summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Härdeman2025-11-23 13:46:49 +0000
committerÁlvaro Fernández Rojas2025-11-27 07:24:34 +0000
commitb4ab371c541ab481c7dff001964afd621b5a968d (patch)
treed318d593d47933ab4164f9fe59f6d10e7c14b1f6
parenta05cc991716c7cbd292ab7c9775327b7f7d0922e (diff)
config: fix (S)NTP realloc handling
Make sure that realloc errors are dealt with properly in the (S)NTP option parsing. Signed-off-by: David Härdeman <david@hardeman.nu> Link: https://github.com/openwrt/odhcpd/pull/320 Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
-rw-r--r--src/config.c30
1 files changed, 16 insertions, 14 deletions
diff --git a/src/config.c b/src/config.c
index 68ef3ab..9a09224 100644
--- a/src/config.c
+++ b/src/config.c
@@ -730,10 +730,10 @@ static int parse_ntp_options(uint16_t *dhcpv6_ntp_len, struct in6_addr addr6, ui
{
uint16_t sub_opt = 0, sub_len = htons(IPV6_ADDR_LEN);
uint16_t ntp_len = IPV6_ADDR_LEN + 4;
- uint8_t *ntp = *dhcpv6_ntp;
+ uint8_t *ntp;
size_t pos = *dhcpv6_ntp_len;
- ntp = realloc(ntp, pos + ntp_len);
+ ntp = realloc(*dhcpv6_ntp, pos + ntp_len);
if (!ntp)
return -1;
@@ -760,7 +760,7 @@ static int parse_ntp_fqdn(uint16_t *dhcpv6_ntp_len, char *fqdn, uint8_t **dhcpv6
{
size_t fqdn_len = strlen(fqdn);
uint16_t sub_opt = 0, sub_len = 0, ntp_len = 0;
- uint8_t *ntp = *dhcpv6_ntp;
+ uint8_t *ntp;
size_t pos = *dhcpv6_ntp_len;
uint8_t buf[256] = {0};
@@ -773,7 +773,7 @@ static int parse_ntp_fqdn(uint16_t *dhcpv6_ntp_len, char *fqdn, uint8_t **dhcpv6
ntp_len = len + 4;
- ntp = realloc(ntp, pos + ntp_len);
+ ntp = realloc(*dhcpv6_ntp, pos + ntp_len);
if (!ntp)
return -1;
@@ -1681,32 +1681,34 @@ int config_parse_interface(void *data, size_t len, const char *name, bool overwr
continue;
char *str = blobmsg_get_string(cur);
- struct in_addr addr4;
- struct in6_addr addr6;
+ struct in_addr addr4, *tmp4;
+ struct in6_addr addr6, *tmp6;
if (inet_pton(AF_INET, str, &addr4) == 1) {
if (addr4.s_addr == INADDR_ANY)
goto err;
- iface->dhcpv4_ntp = realloc(iface->dhcpv4_ntp,
- (++iface->dhcpv4_ntp_cnt) * sizeof(*iface->dhcpv4_ntp));
- if (!iface->dhcpv4_ntp)
+ tmp4 = realloc(iface->dhcpv4_ntp, (iface->dhcpv4_ntp_cnt + 1) * sizeof(*iface->dhcpv4_ntp));
+ if (!tmp4)
goto err;
- iface->dhcpv4_ntp[iface->dhcpv4_ntp_cnt - 1] = addr4;
+ iface->dhcpv4_ntp = tmp4;
+ iface->dhcpv4_ntp[iface->dhcpv4_ntp_cnt++] = addr4;
+
} else if (inet_pton(AF_INET6, str, &addr6) == 1) {
if (IN6_IS_ADDR_UNSPECIFIED(&addr6))
goto err;
- iface->dhcpv6_sntp = realloc(iface->dhcpv6_sntp,
- (++iface->dhcpv6_sntp_cnt) * sizeof(*iface->dhcpv6_sntp));
- if (!iface->dhcpv6_sntp)
+ tmp6 = realloc(iface->dhcpv6_sntp, (iface->dhcpv6_sntp_cnt + 1) * sizeof(*iface->dhcpv6_sntp));
+ if (!tmp6)
goto err;
- iface->dhcpv6_sntp[iface->dhcpv6_sntp_cnt - 1] = addr6;
+ iface->dhcpv6_sntp = tmp6;
+ iface->dhcpv6_sntp[iface->dhcpv6_sntp_cnt++] = addr6;
if (!parse_ntp_options(&iface->dhcpv6_ntp_len, addr6, &iface->dhcpv6_ntp))
iface->dhcpv6_ntp_cnt++;
+
} else {
if (!parse_ntp_fqdn(&iface->dhcpv6_ntp_len, str, &iface->dhcpv6_ntp))
iface->dhcpv6_ntp_cnt++;