@@ -379,8 +379,8 @@ void insn_get_displacement(struct insn *insn)
379
379
return ;
380
380
}
381
381
382
- /* Decode moffset16/32/64 */
383
- static void __get_moffset (struct insn * insn )
382
+ /* Decode moffset16/32/64. Return 0 if failed */
383
+ static int __get_moffset (struct insn * insn )
384
384
{
385
385
switch (insn -> addr_bytes ) {
386
386
case 2 :
@@ -397,15 +397,19 @@ static void __get_moffset(struct insn *insn)
397
397
insn -> moffset2 .value = get_next (int , insn );
398
398
insn -> moffset2 .nbytes = 4 ;
399
399
break ;
400
+ default : /* opnd_bytes must be modified manually */
401
+ goto err_out ;
400
402
}
401
403
insn -> moffset1 .got = insn -> moffset2 .got = 1 ;
402
404
405
+ return 1 ;
406
+
403
407
err_out :
404
- return ;
408
+ return 0 ;
405
409
}
406
410
407
- /* Decode imm v32(Iz) */
408
- static void __get_immv32 (struct insn * insn )
411
+ /* Decode imm v32(Iz). Return 0 if failed */
412
+ static int __get_immv32 (struct insn * insn )
409
413
{
410
414
switch (insn -> opnd_bytes ) {
411
415
case 2 :
@@ -417,14 +421,18 @@ static void __get_immv32(struct insn *insn)
417
421
insn -> immediate .value = get_next (int , insn );
418
422
insn -> immediate .nbytes = 4 ;
419
423
break ;
424
+ default : /* opnd_bytes must be modified manually */
425
+ goto err_out ;
420
426
}
421
427
428
+ return 1 ;
429
+
422
430
err_out :
423
- return ;
431
+ return 0 ;
424
432
}
425
433
426
- /* Decode imm v64(Iv/Ov) */
427
- static void __get_immv (struct insn * insn )
434
+ /* Decode imm v64(Iv/Ov), Return 0 if failed */
435
+ static int __get_immv (struct insn * insn )
428
436
{
429
437
switch (insn -> opnd_bytes ) {
430
438
case 2 :
@@ -441,15 +449,18 @@ static void __get_immv(struct insn *insn)
441
449
insn -> immediate2 .value = get_next (int , insn );
442
450
insn -> immediate2 .nbytes = 4 ;
443
451
break ;
452
+ default : /* opnd_bytes must be modified manually */
453
+ goto err_out ;
444
454
}
445
455
insn -> immediate1 .got = insn -> immediate2 .got = 1 ;
446
456
457
+ return 1 ;
447
458
err_out :
448
- return ;
459
+ return 0 ;
449
460
}
450
461
451
462
/* Decode ptr16:16/32(Ap) */
452
- static void __get_immptr (struct insn * insn )
463
+ static int __get_immptr (struct insn * insn )
453
464
{
454
465
switch (insn -> opnd_bytes ) {
455
466
case 2 :
@@ -462,14 +473,17 @@ static void __get_immptr(struct insn *insn)
462
473
break ;
463
474
case 8 :
464
475
/* ptr16:64 is not exist (no segment) */
465
- return ;
476
+ return 0 ;
477
+ default : /* opnd_bytes must be modified manually */
478
+ goto err_out ;
466
479
}
467
480
insn -> immediate2 .value = get_next (unsigned short , insn );
468
481
insn -> immediate2 .nbytes = 2 ;
469
482
insn -> immediate1 .got = insn -> immediate2 .got = 1 ;
470
483
484
+ return 1 ;
471
485
err_out :
472
- return ;
486
+ return 0 ;
473
487
}
474
488
475
489
/**
@@ -489,7 +503,8 @@ void insn_get_immediate(struct insn *insn)
489
503
insn_get_displacement (insn );
490
504
491
505
if (inat_has_moffset (insn -> attr )) {
492
- __get_moffset (insn );
506
+ if (!__get_moffset (insn ))
507
+ goto err_out ;
493
508
goto done ;
494
509
}
495
510
@@ -517,16 +532,20 @@ void insn_get_immediate(struct insn *insn)
517
532
insn -> immediate2 .nbytes = 4 ;
518
533
break ;
519
534
case INAT_IMM_PTR :
520
- __get_immptr (insn );
535
+ if (!__get_immptr (insn ))
536
+ goto err_out ;
521
537
break ;
522
538
case INAT_IMM_VWORD32 :
523
- __get_immv32 (insn );
539
+ if (!__get_immv32 (insn ))
540
+ goto err_out ;
524
541
break ;
525
542
case INAT_IMM_VWORD :
526
- __get_immv (insn );
543
+ if (!__get_immv (insn ))
544
+ goto err_out ;
527
545
break ;
528
546
default :
529
- break ;
547
+ /* Here, insn must have an immediate, but failed */
548
+ goto err_out ;
530
549
}
531
550
if (inat_has_second_immediate (insn -> attr )) {
532
551
insn -> immediate2 .value = get_next (char , insn );
0 commit comments