Lines 1442-1447
Link Here
|
1442 |
{ |
1442 |
{ |
1443 |
int err; |
1443 |
int err; |
1444 |
|
1444 |
|
|
|
1445 |
do { /* PaX: libffi trampoline emulation */ |
1446 |
unsigned char mov, jmp; |
1447 |
unsigned int addr1, addr2; |
1448 |
|
1449 |
#ifdef CONFIG_X86_64 |
1450 |
if ((regs->ip + 9) >> 32) |
1451 |
break; |
1452 |
#endif |
1453 |
|
1454 |
err = get_user(mov, (unsigned char __user *)regs->ip); |
1455 |
err |= get_user(addr1, (unsigned int __user *)(regs->ip + 1)); |
1456 |
err |= get_user(jmp, (unsigned char __user *)(regs->ip + 5)); |
1457 |
err |= get_user(addr2, (unsigned int __user *)(regs->ip + 6)); |
1458 |
|
1459 |
if (err) |
1460 |
break; |
1461 |
|
1462 |
if (mov == 0xB8 && jmp == 0xE9) { |
1463 |
regs->ax = addr1; |
1464 |
regs->ip = (unsigned int)(regs->ip + addr2 + 10); |
1465 |
return 2; |
1466 |
} |
1467 |
} while (0); |
1468 |
|
1445 |
do { /* PaX: gcc trampoline emulation #1 */ |
1469 |
do { /* PaX: gcc trampoline emulation #1 */ |
1446 |
unsigned char mov1, mov2; |
1470 |
unsigned char mov1, mov2; |
1447 |
unsigned short jmp; |
1471 |
unsigned short jmp; |
Lines 1501-1506
Link Here
|
1501 |
{ |
1525 |
{ |
1502 |
int err; |
1526 |
int err; |
1503 |
|
1527 |
|
|
|
1528 |
do { /* PaX: libffi trampoline emulation */ |
1529 |
unsigned short mov1, mov2, jmp1; |
1530 |
unsigned char stcclc, jmp2; |
1531 |
unsigned long addr1, addr2; |
1532 |
|
1533 |
err = get_user(mov1, (unsigned short __user *)regs->ip); |
1534 |
err |= get_user(addr1, (unsigned long __user *)(regs->ip + 2)); |
1535 |
err |= get_user(mov2, (unsigned short __user *)(regs->ip + 10)); |
1536 |
err |= get_user(addr2, (unsigned long __user *)(regs->ip + 12)); |
1537 |
err |= get_user(stcclc, (unsigned char __user *)(regs->ip + 20)); |
1538 |
err |= get_user(jmp1, (unsigned short __user *)(regs->ip + 21)); |
1539 |
err |= get_user(jmp2, (unsigned char __user *)(regs->ip + 23)); |
1540 |
|
1541 |
if (err) |
1542 |
break; |
1543 |
|
1544 |
if (mov1 == 0xBB49 && mov2 == 0xBA49 && (stcclc == 0xF8 || stcclc == 0xF9) && jmp1 == 0xFF49 && jmp2 == 0xE3) { |
1545 |
regs->r11 = addr1; |
1546 |
regs->r10 = addr2; |
1547 |
if (stcclc == 0xF8) |
1548 |
regs->flags &= ~X86_EFLAGS_CF; |
1549 |
else |
1550 |
regs->flags |= X86_EFLAGS_CF; |
1551 |
regs->ip = addr1; |
1552 |
return 2; |
1553 |
} |
1554 |
} while (0); |
1555 |
|
1504 |
do { /* PaX: gcc trampoline emulation #1 */ |
1556 |
do { /* PaX: gcc trampoline emulation #1 */ |
1505 |
unsigned short mov1, mov2, jmp1; |
1557 |
unsigned short mov1, mov2, jmp1; |
1506 |
unsigned char jmp2; |
1558 |
unsigned char jmp2; |