diff -u sysvinit-2.88dsf/src/killall5.c sysvinit-2.88dsf/src/killall5.c --- sysvinit-2.88dsf/src/killall5.c 2011-12-03 23:12:52.373139250 +0100 +++ sysvinit-2.88dsf/src/killall5.c 2011-12-03 23:19:21.498025134 +0100 @@ -479,6 +479,7 @@ if (p->argv1) free(p->argv1); if (p->statname) free(p->statname); if (p->pathname) free(p->pathname); + if (p->statname) free(p->statname); free(p); } plist = NULL; @@ -496,7 +497,7 @@ /* Open the status file. */ snprintf(path, sizeof(path), "%s/stat", d->d_name); - /* Read SID & statname from it. */ + /* Read statname from it. */ if ((fp = fopen(path, "r")) != NULL) { buf[0] = 0; fgets(buf, sizeof(buf), fp); @@ -509,7 +510,6 @@ /* Read program name. */ q = strrchr(buf, ')'); if (q == NULL) { - p->sid = 0; nsyslog(LOG_ERR, "can't get program name from /proc/%s\n", path); @@ -517,6 +517,7 @@ if (p->argv1) free(p->argv1); if (p->statname) free(p->statname); free(p); + fclose(fp); continue; } s++; @@ -531,23 +532,26 @@ /* Get session, startcode, endcode. */ startcode = endcode = 0; - if (sscanf(q, "%*c %*d %*d %d %*d %*d %*u %*u " + if (sscanf(q, "%*c %*d %*d %*d %*d %*d %*u %*u " "%*u %*u %*u %*u %*u %*d %*d " "%*d %*d %*d %*d %*u %*u %*d " "%*u %lu %lu", - &p->sid, &startcode, &endcode) != 3) { + &startcode, &endcode) == 2) { + if (startcode == 0 && endcode == 0) + p->kernel = 1; + } + fclose(fp); + p->sid = getsid(pid); + if (p->sid < 0) { p->sid = 0; - nsyslog(LOG_ERR, "can't read sid from %s\n", - path); + nsyslog(LOG_ERR, "can't read sid for pid %d\n", pid); + free(p->statname); if (p->argv0) free(p->argv0); if (p->argv1) free(p->argv1); if (p->statname) free(p->statname); free(p); continue; } - if (startcode == 0 && endcode == 0) - p->kernel = 1; - fclose(fp); } else { /* Process disappeared.. */ if (p->argv0) free(p->argv0);