summaryrefslogtreecommitdiffhomepage
path: root/src/config.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/config.c')
-rw-r--r--src/config.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/src/config.c b/src/config.c
index 7940095..9ce20ef 100644
--- a/src/config.c
+++ b/src/config.c
@@ -4,12 +4,14 @@
#include <arpa/inet.h>
#include <unistd.h>
#include <libgen.h>
+#include <net/if.h>
#include <string.h>
#include <sys/stat.h>
#include <syslog.h>
#include <uci.h>
#include <uci_blob.h>
+#include <libubox/utils.h>
#include "odhcpd.h"
@@ -235,6 +237,7 @@ static void close_interface(struct interface *iface)
setup_dhcpv4_interface(iface, false);
clean_interface(iface);
+ free(iface->ifname);
free(iface);
}
@@ -394,11 +397,13 @@ int config_parse_interface(void *data, size_t len, const char *name, bool overwr
struct interface *iface = get_interface(name);
if (!iface) {
- iface = calloc(1, sizeof(*iface));
+ char *iface_name;
+
+ iface = calloc_a(sizeof(*iface), &iface_name, strlen(name) + 1);
if (!iface)
return -1;
- strncpy(iface->name, name, sizeof(iface->name) - 1);
+ iface->name = strcpy(iface_name, name);
set_interface_defaults(iface);
@@ -415,15 +420,20 @@ int config_parse_interface(void *data, size_t len, const char *name, bool overwr
}
#ifdef WITH_UBUS
- if (overwrite || !iface->ifname[0])
+ if (overwrite || !iface->ifname)
ifname = ubus_get_ifname(name);
#endif
- if (!iface->ifname[0] && !ifname)
+ if (!iface->ifname && !ifname)
goto err;
- if (ifname)
- strncpy(iface->ifname, ifname, sizeof(iface->ifname) - 1);
+ if (ifname) {
+ free(iface->ifname);
+ iface->ifname = strdup(ifname);
+
+ if (!iface->ifname)
+ goto err;
+ }
if ((iface->ifindex = if_nametoindex(iface->ifname)) <= 0)
goto err;