Herbert Xu
Wed, 26 May 2010 04:00:42 -0700
[VAR] Move unsetvar functionality into setvareq This patch moves the unsetvar code into setvareq so that we can no have a pathological case of an unset variable hanging around unless it has a bit pinning it like VEXPORT.
Signed-off-by: Herbert Xu <herb...@gondor.apana.org.au>
---
ChangeLog | 1 +
src/var.c | 54 +++++++++++++++++-------------------------------------
src/var.h | 2 +-
3 files changed, 19 insertions(+), 38 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index f3c7701..1f7120f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,7 @@
2010-05-25 Herbert Xu <herb...@gondor.apana.org.au>
* Fix poplocalvar leak.
+ * Move unsetvar functionality into setvareq.
2010-05-24 Herbert Xu <herb...@gondor.apana.org.au>
diff --git a/src/var.c b/src/var.c
index fc6d367..12f2f6c 100644
--- a/src/var.c
+++ b/src/var.c
@@ -266,10 +266,22 @@ setvareq(char *s, int flags)
if ((vp->flags & (VTEXTFIXED|VSTACK)) == 0)
ckfree(vp->text);
+ if (((flags & (VEXPORT|VREADONLY|VSTRFIXED|VUNSET)) |
+ (vp->flags & VSTRFIXED)) == VUNSET) {
+ *vpp = vp->next;
+ ckfree(vp);
+out_free:
+ if ((flags & (VTEXTFIXED|VSTACK|VNOSAVE)) == VNOSAVE)
+ ckfree(s);
+ return;
+ }
+
flags |= vp->flags & ~(VTEXTFIXED|VSTACK|VNOSAVE|VUNSET);
} else {
if (flags & VNOSET)
return;
+ if ((flags & (VEXPORT|VREADONLY|VSTRFIXED|VUNSET)) == VUNSET)
+ goto out_free;
/* not found */
vp = ckmalloc(sizeof (*vp));
vp->next = *vpp;
@@ -588,7 +600,6 @@ unsetcmd(int argc, char **argv)
char **ap;
int i;
int flag = 0;
- int ret = 0;
while ((i = nextopt("vf")) != '\0') {
flag = i;
@@ -596,15 +607,13 @@ unsetcmd(int argc, char **argv)
for (ap = argptr; *ap ; ap++) {
if (flag != 'f') {
- i = unsetvar(*ap);
- ret |= i;
- if (!(i & 2))
- continue;
+ unsetvar(*ap);
+ continue;
}
if (flag != 'v')
unsetfunc(*ap);
}
- return ret & 1;
+ return 0;
}
@@ -612,38 +621,9 @@ unsetcmd(int argc, char **argv)
* Unset the specified variable.
*/
-int
-unsetvar(const char *s)
+void unsetvar(const char *s)
{
- struct var **vpp;
- struct var *vp;
- int retval;
-
- vpp = findvar(hashvar(s), s);
- vp = *vpp;
- retval = 2;
- if (vp) {
- int flags = vp->flags;
-
- retval = 1;
- if (flags & VREADONLY)
- goto out;
- if ((flags & VSTRFIXED) == 0) {
- INTOFF;
- if ((flags & (VTEXTFIXED|VSTACK)) == 0)
- ckfree(vp->text);
- *vpp = vp->next;
- ckfree(vp);
- INTON;
- } else if (!(flags & VUNSET)) {
- setvar(s, 0, 0);
- vp->flags &= ~VEXPORT;
- }
- retval = 0;
- }
-
-out:
- return retval;
+ setvar(s, 0, 0);
}
diff --git a/src/var.h b/src/var.h
index 32b0dde..2bb82b1 100644
--- a/src/var.h
+++ b/src/var.h
@@ -142,7 +142,7 @@ int localcmd(int, char **);
void pushlocalvars(void);
void poplocalvars(void);
int unsetcmd(int, char **);
-int unsetvar(const char *);
+void unsetvar(const char *);
int varcmp(const char *, const char *);
static inline int varequal(const char *a, const char *b) {
--
To unsubscribe from this list: send the line "unsubscribe dash" in
the body of a message to majord...@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html