Changeset 27 for trunk/src/template.c

Show
Ignore:
Timestamp:
04/05/07 18:10:36 (16 years ago)
Author:
andreu
Message:

explicite output to find wrong definition bug - memory leak in renetcolAgg find

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/src/template.c

    r23 r27  
    5353 * it can exist many templates definitions in a template flowset 
    5454 */ 
    55 unsigned short  
     55short  
    5656checkTemplateFlowSet(RouterPtr cr, unsigned short *offV9,  
    5757                     unsigned char *buf,  
     
    6969  unsigned short getFlowsetId = 0; 
    7070  unsigned short length = 0; 
    71   TplFlowSetPtr ptpltmp; 
     71  TplFlowSetPtr ptpltmp = NULL; 
    7272  /* for msg sending: */ 
    7373  msgType myMsg; 
     
    7575  char *msgTextIndex; 
    7676  unsigned short tplMsgType = 1; 
     77  unsigned short badFieldNumber = 0; 
     78  unsigned short badFieldLength = 0; 
    7779 
    7880  buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++; 
     
    8385  length = *((unsigned short*)&buffer2); 
    8486  do { 
     87    fprintf (stderr, " TD \n"); 
     88    badFieldNumber = 0; 
     89    badFieldLength = 0; 
    8590    buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++; 
    8691    buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++; 
     
    102107        buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++; 
    103108        buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++; 
    104         fldPtr->fieldType = *((unsigned short*)&buffer2); 
    105         buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++; 
    106         buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++; 
    107         fldPtr->fieldLength = *((unsigned short*)&buffer2); 
     109        if ( (fldPtr->fieldType = *((unsigned short*)&buffer2) ) > 89) { 
     110          badFieldNumber = 1; 
     111        } 
     112        buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++; 
     113        buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++; 
     114        if ( (fldPtr->fieldLength = *((unsigned short*)&buffer2) ) > 16) { 
     115          badFieldLength = 1; 
     116        } 
    108117        fldPtr->next = cTFSPtr->fieldSet; 
    109118        fldPtr->prev = NULL; 
     
    114123        } 
    115124        cpt_fields++; 
    116         if ( cpt_fields > 40 ) { /* FIXME : declarer une constante pour cela */ 
    117           fprintf(stderr,"IP: %lu \n",cr->IpAddress); 
    118           fprintf (stderr, "cTFSPtr->templateFlowSetId: %hu\n",  
     125        if ( (cpt_fields > 40) || (badFieldNumber == 1) || badFieldLength == 1) { /* FIXME : constante pour cela */ 
     126          fprintf(stderr,"\n IP: %lu.%lu.%lu.%lu, %d,%d\n", 
     127                  cr->IpAddress>>24, 
     128                  cr->IpAddress<<8>>24, 
     129                  cr->IpAddress<<16>>24, 
     130                  cr->IpAddress<<24>>24, 
     131                  badFieldNumber, 
     132                  badFieldLength 
     133                  ); 
     134          fprintf (stderr, "\n cTFSPtr->templateFlowSetId: %hu\n",  
    119135                   cTFSPtr->templateFlowSetId); 
    120136          while ( ((*offV9))> (index)){ 
     
    125141          } 
    126142          syslog (LOG_INFO,  
    127                   "fields nb too large, bug collector or wrong template def");  
    128           cTFSPtr = deleteTplFlSet(cTFSPtr); 
    129         } 
     143                  "in new template: field nb gt 89, field lg gt 16 or too many fields, bad template definition possibility"); 
     144          fprintf(stderr,  
     145                  "\n in new template function: too many fields, bug collector or wrong template def \n");  
     146          ptpltmp = cTFSPtr; 
     147          if (ptpltmp->prev == NULL) { 
     148            cr->tplList = ptpltmp->next; 
     149            if (cr->tplList) { 
     150              cr->tplList->prev = NULL; 
     151            } 
     152          } else { 
     153            ptpltmp->prev->next = ptpltmp->next; 
     154            if (ptpltmp->next) { 
     155              ptpltmp->next->prev = ptpltmp->prev; 
     156            } 
     157          } 
     158          deleteTplFlSet(ptpltmp); 
     159          cTFSPtr = NULL; 
     160          return (-1); 
     161        } 
     162        fprintf (stderr, "t for new \n"); 
    130163      } 
    131164    } else { /*update*/ 
     
    158191        buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++; 
    159192        buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++; 
    160         fldPtr->fieldType = *((unsigned short*)&buffer2); 
    161         buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++; 
    162         buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++; 
    163         fldPtr->fieldLength = *((unsigned short*)&buffer2); 
     193        if ( (fldPtr->fieldType = *((unsigned short*)&buffer2) ) > 89) { 
     194          badFieldNumber = 1; 
     195        } 
     196        buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++; 
     197        buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++; 
     198        if ( (fldPtr->fieldLength = *((unsigned short*)&buffer2) ) > 16) { 
     199          badFieldLength = 1; 
     200        } 
    164201        fldPtr->next = cTFSPtr->fieldSet; 
    165202        fldPtr->prev = NULL; 
     
    172209        } 
    173210        cpt_fields++; 
    174         if ( cpt_fields > 40 ) { /* FIXME : declarer une constante pour cela */ 
     211        if ( (cpt_fields > 40) || (badFieldNumber == 1) || badFieldLength == 1) { /* FIXME : declarer une constante pour cela */ 
    175212          while ( ((*offV9))> (index)){ 
    176213            buffer2[1]= *(buf+index); index++; 
     
    180217          } 
    181218          syslog (LOG_INFO,  
    182                   "fields nb too large, bug collector or wrong template def");  
    183           cTFSPtr = deleteTplFlSet(cTFSPtr); 
    184         } 
     219                  "in update template function: too many fields, bug collector or wrong template def in template update"); 
     220          fprintf(stderr, 
     221                  "\nin update template function: too many fields, bug collector or wrong template def in template update\n"); 
     222          ptpltmp = cTFSPtr; 
     223          if (ptpltmp->prev == NULL) { 
     224            cr->tplList = ptpltmp->next; 
     225            if (cr->tplList) { 
     226              cr->tplList->prev = NULL; 
     227            } 
     228          } else { 
     229            ptpltmp->prev->next = ptpltmp->next; 
     230            if (ptpltmp->next) { 
     231              ptpltmp->next->prev = ptpltmp->prev; 
     232            } 
     233          } 
     234          deleteTplFlSet(ptpltmp); 
     235          cTFSPtr = NULL; 
     236          return (-1);     
     237        } 
     238        fprintf (stderr, "t for up \n"); 
    185239      } 
    186240    } /* end if template creation or update */ 
     
    232286 * 
    233287 */ 
    234 unsigned short  
     288short  
    235289checkTemplateOption(RouterPtr cr, unsigned short *offV9,  
    236290                    unsigned char *buf, NetFlowV9HeaderPtr v9Ptr, 
     
    244298  unsigned char buffer2[2]; 
    245299  TplOptionPtr ptplotmp; 
     300  unsigned short badFieldNumber = 0; 
     301  unsigned short badFieldLength = 0; 
     302  int cpt_fields = 0; 
    246303 
    247304  buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++; 
     
    252309  length = *((unsigned short*)&buffer2); 
    253310  do { 
     311    fprintf (stderr, " TO \n"); 
     312    badFieldNumber = 0; 
     313    badFieldLength = 0; 
    254314    buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++; 
    255315    buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++; 
     
    269329      buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++; 
    270330      cTOPtr->optionLg = *((unsigned short*)&buffer2); 
     331      cpt_fields = 0; 
    271332      for ( i=0; i<(((cTOPtr->optionScopeLg)+(cTOPtr->optionLg))/4); i++) { 
    272333        FieldPtr tmp = (FieldPtr) malloc(sizeof(struct Field)); 
    273334        buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++; 
    274335        buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++; 
    275         tmp->fieldType = *((unsigned short*)&buffer2); 
    276         buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++; 
    277         buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++; 
    278         tmp->fieldLength = *((unsigned short*)&buffer2); 
     336        if ( (tmp->fieldType = *((unsigned short*)&buffer2) ) > 89) { 
     337          badFieldNumber = 1; 
     338        } 
     339        buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++; 
     340        buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++; 
     341        if ( (tmp->fieldLength = *((unsigned short*)&buffer2) ) > 16) { 
     342          badFieldLength = 1; 
     343        } 
    279344        tmp->next = cTOPtr->fieldSet; 
    280345        tmp->prev = NULL; 
     
    284349          cTOPtr->lastField = tmp; 
    285350        } 
     351        cpt_fields++; 
     352        if ( (cpt_fields > 40) || (badFieldNumber == 1) || badFieldLength == 1) { 
     353          syslog (LOG_INFO,  
     354                  "in option template function: too many fields, bug collector or wrong template def in template update"); 
     355          fprintf(stderr, 
     356                  "\nin option template function: too many fields, bug collector or wrong template def in template update\n"); 
     357          ptplotmp = cTOPtr; 
     358          if (ptplotmp->prev == NULL) { 
     359            cr->tplOptList = ptplotmp->next; 
     360            if (cr->tplOptList) { 
     361              cr->tplOptList->prev = NULL; 
     362            } 
     363          } else { 
     364            ptplotmp->prev->next = ptplotmp->next; 
     365            if (ptplotmp->next) { 
     366              ptplotmp->next->prev = ptplotmp->prev; 
     367            } 
     368          } 
     369          deleteTplOption(ptplotmp); 
     370          cTOPtr = NULL; 
     371          return (-1); 
     372        } 
     373        fprintf (stderr, "to for new \n"); 
    286374      } 
    287375      while ((*offV9)%4 != 0) { 
    288376        (*offV9)++; cpt++; 
     377        fprintf (stderr, " TO new padding \n"); 
    289378      } /*padding case*/ 
    290379    } else { /*update */ 
     
    315404      buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++; 
    316405      cTOPtr->optionLg = *((unsigned short*)&buffer2); 
     406      cpt_fields = 0; 
    317407      for ( i=0; i<(((cTOPtr->optionScopeLg)+(cTOPtr->optionLg))/4); i++) { 
    318408        FieldPtr tmp = (FieldPtr) malloc(sizeof(struct Field)); 
    319409        buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++; 
    320410        buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++; 
    321         tmp->fieldType = *((unsigned short*)&buffer2); 
    322         buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++; 
    323         buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++; 
    324         tmp->fieldLength = *((unsigned short*)&buffer2); 
     411        if ( (tmp->fieldType = *((unsigned short*)&buffer2) ) > 89) { 
     412          badFieldNumber = 1; 
     413        } 
     414        buffer2[1]= *(buf+(*offV9)); (*offV9)++; cpt++; 
     415        buffer2[0]= *(buf+(*offV9)); (*offV9)++; cpt++; 
     416        if ( (tmp->fieldLength = *((unsigned short*)&buffer2) ) > 16) { 
     417          badFieldLength = 1; 
     418        } 
    325419        tmp->next = cTOPtr->fieldSet; 
    326420        tmp->prev = NULL; 
     
    330424          cTOPtr->lastField = tmp; 
    331425        } 
     426        cpt_fields++; 
     427        if ( (cpt_fields > 40) || (badFieldNumber == 1) || badFieldLength == 1) { 
     428          syslog (LOG_INFO,  
     429                  "in update option tpl function: too many fields, bug collector or wrong template def in template update"); 
     430          fprintf(stderr, 
     431                  "\nin update option tpl function: too many fields, bug collector or wrong template def in template update\n"); 
     432          ptplotmp = cTOPtr; 
     433          if (ptplotmp->prev == NULL) { 
     434            cr->tplOptList = ptplotmp->next; 
     435            if (cr->tplOptList) { 
     436              cr->tplOptList->prev = NULL; 
     437            } 
     438          } else { 
     439            ptplotmp->prev->next = ptplotmp->next; 
     440            if (ptplotmp->next) { 
     441              ptplotmp->next->prev = ptplotmp->prev; 
     442            } 
     443          } 
     444          deleteTplOption(ptplotmp); 
     445          cTOPtr = NULL; 
     446          return (-1); 
     447        } 
     448        fprintf (stderr, "to for up \n"); 
    332449      } 
    333450      while ((*offV9)%4 != 0) { 
    334451        (*offV9)++; cpt++; 
     452        fprintf (stderr, " TO update padding \n"); 
    335453      } /*padding case*/ 
    336454    } 
     
    338456  } while ((cpt) < (length-2)); 
    339457/*   show_all_tplFlSet(); */ 
     458  fprintf (stderr, "to return %d \n", length); 
    340459  return length; 
    341460}