diff options
| author | Eric Andersen <andersen@codepoet.org> | 2002-09-16 10:44:24 +0000 |
|---|---|---|
| committer | Eric Andersen <andersen@codepoet.org> | 2002-09-16 10:44:24 +0000 |
| commit | d4ee98940bf2a2b2a2220dbcc8cbfd413fc83c60 (patch) | |
| tree | 4a49c49934a9c1d92dfce714eb059ef76b136a1f | |
| parent | 02b8dfc5249303dd489c479aae1087905427a50e (diff) | |
| download | busybox-w32-d4ee98940bf2a2b2a2220dbcc8cbfd413fc83c60.tar.gz busybox-w32-d4ee98940bf2a2b2a2220dbcc8cbfd413fc83c60.tar.bz2 busybox-w32-d4ee98940bf2a2b2a2220dbcc8cbfd413fc83c60.zip | |
last_patch55 from vodz:
I found overflow problem in xargs applet
(allocated not space for trailing '\0').
Last patch also reduce 22 bytes size. ;)
| -rw-r--r-- | findutils/xargs.c | 38 |
1 files changed, 20 insertions, 18 deletions
diff --git a/findutils/xargs.c b/findutils/xargs.c index bb5987ec9..471bae45b 100644 --- a/findutils/xargs.c +++ b/findutils/xargs.c | |||
| @@ -28,8 +28,10 @@ | |||
| 28 | 28 | ||
| 29 | int xargs_main(int argc, char **argv) | 29 | int xargs_main(int argc, char **argv) |
| 30 | { | 30 | { |
| 31 | char *cmd_to_be_executed = NULL; | 31 | char *cmd_to_be_executed; |
| 32 | char *file_to_act_on = NULL; | 32 | char *file_to_act_on; |
| 33 | int i; | ||
| 34 | int len; | ||
| 33 | 35 | ||
| 34 | /* | 36 | /* |
| 35 | * No options are supported in this version of xargs; no getopt. | 37 | * No options are supported in this version of xargs; no getopt. |
| @@ -42,41 +44,41 @@ int xargs_main(int argc, char **argv) | |||
| 42 | * once with no args and xargs will echo the filename. Simple. | 44 | * once with no args and xargs will echo the filename. Simple. |
| 43 | */ | 45 | */ |
| 44 | 46 | ||
| 47 | argv++; | ||
| 48 | len = argc; /* arg = count for ' ' + trailing '\0' */ | ||
| 45 | /* Store the command to be executed (taken from the command line) */ | 49 | /* Store the command to be executed (taken from the command line) */ |
| 46 | if (argc == 1) { | 50 | if (argc == 1) { |
| 47 | /* default behavior is to echo all the filenames */ | 51 | /* default behavior is to echo all the filenames */ |
| 48 | cmd_to_be_executed = xstrdup("/bin/echo "); | 52 | argv[0] = "/bin/echo"; |
| 53 | len++; /* space for trailing '\0' */ | ||
| 49 | } else { | 54 | } else { |
| 50 | /* concatenate all the arguments passed to xargs together */ | 55 | argc--; |
| 51 | int i; | ||
| 52 | int len = 0; | ||
| 53 | for (i = 1; i < argc; i++) | ||
| 54 | len += ( strlen(argv[i]) + 1 ); | ||
| 55 | cmd_to_be_executed = xstrndup ( "", len ); | ||
| 56 | for (i = 1; i < argc; i++) { | ||
| 57 | strcat(cmd_to_be_executed, argv[i]); | ||
| 58 | strcat(cmd_to_be_executed, " "); | ||
| 59 | } | 56 | } |
| 57 | /* concatenate all the arguments passed to xargs together */ | ||
| 58 | for (i = 0; i < argc; i++) | ||
| 59 | len += strlen(argv[i]); | ||
| 60 | cmd_to_be_executed = xmalloc (len); | ||
| 61 | for (i = len = 0; i < argc; i++) { | ||
| 62 | len = sprintf(cmd_to_be_executed + len, "%s ", argv[i]); | ||
| 60 | } | 63 | } |
| 61 | 64 | ||
| 62 | /* Now, read in one line at a time from stdin, and store this | 65 | /* Now, read in one line at a time from stdin, and store this |
| 63 | * line to be used later as an argument to the command */ | 66 | * line to be used later as an argument to the command */ |
| 64 | while ((file_to_act_on = get_line_from_file(stdin)) !=NULL) { | 67 | while ((file_to_act_on = get_line_from_file(stdin)) !=NULL) { |
| 65 | 68 | ||
| 66 | FILE *cmd_output = NULL; | 69 | FILE *cmd_output; |
| 67 | char *output_line = NULL; | 70 | char *output_line; |
| 68 | char *execstr = NULL; | 71 | char *execstr; |
| 69 | 72 | ||
| 70 | /* eat the newline off the filename. */ | 73 | /* eat the newline off the filename. */ |
| 71 | chomp(file_to_act_on); | 74 | chomp(file_to_act_on); |
| 72 | 75 | ||
| 73 | /* eat blank lines */ | 76 | /* eat blank lines */ |
| 74 | if (strlen(file_to_act_on) == 0) | 77 | if (file_to_act_on[0] == 0) |
| 75 | continue; | 78 | continue; |
| 76 | 79 | ||
| 77 | /* assemble the command and execute it */ | 80 | /* assemble the command and execute it */ |
| 78 | execstr = xstrndup ( cmd_to_be_executed, xstrlen(cmd_to_be_executed) + xstrlen(file_to_act_on)); | 81 | bb_asprintf(&execstr, "%s%s", cmd_to_be_executed, file_to_act_on); |
| 79 | strcat(execstr, file_to_act_on); | ||
| 80 | 82 | ||
| 81 | cmd_output = popen(execstr, "r"); | 83 | cmd_output = popen(execstr, "r"); |
| 82 | if (cmd_output == NULL) | 84 | if (cmd_output == NULL) |
