Dropped "-f" format flag for pidof command as it

could be used to print information from memory or crash
pidof. Replaced flag with "-d" which allows for a custom
separator to be used between listed PIDs.
Patch supplied by KatolaZ.
This commit is contained in:
Jesse Smith 2019-03-20 13:46:36 -03:00
parent 4e2ad6a698
commit f1da344565
3 changed files with 16 additions and 98 deletions

View File

@ -4,11 +4,11 @@ sysvinit (2.95) unreleased; urgency=low
* Fixed various typos and control codes in manual pages. * Fixed various typos and control codes in manual pages.
Patch provided by Bjarni Ingi Gislason. Patch provided by Bjarni Ingi Gislason.
* Patched pidof so that the -f flag does not print memory information * Dropped "-f" format flag for pidof command as it
from the stack when passed a specially crafted format string. could be used to print information from memory or crash
Also prevent segfault when "%s" is used in a format string. pidof. Replaced flag with "-d" which allows for a custom
Special characters for the format string can be found in the man separator to be used between listed PIDs.
page for pidof. Patch supplied by KatolaZ.
sysvinit (2.94) released; urgency=low sysvinit (2.94) released; urgency=low

View File

@ -28,8 +28,8 @@ pidof -- find the process ID of a running program.
.IR omitpid[,omitpid...] ] .IR omitpid[,omitpid...] ]
.RB [ \-o .RB [ \-o
.IR omitpid[,omitpid...]... ] .IR omitpid[,omitpid...]... ]
.RB [ \-f .RB [ \-d
.IR format ] .IR sep ]
.B program .B program
.RB [ program... ] .RB [ program... ]
.SH DESCRIPTION .SH DESCRIPTION
@ -64,15 +64,13 @@ a status of true or false to indicate whether a matching PID was found.
.IP \-x .IP \-x
Scripts too - this causes the program to also return process id's of Scripts too - this causes the program to also return process id's of
shells running the named scripts. shells running the named scripts.
.IP "-d \fIsep\fP"
Tells \fIpidof\fP to use \fIsep\fP as an output separator if more than one PID
is shown. The default separator is a space.
.IP "-o \fIomitpid\fP" .IP "-o \fIomitpid\fP"
Tells \fIpidof\fP to omit processes with that process id. The special Tells \fIpidof\fP to omit processes with that process id. The special
pid \fB%PPID\fP can be used to name the parent process of the \fIpidof\fP pid \fB%PPID\fP can be used to name the parent process of the \fIpidof\fP
program, in other words the calling shell or shell script. program, in other words the calling shell or shell script.
.IP "-f \fIformat\fP"
Tells \fIpidof\fP to format the process IDs in the given \fIprintf\fP style string.
For example \fB" -p%d"\fP is useful for \fIstrace\fP.
The "%d" symbol is used as a place holder for the PID to be printed. A "\\n" can
be used to cause a newline to be printed. For example \fB" %d\\n"\fP.
.SH "EXIT STATUS" .SH "EXIT STATUS"
.TP .TP
.B 0 .B 0

View File

