libbb: avoid malloc/free in bb_unsetenv()

function                                             old     new   delta
bb_unsetenv                                           55      83     +28

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2017-07-22 02:15:17 +02:00
parent c9e7843dde
commit ef0366eb4f

View File

@ -344,20 +344,28 @@ void FAST_FUNC xsetenv(const char *key, const char *value)
*/
void FAST_FUNC bb_unsetenv(const char *var)
{
char *tp = strchr(var, '=');
char onstack[128 - 16]; /* smaller stack setup code on x86 */
char *tp;
if (!tp) {
unsetenv(var);
return;
tp = strchr(var, '=');
if (tp) {
/* In case var was putenv'ed, we can't replace '='
* with NUL and unsetenv(var) - it won't work,
* env is modified by the replacement, unsetenv
* sees "VAR" instead of "VAR=VAL" and does not remove it!
* Horror :(
*/
unsigned sz = tp - var;
if (sz < sizeof(onstack)) {
((char*)mempcpy(onstack, var, sz))[0] = '\0';
tp = NULL;
var = onstack;
} else {
/* unlikely: very long var name */
var = tp = xstrndup(var, sz);
}
}
/* In case var was putenv'ed, we can't replace '='
* with NUL and unsetenv(var) - it won't work,
* env is modified by the replacement, unsetenv
* sees "VAR" instead of "VAR=VAL" and does not remove it!
* horror :( */
tp = xstrndup(var, tp - var);
unsetenv(tp);
unsetenv(var);
free(tp);
}