sh: Fix unalias -a while an alias is currently in use.

It is a rare situation to modify aliases while an alias is currently in use,
but this is handled for plain unalias. Handle it for unalias -a as well.
This commit is contained in:
Jilles Tjoelker 2017-04-16 21:42:43 +00:00
parent 6fd94039ef
commit 773e27aeee
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=317037
2 changed files with 27 additions and 12 deletions

View File

@ -85,6 +85,14 @@ setalias(const char *name, const char *val)
INTON; INTON;
} }
static void
freealias(struct alias *ap)
{
ckfree(ap->name);
ckfree(ap->val);
ckfree(ap);
}
static int static int
unalias(const char *name) unalias(const char *name)
{ {
@ -106,9 +114,7 @@ unalias(const char *name)
else { else {
INTOFF; INTOFF;
*app = ap->next; *app = ap->next;
ckfree(ap->name); freealias(ap);
ckfree(ap->val);
ckfree(ap);
INTON; INTON;
} }
aliases--; aliases--;
@ -122,19 +128,21 @@ unalias(const char *name)
static void static void
rmaliases(void) rmaliases(void)
{ {
struct alias *ap, *tmp; struct alias *ap, **app;
int i; int i;
INTOFF; INTOFF;
for (i = 0; i < ATABSIZE; i++) { for (i = 0; i < ATABSIZE; i++) {
ap = atab[i]; app = &atab[i];
atab[i] = NULL; while (*app) {
while (ap) { ap = *app;
ckfree(ap->name); if (ap->flag & ALIASINUSE) {
ckfree(ap->val); *ap->name = '\0';
tmp = ap; app = &(*app)->next;
ap = ap->next; } else {
ckfree(tmp); *app = ap->next;
freealias(ap);
}
} }
} }
aliases = 0; aliases = 0;

View File

@ -0,0 +1,7 @@
# $FreeBSD$
v=1
alias a='unalias -a
v=2'
eval a
[ "$v" = 2 ]