From d4da20f064f4d155ad27f1595893e5b0a6c4c5e1 Mon Sep 17 00:00:00 2001 From: Simon Kelley Date: Fri, 4 Oct 2013 10:12:49 +0100 Subject: [PATCH] Unset environment variables to script when we have no value for them. --- src/helper.c | 93 ++++++++++++++++++++++++++-------------------------- 1 file changed, 46 insertions(+), 47 deletions(-) diff --git a/src/helper.c b/src/helper.c index 5872e6a..24c2afd 100644 --- a/src/helper.c +++ b/src/helper.c @@ -481,20 +481,13 @@ int create_helper(int event_fd, int err_fd, uid_t uid, gid_t gid, long max_fd) if (data.action != ACTION_TFTP) { #ifdef HAVE_DHCP6 - if (is6) - { - my_setenv("DNSMASQ_IAID", daemon->dhcp_buff3, &err); - my_setenv("DNSMASQ_SERVER_DUID", daemon->dhcp_packet.iov_base, &err); - if (data.hwaddr_len != 0) - my_setenv("DNSMASQ_MAC", daemon->dhcp_buff, &err); - } + my_setenv("DNSMASQ_IAID", is6 ? daemon->dhcp_buff3 : NULL, &err); + my_setenv("DNSMASQ_SERVER_DUID", is6 ? daemon->dhcp_packet.iov_base : NULL, &err); + my_setenv("DNSMASQ_MAC", is6 && data.hwaddr_len != 0 ? daemon->dhcp_buff : NULL, &err); #endif - if (!is6 && data.clid_len != 0) - my_setenv("DNSMASQ_CLIENT_ID", daemon->packet, &err); - - if (strlen(data.interface) != 0) - my_setenv("DNSMASQ_INTERFACE", data.interface, &err); + my_setenv("DNSMASQ_CLIENT_ID", !is6 && data.clid_len != 0 ? daemon->packet : NULL, &err); + my_setenv("DNSMASQ_INTERFACE", strlen(data.interface) != 0 ? data.interface : NULL, &err); #ifdef HAVE_BROKEN_RTC sprintf(daemon->dhcp_buff2, "%u", data.length); @@ -504,8 +497,7 @@ int create_helper(int event_fd, int err_fd, uid_t uid, gid_t gid, long max_fd) my_setenv("DNSMASQ_LEASE_EXPIRES", daemon->dhcp_buff2, &err); #endif - if (domain) - my_setenv("DNSMASQ_DOMAIN", domain, &err); + my_setenv("DNSMASQ_DOMAIN", domain, &err); end = extradata + data.ed_len; buf = extradata; @@ -543,8 +535,8 @@ int create_helper(int event_fd, int err_fd, uid_t uid, gid_t gid, long max_fd) if (is6) buf = grab_extradata(buf, end, "DNSMASQ_RELAY_ADDRESS", &err); - else if (data.giaddr.s_addr != 0) - my_setenv("DNSMASQ_RELAY_ADDRESS", inet_ntoa(data.giaddr), &err); + else + my_setenv("DNSMASQ_RELAY_ADDRESS", data.giaddr.s_addr != 0 ? inet_ntoa(data.giaddr) : NULL, &err); for (i = 0; buf; i++) { @@ -552,22 +544,16 @@ int create_helper(int event_fd, int err_fd, uid_t uid, gid_t gid, long max_fd) buf = grab_extradata(buf, end, daemon->dhcp_buff2, &err); } - if (data.action != ACTION_DEL && data.remaining_time != 0) - { - sprintf(daemon->dhcp_buff2, "%u", data.remaining_time); - my_setenv("DNSMASQ_TIME_REMAINING", daemon->dhcp_buff2, &err); - } + sprintf(daemon->dhcp_buff2, "%u", data.remaining_time); + my_setenv("DNSMASQ_TIME_REMAINING", data.action != ACTION_DEL && data.remaining_time != 0 ? daemon->dhcp_buff2 : NULL, &err); - if (data.action == ACTION_OLD_HOSTNAME && hostname) - { - my_setenv("DNSMASQ_OLD_HOSTNAME", hostname, &err); - hostname = NULL; - } + my_setenv("DNSMASQ_OLD_HOSTNAME", data.action == ACTION_OLD_HOSTNAME ? hostname : NULL, &err); + if (data.action == ACTION_OLD_HOSTNAME) + hostname = NULL; } - if (option_bool(OPT_LOG_OPTS)) - my_setenv("DNSMASQ_LOG_DHCP", "1", &err); - + my_setenv("DNSMASQ_LOG_DHCP", option_bool(OPT_LOG_OPTS) ? "1" : NULL, &err); + /* we need to have the event_fd around if exec fails */ if ((i = fcntl(event_fd, F_GETFD)) != -1) fcntl(event_fd, F_SETFD, i | FD_CLOEXEC); @@ -590,31 +576,44 @@ int create_helper(int event_fd, int err_fd, uid_t uid, gid_t gid, long max_fd) static void my_setenv(const char *name, const char *value, int *error) { - if (*error == 0 && setenv(name, value, 1) != 0) - *error = errno; + if (*error == 0) + { + if (!value) + unsetenv(name); + else if (setenv(name, value, 1) != 0) + *error = errno; + } } static unsigned char *grab_extradata(unsigned char *buf, unsigned char *end, char *env, int *err) { - unsigned char *next; + unsigned char *next = NULL; + char *val = NULL; - if (!buf || (buf == end)) - return NULL; - - for (next = buf; *next != 0; next++) - if (next == end) - return NULL; - - if (next != buf) + if (buf && (buf != end)) { - char *p; - /* No "=" in value */ - if ((p = strchr((char *)buf, '='))) - *p = 0; - my_setenv(env, (char *)buf, err); - } + for (next = buf; ; next++) + if (next == end) + { + next = NULL; + break; + } + else if (*next == 0) + break; - return next + 1; + if (next && (next != buf)) + { + char *p; + /* No "=" in value */ + if ((p = strchr((char *)buf, '='))) + *p = 0; + val = (char *)buf; + } + } + + my_setenv(env, val, err); + + return next ? next + 1 : NULL; } #ifdef HAVE_LUASCRIPT