diff -ru schroot-1.1.5/sbuild/sbuild-lock.cc schroot-1.1.5.centos/sbuild/sbuild-lock.cc --- schroot-1.1.5/sbuild/sbuild-lock.cc 2007-07-08 11:23:29.000000000 +0200 +++ schroot-1.1.5.centos/sbuild/sbuild-lock.cc 2007-09-11 10:33:36.000000000 +0200 @@ -251,7 +251,16 @@ if (locked) { pid_t status = 0; + uid_t olduid; + gid_t oldgid; + olduid = getuid(); + oldgid = getgid(); + setuid(0); + setgid(0); status = dev_unlock(this->device.c_str(), getpid()); + setreuid(olduid,0); + setregid(oldgid,0); + if (status < 0) // Failure log_exception_warning(error(DEVICE_UNLOCK)); } @@ -265,7 +274,13 @@ { lock_timeout = false; + uid_t olduid; + gid_t oldgid; struct itimerval timeout_timer; + + olduid = getuid(); + oldgid = getgid(); + timeout_timer.it_interval.tv_sec = timeout_timer.it_interval.tv_usec = 0; timeout_timer.it_value.tv_sec = timeout; timeout_timer.it_value.tv_usec = 0; @@ -282,7 +297,11 @@ { if (lock_type == LOCK_SHARED || lock_type == LOCK_EXCLUSIVE) { + setuid(0); + setgid(0); status = dev_lock(this->device.c_str()); + setreuid(olduid,0); + setregid(oldgid,0); if (status == 0) // Success { this->locked = true; @@ -295,7 +314,13 @@ } else { - pid_t cur_lock_pid = dev_testlock(this->device.c_str()); + pid_t cur_lock_pid; + setuid(0); + setgid(0); + cur_lock_pid = dev_testlock(this->device.c_str()); + setreuid(olduid,0); + setregid(oldgid,0); + if (cur_lock_pid < 0) // Test failure { throw error(DEVICE_TEST); @@ -306,7 +331,11 @@ // "drop" our nonexistent lock. break; } + setuid(0); + setgid(0); status = dev_unlock(this->device.c_str(), getpid()); + setreuid(olduid,0); + setregid(oldgid,0); if (status == 0) // Success { this->locked = false;