Text   |  XML   |  ReML   |   Visible Warnings:

Unreachable Control Flow  at packet-acn.c:1277

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

dissect_acn_dmp_pdu

(/home/sate/Testcases/c/cve/wireshark-1.2.0/epan/dissectors/packet-acn.c)expand/collapse
Show more  
 1076  dissect_acn_dmp_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, acn_pdu_offsets *last_pdu_offsets)
 1077  {
 1078    /* common to all pdu */
 1079    guint8 pdu_flags;
 1080    guint32 pdu_start;
 1081    guint32 pdu_length;
 1082    guint32 pdu_flvh_length; /* flags, length, vector, header */
 1083    acn_pdu_offsets pdu_offsets = {0,0,0,0,0};
 1084    guint8 D;
 1085    guint8 octet;
 1086    guint32 length1;
 1087    guint32 length2;
 1088    guint32 length3;
 1089    guint32 vector_offset;
 1090    guint32 header_offset;
 1091    guint32 data_offset;
 1092    guint32 old_offset;
 1093    guint32 end_offset;
 1094    guint32 data_length;
 1095    guint32 address_count;
 1096   
 1097    proto_item *ti, *pi;
 1098    proto_tree *pdu_tree = NULL;
 1099    proto_tree *flag_tree = NULL;
 1100   
 1101    /* this pdu */
 1102    const gchar *name;
 1103    acn_dmp_adt_type adt = {0,0,0,0,0,0};
 1104    acn_dmp_adt_type adt2 = {0,0,0,0,0,0};
 1105    guint32 vector;
 1106   
 1107    /* save start of pdu block */
 1108    pdu_start = offset;
 1109    pdu_offsets.start = pdu_start;
 1110   
 1111    /* get PDU flags and length flag first */
 1112    octet = tvb_get_guint8(tvb, offset++);
 1113    pdu_flags =  octet & 0xf0;
 1114    length1 = octet & 0x0f;                   /* bottom 4 bits only */
 1115    length2 = tvb_get_guint8(tvb, offset++);
 1116   
 1117    /* if length flag is set, then we have a 20 bit length else we have a 12 bit */
 1118    /* flvh = flags, length, vector, header */
 1119    if (pdu_flags & ACN_PDU_FLAG_L) {
 1120      length3 = tvb_get_guint8(tvb, offset);
 1121      offset++;
 1122      pdu_length = length3 | (length2 << 8) | (length1 << 16);
 1123      pdu_flvh_length = 3;
 1124    } else {
 1125      pdu_length = length2 | (length1 << 8);
 1126      pdu_flvh_length = 2;
 1127    }
 1128    /* offset should now be pointing to vector (if one exists) */
 1129   
 1130    /* Add pdu item and tree */
 1131    ti = proto_tree_add_item(tree, hf_acn_pdu, tvb, pdu_start, pdu_length, FALSE);
 1132    pdu_tree = proto_item_add_subtree(ti, ett_acn_dmp_pdu);
 1133   
 1134    /* Add flag item and tree */
 1135    pi = proto_tree_add_uint(pdu_tree, hf_acn_pdu_flags, tvb, pdu_start, 1, pdu_flags);
 1136    flag_tree = proto_item_add_subtree(pi, ett_acn_pdu_flags);
 1137    proto_tree_add_item(flag_tree, hf_acn_pdu_flag_l, tvb, pdu_start, 1, FALSE);
 1138    proto_tree_add_item(flag_tree, hf_acn_pdu_flag_v, tvb, pdu_start, 1, FALSE);
 1139    proto_tree_add_item(flag_tree, hf_acn_pdu_flag_h, tvb, pdu_start, 1, FALSE);
 1140    proto_tree_add_item(flag_tree, hf_acn_pdu_flag_d, tvb, pdu_start, 1, FALSE);
 1141   
 1142    /* Add PDU Length item */
 1143    proto_tree_add_uint(pdu_tree, hf_acn_pdu_length, tvb, pdu_start, pdu_flvh_length, pdu_length);
 1144   
 1145    /* Set vector offset */
 1146    if (pdu_flags & ACN_PDU_FLAG_V) {
 1147      /* use new values */
 1148      vector_offset = offset;
 1149      last_pdu_offsets->vector = offset;
 1150      offset++;
 1151      pdu_flvh_length++;
 1152    } else {
 1153      /* use last values */
 1154      vector_offset = last_pdu_offsets->vector;
 1155    }
 1156    /* offset should now be pointing to header (if one exists) */
 1157   
 1158    /* Add Vector item */
 1159    vector = tvb_get_guint8(tvb, vector_offset);
 1160    proto_tree_add_uint(pdu_tree, hf_acn_dmp_vector, tvb, vector_offset, 1, vector);
 1161   
 1162    /* Add Vector item to tree*/
 1163    name = val_to_str(vector, acn_dmp_vector_vals, "not valid (%d)");
 1164    proto_item_append_text(ti, ": ");
 1165    proto_item_append_text(ti, "%s", name);
 1166   
 1167    /* Set header offset */
 1168    if (pdu_flags & ACN_PDU_FLAG_H) {
 1169      /* use new values */
 1170      header_offset = offset;
 1171      last_pdu_offsets->header = offset;
 1172      offset++;
 1173      pdu_flvh_length++;
 1174    } else {
 1175      /* use last values */
 1176      header_offset = last_pdu_offsets->header;
 1177    }
 1178    /* offset should now be pointing to data (if one exists) */
 1179   
 1180    /* header contains address and data type */
 1181    acn_add_dmp_address_type(tvb, pinfo, pdu_tree, header_offset, &adt);
 1182   
 1183    /* Adjust data */
 1184    if (pdu_flags & ACN_PDU_FLAG_D) {
 1185      /* use new values */
 1186      data_offset = offset;
 1187      data_length = pdu_length - pdu_flvh_length;
 1188      last_pdu_offsets->data = offset;
 1189      last_pdu_offsets->data_length = data_length;
 1190    } else {
 1191      /* use last values */
 1192      data_offset = last_pdu_offsets->data;
 1193      data_length = last_pdu_offsets->data_length;
 1194    }
 1195    end_offset = data_offset + data_length;
 1196   
 1197    switch (vector) {
 1198    case ACN_DMP_VECTOR_UNKNOWN:
 1199      break;
 1200    case ACN_DMP_VECTOR_GET_PROPERTY:
 1201      /* Rip trough property address */
 1202      while (data_offset < end_offset) {
 1203        old_offset = data_offset;
 1204        data_offset = acn_add_dmp_address(tvb, pinfo, pdu_tree, data_offset, &adt);
 1205        if (old_offset == data_offset) break;
 1206      }
 1207      break;
 1208    case ACN_DMP_VECTOR_SET_PROPERTY:
 1209      /* Rip through Property Address-Data pairs                                 */
 1210      /* But, in reality, this generally won't work as we have know way of       */
 1211      /* calculating the next Address-Data pair                                  */
 1212      while (data_offset < end_offset) {
 1213        old_offset = data_offset;
 1214        data_offset = acn_add_dmp_address(tvb, pinfo, pdu_tree, data_offset, &adt);
 1215        if (old_offset == data_offset) break;
 1216   
 1217        adt.data_length = data_length - (data_offset - old_offset);
 1218        old_offset = data_offset;
 1219        data_offset = acn_add_dmp_data(tvb, pinfo, pdu_tree, data_offset, &adt);
 1220        if (old_offset == data_offset) break;
 1221      }
 1222      break;
 1223    case ACN_DMP_VECTOR_GET_PROPERTY_REPLY:
 1224      /* Rip through Property Address-Data pairs */
 1225      /* But, in reality, this generally won't work as we have know way of       */
 1226      /* calculating the next Address-Data pair                                  */
 1227      while (data_offset < end_offset) {
 1228        old_offset = data_offset;
 1229        data_offset = acn_add_dmp_address(tvb, pinfo, pdu_tree, data_offset, &adt);
 1230        if (old_offset == data_offset) break;
 1231   
 1232        adt.data_length = data_length - (data_offset - old_offset);
 1233        old_offset = data_offset;
 1234        data_offset = acn_add_dmp_data(tvb, pinfo, pdu_tree, data_offset, &adt);
 1235        if (old_offset == data_offset) break;
 1236      }
 1237      break;
 1238    case ACN_DMP_VECTOR_EVENT:
 1239      /* Rip through Property Address-Data pairs */
 1240      /* But, in reality, this generally won't work as we have know way of       */
 1241      /* calculating the next Address-Data pair                                  */
 1242      while (data_offset < end_offset) {
 1243        old_offset = data_offset;
 1244        data_offset = acn_add_dmp_address(tvb, pinfo, pdu_tree, data_offset, &adt);
 1245        if (old_offset == data_offset) break;
 1246   
 1247        adt.data_length = data_length - (data_offset - old_offset);
 1248        old_offset = data_offset;
 1249        data_offset = acn_add_dmp_data(tvb, pinfo, pdu_tree, data_offset, &adt);
 1250        if (old_offset == data_offset) break;
 1251      }
 1252      break;
 1253    case ACN_DMP_VECTOR_MAP_PROPERTY:
 1254      /* Virtual Address type */
 1255      data_offset = acn_add_dmp_address_type(tvb, pinfo, pdu_tree, data_offset, &adt2);
 1256      /* Rip through Actual-Virtual Address Pairs */
 1257      while (data_offset < end_offset) {
 1258        /* actual */
 1259        old_offset = data_offset;
 1260        data_offset = acn_add_dmp_address(tvb, pinfo, pdu_tree, data_offset, &adt);
 1261        if (old_offset == data_offset) break;
 1262        D = ACN_DMP_ADT_EXTRACT_D(adt.flags);
 1263        switch (D) {
 1264          case ACN_DMP_ADT_D_NS:
 1265            address_count = 1;
 1266            break;
 1267          case ACN_DMP_ADT_D_RS:
 1268            address_count = 1;
 1269            break;
 1270          case ACN_DMP_ADT_D_RE:
 1271            address_count = adt.count;
 1272            break;
 1273          /*case ACN_DMP_ADT_D_RM: */
 1274          default:
 1275            /* OUCH */
 1276            return pdu_start + pdu_length;
 1277            break;
 1278        }
 1279   
 1280        /* virtual */
 1281        while (address_count > 0) {
 1282          data_offset = acn_add_dmp_address(tvb, pinfo, pdu_tree, data_offset, &adt2);
 1283          address_count--;
 1284        }
 1285      }
 1286      break;
 1287    case ACN_DMP_VECTOR_UNMAP_PROPERTY:
 1288      /* Rip trough Actaul Proptery Address */
 1289      while (data_offset < end_offset) {
 1290        old_offset = data_offset;
 1291        data_offset = acn_add_dmp_address(tvb, pinfo, pdu_tree, data_offset, &adt);
 1292        if (old_offset == data_offset) break;
 1293      }
 1294      break;
 1295    case ACN_DMP_VECTOR_SUBSCRIBE:
 1296      /* Rip trough Proptery Address */
 1297      while (data_offset < end_offset) {
 1298        old_offset = data_offset;
 1299        data_offset = acn_add_dmp_address(tvb, pinfo, pdu_tree, data_offset, &adt);
 1300        if (old_offset == data_offset) break;
 1301      }
 1302      break;
 1303    case ACN_DMP_VECTOR_UNSUBSCRIBE:
 1304      /* Rip trough Proptery Address */
 1305      while (data_offset < end_offset) {
 1306        old_offset = data_offset;
 1307        data_offset = acn_add_dmp_address(tvb, pinfo, pdu_tree, data_offset, &adt);
 1308        if (old_offset == data_offset) break;
 1309      }
 1310      break;
 1311    case ACN_DMP_VECTOR_GET_PROPERTY_FAIL:
 1312      /* Rip trough Address-Reason Code Pairs */
 1313      while (data_offset < end_offset) {
 1314        old_offset = data_offset;
 1315        data_offset = acn_add_dmp_address(tvb, pinfo, pdu_tree, data_offset, &adt);
 1316        if (old_offset == data_offset) break;
 1317   
 1318        adt.data_length = data_length - (data_offset - old_offset);
 1319        old_offset = data_offset;
 1320        data_offset = acn_add_dmp_reason_codes(tvb, pinfo, pdu_tree, data_offset, &adt);
 1321        if (old_offset == data_offset) break;
 1322      }
 1323      break;
 1324    case ACN_DMP_VECTOR_SET_PROPERTY_FAIL:
 1325      /* Rip trough Address-Reason Code Pairs */
 1326      while (data_offset < end_offset) {
 1327        old_offset = data_offset;
 1328        data_offset = acn_add_dmp_address(tvb, pinfo, pdu_tree, data_offset, &adt);
 1329        if (old_offset == data_offset) break;
 1330   
 1331        adt.data_length = data_length - (data_offset - old_offset);
 1332        old_offset = data_offset;
 1333        data_offset = acn_add_dmp_reason_codes(tvb, pinfo, pdu_tree, data_offset, &adt);
 1334        if (old_offset == data_offset) break;
 1335      }
 1336      break;
 1337    case ACN_DMP_VECTOR_MAP_PROPERTY_FAIL:
 1338      /* Rip trough Address-Reason Code Pairs */
 1339      while (data_offset < end_offset) {
 1340        old_offset = data_offset;
 1341        data_offset = acn_add_dmp_address(tvb, pinfo, pdu_tree, data_offset, &adt);
 1342        if (old_offset == data_offset) break;
 1343   
 1344        adt.data_length = data_length - (data_offset - old_offset);
 1345        old_offset = data_offset;
 1346        data_offset = acn_add_dmp_reason_codes(tvb, pinfo, pdu_tree, data_offset, &adt);
 1347        if (old_offset == data_offset) break;
 1348      }
 1349      break;
 1350    case ACN_DMP_VECTOR_SUBSCRIBE_ACCEPT:
 1351      /* Rip through Property Addrsses */
 1352      while (data_offset < end_offset) {
 1353        old_offset = data_offset;
 1354        data_offset = acn_add_dmp_address(tvb, pinfo, pdu_tree, data_offset, &adt);
 1355        if (old_offset == data_offset) break;
 1356      }
 1357      break;
 1358    case ACN_DMP_VECTOR_SUBSCRIBE_REJECT:
 1359      /* Rip trough Address-Reason Code Pairs */
 1360      while (data_offset < end_offset) {
 1361        old_offset = data_offset;
 1362        data_offset = acn_add_dmp_address(tvb, pinfo, pdu_tree, data_offset, &adt);
 1363        if (old_offset == data_offset) break;
 1364   
 1365        adt.data_length = data_length - (data_offset - old_offset);
 1366        old_offset = data_offset;
 1367        data_offset = acn_add_dmp_reason_codes(tvb, pinfo, pdu_tree, data_offset, &adt);
 1368        if (old_offset == data_offset) break;
 1369      }
 1370      break;
 1371    case ACN_DMP_VECTOR_ALLOCATE_MAP:
 1372      /* No data for this */
 1373      break;
 1374    case ACN_DMP_VECTOR_ALLOCATE_MAP_REPLY:
 1375      /* Single reason code  */
 1376      proto_tree_add_item(pdu_tree, hf_acn_dmp_reason_code, tvb, data_offset, 1, FALSE);
 1377      data_offset++;
 1378    case ACN_DMP_VECTOR_DEALLOCATE_MAP:
 1379      /* No data for this */
 1380      break;
 1381    }
 1382   
 1383    return pdu_start + pdu_length;
 1384  }
Show more  




Change Warning 1822.32744 : Unreachable Control Flow

Priority:
State:
Finding:
Owner:
Note: