bsdutils: /usr/bin/script doesn't wait for command to finish before exiting

Fergus Henderson fergus at google.com
Mon Jul 28 22:58:53 UTC 2008


Package: bsdutils
Version: 1:2.12r-4ubuntu6.1
Severity: normal
Tags: patch


The script command fails to wait for the command that it is executing to finish.
For example, the command

  /usr/bin/script -c "sleep 1; echo foo" < /dev/null; echo bar

produces the output

  Script started, file is typescript
  Script done, file is typescript
  bar
  foo

and an empty "typescript" file, whereas the correct output should be

  Script started, file is typescript
  foo
  Script done, file is typescript
  bar

and the "typescript" file should contain "foo".

The following patch fixes the problem.

--- util-linux-2.12r/misc-utils/script.c	2004-03-26 12:07:16.000000000 -0500
+++ util-linux-2.12r-fergus/misc-utils/script.c	2008-07-28 18:34:38.223254000 -0400
@@ -52,6 +52,8 @@
 #include <sys/time.h>
 #include <sys/file.h>
 #include <sys/signal.h>
+#include <sys/wait.h>
+#include <errno.h>
 #include "nls.h"
 
 #ifdef __linux__
@@ -74,6 +76,7 @@
 void doinput(void);
 void dooutput(void);
 void doshell(void);
+void waitforchild(void);
 
 char	*shell;
 FILE	*fscript;
@@ -208,9 +211,10 @@
 			dooutput();
 		else
 			doshell();
-	} else
+	} else {
 		(void) signal(SIGWINCH, resize);
-	doinput();
+		doinput();
+	}
 
 	return 0;
 }
@@ -224,6 +228,9 @@
 
 	while ((cc = read(0, ibuf, BUFSIZ)) > 0)
 		(void) write(master, ibuf, cc);
+
+	waitforchild();
+
 	done();
 }
 
@@ -293,6 +300,7 @@
 		if (fflg)
 			(void) fflush(fscript);
 	}
+	waitforchild();
 	done();
 }
 
@@ -325,9 +333,9 @@
 		shname = shell;
 
 	if (cflg)
-		execl(shell, shname, "-c", cflg, 0);
+		execl(shell, shname, "-c", cflg, (const char *)0);
 	else
-		execl(shell, shname, "-i", 0);
+		execl(shell, shname, "-i", (const char *)0);
 
 	perror(shell);
 	fail();
@@ -431,3 +439,10 @@
 	(void) setsid();
 	(void) ioctl(slave, TIOCSCTTY, 0);
 }
+
+void waitforchild() {
+	int err;
+	do {
+		err = waitpid(child, NULL, 0);
+	} while (err == EINTR);
+}


-- System Information:
Debian Release: testing/unstable
  APT prefers dapper-updates
  APT policy: (500, 'dapper-updates'), (500, 'dapper-security'), (500, 'dapper')
Architecture: i386 (x86_64)
Shell:  /bin/sh linked to /bin/bash
Kernel: Linux 2.6.18.5-gg26workstation-mixed64-32
Locale: LANG=en_US, LC_CTYPE=en_US (charmap=ISO-8859-1)

Versions of packages bsdutils depends on:
ii  libc6                2.3.6-0ubuntu20-gg2 GNU C Library: Shared libraries an

Versions of packages bsdutils recommends:
ii  bsdmainutils                6.1.2ubuntu1 collection of more utilities from 

-- debconf-show failed




More information about the ubuntu-users mailing list