50
53
#endif /* HAVE_LOGIN_CAP_H */
55
59
#include "sudoers.h"
62
* If there is no SIZE_MAX or SIZE_T_MAX we have to assume that size_t
63
* could be signed (as it is on SunOS 4.x). This just means that
64
* emalloc2() and erealloc3() cannot allocate huge amounts on such a
65
* platform but that is OK since sudo doesn't need to do so anyway.
69
# define SIZE_MAX SIZE_T_MAX
71
# define SIZE_MAX INT_MAX
72
# endif /* SIZE_T_MAX */
58
76
* Flags used in rebuild_env()
229
247
memset(env.envp, 0, env.env_size * sizeof(char *));
231
249
memcpy(env.envp, envp, len * sizeof(char *));
232
env.envp[len] = '\0';
250
env.envp[len] = NULL;
234
252
/* Free the old envp we allocated, if any. */
235
253
if (env.old_envp != NULL)
263
281
bool found = false;
265
283
/* Make sure there is room for the new entry plus a NULL. */
266
if (env.env_len + 2 > env.env_size) {
284
if (env.env_size > 2 && env.env_len > env.env_size - 2) {
268
size_t nsize = env.env_size + 128;
269
nenvp = env.envp ? realloc(env.envp, nsize * sizeof(char *)) :
270
malloc(nsize * sizeof(char *));
288
if (env.env_size > SIZE_MAX - 128) {
289
errorx2(1, _("internal error, %s overflow"),
290
"sudo_putenv_nodebug()");
292
nsize = env.env_size + 128;
293
if (nsize > SIZE_MAX / sizeof(char *)) {
294
errorx2(1, _("internal error, %s overflow"),
295
"sudo_putenv_nodebug()");
297
nenvp = realloc(env.envp, nsize * sizeof(char *));
271
298
if (nenvp == NULL) {
291
318
len = (strchr(str, '=') - str) + 1;
292
for (ep = env.envp; !found && *ep != NULL; ep++) {
319
for (ep = env.envp; *ep != NULL; ep++) {
293
320
if (strncmp(str, *ep, len) == 0) {
299
/* Prune out duplicate variables. */
327
/* Prune out extra instances of the variable we just overwrote. */
300
328
if (found && overwrite) {
301
while (*ep != NULL) {
329
while (*++ep != NULL) {
302
330
if (strncmp(str, *ep, len) == 0) {
304
332
while ((*cur = *(cur + 1)) != NULL)
310
337
env.env_len = ep - env.envp;
333
360
debug_decl(sudo_putenv, SUDO_DEBUG_ENV)
362
sudo_debug_printf(SUDO_DEBUG_INFO, "sudo_putenv: %s", str);
335
364
rval = sudo_putenv_nodebug(str, dupcheck, overwrite);
336
365
if (rval == -1) {
363
393
strlcat(estring, "=", esize) >= esize ||
364
394
strlcat(estring, val, esize) >= esize) {
366
errorx(1, _("internal error, sudo_setenv2() overflow"));
396
errorx(1, _("internal error, %s overflow"), "sudo_setenv2()");
368
debug_return_int(sudo_putenv(estring, dupcheck, overwrite));
398
rval = sudo_putenv(estring, dupcheck, overwrite);
401
debug_return_int(rval);
390
424
strlcat(estring, val, esize) >= esize) {
395
return sudo_putenv_nodebug(estring, true, overwrite);
429
rval = sudo_putenv_nodebug(estring, true, overwrite);
407
445
rval = sudo_setenv_nodebug(var, val, overwrite);
408
446
if (rval == -1) {
409
447
if (errno == EINVAL)
410
errorx(1, _("internal error, sudo_setenv() overflow"));
448
errorx(1, _("internal error, %s overflow"), "sudo_setenv()");
411
449
errorx(1, _("unable to allocate memory"));
413
451
debug_return_int(rval);
453
491
debug_decl(sudo_unsetenv, SUDO_DEBUG_ENV)
493
sudo_debug_printf(SUDO_DEBUG_INFO, "sudo_unsetenv: %s", name);
455
495
rval = sudo_unsetenv_nodebug(name);
457
497
debug_return_int(rval);
491
531
debug_decl(sudo_getenv, SUDO_DEBUG_ENV)
533
sudo_debug_printf(SUDO_DEBUG_INFO, "sudo_getenv: %s", name);
493
535
val = sudo_getenv_nodebug(name);
495
537
debug_return_str(val);
621
663
delete_it = matches_env_delete(var);
623
665
delete_it = matches_env_check(var) == false;
667
sudo_debug_printf(SUDO_DEBUG_INFO, "delete %s: %s",
668
var, delete_it ? "YES" : "NO");
624
669
debug_return_bool(delete_it);
638
683
if (keepit == -1)
639
684
keepit = matches_env_keep(var);
686
sudo_debug_printf(SUDO_DEBUG_INFO, "keep %s: %s",
687
var, keepit ? "YES" : "NO");
641
688
debug_return_bool(keepit == true);
789
836
if (!ISSET(didvar, DID_SHELL))
790
837
sudo_setenv2("SHELL", sudo_user.pw->pw_shell, false, true);
791
if (!ISSET(didvar, DID_LOGNAME))
792
sudo_setenv2("LOGNAME", user_name, false, true);
793
if (!ISSET(didvar, DID_USER))
794
sudo_setenv2("USER", user_name, false, true);
795
if (!ISSET(didvar, DID_USERNAME))
796
sudo_setenv2("USERNAME", user_name, false, true);
838
/* We will set LOGNAME later in the !def_set_logname case. */
839
if (!def_set_logname) {
840
if (!ISSET(didvar, DID_LOGNAME))
841
sudo_setenv2("LOGNAME", user_name, false, true);
842
if (!ISSET(didvar, DID_USER))
843
sudo_setenv2("USER", user_name, false, true);
844
if (!ISSET(didvar, DID_USERNAME))
845
sudo_setenv2("USERNAME", user_name, false, true);
799
849
/* If we didn't keep HOME, reset it based on target user. */
846
896
* Set $USER, $LOGNAME and $USERNAME to target if "set_logname" is not
847
897
* disabled. We skip this if we are running a login shell (because
848
* they have already been set them) or sudoedit (because we want the
849
* editor to find the user's startup files).
898
* they have already been set) or sudoedit (because we want the editor
899
* to find the invoking user's startup files).
851
901
if (def_set_logname && !ISSET(sudo_mode, MODE_LOGIN_SHELL|MODE_EDIT)) {
852
902
if (!ISSET(didvar, KEPT_LOGNAME))