Text   |  XML   |  ReML   |   Visible Warnings:

Null Test After Dereference  at packet-frame.c:291

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

dissect_frame

(/home/sate/Testcases/c/cve/wireshark-1.2.0/epan/dissectors/packet-frame.c)expand/collapse
Show more  
 115  dissect_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree)
 116  {
 117          proto_tree      *fh_tree=NULL;
 118          proto_item      *volatile ti = NULL;
 119          nstime_t        ts;
 120          int             cap_len = 0, frame_len = 0;
 121          proto_tree      *volatile tree;
 122          proto_item  *item;
 123          guint32 frame_number;
 124   
 125          frame_number=pinfo->fd->num; /* dummy so that the buildbot crashdumps
 126                                          will show the packetnumber where the
 127                                          crash occurred.
 128                                       */
 129          tree=parent_tree;
 130   
 131          pinfo->current_proto = "Frame";
 132   
 133          if (pinfo->pseudo_header != NULL) {
 134                  switch (pinfo->fd->lnk_t) {
 135   
 136                  case WTAP_ENCAP_WFLEET_HDLC:
 137                  case WTAP_ENCAP_CHDLC_WITH_PHDR:
 138                  case WTAP_ENCAP_PPP_WITH_PHDR:
 139                  case WTAP_ENCAP_SDLC:
 140                  case WTAP_ENCAP_BLUETOOTH_H4:
 141                  case WTAP_ENCAP_BLUETOOTH_H4_WITH_PHDR:
 142                          pinfo->p2p_dir = pinfo->pseudo_header->p2p.sent ?
 143                              P2P_DIR_SENT : P2P_DIR_RECV;
 144                          break;
 145   
 146                  case WTAP_ENCAP_BLUETOOTH_HCI:
 147                          pinfo->p2p_dir = pinfo->pseudo_header->bthci.sent;
 148                          break;
 149   
 150                  case WTAP_ENCAP_LAPB:
 151                  case WTAP_ENCAP_FRELAY_WITH_PHDR:
 152                          pinfo->p2p_dir =
 153                              (pinfo->pseudo_header->x25.flags & FROM_DCE) ?
 154                              P2P_DIR_RECV : P2P_DIR_SENT;
 155                          break;
 156   
 157                  case WTAP_ENCAP_ISDN:
 158                          pinfo->p2p_dir = pinfo->pseudo_header->isdn.uton ?
 159                              P2P_DIR_SENT : P2P_DIR_RECV;
 160                          break;
 161   
 162                  case WTAP_ENCAP_LINUX_LAPD:
 163                          pinfo->p2p_dir = (pinfo->pseudo_header->lapd.pkttype == 3 ||
 164                                  pinfo->pseudo_header->lapd.pkttype == 4) ?
 165                                  P2P_DIR_SENT : P2P_DIR_RECV;
 166                          break;
 167   
 168                  case WTAP_ENCAP_MTP2_WITH_PHDR:
 169                          pinfo->p2p_dir = pinfo->pseudo_header->mtp2.sent ?
 170                              P2P_DIR_SENT : P2P_DIR_RECV;
 171                          pinfo->link_number  = pinfo->pseudo_header->mtp2.link_number;
 172                          pinfo->annex_a_used = pinfo->pseudo_header->mtp2.annex_a_used;
 173                          break;
 174   
 175                  case WTAP_ENCAP_GSM_UM:
 176                          pinfo->p2p_dir = pinfo->pseudo_header->gsm_um.uplink ?
 177                              P2P_DIR_SENT : P2P_DIR_RECV;
 178                          break;
 179   
 180                  }
 181          }
 182   
 183          /* Put in frame header information. */
 184          if (tree) {
 185            cap_len = tvb_length(tvb);
 186            frame_len = tvb_reported_length(tvb);
 187   
 188            ti = proto_tree_add_protocol_format(tree, proto_frame, tvb, 0, -1,
 189              "Frame %u (%u bytes on wire, %u bytes captured)", pinfo->fd->num, frame_len, cap_len);
 190   
 191            fh_tree = proto_item_add_subtree(ti, ett_frame);
 192          }
 193   
 194          /* if FRAME is not referenced from any filters we dont need to worry about
 195             generating any tree items.  We must do this after we created the actual
 196             protocol above so that proto hier stat still works though.
 197          */
 198          if(!proto_field_is_referenced(tree, proto_frame)){
 199                  tree=NULL;
 200                  fh_tree = NULL;
 201          }
 202   
 203   
 204          if (fh_tree) {
 205            ts = pinfo->fd->abs_ts;
 206   
 207            proto_tree_add_time(fh_tree, hf_frame_arrival_time, tvb,
 208                  0, 0, &ts);
 209            if(ts.nsecs < 0 || ts.nsecs >= 1000000000) {
 210              item = proto_tree_add_none_format(fh_tree, hf_frame_time_invalid, tvb,
 211                    0, 0, "Arrival Time: Fractional second %09ld is invalid, the valid range is 0-1000000000", (long) ts.nsecs);
 212              PROTO_ITEM_SET_GENERATED(item);
 213              expert_add_info_format(pinfo, item, PI_MALFORMED, PI_WARN, "Arrival Time: Fractional second out of range (0-1000000000)");
 214            }
 215   
 216            ts = pinfo->fd->del_cap_ts;
 217   
 218            item = proto_tree_add_time(fh_tree, hf_frame_time_delta, tvb,
 219                  0, 0, &ts);
 220            PROTO_ITEM_SET_GENERATED(item);
 221   
 222            ts = pinfo->fd->del_dis_ts;
 223   
 224            item = proto_tree_add_time(fh_tree, hf_frame_time_delta_displayed, tvb,
 225                  0, 0, &ts);
 226            PROTO_ITEM_SET_GENERATED(item);
 227   
 228            ts = pinfo->fd->rel_ts;
 229   
 230            item = proto_tree_add_time(fh_tree, hf_frame_time_relative, tvb,
 231                  0, 0, &ts);
 232            PROTO_ITEM_SET_GENERATED(item);
 233   
 234            if(pinfo->fd->flags.ref_time){
 235                  ti = proto_tree_add_item(fh_tree, hf_frame_time_reference, tvb, 0, 0, FALSE);
 236                  PROTO_ITEM_SET_GENERATED(ti);
 237            }
 238   
 239            proto_tree_add_uint(fh_tree, hf_frame_number, tvb,
 240                  0, 0, pinfo->fd->num);
 241   
 242            proto_tree_add_uint_format(fh_tree, hf_frame_len, tvb,
 243                  0, 0, frame_len, "Frame Length: %d byte%s", frame_len,
 244                  plurality(frame_len, "", "s"));
 245   
 246            proto_tree_add_uint_format(fh_tree, hf_frame_capture_len, tvb,
 247                  0, 0, cap_len, "Capture Length: %d byte%s", cap_len,
 248                  plurality(cap_len, "", "s"));
 249   
 250            if (generate_md5_hash) {
 251                    const guint8 *cp;
 252                    md5_state_t md_ctx;
 253                    md5_byte_t digest[16];
 254                    gchar *digest_string;
 255   
 256                    cp = tvb_get_ptr(tvb, 0, cap_len);
 257   
 258                    md5_init(&md_ctx);
 259                    md5_append(&md_ctx, cp, cap_len);
 260                    md5_finish(&md_ctx, digest);
 261   
 262                    digest_string = bytestring_to_str(digest, 16, '\0');
 263                    ti = proto_tree_add_string(fh_tree, hf_frame_md5_hash, tvb, 0, 0, digest_string);
 264                    PROTO_ITEM_SET_GENERATED(ti);
 265            }
 266   
 267            ti = proto_tree_add_boolean(fh_tree, hf_frame_marked, tvb, 0, 0,pinfo->fd->flags.marked);
 268            PROTO_ITEM_SET_GENERATED(ti);
 269   
 270            /* we are going to be using proto_item_append_string() on 
 271             * hf_frame_protocols, and we must therefore disable the
 272             * TRY_TO_FAKE_THIS_ITEM() optimisation for the tree by 
 273             * setting it as visible.
 274             *
 275             * See proto.h for details.
 276             */
 277            proto_tree_set_visible(fh_tree, TRUE);
 278   
 279            ti = proto_tree_add_string(fh_tree, hf_frame_protocols, tvb,
 280                  0, 0, "");
 281            PROTO_ITEM_SET_GENERATED(ti);
 282            pinfo->layer_names = g_string_new("");
 283   
 284            /* Check for existences of P2P pseudo header */
 285            if (pinfo->p2p_dir != P2P_DIR_UNKNOWN) {
 286                    proto_tree_add_int(fh_tree, hf_frame_p2p_dir, tvb,
 287                                    0, 0, pinfo->p2p_dir);
 288            }
 289   
 290            /* Check for existences of MTP2 link number */
 291            if ((pinfo->pseudo_header != NULL ) && (pinfo->fd->lnk_t == WTAP_ENCAP_MTP2_WITH_PHDR)) {
 292                    proto_tree_add_uint(fh_tree, hf_link_number, tvb,
 293                                    0, 0, pinfo->link_number);
 294            }
 295   
 296            if (show_file_off) {
 297                    proto_tree_add_int64_format(fh_tree, hf_frame_file_off, tvb,
 298                                    0, 0, pinfo->fd->file_off,
 299                                    "File Offset: %" G_GINT64_MODIFIER "d (0x%" G_GINT64_MODIFIER "x)",
 300                                    pinfo->fd->file_off, pinfo->fd->file_off);
 301            }
 302   
 303            if(pinfo->fd->color_filter != NULL) {
 304                color_filter_t *color_filter = pinfo->fd->color_filter;
 305                item = proto_tree_add_string(fh_tree, hf_frame_color_filter_name, tvb,
 306                      0, 0, color_filter->filter_name);
 307                PROTO_ITEM_SET_GENERATED(item);
 308                item = proto_tree_add_string(fh_tree, hf_frame_color_filter_text, tvb,
 309                      0, 0, color_filter->filter_text);
 310                PROTO_ITEM_SET_GENERATED(item);
 311            }
 312          } else {
 313            if(pinfo->fd->abs_ts.nsecs < 0 || pinfo->fd->abs_ts.nsecs >= 1000000000) {
 314                  expert_add_info_format(pinfo, NULL, PI_MALFORMED, PI_WARN, "Arrival Time: Fractional second out of range (0-1000000000)");
 315            }
 316          }
 317   
 318      /* Portable Exception Handling to trap Wireshark specific exceptions like BoundsError exceptions */
 319          TRY {
 320  #ifdef _MSC_VER 
 321      /* Win32: Visual-C Structured Exception Handling (SEH) to trap hardware exceptions like memory access violations */
 322      /* (a running debugger will be called before the except part below) */
 323      __try {
 324  #endif
 325          if ((force_docsis_encap) && (docsis_handle)) {
 326              call_dissector(docsis_handle, tvb, pinfo, parent_tree);
 327          } else {
 328              if (!dissector_try_port(wtap_encap_dissector_table, pinfo->fd->lnk_t,
 329                  tvb, pinfo, parent_tree)) {
 330   
 331                          if (check_col(pinfo->cinfo, COL_PROTOCOL))
 332                                  col_set_str(pinfo->cinfo, COL_PROTOCOL, "UNKNOWN");
 333                          if (check_col(pinfo->cinfo, COL_INFO))
 334                                  col_add_fstr(pinfo->cinfo, COL_INFO, "WTAP_ENCAP = %u",
 335                                      pinfo->fd->lnk_t);
 336                          call_dissector(data_handle,tvb, pinfo, parent_tree);
 337                  }
 338          }
 339  #ifdef _MSC_VER 
 340      } __except(TRUE /* handle all exceptions */) {
 341          switch(GetExceptionCode()) {
 342          case(STATUS_ACCESS_VIOLATION):
 343                      show_exception(tvb, pinfo, parent_tree, DissectorError,
 344                  "STATUS_ACCESS_VIOLATION: dissector accessed an invalid memory address");
 345              break;
 346          case(STATUS_INTEGER_DIVIDE_BY_ZERO):
 347                      show_exception(tvb, pinfo, parent_tree, DissectorError,
 348                  "STATUS_INTEGER_DIVIDE_BY_ZERO: dissector tried an integer division by zero");
 349              break;
 350          case(STATUS_STACK_OVERFLOW):
 351                      show_exception(tvb, pinfo, parent_tree, DissectorError,
 352                  "STATUS_STACK_OVERFLOW: dissector overflowed the stack (e.g. endless loop)");
 353              /* XXX - this will have probably corrupted the stack, which makes problems later in the exception code */
 354              break;
 355          /* XXX - add other hardware exception codes as required */
 356          default:
 357                      show_exception(tvb, pinfo, parent_tree, DissectorError,
 358                  g_strdup_printf("dissector caused an unknown exception: 0x%x", GetExceptionCode()));
 359          }
 360      }
 361  #endif
 362          }
 363          CATCH(OutOfMemoryError) {
 364                  RETHROW;
 365          }
 366          CATCH_ALL {
 367                  show_exception(tvb, pinfo, parent_tree, EXCEPT_CODE, GET_MESSAGE);
 368          }
 369          ENDTRY;
 370   
 371          if (tree && pinfo->layer_names) {
 372                  proto_item_append_string(ti, pinfo->layer_names->str);
 373                  g_string_free(pinfo->layer_names, TRUE);
 374                  pinfo->layer_names = NULL;
 375          }
 376   
 377          /*  Call postdissectors if we have any (while trying to avoid another
 378           *  TRY/CATCH)
 379           */
 380          if (have_postdissector()) {
 381              TRY {
 382  #ifdef _MSC_VER 
 383              /* Win32: Visual-C Structured Exception Handling (SEH) to trap hardware exceptions like memory access violations */
 384              /* (a running debugger will be called before the except part below) */
 385              __try {
 386  #endif
 387                  call_all_postdissectors(tvb, pinfo, parent_tree);
 388  #ifdef _MSC_VER 
 389              } __except(TRUE /* handle all exceptions */) {
 390                  switch(GetExceptionCode()) {
 391                  case(STATUS_ACCESS_VIOLATION):
 392                              show_exception(tvb, pinfo, parent_tree, DissectorError,
 393                          "STATUS_ACCESS_VIOLATION: dissector accessed an invalid memory address");
 394                      break;
 395                  case(STATUS_INTEGER_DIVIDE_BY_ZERO):
 396                              show_exception(tvb, pinfo, parent_tree, DissectorError,
 397                          "STATUS_INTEGER_DIVIDE_BY_ZERO: dissector tried an integer division by zero");
 398                      break;
 399                  case(STATUS_STACK_OVERFLOW):
 400                              show_exception(tvb, pinfo, parent_tree, DissectorError,
 401                          "STATUS_STACK_OVERFLOW: dissector overflowed the stack (e.g. endless loop)");
 402                      /* XXX - this will have probably corrupted the stack, which makes problems later in the exception code */
 403                      break;
 404                  /* XXX - add other hardware exception codes as required */
 405                  default:
 406                              show_exception(tvb, pinfo, parent_tree, DissectorError,
 407                          g_strdup_printf("dissector caused an unknown exception: 0x%x", GetExceptionCode()));
 408                  }
 409              }
 410  #endif
 411              }
 412              CATCH(OutOfMemoryError) {
 413                      RETHROW;
 414              }
 415              CATCH_ALL {
 416                      show_exception(tvb, pinfo, parent_tree, EXCEPT_CODE, GET_MESSAGE);
 417              }
 418              ENDTRY;
 419          }
 420   
 421          tap_queue_packet(frame_tap, pinfo, NULL);
 422   
 423   
 424          if (frame_end_routines) {
 425                  g_slist_foreach(frame_end_routines, &call_frame_end_routine, NULL);
 426                  g_slist_free(frame_end_routines);
 427                  frame_end_routines = NULL;
 428          }
 429  }
Show more  




Change Warning 12383.32307 : Null Test After Dereference

Priority:
State:
Finding:
Owner:
Note: