|
Lines 3423-3428
Link Here
|
| 3423 |
} |
3423 |
} |
| 3424 |
|
3424 |
|
| 3425 |
|
3425 |
|
|
|
3426 |
/* krellan: Linux 2.6.29 compatibility functions for capabilities */ |
| 3427 |
/* Errors are logged but otherwise ignored */ |
| 3428 |
|
| 3429 |
void compat_cap_raise(int cap) |
| 3430 |
{ |
| 3431 |
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 29) |
| 3432 |
cap_raise(current->cap_effective, cap); |
| 3433 |
#else |
| 3434 |
struct cred *new_cred; |
| 3435 |
|
| 3436 |
new_cred = prepare_creds(); |
| 3437 |
if (new_cred != NULL) |
| 3438 |
{ |
| 3439 |
cap_raise(new_cred->cap_effective, cap); |
| 3440 |
commit_creds(new_cred); |
| 3441 |
} |
| 3442 |
else |
| 3443 |
{ |
| 3444 |
Log("compat_cap_raise(%d) prepare_creds(): Out of memory\n", cap); |
| 3445 |
} |
| 3446 |
#endif |
| 3447 |
} |
| 3448 |
|
| 3449 |
void compat_cap_lower(int cap) |
| 3450 |
{ |
| 3451 |
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 29) |
| 3452 |
cap_lower(current->cap_effective, cap); |
| 3453 |
#else |
| 3454 |
struct cred *new_cred; |
| 3455 |
|
| 3456 |
new_cred = prepare_creds(); |
| 3457 |
if (new_cred != NULL) |
| 3458 |
{ |
| 3459 |
cap_lower(new_cred->cap_effective, cap); |
| 3460 |
commit_creds(new_cred); |
| 3461 |
} |
| 3462 |
else |
| 3463 |
{ |
| 3464 |
Log("compat_cap_lower(%d) prepare_creds(): Out of memory\n", cap); |
| 3465 |
} |
| 3466 |
#endif |
| 3467 |
} |
| 3468 |
|
| 3469 |
int compat_cap_raised(int cap) |
| 3470 |
{ |
| 3471 |
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 29) |
| 3472 |
return cap_raised(current->cap_effective, cap); |
| 3473 |
#else |
| 3474 |
return cap_raised(current_cap(), cap); |
| 3475 |
#endif |
| 3476 |
} |
| 3477 |
|
| 3478 |
int compat_get_fsuid(void) |
| 3479 |
{ |
| 3480 |
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 29) |
| 3481 |
return current->fsuid; |
| 3482 |
#else |
| 3483 |
return current_fsuid(); |
| 3484 |
#endif |
| 3485 |
} |
| 3486 |
|
| 3487 |
void compat_set_fsuid(int fsuid) |
| 3488 |
{ |
| 3489 |
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 29) |
| 3490 |
current->fsuid = fsuid; |
| 3491 |
#else |
| 3492 |
struct cred *new_cred; |
| 3493 |
|
| 3494 |
new_cred = prepare_creds(); |
| 3495 |
if (new_cred != NULL) |
| 3496 |
{ |
| 3497 |
new_cred->fsuid = fsuid; |
| 3498 |
commit_creds(new_cred); |
| 3499 |
} |
| 3500 |
else |
| 3501 |
{ |
| 3502 |
Log("compat_set_fsuid(%d) prepare_creds(): Out of memory\n", fsuid); |
| 3503 |
} |
| 3504 |
#endif |
| 3505 |
} |
| 3506 |
|
| 3507 |
|
| 3426 |
/* |
3508 |
/* |
| 3427 |
*---------------------------------------------------------------------- |
3509 |
*---------------------------------------------------------------------- |
| 3428 |
* |
3510 |
* |
|
Lines 3455-3461
Link Here
|
| 3455 |
oldFS = get_fs(); |
3537 |
oldFS = get_fs(); |
| 3456 |
set_fs(KERNEL_DS); |
3538 |
set_fs(KERNEL_DS); |
| 3457 |
compat_allow_signal(SIGKILL); |
3539 |
compat_allow_signal(SIGKILL); |
| 3458 |
cap_raise(current->cap_effective, CAP_SYS_RESOURCE); |
3540 |
compat_cap_raise(CAP_SYS_RESOURCE); |
| 3459 |
compat_set_user_nice(current, linuxState.fastClockPriority); |
3541 |
compat_set_user_nice(current, linuxState.fastClockPriority); |
| 3460 |
|
3542 |
|
| 3461 |
while (linuxState.fastClockRate > HZ + HZ/16) { |
3543 |
while (linuxState.fastClockRate > HZ + HZ/16) { |
|
Lines 3579-3597
Link Here
|
| 3579 |
Bool cap; |
3661 |
Bool cap; |
| 3580 |
long pid; |
3662 |
long pid; |
| 3581 |
|
3663 |
|
| 3582 |
fsuid = current->fsuid; |
3664 |
fsuid = compat_get_fsuid(); |
| 3583 |
current->fsuid = 0; |
3665 |
compat_set_fsuid(0); |
| 3584 |
filp = filp_open("/dev/rtc", O_RDONLY, 0); |
3666 |
filp = filp_open("/dev/rtc", O_RDONLY, 0); |
| 3585 |
current->fsuid = fsuid; |
3667 |
compat_set_fsuid(fsuid); |
| 3586 |
if (IS_ERR(filp)) { |
3668 |
if (IS_ERR(filp)) { |
| 3587 |
Warning("/dev/rtc open failed: %d\n", (int)(VA)filp); |
3669 |
Warning("/dev/rtc open failed: %d\n", (int)(VA)filp); |
| 3588 |
return -(int)(VA)filp; |
3670 |
return -(int)(VA)filp; |
| 3589 |
} |
3671 |
} |
| 3590 |
cap = cap_raised(current->cap_effective, CAP_SYS_RESOURCE); |
3672 |
cap = compat_cap_raised(CAP_SYS_RESOURCE); |
| 3591 |
cap_raise(current->cap_effective, CAP_SYS_RESOURCE); |
3673 |
compat_cap_raise(CAP_SYS_RESOURCE); |
| 3592 |
res = HostIFDoIoctl(filp, RTC_PIE_ON, 0); |
3674 |
res = HostIFDoIoctl(filp, RTC_PIE_ON, 0); |
| 3593 |
if (!cap) { |
3675 |
if (!cap) { |
| 3594 |
cap_lower(current->cap_effective, CAP_SYS_RESOURCE); |
3676 |
compat_cap_lower(CAP_SYS_RESOURCE); |
| 3595 |
} |
3677 |
} |
| 3596 |
if (res < 0) { |
3678 |
if (res < 0) { |
| 3597 |
Warning("/dev/rtc enable interrupt failed: %d\n", res); |
3679 |
Warning("/dev/rtc enable interrupt failed: %d\n", res); |