]> granicus.if.org Git - cronie/commitdiff
Copy some variables from the crond process environment.
authorTomas Mraz <tmraz@fedoraproject.org>
Fri, 7 Jun 2013 15:37:32 +0000 (17:37 +0200)
committerTomas Mraz <tmraz@fedoraproject.org>
Fri, 7 Jun 2013 15:37:32 +0000 (17:37 +0200)
Also cleanup error handling in load_env().

src/env.c
src/funcs.h
src/user.c

index 772e9a0bac16eff66e7c9f4b01053a0b479b4453..1ebea6299982d12cafdc41b44ec5afa847ff8787 100644 (file)
--- a/src/env.c
+++ b/src/env.c
@@ -25,6 +25,7 @@
 #include <errno.h>
 #include <stdlib.h>
 #include <string.h>
+#include <unistd.h>
 
 #include "globals.h"
 #include "funcs.h"
@@ -67,7 +68,7 @@ char **env_copy(char **envp) {
        return (p);
 }
 
-char **env_set(char **envp, char *envstr) {
+char **env_set(char **envp, const char *envstr) {
        int count, found;
        char **p, *envtmp;
 
@@ -112,6 +113,47 @@ char **env_set(char **envp, char *envstr) {
        return (p);
 }
 
+int env_set_from_environ(char ***envpp) {
+       static const char *names[] = {
+               "LANG",
+               "LC_CTYPE",
+               "LC_NUMERIC",
+               "LC_TIME",
+               "LC_COLLATE",
+               "LC_MONETARY",
+               "LC_MESSAGES",
+               "LC_PAPER",
+               "LC_NAME",
+               "LC_ADDRESS",
+               "LC_TELEPHONE",
+               "LC_MEASUREMENT",
+               "LC_IDENTIFICATION",
+               "LC_ALL",
+               "LANGUAGE",
+               NULL
+       };
+       const char **name;
+       char **procenv;
+
+       for (procenv = environ; *procenv != NULL; ++procenv) {
+               for (name = names; *name != NULL; ++name) {
+                       size_t namelen;
+
+                       namelen = strlen(*name);
+                       if (strncmp(*name, *procenv, namelen) == 0 
+                           && (*procenv)[namelen] == '=') {
+                               char **tmpenv;
+
+                               tmpenv = env_set(*envpp, *procenv);
+                               if (tmpenv == NULL)
+                                       return FALSE;
+                               *envpp = tmpenv;
+                       }
+               }
+       }
+       return TRUE;
+}
+
 /* The following states are used by load_env(), traversed in order: */
 enum env_state {
        NAMEI,  /* First char of NAME, may be quote */
index 4d95d220552642444f40f783c32b2948b74f229f..76376b97ef50316a2f228ce0e3f758dfe16a5235 100644 (file)
@@ -67,6 +67,7 @@ int           load_database(cron_db *),
                swap_uids(void),
                swap_uids_back(void),
                load_env(char *, FILE *),
+               env_set_from_environ(char ***envpp),
                cron_pclose(FILE *),
                glue_strings(char *, size_t, const char *, const char *, char),
                strcmp_until(const char *, const char *, char),
@@ -81,7 +82,7 @@ char          *env_get(const char *, char **),
                *first_word(const char *, const char *),
                **env_init(void),
                **env_copy(char **),
-               **env_set(char **, char *);
+               **env_set(char **, const char *);
 
 user           *load_user(int, struct passwd *, const char *, const char *, const char *),
                *find_user(cron_db *, const char *, const char *);
index 1fae04e8ccf5bf3e0d054f0bf2cc98adb916104d..dea97aeeb2706e306d3c9c95d89e12586e8a354a 100644 (file)
@@ -63,7 +63,7 @@ load_user (int crontab_fd, struct passwd *pw, const char *uname,
        FILE *file;
        user *u;
        entry *e;
-       int status, save_errno = errno;
+       int status = ERR, save_errno = 0;
        char **envp = NULL, **tenvp;
 
        if (!(file = fdopen(crontab_fd, "r")))  {
@@ -84,8 +84,6 @@ load_user (int crontab_fd, struct passwd *pw, const char *uname,
        if (((u->name = strdup(fname)) == NULL)
                || ((u->tabname = strdup(tabname)) == NULL)) {
                save_errno = errno;
-               free_user(u);
-               u = NULL;
                goto done;
        }
 
@@ -94,16 +92,17 @@ load_user (int crontab_fd, struct passwd *pw, const char *uname,
        */
        if ((envp = env_init()) == NULL) {
                save_errno = errno;
-               free_user(u);
-               u = NULL;
+               goto done;
+       }
+
+       if (env_set_from_environ(&envp) == FALSE) {
+               save_errno = errno;
                goto done;
        }
 
 #ifdef WITH_SELINUX
        if (get_security_context(pw == NULL ? NULL : uname,
                crontab_fd, &u->scontext, tabname) != 0) {
-               free_user (u);
-               u = NULL;
                goto done;
        }
 #endif
@@ -113,8 +112,6 @@ load_user (int crontab_fd, struct passwd *pw, const char *uname,
                switch (status) {
                        case ERR:
                                save_errno = errno;
-                               free_user(u);
-                               u = NULL;
                                goto done;
                        case FALSE:
                                FileName = tabname;
@@ -126,9 +123,8 @@ load_user (int crontab_fd, struct passwd *pw, const char *uname,
                                break;
                        case TRUE:
                                if ((tenvp = env_set (envp, envstr)) == NULL) {
+                                       status = ERR;
                                        save_errno = errno;
-                                       free_user(u);
-                                       u = NULL;
                                        goto done;
                                }
                        envp = tenvp;
@@ -137,6 +133,10 @@ load_user (int crontab_fd, struct passwd *pw, const char *uname,
        }
 
 done:
+       if (status == ERR) {
+               free_user(u);
+               u = NULL;
+       }
        if (envp)
                env_free(envp);
        fclose(file);