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:
parent
6fd94039ef
commit
773e27aeee
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=317037
@ -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;
|
||||||
|
7
bin/sh/tests/parser/alias17.0
Normal file
7
bin/sh/tests/parser/alias17.0
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
# $FreeBSD$
|
||||||
|
|
||||||
|
v=1
|
||||||
|
alias a='unalias -a
|
||||||
|
v=2'
|
||||||
|
eval a
|
||||||
|
[ "$v" = 2 ]
|
Loading…
Reference in New Issue
Block a user