| 1416 | } |
| 1417 | |
| 1418 | bool DexFileVerifier::CheckIntraDebugInfoItem() { |
| 1419 | DECODE_UNSIGNED_CHECKED_FROM(ptr_, dummy); |
| 1420 | DECODE_UNSIGNED_CHECKED_FROM(ptr_, parameters_size); |
| 1421 | if (UNLIKELY(parameters_size > 65536)) { |
| 1422 | ErrorStringPrintf("Invalid parameters_size: %x", parameters_size); |
| 1423 | return false; |
| 1424 | } |
| 1425 | |
| 1426 | for (uint32_t j = 0; j < parameters_size; j++) { |
| 1427 | DECODE_UNSIGNED_CHECKED_FROM(ptr_, parameter_name); |
| 1428 | if (parameter_name != 0) { |
| 1429 | parameter_name--; |
| 1430 | if (!CheckIndex(parameter_name, header_->string_ids_size_, "debug_info_item parameter_name")) { |
| 1431 | return false; |
| 1432 | } |
| 1433 | } |
| 1434 | } |
| 1435 | |
| 1436 | while (true) { |
| 1437 | uint8_t opcode = *(ptr_++); |
| 1438 | switch (opcode) { |
| 1439 | case DexFile::DBG_END_SEQUENCE: { |
| 1440 | return true; |
| 1441 | } |
| 1442 | case DexFile::DBG_ADVANCE_PC: { |
| 1443 | DECODE_UNSIGNED_CHECKED_FROM(ptr_, advance_pc_dummy); |
| 1444 | break; |
| 1445 | } |
| 1446 | case DexFile::DBG_ADVANCE_LINE: { |
| 1447 | DECODE_SIGNED_CHECKED_FROM(ptr_, advance_line_dummy); |
| 1448 | break; |
| 1449 | } |
| 1450 | case DexFile::DBG_START_LOCAL: { |
| 1451 | DECODE_UNSIGNED_CHECKED_FROM(ptr_, reg_num); |
| 1452 | if (UNLIKELY(reg_num >= 65536)) { |
| 1453 | ErrorStringPrintf("Bad reg_num for opcode %x", opcode); |
| 1454 | return false; |
| 1455 | } |
| 1456 | DECODE_UNSIGNED_CHECKED_FROM(ptr_, name_idx); |
| 1457 | if (name_idx != 0) { |
| 1458 | name_idx--; |
| 1459 | if (!CheckIndex(name_idx, header_->string_ids_size_, "DBG_START_LOCAL name_idx")) { |
| 1460 | return false; |
| 1461 | } |
| 1462 | } |
| 1463 | DECODE_UNSIGNED_CHECKED_FROM(ptr_, type_idx); |
| 1464 | if (type_idx != 0) { |
| 1465 | type_idx--; |
| 1466 | if (!CheckIndex(type_idx, header_->type_ids_size_, "DBG_START_LOCAL type_idx")) { |
| 1467 | return false; |
| 1468 | } |
| 1469 | } |
| 1470 | break; |
| 1471 | } |
| 1472 | case DexFile::DBG_END_LOCAL: |
| 1473 | case DexFile::DBG_RESTART_LOCAL: { |
| 1474 | DECODE_UNSIGNED_CHECKED_FROM(ptr_, reg_num); |
| 1475 | if (UNLIKELY(reg_num >= 65536)) { |
nothing calls this directly
no outgoing calls
no test coverage detected