|
|
Message-ID: <alpine.LNX.2.20.1601041403590.15644@monopod.intra.ispras.ru>
Date: Mon, 4 Jan 2016 14:56:26 +0300 (MSK)
From: Alexander Monakov <amonakov@...ras.ru>
To: musl@...ts.openwall.com
Subject: Re: [PATCH] fix use of pointer after free in unsetenv
On Mon, 4 Jan 2016, Alexander Cherepanov wrote:
> This depends on whether our __env_map[j] could be 0. The condition
> "__env_map[j]" in the previous loop hints that it could. Then it should be
> something like this:
>
> if (__env_map[j]) {
> free (__env_map[j]);
> do __env_map[j] = __env_map[j+1];
> while (__env_map[++j]);
> }
True, but it wouldn't solve the problem in its entirety. There's a similar
issue further down (line 26 atm), where __environ[i] is tested in a loop.
However, if we executed free(__env_map[j]), then __env_map[j]==__environ[i]
had held. Thus, entering the loop invokes the same UB.
To me the implementation looks weird due to how it restarts scanning __environ
with 'goto again' from position 0 instead of current position. I can propose
the following rewrite (untested):
for (i=0; __environ[i]; i++) {
char *e = __environ[i];
if (!memcmp(name, e, l) && e[l] == '=') {
for (j=i--; __environ[j]; j++)
__environ[j] = __environ[j+1];
if (__env_map) {
for (j=0; __env_map[j] && __env_map[j] != e; j++);
if (__env_map[j]) {
free(__env_map[j]);
do __env_map[j] = __env_map[j+1];
while (__env_map[++j]);
}
}
}
}
Alexadner
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.