[BusyBox] another hush fix (was Changing from ..)

Larry Doolittle ldoolitt at recycle.lbl.gov
Tue Jun 5 18:04:16 UTC 2001


Gotta run -- this patch does fix the segfault when faced with
$ >""

I don't know if it is too much of a kludge to meet this group's
high standards.

I don't favor splitting sh.testcases into a zillion files.
More than two is OK.  Moderation in all things.

     - Larry

--- /home/ldoolitt/cvs/busybox/hush.c	Tue Jun  5 09:52:44 2001
+++ hush.c	Tue Jun  5 16:58:26 2001
@@ -997,6 +997,10 @@
 	struct redir_struct *redir;
 
 	for (redir=prog->redirects; redir; redir=redir->next) {
+		if (redir->dup == -1 && redir->word.gl_pathv == NULL) {
+			/* something went wrong in the parse.  Pretend it didn't happen */
+			continue;
+		}
 		if (redir->dup == -1) {
 			mode=redir_table[redir->type].mode;
 			openfd = open(redir->word.gl_pathv[0], mode, 0666);
@@ -1545,8 +1549,11 @@
 		for (r=child->redirects; r; r=rnext) {
 			final_printf("%s   redirect %d%s", ind, r->fd, redir_table[r->type].descrip);
 			if (r->dup == -1) {
-				final_printf(" %s\n", *r->word.gl_pathv);
-				globfree(&r->word);
+				/* guard against the case >$FOO, where foo is unset or blank */
+				if (r->word.gl_pathv) {
+					final_printf(" %s\n", *r->word.gl_pathv);
+					globfree(&r->word);
+				}
 			} else {
 				final_printf("&%d\n", r->dup);
 			}
@@ -1599,10 +1606,10 @@
  */
 static int globhack(const char *src, int flags, glob_t *pglob)
 {
-	int cnt, pathc;
+	int cnt=0, pathc;
 	const char *s;
 	char *dest;
-	for (cnt=1, s=src; *s; s++) {
+	for (cnt=1, s=src; s && *s; s++) {
 		if (*s == '\\') s++;
 		cnt++;
 	}
@@ -1619,7 +1626,7 @@
 	if (pglob->gl_pathv == NULL) return GLOB_NOSPACE;
 	pglob->gl_pathv[pathc-1]=dest;
 	pglob->gl_pathv[pathc]=NULL;
-	for (s=src; *s; s++, dest++) {
+	for (s=src; s && *s; s++, dest++) {
 		if (*s == '\\') s++;
 		*dest = *s;
 	}
@@ -1829,6 +1836,7 @@
 	}
 	redir = xmalloc(sizeof(struct redir_struct));
 	redir->next=NULL;
+	redir->word.gl_pathv=NULL;
 	if (last_redir) {
 		last_redir->next=redir;
 	} else {





More information about the busybox mailing list