@ -948,8 +948,8 @@ void pidof_usage(void)
{ {
printf("pidof usage: [options] <program-name>\n\n"); printf("pidof usage: [options] <program-name>\n\n");
printf(" -c Return PIDs with the same root directory\n"); printf(" -c Return PIDs with the same root directory\n");
printf(" -d <sep> Use the provided character as output separator\n");
printf(" -h Display this help text\n"); printf(" -h Display this help text\n");
printf(" -f <format> Display PIDs in a given printf-style format\n");
printf(" -n Avoid using stat system function on network shares\n"); printf(" -n Avoid using stat system function on network shares\n");
printf(" -o <pid> Omit results with a given PID\n"); printf(" -o <pid> Omit results with a given PID\n");
printf(" -q Quiet mode. Do not display output\n"); printf(" -q Quiet mode. Do not display output\n");
@ -985,66 +985,6 @@ void nsyslog(int pri, char *fmt, ...)
#define PIDOF_NETFS 0x04 #define PIDOF_NETFS 0x04
#define PIDOF_QUIET 0x08 #define PIDOF_QUIET 0x08
/* Replace elements (from) of the original string
with new elements (to).
Returns the new string on success or NULL on failure.
Free the returnedstring after use.
*/
char *Replace_String(char *from, char *to, char *original)
{
int from_length, to_length;
int source_length, destination_length;
int replace_count = 0;
char *replace_position;
char *destination_string;
char *source_position, *destination_position;
if ( (! from) || (! to) || (! original) )
return NULL;
from_length = strlen(from);
to_length = strlen(to);
source_length = strlen(original);
replace_position = strstr(original, from);
/* There is nothing to replace, return original string */
if (! replace_position)
return strdup(original);
/* count number of times we need to perform replacement */
while (replace_position)
{
replace_count++;
replace_position++;
replace_position = strstr(replace_position, from);
}
/* calculate length and allocate the new string */
destination_length = source_length + ( (to_length - from_length) * replace_count);
destination_string = calloc(destination_length, sizeof(char));
if (! destination_string)
return NULL;
/* Copy source string up to the part we need to replace. Then jump over the replaced bit */
source_position = original;
destination_position = destination_string;
replace_position = strstr(original, from);
while (replace_position)
{
for ( ; source_position < replace_position; source_position++)
{
destination_position[0] = source_position[0];
destination_position++;
}
strcat(destination_position, to);
source_position += from_length;
destination_position += to_length;
replace_position = strstr(source_position, from);
}
/* Replaced all the items, now copy the tail end of the original string */
strcat(destination_position, source_position);
return destination_string;
}
/* /*
* Pidof functionality. * Pidof functionality.
*/ */
@ -1059,7 +999,7 @@ int main_pidof(int argc, char **argv)
int chroot_check = 0; int chroot_check = 0;
struct stat st; struct stat st;
char tmp[512]; char tmp[512];
char *format = NULL; char sep = ' ';
omit = (OMIT*)0; omit = (OMIT*)0;
nlist = (NFS*)0; nlist = (NFS*)0;
@ -1068,7 +1008,7 @@ int main_pidof(int argc, char **argv)
if ((token = getenv("PIDOF_NETFS")) && (strcmp(token,"no") != 0)) if ((token = getenv("PIDOF_NETFS")) && (strcmp(token,"no") != 0))
flags |= PIDOF_NETFS; flags |= PIDOF_NETFS;
while ((opt = getopt(argc,argv,"qhco:f:sxn")) != EOF) switch (opt) { while ((opt = getopt(argc,argv,"qhco:d:sxn")) != EOF) switch (opt) {
case '?': case '?':
nsyslog(LOG_ERR,"invalid options on command line!\n"); nsyslog(LOG_ERR,"invalid options on command line!\n");
closelog(); closelog();
@ -1079,8 +1019,8 @@ int main_pidof(int argc, char **argv)
case 'h': case 'h':
pidof_usage(); pidof_usage();
exit(0); exit(0);
case 'f': case 'd':
format = optarg; sep = optarg[0];
break; break;
case 'o': case 'o':
here = optarg; here = optarg;
@ -1178,29 +1118,9 @@ int main_pidof(int argc, char **argv)
} }
if ( ~flags & PIDOF_QUIET ) { if ( ~flags & PIDOF_QUIET ) {
if (format)
{
char *show_string, *final_string;
char my_pid[32];
snprintf(my_pid, 32, "%d", p->pid);
show_string = Replace_String("%d", my_pid, format);
final_string = Replace_String("\\n", "\n", show_string);
if (show_string) free(show_string);
if (final_string)
{
printf("%s", final_string);
free(final_string);
}
else
fprintf(stderr, "Cannot handle format provided by -f\n");
/* printf(format, p->pid); */
}
else
{
if (! first) if (! first)
printf(" "); printf("%c", sep);
printf("%d", p->pid); printf("%d", p->pid);
}
} }
first = 0; first = 0;
} }