summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kinit/start_kdeinit.c21
1 files changed, 20 insertions, 1 deletions
diff --git a/kinit/start_kdeinit.c b/kinit/start_kdeinit.c
index 722f3e97f..a86b366e5 100644
--- a/kinit/start_kdeinit.c
+++ b/kinit/start_kdeinit.c
@@ -44,11 +44,30 @@ static int set_protection( pid_t pid, int enable )
{
char buf[ 1024 ];
int procfile;
+ struct stat st;
+
+ /* Newer kernels (noticed in 2.6.36) */
+ sprintf( buf, "/proc/%d/oom_score_adj", pid );
+ if ( lstat (buf, &st) == 0) {
+ if( !enable ) {
+ /* Be paranoid and check that the pid we got from the pipe
+ belongs to this user. */
+ if( st.st_uid != getuid())
+ return 0;
+ }
+ procfile = open(buf, O_WRONLY);
+ if( enable )
+ write( procfile, "-300", sizeof( "-300" ));
+ else
+ write( procfile, "0", sizeof( "0" ));
+ close( procfile );
+ return 1;
+ }
+
sprintf( buf, "/proc/%d/stat", pid );
if( !enable ) {
/* Be paranoid and check that the pid we got from the pipe
belongs to this user. */
- struct stat st;
if( lstat( buf, &st ) < 0 || st.st_uid != getuid())
return 0;
}