Do not call sudo_warnx() on invalid value from the env hook functions
as the printf() family may call getenv() for locale reasons.
This commit is contained in:
52
src/hooks.c
52
src/hooks.c
@@ -74,18 +74,9 @@ process_hooks_setenv(const char *name, const char *value, int overwrite)
|
||||
/* First process the hooks. */
|
||||
SLIST_FOREACH(hook, &sudo_hook_setenv_list, entries) {
|
||||
rc = hook->u.setenv_fn(name, value, overwrite, hook->closure);
|
||||
switch (rc) {
|
||||
case SUDO_HOOK_RET_NEXT:
|
||||
break;
|
||||
case SUDO_HOOK_RET_ERROR:
|
||||
case SUDO_HOOK_RET_STOP:
|
||||
goto done;
|
||||
default:
|
||||
sudo_warnx_nodebug("invalid setenv hook return value: %d", rc);
|
||||
break;
|
||||
}
|
||||
if (rc == SUDO_HOOK_RET_STOP || SUDO_HOOK_RET_ERROR)
|
||||
break;
|
||||
}
|
||||
done:
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -99,18 +90,9 @@ process_hooks_putenv(char *string)
|
||||
/* First process the hooks. */
|
||||
SLIST_FOREACH(hook, &sudo_hook_putenv_list, entries) {
|
||||
rc = hook->u.putenv_fn(string, hook->closure);
|
||||
switch (rc) {
|
||||
case SUDO_HOOK_RET_NEXT:
|
||||
break;
|
||||
case SUDO_HOOK_RET_ERROR:
|
||||
case SUDO_HOOK_RET_STOP:
|
||||
goto done;
|
||||
default:
|
||||
sudo_warnx_nodebug("invalid putenv hook return value: %d", rc);
|
||||
break;
|
||||
}
|
||||
if (rc == SUDO_HOOK_RET_STOP || SUDO_HOOK_RET_ERROR)
|
||||
break;
|
||||
}
|
||||
done:
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -125,18 +107,9 @@ process_hooks_getenv(const char *name, char **value)
|
||||
/* First process the hooks. */
|
||||
SLIST_FOREACH(hook, &sudo_hook_getenv_list, entries) {
|
||||
rc = hook->u.getenv_fn(name, &val, hook->closure);
|
||||
switch (rc) {
|
||||
case SUDO_HOOK_RET_NEXT:
|
||||
break;
|
||||
case SUDO_HOOK_RET_ERROR:
|
||||
case SUDO_HOOK_RET_STOP:
|
||||
goto done;
|
||||
default:
|
||||
sudo_warnx_nodebug("invalid getenv hook return value: %d", rc);
|
||||
break;
|
||||
}
|
||||
if (rc == SUDO_HOOK_RET_STOP || SUDO_HOOK_RET_ERROR)
|
||||
break;
|
||||
}
|
||||
done:
|
||||
if (val != NULL)
|
||||
*value = val;
|
||||
return rc;
|
||||
@@ -152,18 +125,9 @@ process_hooks_unsetenv(const char *name)
|
||||
/* First process the hooks. */
|
||||
SLIST_FOREACH(hook, &sudo_hook_unsetenv_list, entries) {
|
||||
rc = hook->u.unsetenv_fn(name, hook->closure);
|
||||
switch (rc) {
|
||||
case SUDO_HOOK_RET_NEXT:
|
||||
break;
|
||||
case SUDO_HOOK_RET_ERROR:
|
||||
case SUDO_HOOK_RET_STOP:
|
||||
goto done;
|
||||
default:
|
||||
sudo_warnx_nodebug("invalid unsetenv hook return value: %d", rc);
|
||||
break;
|
||||
}
|
||||
if (rc == SUDO_HOOK_RET_STOP || SUDO_HOOK_RET_ERROR)
|
||||
break;
|
||||
}
|
||||
done:
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user