/*
- * Copyright (c) 2011 Todd C. Miller <Todd.Miller@courtesan.com>
+ * Copyright (c) 2011-2012 Todd C. Miller <Todd.Miller@courtesan.com>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
char *slash = NULL;
const char *endbrace, *src = dir;
static struct path_escape *escapes;
- int pass;
+ int pass, oldlocale;
bool strfit;
debug_decl(expand_iolog_path, SUDO_DEBUG_UTIL)
time(&now);
timeptr = localtime(&now);
-#ifdef HAVE_SETLOCALE
- if (!setlocale(LC_ALL, def_sudoers_locale)) {
- warningx(_("unable to set locale to \"%s\", using \"C\""),
- def_sudoers_locale);
- setlocale(LC_ALL, "C");
- }
-#endif
+ /* Use sudoers locale for strftime() */
+ sudoers_setlocale(SUDOERS_LOCALE_SUDOERS, &oldlocale);
+
/* We only calls strftime() on the current part of the buffer. */
tmpbuf[sizeof(tmpbuf) - 1] = '\0';
len = strftime(tmpbuf, sizeof(tmpbuf), dst0, timeptr);
-#ifdef HAVE_SETLOCALE
- setlocale(LC_ALL, "");
-#endif
+ /* Restore old locale. */
+ sudoers_setlocale(oldlocale, NULL);
+
if (len == 0 || tmpbuf[sizeof(tmpbuf) - 1] != '\0')
goto bad; /* strftime() failed, buf too small? */
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif /* HAVE_UNISTD_H */
-#ifdef HAVE_SETLOCALE
-# include <locale.h>
-#endif /* HAVE_SETLOCALE */
#ifdef HAVE_NL_LANGINFO
# include <langinfo.h>
#endif /* HAVE_NL_LANGINFO */
size_t len, maxlen;
char *p, *tmp, save;
const char *fmt;
-#ifdef HAVE_SETLOCALE
- const char *old_locale = estrdup(setlocale(LC_ALL, NULL));
-#endif
+ int oldlocale;
debug_decl(do_syslog, SUDO_DEBUG_LOGGING)
-#ifdef HAVE_SETLOCALE
- if (!setlocale(LC_ALL, def_sudoers_locale))
- setlocale(LC_ALL, "C");
-#endif /* HAVE_SETLOCALE */
+ sudoers_setlocale(SUDOERS_LOCALE_SUDOERS, &oldlocale);
/*
* Log the full line, breaking into multiple syslog(3) calls if necessary
maxlen = MAXSYSLOGLEN - (strlen(fmt) - 5 + strlen(user_name));
}
-#ifdef HAVE_SETLOCALE
- setlocale(LC_ALL, old_locale);
- efree((void *)old_locale);
-#endif /* HAVE_SETLOCALE */
+ sudoers_setlocale(oldlocale, NULL);
debug_return;
}
size_t len;
mode_t oldmask;
time_t now;
+ int oldlocale;
FILE *fp;
debug_decl(do_logfile, SUDO_DEBUG_LOGGING)
+ sudoers_setlocale(SUDOERS_LOCALE_SUDOERS, &oldlocale);
+
oldmask = umask(077);
fp = fopen(def_logfile, "a");
(void) umask(oldmask);
send_mail(_("unable to lock log file: %s: %s"),
def_logfile, strerror(errno));
} else {
-#ifdef HAVE_SETLOCALE
- const char *old_locale = estrdup(setlocale(LC_ALL, NULL));
- if (!setlocale(LC_ALL, def_sudoers_locale))
- setlocale(LC_ALL, "C");
-#endif /* HAVE_SETLOCALE */
-
now = time(NULL);
if (def_loglinelen < sizeof(LOG_INDENT)) {
/* Don't pretty-print long log file lines (hard to grep) */
(void) fflush(fp);
(void) lock_file(fileno(fp), SUDO_UNLOCK);
(void) fclose(fp);
-
-#ifdef HAVE_SETLOCALE
- setlocale(LC_ALL, old_locale);
- efree((void *)old_locale);
-#endif /* HAVE_SETLOCALE */
}
+ sudoers_setlocale(oldlocale, NULL);
+
debug_return;
}
(void) dup2(fd, STDERR_FILENO);
}
-#ifdef HAVE_SETLOCALE
- if (!setlocale(LC_ALL, def_sudoers_locale)) {
- setlocale(LC_ALL, "C");
- efree(def_sudoers_locale);
- def_sudoers_locale = estrdup("C");
- }
-#endif /* HAVE_SETLOCALE */
+ sudoers_setlocale(SUDOERS_LOCALE_SUDOERS, NULL);
/* Close password, group and other fds so we don't leak. */
sudo_endpwent();
char *iolog_path = NULL;
mode_t cmnd_umask = 0777;
struct sudo_nss *nss;
- int cmnd_status = -1, validated;
+ int cmnd_status = -1, oldlocale, validated;
volatile int rval = true;
sigaction_t sa, saved_sa_int, saved_sa_quit, saved_sa_tstp;
debug_decl(sudoers_policy_main, SUDO_DEBUG_PLUGIN)
/* Find command in path */
cmnd_status = set_cmnd();
-#ifdef HAVE_SETLOCALE
- if (!setlocale(LC_ALL, def_sudoers_locale)) {
- warningx(_("unable to set locale to \"%s\", using \"C\""),
- def_sudoers_locale);
- setlocale(LC_ALL, "C");
- }
-#endif
-
/*
- * Check sudoers sources.
+ * Check sudoers sources, using the locale specified in sudoers.
*/
+ sudoers_setlocale(SUDOERS_LOCALE_SUDOERS, &oldlocale);
validated = FLAG_NO_USER | FLAG_NO_HOST;
tq_foreach_fwd(snl, nss) {
validated = nss->lookup(nss, validated, pwflag);
}
}
+ /* Restore user's locale. */
+ sudoers_setlocale(oldlocale, NULL);
+
if (safe_cmnd == NULL)
safe_cmnd = estrdup(user_cmnd);
-#ifdef HAVE_SETLOCALE
- setlocale(LC_ALL, "");
-#endif
-
/* If only a group was specified, set runas_pw based on invoking user. */
if (runas_pw == NULL)
set_runaspw(user_name);