@@ -362,10 +362,10 @@ static void __kprobes resume_execution(struct kprobe *p,
362
362
struct pt_regs * regs , struct kprobe_ctlblk * kcb )
363
363
{
364
364
unsigned long * tos = (unsigned long * )& regs -> esp ;
365
- unsigned long next_eip = 0 ;
366
365
unsigned long copy_eip = (unsigned long )p -> ainsn .insn ;
367
366
unsigned long orig_eip = (unsigned long )p -> addr ;
368
367
368
+ regs -> eflags &= ~TF_MASK ;
369
369
switch (p -> ainsn .insn [0 ]) {
370
370
case 0x9c : /* pushfl */
371
371
* tos &= ~(TF_MASK | IF_MASK );
@@ -375,37 +375,31 @@ static void __kprobes resume_execution(struct kprobe *p,
375
375
case 0xcb :
376
376
case 0xc2 :
377
377
case 0xca :
378
- regs -> eflags &= ~ TF_MASK ;
379
- /* eip is already adjusted, no more changes required*/
380
- return ;
378
+ case 0xea : /* jmp absolute -- eip is correct */
379
+ /* eip is already adjusted, no more changes required */
380
+ goto no_change ;
381
381
case 0xe8 : /* call relative - Fix return addr */
382
382
* tos = orig_eip + (* tos - copy_eip );
383
383
break ;
384
384
case 0xff :
385
385
if ((p -> ainsn .insn [1 ] & 0x30 ) == 0x10 ) {
386
386
/* call absolute, indirect */
387
387
/* Fix return addr; eip is correct. */
388
- next_eip = regs -> eip ;
389
388
* tos = orig_eip + (* tos - copy_eip );
389
+ goto no_change ;
390
390
} else if (((p -> ainsn .insn [1 ] & 0x31 ) == 0x20 ) || /* jmp near, absolute indirect */
391
391
((p -> ainsn .insn [1 ] & 0x31 ) == 0x21 )) { /* jmp far, absolute indirect */
392
392
/* eip is correct. */
393
- next_eip = regs -> eip ;
393
+ goto no_change ;
394
394
}
395
- break ;
396
- case 0xea : /* jmp absolute -- eip is correct */
397
- next_eip = regs -> eip ;
398
- break ;
399
395
default :
400
396
break ;
401
397
}
402
398
403
- regs -> eflags &= ~TF_MASK ;
404
- if (next_eip ) {
405
- regs -> eip = next_eip ;
406
- } else {
407
- regs -> eip = orig_eip + (regs -> eip - copy_eip );
408
- }
399
+ regs -> eip = orig_eip + (regs -> eip - copy_eip );
400
+
401
+ no_change :
402
+ return ;
409
403
}
410
404
411
405
/*
0 commit comments