ash: introduce and use stzalloc and ckzalloc.

function                                             old     new   delta
stzalloc                                               -      29     +29
ckzalloc                                               -      29     +29
recordregion                                         108     102      -6
cmdlookup                                            158     152      -6
pipeline                                             188     181      -7
parseheredoc                                         135     128      -7
makename                                              42      35      -7
list                                                 355     348      -7
setvareq                                             221     212      -9
aliascmd                                             324     311     -13
pushfile                                              83      69     -14
readtoken1                                          2872    2849     -23
parse_command                                       1430    1391     -39
------------------------------------------------------------------------------
(add/remove: 2/0 grow/shrink: 0/11 up/down: 58/-138)          Total: -80 bytes
   text    data     bss     dec     hex filename
 577227     706   23740  601673   92e49 busybox_old
 577147     706   23740  601593   92df9 busybox_unstripped

diff --git a/shell/ash.c b/shell/ash.c
index 25c8fa5..65f94f6 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -1185,6 +1185,12 @@
 	return ckrealloc(NULL, nbytes);
 }
 
+static void *
+ckzalloc(size_t nbytes)
+{
+	return memset(ckmalloc(nbytes), 0, nbytes);
+}
+
 /*
  * Make a copy of a string in safe storage.
  */
@@ -1238,6 +1244,12 @@
 	return p;
 }
 
+static void *
+stzalloc(size_t nbytes)
+{
+	return memset(stalloc(nbytes), 0, nbytes);
+}
+
 static void
 stunalloc(void *p)
 {
@@ -2028,9 +2040,9 @@
 		if (flags & VNOSET)
 			return;
 		/* not found */
-		vp = ckmalloc(sizeof(*vp));
+		vp = ckzalloc(sizeof(*vp));
 		vp->next = *vpp;
-		vp->func = NULL;
+		/*vp->func = NULL; - ckzalloc did it */
 		*vpp = vp;
 	}
 	if (!(flags & (VTEXTFIXED|VSTACK|VNOSAVE)))
@@ -3072,11 +3084,11 @@
 		ap->flag &= ~ALIASDEAD;
 	} else {
 		/* not found */
-		ap = ckmalloc(sizeof(struct alias));
+		ap = ckzalloc(sizeof(struct alias));
 		ap->name = ckstrdup(name);
 		ap->val = ckstrdup(val);
-		ap->flag = 0;
-		ap->next = 0;
+		/*ap->flag = 0; - ckzalloc did it */
+		/*ap->next = NULL;*/
 		*app = ap;
 	}
 	INT_ON;
@@ -5222,8 +5234,8 @@
 		ifsp = &ifsfirst;
 	} else {
 		INT_OFF;
-		ifsp = ckmalloc(sizeof(*ifsp));
-		ifsp->next = NULL;
+		ifsp = ckzalloc(sizeof(*ifsp));
+		/*ifsp->next = NULL; - ckzalloc did it */
 		ifslastp->next = ifsp;
 		INT_ON;
 	}
@@ -6139,7 +6151,7 @@
 					continue;
 				}
 				*q = '\0';
-				sp = stalloc(sizeof(*sp));
+				sp = stzalloc(sizeof(*sp));
 				sp->text = start;
 				*arglist->lastp = sp;
 				arglist->lastp = &sp->next;
@@ -6155,7 +6167,8 @@
 						if (strchr(ifs, *p) == NULL ) {
 							p = q;
 							break;
-						} else if (strchr(defifs, *p) == NULL) {
+						}
+						if (strchr(defifs, *p) == NULL) {
 							if (ifsspc) {
 								p++;
 								ifsspc = 0;
@@ -6179,7 +6192,7 @@
 		return;
 
  add:
-	sp = stalloc(sizeof(*sp));
+	sp = stzalloc(sizeof(*sp));
 	sp->text = start;
 	*arglist->lastp = sp;
 	arglist->lastp = &sp->next;
@@ -6211,7 +6224,7 @@
 {
 	struct strlist *sp;
 
-	sp = stalloc(sizeof(*sp));
+	sp = stzalloc(sizeof(*sp));
 	sp->text = ststrdup(name);
 	*exparg.lastp = sp;
 	exparg.lastp = &sp->next;
@@ -6481,7 +6494,7 @@
 	} else {
 		if (flag & EXP_REDIR) /*XXX - for now, just remove escapes */
 			rmescapes(p);
-		sp = stalloc(sizeof(*sp));
+		sp = stzalloc(sizeof(*sp));
 		sp->text = p;
 		*exparg.lastp = sp;
 		exparg.lastp = &sp->next;
@@ -6644,7 +6657,7 @@
 		ap += 2;
 		argv++;
 		while ((*ap++ = *argv++))
-			;
+			continue;
 		argv = new;
 		goto repeat;
 	}
@@ -6781,9 +6794,9 @@
 		pp = &cmdp->next;
 	}
 	if (add && cmdp == NULL) {
-		cmdp = *pp = ckmalloc(sizeof(struct tblentry) - ARB
+		cmdp = *pp = ckzalloc(sizeof(struct tblentry) - ARB
 					+ strlen(name) + 1);
-		cmdp->next = NULL;
+		/*cmdp->next = NULL; - ckzalloc did it */
 		cmdp->cmdtype = CMDUNKNOWN;
 		strcpy(cmdp->cmdname, name);
 	}
@@ -8903,11 +8916,11 @@
 	parsefile->lleft = parselleft;
 	parsefile->nextc = parsenextc;
 	parsefile->linno = plinno;
-	pf = ckmalloc(sizeof(*pf));
+	pf = ckzalloc(sizeof(*pf));
 	pf->prev = parsefile;
 	pf->fd = -1;
-	pf->strpush = NULL;
-	pf->basestrpush.prev = NULL;
+	/*pf->strpush = NULL; - ckzalloc did it */
+	/*pf->basestrpush.prev = NULL;*/
 	parsefile = pf;
 }
 
@@ -9537,9 +9550,9 @@
 				n2->npipe.backgnd = 1;
 			} else {
 				if (n2->type != NREDIR) {
-					n3 = stalloc(sizeof(struct nredir));
+					n3 = stzalloc(sizeof(struct nredir));
 					n3->nredir.n = n2;
-					n3->nredir.redirect = NULL;
+					/*n3->nredir.redirect = NULL; - stzalloc did it */
 					n2 = n3;
 				}
 				n2->type = NBACKGND;
@@ -9629,9 +9642,9 @@
 		tokpushback = 1;
 	n1 = parse_command();
 	if (readtoken() == TPIPE) {
-		pipenode = stalloc(sizeof(struct npipe));
+		pipenode = stzalloc(sizeof(struct npipe));
 		pipenode->type = NPIPE;
-		pipenode->npipe.backgnd = 0;
+		/*pipenode->npipe.backgnd = 0; - stzalloc did it */
 		lp = stalloc(sizeof(struct nodelist));
 		pipenode->npipe.cmdlist = lp;
 		lp->n = n1;
@@ -9660,9 +9673,9 @@
 {
 	union node *n;
 
-	n = stalloc(sizeof(struct narg));
+	n = stzalloc(sizeof(struct narg));
 	n->type = NARG;
-	n->narg.next = NULL;
+	/*n->narg.next = NULL; - stzalloc did it */
 	n->narg.text = wordtext;
 	n->narg.backquote = backquotelist;
 	return n;
@@ -9762,8 +9775,9 @@
 		checkkwd = savecheckkwd;
 		switch (readtoken()) {
 		case TWORD:
-			n = stalloc(sizeof(struct narg));
+			n = stzalloc(sizeof(struct narg));
 			n->type = NARG;
+			/*n->narg.next = NULL; - stzalloc did it */
 			n->narg.text = wordtext;
 			n->narg.backquote = backquotelist;
 			if (savecheckkwd && isassignment(wordtext)) {
@@ -9887,8 +9901,9 @@
 		if (readtoken() == TIN) {
 			app = ≈
 			while (readtoken() == TWORD) {
-				n2 = stalloc(sizeof(struct narg));
+				n2 = stzalloc(sizeof(struct narg));
 				n2->type = NARG;
+				/*n2->narg.next = NULL; - stzalloc did it */
 				n2->narg.text = wordtext;
 				n2->narg.backquote = backquotelist;
 				*app = n2;
@@ -9899,11 +9914,11 @@
 			if (lasttoken != TNL && lasttoken != TSEMI)
 				raise_error_unexpected_syntax(-1);
 		} else {
-			n2 = stalloc(sizeof(struct narg));
+			n2 = stzalloc(sizeof(struct narg));
 			n2->type = NARG;
+			/*n2->narg.next = NULL; - stzalloc did it */
 			n2->narg.text = (char *)dolatstr;
-			n2->narg.backquote = NULL;
-			n2->narg.next = NULL;
+			/*n2->narg.backquote = NULL;*/
 			n1->nfor.args = n2;
 			/*
 			 * Newline or semicolon here is optional (but note
@@ -9923,11 +9938,11 @@
 		n1->type = NCASE;
 		if (readtoken() != TWORD)
 			raise_error_unexpected_syntax(TWORD);
-		n1->ncase.expr = n2 = stalloc(sizeof(struct narg));
+		n1->ncase.expr = n2 = stzalloc(sizeof(struct narg));
 		n2->type = NARG;
+		/*n2->narg.next = NULL; - stzalloc did it */
 		n2->narg.text = wordtext;
 		n2->narg.backquote = backquotelist;
-		n2->narg.next = NULL;
 		do {
 			checkkwd = CHKKWD | CHKALIAS;
 		} while (readtoken() == TNL);
@@ -9944,8 +9959,9 @@
 			cp->type = NCLIST;
 			app = &cp->nclist.pattern;
 			for (;;) {
-				*app = ap = stalloc(sizeof(struct narg));
+				*app = ap = stzalloc(sizeof(struct narg));
 				ap->type = NARG;
+				/*ap->narg.next = NULL; - stzalloc did it */
 				ap->narg.text = wordtext;
 				ap->narg.backquote = backquotelist;
 				if (readtoken() != TPIPE)
@@ -9953,7 +9969,7 @@
 				app = &ap->narg.next;
 				readtoken();
 			}
-			ap->narg.next = NULL;
+			//ap->narg.next = NULL;
 			if (lasttoken != TRP)
 				raise_error_unexpected_syntax(TRP);
 			cp->nclist.body = list(2);
@@ -9971,10 +9987,10 @@
 		*cpp = NULL;
 		goto redir;
 	case TLP:
-		n1 = stalloc(sizeof(struct nredir));
+		n1 = stzalloc(sizeof(struct nredir));
 		n1->type = NSUBSHELL;
 		n1->nredir.n = list(0);
-		n1->nredir.redirect = NULL;
+		/*n1->nredir.redirect = NULL; - stzalloc did it */
 		t = TRP;
 		break;
 	case TBEGIN:
@@ -10003,7 +10019,7 @@
 	*rpp = NULL;
 	if (redir) {
 		if (n1->type != NSUBSHELL) {
-			n2 = stalloc(sizeof(struct nredir));
+			n2 = stzalloc(sizeof(struct nredir));
 			n2->type = NREDIR;
 			n2->nredir.n = n1;
 			n1 = n2;
@@ -10301,7 +10317,7 @@
 	char fd = *out;
 	union node *np;
 
-	np = stalloc(sizeof(struct nfile));
+	np = stzalloc(sizeof(struct nfile));
 	if (c == '>') {
 		np->nfile.fd = 1;
 		c = pgetc();
@@ -10316,13 +10332,13 @@
 			pungetc();
 		}
 	} else {        /* c == '<' */
-		np->nfile.fd = 0;
+		/*np->nfile.fd = 0; - stzalloc did it */
 		c = pgetc();
 		switch (c) {
 		case '<':
 			if (sizeof(struct nfile) != sizeof(struct nhere)) {
-				np = stalloc(sizeof(struct nhere));
-				np->nfile.fd = 0;
+				np = stzalloc(sizeof(struct nhere));
+				/*np->nfile.fd = 0; - stzalloc did it */
 			}
 			np->type = NHERE;
 			heredoc = stalloc(sizeof(struct heredoc));
@@ -10573,8 +10589,8 @@
 	nlpp = &bqlist;
 	while (*nlpp)
 		nlpp = &(*nlpp)->next;
-	*nlpp = stalloc(sizeof(**nlpp));
-	(*nlpp)->next = NULL;
+	*nlpp = stzalloc(sizeof(**nlpp));
+	/* (*nlpp)->next = NULL; - stzalloc did it */
 	parsebackquote = oldstyle;
 
 	if (oldstyle) {
@@ -10930,9 +10946,9 @@
 		}
 		readtoken1(pgetc(), here->here->type == NHERE? SQSYNTAX : DQSYNTAX,
 				here->eofmark, here->striptabs);
-		n = stalloc(sizeof(struct narg));
+		n = stzalloc(sizeof(struct narg));
 		n->narg.type = NARG;
-		n->narg.next = NULL;
+		/*n->narg.next = NULL; - stzalloc did it */
 		n->narg.text = wordtext;
 		n->narg.backquote = backquotelist;
 		here->here->nhere.doc = n;