|
Message-ID: <20160104210528.GX238@brightrain.aerifal.cx> Date: Mon, 4 Jan 2016 16:05:29 -0500 From: Rich Felker <dalias@...c.org> To: musl@...ts.openwall.com Subject: Re: [PATCH] fix use of pointer after free in unsetenv On Mon, Jan 04, 2016 at 06:47:36PM +0300, Alexander Monakov wrote: > On Mon, 4 Jan 2016, Alexander Monakov wrote: > > 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): The "goto again" is for the rare (generally malicious) case of duplicate definitions, to ensure that unsetenv removes them all. > > 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]); > > } > > } > > } > > } > > Hm, there's no need to preserve relative order of env entries, is there? Yes, there is. If FOO=x and FOO=y both appear in environ[], unsetenv("BAR") must not cause getenv("FOO") to change from "x" to "y". However the order in __env_map is irrelevant. Its only purpose is to track which slots are allocated so we can free them. Rich
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.