diff options
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | kill.c | 5 | ||||
-rw-r--r-- | procps/kill.c | 5 | ||||
-rw-r--r-- | utility.c | 30 |
4 files changed, 34 insertions, 8 deletions
@@ -26,7 +26,7 @@ export VERSION # Set the following to `true' to make a debuggable build. # Leave this set to `false' for production use. # eg: `make DODEBUG=true tests' -DODEBUG = false +DODEBUG = true # If you want a static binary, turn this on. DOSTATIC = false @@ -222,12 +222,15 @@ extern int kill_main(int argc, char **argv) } #ifdef BB_KILLALL else { + pid_t myPid=getpid(); /* Looks like they want to do a killall. Do that */ while (--argc >= 0) { pid_t* pidList; pidList = findPidByName( *argv); - for(; pidList && pidList!=0; pidList++) { + for(; pidList && *pidList!=0; pidList++) { + if (*pidList==myPid) + continue; if (kill(*pidList, sig) != 0) fatalError( "Could not kill pid '%d': %s\n", *pidList, strerror(errno)); } diff --git a/procps/kill.c b/procps/kill.c index db4842457..93f02eab4 100644 --- a/procps/kill.c +++ b/procps/kill.c @@ -222,12 +222,15 @@ extern int kill_main(int argc, char **argv) } #ifdef BB_KILLALL else { + pid_t myPid=getpid(); /* Looks like they want to do a killall. Do that */ while (--argc >= 0) { pid_t* pidList; pidList = findPidByName( *argv); - for(; pidList && pidList!=0; pidList++) { + for(; pidList && *pidList!=0; pidList++) { + if (*pidList==myPid) + continue; if (kill(*pidList, sig) != 0) fatalError( "Could not kill pid '%d': %s\n", *pidList, strerror(errno)); } @@ -1291,12 +1291,21 @@ extern pid_t* findPidByName( char* pidName) /* Now search for a match */ for (i=1; i<pid_array[0] ; i++) { + char* p; struct pid_info info; info.pid = pid_array[i]; if (ioctl (fd, DEVPS_GET_PID_INFO, &info)<0) fatalError( "\nDEVPS_GET_PID_INFO: %s\n", strerror (errno)); + /* Make sure we only match on the process name */ + p=info.command_line+1; + while ((*p != 0) && !isspace(*(p)) && (*(p-1) != '\\')) { + (p)++; + } + if (isspace(*(p))) + *p='\0'; + if ((strstr(info.command_line, pidName) != NULL)) { pidList=realloc( pidList, sizeof(pid_t) * (j+2)); if (pidList==NULL) @@ -1304,7 +1313,8 @@ extern pid_t* findPidByName( char* pidName) pidList[j++]=info.pid; } } - pidList[j]=0; + if (pidList) + pidList[j]=0; /* Free memory */ free( pid_array); @@ -1343,7 +1353,7 @@ extern pid_t* findPidByName( char* pidName) FILE *status; char filename[256]; char buffer[256]; - char* p; + char* p, *q; /* If it isn't a number, we don't want it */ if (!isdigit(*next->d_name)) @@ -1358,15 +1368,25 @@ extern pid_t* findPidByName( char* pidName) fgets(buffer, 256, status); fclose(status); - if (((p=strstr(buffer, pidName)) != NULL) - && (strncmp(p, pidName, strlen(pidName)) != 0)) { + /* Make sure we only match on the process name */ + p=buffer+5; /* Skip the name */ + while ((p)++) { + if (*p==0 || *p=='\n') { + *p='\0'; + break; + } + } + p=buffer+6; /* Skip the "Name:\t" */ + + if (((q=strstr(q, pidName)) != NULL) + && (strncmp(q, pidName, strlen(pidName)) != 0)) { pidList=realloc( pidList, sizeof(pid_t) * (i+2)); if (pidList==NULL) fatalError("out of memory\n"); pidList[i++]=strtol(next->d_name, NULL, 0); } } - if (pidList!=NULL) + if (pidList) pidList[i]=0; return pidList; } |