mirror of
https://github.com/pi-hole/dnsmasq.git
synced 2025-12-19 10:18:25 +00:00
Unset environment variables to script when we have no value for them.
This commit is contained in:
93
src/helper.c
93
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)
|
if (data.action != ACTION_TFTP)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_DHCP6
|
#ifdef HAVE_DHCP6
|
||||||
if (is6)
|
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_IAID", daemon->dhcp_buff3, &err);
|
my_setenv("DNSMASQ_MAC", is6 && data.hwaddr_len != 0 ? daemon->dhcp_buff : NULL, &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);
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!is6 && data.clid_len != 0)
|
my_setenv("DNSMASQ_CLIENT_ID", !is6 && data.clid_len != 0 ? daemon->packet : NULL, &err);
|
||||||
my_setenv("DNSMASQ_CLIENT_ID", daemon->packet, &err);
|
my_setenv("DNSMASQ_INTERFACE", strlen(data.interface) != 0 ? data.interface : NULL, &err);
|
||||||
|
|
||||||
if (strlen(data.interface) != 0)
|
|
||||||
my_setenv("DNSMASQ_INTERFACE", data.interface, &err);
|
|
||||||
|
|
||||||
#ifdef HAVE_BROKEN_RTC
|
#ifdef HAVE_BROKEN_RTC
|
||||||
sprintf(daemon->dhcp_buff2, "%u", data.length);
|
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);
|
my_setenv("DNSMASQ_LEASE_EXPIRES", daemon->dhcp_buff2, &err);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (domain)
|
my_setenv("DNSMASQ_DOMAIN", domain, &err);
|
||||||
my_setenv("DNSMASQ_DOMAIN", domain, &err);
|
|
||||||
|
|
||||||
end = extradata + data.ed_len;
|
end = extradata + data.ed_len;
|
||||||
buf = extradata;
|
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)
|
if (is6)
|
||||||
buf = grab_extradata(buf, end, "DNSMASQ_RELAY_ADDRESS", &err);
|
buf = grab_extradata(buf, end, "DNSMASQ_RELAY_ADDRESS", &err);
|
||||||
else if (data.giaddr.s_addr != 0)
|
else
|
||||||
my_setenv("DNSMASQ_RELAY_ADDRESS", inet_ntoa(data.giaddr), &err);
|
my_setenv("DNSMASQ_RELAY_ADDRESS", data.giaddr.s_addr != 0 ? inet_ntoa(data.giaddr) : NULL, &err);
|
||||||
|
|
||||||
for (i = 0; buf; i++)
|
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);
|
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", data.action != ACTION_DEL && data.remaining_time != 0 ? daemon->dhcp_buff2 : NULL, &err);
|
||||||
sprintf(daemon->dhcp_buff2, "%u", data.remaining_time);
|
|
||||||
my_setenv("DNSMASQ_TIME_REMAINING", daemon->dhcp_buff2, &err);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (data.action == ACTION_OLD_HOSTNAME && hostname)
|
my_setenv("DNSMASQ_OLD_HOSTNAME", data.action == ACTION_OLD_HOSTNAME ? hostname : NULL, &err);
|
||||||
{
|
if (data.action == ACTION_OLD_HOSTNAME)
|
||||||
my_setenv("DNSMASQ_OLD_HOSTNAME", hostname, &err);
|
hostname = NULL;
|
||||||
hostname = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (option_bool(OPT_LOG_OPTS))
|
my_setenv("DNSMASQ_LOG_DHCP", option_bool(OPT_LOG_OPTS) ? "1" : NULL, &err);
|
||||||
my_setenv("DNSMASQ_LOG_DHCP", "1", &err);
|
|
||||||
|
|
||||||
/* we need to have the event_fd around if exec fails */
|
/* we need to have the event_fd around if exec fails */
|
||||||
if ((i = fcntl(event_fd, F_GETFD)) != -1)
|
if ((i = fcntl(event_fd, F_GETFD)) != -1)
|
||||||
fcntl(event_fd, F_SETFD, i | FD_CLOEXEC);
|
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)
|
static void my_setenv(const char *name, const char *value, int *error)
|
||||||
{
|
{
|
||||||
if (*error == 0 && setenv(name, value, 1) != 0)
|
if (*error == 0)
|
||||||
*error = errno;
|
{
|
||||||
|
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)
|
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))
|
if (buf && (buf != end))
|
||||||
return NULL;
|
|
||||||
|
|
||||||
for (next = buf; *next != 0; next++)
|
|
||||||
if (next == end)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
if (next != buf)
|
|
||||||
{
|
{
|
||||||
char *p;
|
for (next = buf; ; next++)
|
||||||
/* No "=" in value */
|
if (next == end)
|
||||||
if ((p = strchr((char *)buf, '=')))
|
{
|
||||||
*p = 0;
|
next = NULL;
|
||||||
my_setenv(env, (char *)buf, err);
|
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
|
#ifdef HAVE_LUASCRIPT
|
||||||
|
|||||||
Reference in New Issue
Block a user