summaryrefslogtreecommitdiff
path: root/source4/lib/replace
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2007-05-18 06:53:57 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 14:52:36 -0500
commit2ad24b9ba191ed9d2b77dbf3f667504e05bc9707 (patch)
tree81f71243c4c8665e3bc48ee81460af873423f2a9 /source4/lib/replace
parentfe0b8a5df42109dee44743e29c2e6e42565ff5c5 (diff)
downloadsamba-2ad24b9ba191ed9d2b77dbf3f667504e05bc9707.tar.gz
samba-2ad24b9ba191ed9d2b77dbf3f667504e05bc9707.tar.bz2
samba-2ad24b9ba191ed9d2b77dbf3f667504e05bc9707.zip
r22988: fixed 2 bugs in our unsetenv() replacement code
1) you must not free the memory, as it is possible the memory did not come from malloc (try it under valgrind to test) 2) the old code didn't cope with duplicate environment variables I hope this will fix some of the build farm errors on irix, and maybe solaris (This used to be commit ec6900171d066e927f004b621fb39cc7b8dcfd90)
Diffstat (limited to 'source4/lib/replace')
-rw-r--r--source4/lib/replace/replace.c26
1 files changed, 15 insertions, 11 deletions
diff --git a/source4/lib/replace/replace.c b/source4/lib/replace/replace.c
index db299130e5..87e73d001c 100644
--- a/source4/lib/replace/replace.c
+++ b/source4/lib/replace/replace.c
@@ -568,20 +568,24 @@ int rep_unsetenv(const char *name)
{
extern char **environ;
size_t len = strlen(name);
- size_t i;
- int found = 0;
+ size_t i, count;
- for (i=0; (environ && environ[i]); i++) {
- if (found) {
- environ[i-1] = environ[i];
- continue;
- }
+ if (environ == NULL || getenv(name) == NULL) {
+ return 0;
+ }
+ for (i=0;environ[i];i++) /* noop */ ;
+
+ count=i;
+
+ for (i=0;i<count;) {
if (strncmp(environ[i], name, len) == 0 && environ[i][len] == '=') {
- free(environ[i]);
- environ[i] = NULL;
- found = 1;
- continue;
+ /* note: we do _not_ free the old variable here. It is unsafe to
+ do so, as the pointer may not have come from malloc */
+ memmove(&environ[i], &environ[i+1], (count-i)*sizeof(char *));
+ count--;
+ } else {
+ i++;
}
}