Frage zu Libnodave daveWriteS5Bytes()

funkey

Level-2
Beiträge
361
Reaktionspunkte
109
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo. Ich habe eine Frage bezüglich Libnodave und zwar verwende ich die Funktion daveWriteS5Bytes() und frage mich ob das ein Bug ist.

Hier der betreffende Code:

Code:
int DECL2 daveWriteS5Bytes(daveConnection * dc, uc area, uc BlockN, int offset, int count, void * buf)
{
    int res,datastart;
    daveS5AreaInfo ai;
    uc b1[daveMaxRawLen];
//    if (_daveIsS5DBlockArea(area)==0) {
    if (area==daveDB) {
// LOG1("_daveIsS5DBlockArea\n");
        res=_daveReadS5BlockAddress(dc,area,BlockN,&ai);
        if (res<0) {
            LOG2("%s *** Error in WriteS5Bytes.BlockAddr request.\n", dc->iface->name);
            return res-50;
        }
 datastart=ai.address;
    } else {
        switch (area) {
     case daveRawMemoryS5: datastart=0; break;
     case daveInputs: datastart=dc->cache->PAE; break;
     case daveOutputs: datastart=dc->cache->PAA; break;
     case daveFlags: datastart=dc->cache->flags; break;
     case daveTimer: datastart=dc->cache->timers; break;
     case daveCounter: datastart=dc->cache->counters; break;
     case daveSysDataS5: datastart=dc->cache->systemData; break;
     default:
      LOG2("%s *** Unknown area in WriteS5Bytes request.\n", dc->iface->name);
  return -1;
 }
    }
    if ((count>daveMaxRawLen)||(offset+count>ai.len)) {
        LOG2("%s writeS5Bytes *** Requested data is out-of-range.\n", dc->iface->name);
        return -1;
    }
    
    ....
}

Wie man sehen kann wird die daveS5AreaInfo-Struktur 'ai' nur gefüllt, wenn der Bereich ein Datenbaustein ist. Weiter unten wird aber 'ai.len' zur Überprüfung des Bereiches verwendet, wo dann die Meldung 'Requested data is out-of-range' kommt. Hat da jemand schon einen Fix dafür?

Gruß
funkey
 
Bei daveReadS5Bytes() ist das einfach auskommentiert worden.
Kannst du ja auch so machen, oder die Prüfung in den DB-Pfad verschieben wo es eigentlich hingehört.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich mache das jetzt so

Code:
        switch (area)
        {
     case daveRawMemoryS5:
         datastart=0;
         ai.len = daveMaxRawLen; // ??
         break;
     case daveInputs:
         datastart=dc->cache->PAE;
         ai.len = dc->cache->PAA - datastart;
         break;
     case daveOutputs:
         datastart=dc->cache->PAA;
         ai.len = dc->cache->PAA - dc->cache->PAE; //gleiche Länge angenommen wie Eingänge
         break;
     case daveFlags:
         datastart=dc->cache->flags;
         ai.len = dc->cache->PAE - datastart;
         break;
     case daveTimer:
         datastart=dc->cache->timers;
         ai.len = dc->cache->counters - datastart;
         break;
     case daveCounter:
         datastart=dc->cache->counters;
         ai.len = dc->cache->flags - datastart;
         break;
     case daveSysDataS5:
         datastart=dc->cache->systemData;
         ai.len = dc->cache->timers - datastart;
         break;
     default:
      LOG2("%s *** Unknown area in WriteS5Bytes request.\n", dc->iface->name);
  return -1;
 }
 
Zuletzt bearbeitet:
Das weiß ich leider nicht. Ich bin einfach mal davon ausgegangen und habe gehofft, das es immer so ist.
 
Zuletzt bearbeitet:
Zurück
Oben