Changeset 199 for Evidence


Ignore:
Timestamp:
04/20/10 16:01:16 (14 years ago)
Author:
daqct3
Message:
Bug in ToString() resulted in buffer overflow for structure
Location:
Evidence
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • Evidence/DColl.cc

    r192 r199  
    221221        char *Token = strtok(Info->getString(), "+-!@");       
    222222        while (Token != NULL) {
    223           if (*Info->getString()=='-' || *Info->getString()=='!') ; // RemoveService(string(Token)+"/SERVICE_LIST");     
     223          if (*Info->getString()=='-' || *Info->getString()=='!') RemoveService(string(Token)+"/SERVICE_LIST");   
    224224          else AddService(string(Token)+"/SERVICE_LIST");
    225225          Token = strtok(NULL, "|"); // Skip server IP address
     
    239239      if (strstr(Type, "|CMD")==NULL && strstr(Type, "|RPC")==NULL) {
    240240            // Add or remove service
    241             if (*Info->getString()=='-' || *Info->getString()=='!') ; // RemoveService(Name);
     241            if (*Info->getString()=='-' || *Info->getString()=='!') RemoveService(Name);
    242242                else AddService(Name);
    243243          }
     
    350350  // ====== Part D: Handle history service ===
    351351  //
    352  
     352
    353353  if (Info->getSize() == 0) return;
    354354
     
    468468        if (Name == List[i].DataItem->getName()) return;
    469469  }
    470  
     470
     471  // Set minimum required change by comparing to regular expressions
    471472  struct Item New;
    472 
    473   // Set minimum required change by comparing to regular expressions
    474473  New.MinAbsChange = 0;
    475474  New.HistSize = 0;
     
    505504        }
    506505  }
    507  
     506
    508507  // Subscribe to service
    509508  New.DataItem = new DimStampedInfo(Name.c_str(), NO_LINK, this);
  • Evidence/Evidence.cc

    r187 r199  
    240240  char *Text;
    241241
     242  // Safety check
     243  if (Item->getSize() < 1) return NULL;
     244 
    242245  // Structure: print hex representation (3 characters per byte) 
    243246  if (strlen(Item->getFormat()) != 1) {
    244     if ((Text = (char *) malloc(3*Item->getSize()+1)) != NULL) {
    245           for (int i=0; i<Item->getSize(); i++) sprintf(Text+3*i, "%02x", *((char *) Item->getData() + i));
    246         }
     247    int Size = 3*Item->getSize()+1, N;
     248    if ((Text = (char *) malloc(Size)) == NULL) return NULL;
     249       
     250        char *CurrPos = Text;
     251        for (int i=0; i<Item->getSize(); i++) {
     252          N = snprintf(CurrPos, Size, "%02x ", *((char *) Item->getData() + i));
     253          if (N<0 || N>=Size) {
     254            free(Text);
     255                if (asprintf(&Text, "Structure length %d bytes, buffer overflow in ToString()", Item->getSize()) == -1) return NULL;
     256                else return Text;
     257          }
     258          Size -= N;
     259          CurrPos += N;
     260        }
    247261        return Text;
    248262  }
Note: See TracChangeset for help on using the changeset viewer.