[Toybox] xargs with blank input

William Haddon william at haddonthethird.net
Wed Oct 16 12:16:47 PDT 2013


How exactly should this behave? I haven't been able to decipher what  
POSIX has to say about the subject. The GNU version executes the  
command with no arguments, so that "xargs" with blank input is  
equivalent to "echo" and "xargs ls" with blank input is equivalent to  
"ls". Toybox currently appears to do nothing, but actually forks a  
child process which silently seg-faults as a result of calling xexec()  
with argv[0] == NULL. Patching toybox to implement the GNU behavior  
fixes a lot of scripts on my test system that broke when I switched the  
xargs implementation from busybox to toybox, including the
Linux build scripts. I included the patch below, but I haven't tested  
it with all the numerous options that are available to xargs. I'm still  
investigating whether this toybox behavior is the only factor  
contributing to behavior I observed.

William Haddon

diff --git a/toys/posix/xargs.c b/toys/posix/xargs.c
index e1611ec..6238af8 100644
--- a/toys/posix/xargs.c
+++ b/toys/posix/xargs.c
@@ -160,17 +160,16 @@ void xargs_main(void)
      if (data && !TT.entries) error_exit("argument too long");
      out = xzalloc((entries+TT.entries+1)*sizeof(char *));

-    if (dlist) {
-      struct double_list *dtemp;
+    struct double_list *dtemp;

-      // Fill out command line to exec
-      memcpy(out, toys.optargs, entries*sizeof(char *));
-      TT.entries = 0;
-      TT.bytes = bytes;
+    // Fill out command line to exec
+    memcpy(out, toys.optargs, entries*sizeof(char *));
+    TT.entries = 0;
+    TT.bytes = bytes;
+    if (dlist)
        dlist->prev->next = 0;
-      for (dtemp = dlist; dtemp; dtemp = dtemp->next)
-        handle_entries(dtemp->data, out+entries);
-    }
+    for (dtemp = dlist; dtemp; dtemp = dtemp->next)
+      handle_entries(dtemp->data, out+entries);
      pid_t pid=fork();
      if (!pid) {
        xclose(0);
 1381951007.0


More information about the Toybox mailing list