Text   |  XML   |  ReML   |   Visible Warnings:

Null Test After Dereference  at erf.c:402

No properties have been set. | edit properties
Jump to warning location ↓ warning details...
Show Events | Options

erf_read_header

(/home/sate/Testcases/c/cve/wireshark-1.2.0/wiretap/erf.c)expand/collapse
Show more  
 305  static int erf_read_header(FILE_T fh,
 306                             struct wtap_pkthdr *phdr,
 307                             union wtap_pseudo_header *pseudo_header,
 308                             erf_header_t *erf_header,
 309                             int *err,
 310                             gchar **err_info,
 311                             guint32 *bytes_read,
 312                             guint32 *packet_size)
 313  {
 314    guint32 mc_hdr;
 315    guint8 erf_exhdr[8];
 316    guint64 erf_exhdr_sw;
 317    guint8 type = 0;
 318    guint16 eth_hdr;
 319    guint32 skiplen=0;
 320    int i = 0 , max = sizeof(pseudo_header->erf.ehdr_list)/sizeof(struct erf_ehdr);
 321   
 322    wtap_file_read_expected_bytes(erf_header, sizeof(*erf_header), fh, err);
 323    if (bytes_read != NULL) {
 324      *bytes_read = sizeof(*erf_header);
 325    }
 326   
 327    *packet_size =  g_ntohs(erf_header->rlen) - (guint32)sizeof(*erf_header);
 328   
 329    if (*packet_size > WTAP_MAX_PACKET_SIZE) {
 330      /*
 331       * Probably a corrupt capture file; don't blow up trying 
 332       * to allocate space for an immensely-large packet.
 333       */
 334      *err = WTAP_ERR_BAD_RECORD;
 335      *err_info = g_strdup_printf("erf: File has %u-byte packet, bigger than maximum of %u",
 336                                  *packet_size, WTAP_MAX_PACKET_SIZE);
 337      return FALSE;
 338    }
 339   
 340    if (phdr != NULL) {
 341      guint64 ts = pletohll(&erf_header->ts);
 342   
 343      phdr->ts.secs = (long) (ts >> 32);
 344      ts = ((ts & 0xffffffff) * 1000 * 1000 * 1000);
 345      ts += (ts & 0x80000000) << 1; /* rounding */
 346      phdr->ts.nsecs = ((int) (ts >> 32));
 347      if (phdr->ts.nsecs >= 1000000000) {
 348        phdr->ts.nsecs -= 1000000000;
 349        phdr->ts.secs += 1;
 350      }
 351    }
 352   
 353    /* Copy the ERF pseudo header */
 354    pseudo_header->erf.phdr.ts = pletohll(&erf_header->ts);
 355    pseudo_header->erf.phdr.type = erf_header->type;
 356    pseudo_header->erf.phdr.flags = erf_header->flags;
 357    pseudo_header->erf.phdr.rlen = g_ntohs(erf_header->rlen);
 358    pseudo_header->erf.phdr.lctr = g_ntohs(erf_header->lctr);
 359    pseudo_header->erf.phdr.wlen = g_ntohs(erf_header->wlen);
 360   
 361    /* Copy the ERF extension header into the pseudo header */
 362    type = erf_header->type;
 363    while (type & 0x80){
 364            wtap_file_read_expected_bytes(&erf_exhdr, sizeof(erf_exhdr), fh, err);
 365            if (bytes_read != NULL)
 366                    *bytes_read += (guint32)sizeof(erf_exhdr);
 367            *packet_size -=  (guint32)sizeof(erf_exhdr);
 368            skiplen += (guint32)sizeof(erf_exhdr);
 369            erf_exhdr_sw = pntohll((guint64*) &(erf_exhdr[0]));
 370            if (i < max)
 371              memcpy(&pseudo_header->erf.ehdr_list[i].ehdr, &erf_exhdr_sw, sizeof(erf_exhdr_sw));
 372            type = erf_exhdr[0];
 373            i++;
 374    }
 375   
 376    switch (erf_header->type & 0x7F) {
 377    case ERF_TYPE_IPV4:
 378    case ERF_TYPE_IPV6:
 379    case ERF_TYPE_RAW_LINK:
 380    case ERF_TYPE_INFINIBAND:
 381      /***
 382      if (phdr != NULL) {
 383        phdr->len =  g_htons(erf_header->wlen);
 384        phdr->caplen = g_htons(erf_header->wlen);  
 385      }  
 386      return TRUE;
 387      ***/
 388      break;
 389    case ERF_TYPE_PAD:
 390    case ERF_TYPE_HDLC_POS:
 391    case ERF_TYPE_COLOR_HDLC_POS:
 392    case ERF_TYPE_DSM_COLOR_HDLC_POS:
 393    case ERF_TYPE_ATM:
 394    case ERF_TYPE_AAL5:
 395    case ERF_TYPE_AAL2:
 396      break;
 397   
 398    case ERF_TYPE_ETH:
 399    case ERF_TYPE_COLOR_ETH:
 400    case ERF_TYPE_DSM_COLOR_ETH:
 401      wtap_file_read_expected_bytes(&eth_hdr, sizeof(eth_hdr), fh, err);
 402      if (bytes_read != NULL)
 403        *bytes_read += (guint32)sizeof(eth_hdr);
 404      *packet_size -=  (guint32)sizeof(eth_hdr);
 405      skiplen += (guint32)sizeof(eth_hdr);
 406      pseudo_header->erf.subhdr.eth_hdr = g_htons(eth_hdr);
 407      break;
 408   
 409    case ERF_TYPE_MC_HDLC:
 410    case ERF_TYPE_MC_RAW:
 411    case ERF_TYPE_MC_ATM:
 412    case ERF_TYPE_MC_RAW_CHANNEL:
 413    case ERF_TYPE_MC_AAL5:
 414    case ERF_TYPE_MC_AAL2:
 415    case ERF_TYPE_COLOR_MC_HDLC_POS:
 416      wtap_file_read_expected_bytes(&mc_hdr, sizeof(mc_hdr), fh, err);
 417      if (bytes_read != NULL)
 418        *bytes_read += (guint32)sizeof(mc_hdr);
 419      *packet_size -=  (guint32)sizeof(mc_hdr);
 420      skiplen += (guint32)sizeof(mc_hdr);
 421      pseudo_header->erf.subhdr.mc_hdr = g_htonl(mc_hdr);
 422      break;
 423   
 424    case ERF_TYPE_IP_COUNTER:
 425    case ERF_TYPE_TCP_FLOW_COUNTER:
 426      /* unsupported, continue with default: */
 427    default:
 428      *err = WTAP_ERR_UNSUPPORTED_ENCAP;
 429      *err_info = g_strdup_printf("erf: unknown record encapsulation %u",
 430                                  erf_header->type);
 431      return FALSE;
 432    }
 433   
 434    if (phdr != NULL) {
 435      phdr->len = g_htons(erf_header->wlen);
 436      phdr->caplen = min( g_htons(erf_header->wlen),
 437                          g_htons(erf_header->rlen) - (guint32)sizeof(*erf_header) - skiplen );
 438    }
 439    return TRUE;
 440  }
Show more  




Change Warning 12258.29683 : Null Test After Dereference

Because they are very similar, this warning shares annotations with warning 12258.29684.

Priority:
State:
Finding:
Owner:
Note: