Hello,
In csh(1) the function blkfree() behaves like free(3) and
performs no action if its argument is NULL, so the caller
can avoid checking.
I lightly tested the following patch on i386 and amd64.
In two places the pointer was copied to a temporary
variable (v) before being passed to blkfree() which seemed
a bit awkward. Would anyone be willing to OK this?
- Michael
Index: csh.c
===================================================================
RCS file: /cvs/src/bin/csh/csh.c,v
retrieving revision 1.43
diff -u -p -u -r1.43 csh.c
--- csh.c 16 Dec 2017 10:27:21 -0000 1.43
+++ csh.c 29 Aug 2018 14:45:40 -0000
@@ -885,7 +885,6 @@ pintr(int notused)
void
pintr1(bool wantnl)
{
- Char **v;
sigset_t sigset, osigset;
sigemptyset(&sigset);
@@ -914,10 +913,10 @@ pintr1(bool wantnl)
if (gointr) {
gotolab(gointr);
timflg = 0;
- if ((v = pargv) != NULL)
- pargv = 0, blkfree(v);
- if ((v = gargv) != NULL)
- gargv = 0, blkfree(v);
+ blkfree(pargv);
+ pargv = NULL;
+ blkfree(gargv);
+ gargv = NULL;
reset();
}
else if (intty && wantnl) {
Index: dol.c
===================================================================
RCS file: /cvs/src/bin/csh/dol.c,v
retrieving revision 1.21
diff -u -p -u -r1.21 dol.c
--- dol.c 16 Dec 2017 10:27:21 -0000 1.21
+++ dol.c 29 Aug 2018 14:45:40 -0000
@@ -952,7 +952,7 @@ heredoc(Char *term)
ocnt = BUFSIZ;
}
}
- if (pargv)
- blkfree(pargv), pargv = 0;
+ blkfree(pargv);
+ pargv = NULL;
}
}
Index: error.c
===================================================================
RCS file: /cvs/src/bin/csh/error.c,v
retrieving revision 1.13
diff -u -p -u -r1.13 error.c
--- error.c 16 Dec 2017 10:27:21 -0000 1.13
+++ error.c 29 Aug 2018 14:45:40 -0000
@@ -315,7 +315,6 @@ void
stderror(int id, ...)
{
va_list va;
- Char **v;
int flags = id & ERR_FLAGS;
id &= ~ERR_FLAGS;
@@ -349,10 +348,10 @@ stderror(int id, ...)
free(seterr);
seterr = NULL;
- if ((v = pargv) != NULL)
- pargv = 0, blkfree(v);
- if ((v = gargv) != NULL)
- gargv = 0, blkfree(v);
+ blkfree(pargv);
+ pargv = NULL;
+ blkfree(gargv);
+ gargv = NULL;
(void) fflush(cshout);
(void) fflush(csherr);
Index: func.c
===================================================================
RCS file: /cvs/src/bin/csh/func.c,v
retrieving revision 1.37
diff -u -p -u -r1.37 func.c
--- func.c 18 Dec 2017 19:12:24 -0000 1.37
+++ func.c 29 Aug 2018 14:45:40 -0000
@@ -822,8 +822,7 @@ wfree(void)
}
}
- if (wp->w_fe0)
- blkfree(wp->w_fe0);
+ blkfree(wp->w_fe0);
free(wp->w_fename);
free(wp);
}
@@ -886,8 +885,8 @@ xecho(int sep, Char **v)
(void) fflush(cshout);
if (setintr)
sigprocmask(SIG_BLOCK, &sigset, NULL);
- if (gargv)
- blkfree(gargv), gargv = 0;
+ blkfree(gargv);
+ gargv = NULL;
}
void
@@ -1373,8 +1372,8 @@ doeval(Char **v, struct command *t)
SHIN = dmove(saveIN, oSHIN);
SHOUT = dmove(saveOUT, oSHOUT);
SHERR = dmove(saveERR, oSHERR);
- if (gv)
- blkfree(gv), gv = NULL;
+ blkfree(gv);
+ gv = NULL;
resexit(osetexit);
gv = savegv;
if (my_reenter)
Index: glob.c
===================================================================
RCS file: /cvs/src/bin/csh/glob.c,v
retrieving revision 1.22
diff -u -p -u -r1.22 glob.c
--- glob.c 26 Dec 2015 13:48:38 -0000 1.22
+++ glob.c 29 Aug 2018 14:45:40 -0000
@@ -578,9 +578,7 @@ dobackp(Char *cp, bool literal)
Char *lp, *rp;
Char *ep, word[PATH_MAX];
- if (pargv) {
- blkfree(pargv);
- }
+ blkfree(pargv);
pargsiz = GLOBSPACE;
pargv = xreallocarray(NULL, pargsiz, sizeof(Char *));
pargv[0] = NULL;
Index: proc.c
===================================================================
RCS file: /cvs/src/bin/csh/proc.c,v
retrieving revision 1.31
diff -u -p -u -r1.31 proc.c
--- proc.c 22 Jul 2017 09:37:21 -0000 1.31
+++ proc.c 29 Aug 2018 14:45:41 -0000
@@ -1073,8 +1073,8 @@ pkill(Char **v, int signum)
cont:
v++;
}
- if (gargv)
- blkfree(gargv), gargv = 0;
+ blkfree(gargv);
+ gargv = NULL;
sigprocmask(SIG_UNBLOCK, &sigset, NULL);
if (err1)
stderror(ERR_SILENT);