diff --git a/src/agent.c b/src/agent.c
index 9b68419886189eb18b89da115a6f4330763a3da0..2c97ce3ec9f6c3a28b2e0e24247558f7b26efd11 100644
--- a/src/agent.c
+++ b/src/agent.c
@@ -369,15 +369,14 @@ static void wifiagent_log_steer(struct agent *a,
{
char ev[512] = {0};
unsigned char macaddr[6] = {0};
- char ifname[16] = {0};
+ char ifname[IFNAMSIZ] = {0};
char type[32] = {0};
if (!stamac || !vifname || !steer_type)
return;
memcpy(macaddr, stamac, 6);
- strncpy(ifname, vifname, 16);
- ifname[15] = '\0';
+ strncpy(ifname, vifname, IFNAMSIZ - 1);
strncpy(type, steer_type, 31);
snprintf(ev, sizeof(ev), "{\"macaddr\":\""MACFMT"\""
@@ -3004,7 +3003,7 @@ char *agent_get_backhaul_ifname(struct agent *a, char *ifname)
if (!tb[0])
goto out;
- strncpy(ifname, blobmsg_data(tb[0]), IFNAMSIZ);
+ strncpy(ifname, blobmsg_data(tb[0]), IFNAMSIZ - 1);
if (tb[1]) {
uint8_t macaddr[6] = {0};
diff --git a/src/agent_map.c b/src/agent_map.c
index 46c610a078bae4c1b03a4e73e59b482c20e49c93..da683d5e7d1c974d0eee0c9f2c03c71893b59974 100644
--- a/src/agent_map.c
+++ b/src/agent_map.c
@@ -661,7 +661,7 @@ int handle_topology_discovery(void *agent, struct cmdu_buff *cmdu,
};
struct tlv *tv[2][TLV_MAXNUM] = {0};
int ret = -1;
- char ul_ifname[16] = {0};
+ char ul_ifname[IFNAMSIZ] = {0};
struct blob_buf bk = {0};
struct blob_attr *tb[3];
uint8_t almac[6] = {0};
@@ -716,7 +716,7 @@ int handle_topology_discovery(void *agent, struct cmdu_buff *cmdu,
if (!tb[0])
goto out;
- strncpy(ul_ifname, blobmsg_data(tb[0]), IFNAMSIZ);
+ strncpy(ul_ifname, blobmsg_data(tb[0]), IFNAMSIZ - 1);
if (!strncmp(ul_ifname, cmdu->dev_ifname, IFNAMSIZ)) {
memcpy(a->ul_dev.ul_almac, almac, 6);
@@ -796,7 +796,7 @@ int handle_topology_query(void *agent, struct cmdu_buff *cmdu, struct node *n)
if (hwaddr_is_zero(resp->origin)) {
memcpy(resp->origin, cmdu->dev_macaddr, 6);
- strncpy(resp->dev_ifname, cmdu->dev_ifname, 15);
+ strncpy(resp->dev_ifname, cmdu->dev_ifname, IFNAMSIZ - 1);
}
ret = CMDU_HOOK(a, cmdu_get_type(resp), cmdu_get_mid(resp),
diff --git a/src/agent_ubus.c b/src/agent_ubus.c
index ea298a8d558f7bb3fb1306ddac3c6b546b27e62f..72580591218b653de86428c236eef3dcb7cee38c 100644
--- a/src/agent_ubus.c
+++ b/src/agent_ubus.c
@@ -700,7 +700,7 @@ static int topology_query(struct ubus_context *ctx, struct ubus_object *obj,
strncpy(agent, blobmsg_data(tb[TOPOLOGY_QUERY_AGENT]),
sizeof(agent) - 1);
} else {
- strncpy(agent, MULTICAST_ADDR_STR, 18);
+ strncpy(agent, MULTICAST_ADDR_STR, sizeof(agent));
}
if (!hwaddr_aton(agent, agent_mac))
return UBUS_STATUS_UNKNOWN_ERROR;
diff --git a/src/config.c b/src/config.c
index e33eee04e35b581262d0fce016baa6ecae80cf97..644110f896c318e9a0fd4b59f070c848753b18c5 100644
--- a/src/config.c
+++ b/src/config.c
@@ -2252,8 +2252,8 @@ static int agent_config_get_wifi_radio(struct agent_config *a,
list_add_tail(&n->list, &a->radiolist);
}
- strncpy(n->name, ifname, 16);
- n->name[15] = '\0';
+ strncpy(n->name, ifname, IFNAMSIZ - 1);
+ n->name[IFNAMSIZ - 1] = '\0';
if (band == 2) {
n->band = BAND_2;
rcpi_threshold = 70;
@@ -3841,7 +3841,7 @@ int config_calc_ifname(struct agent_config *cfg,
strncat(fmt, "%hhu", sizeof(fmt) - strlen(fmt) - 1);
} else {
/* legacy: option netdev 'wl' (or 'wlan') */
- strncpy(fmt, cfg->netdev, sizeof(fmt));
+ strncpy(fmt, cfg->netdev, IFNAMSIZ - 1);
snprintf(ifname, IFNAMSIZ, "%s", cfg->netdev);
snprintf(ifname + strlen(ifname), IFNAMSIZ, "%hhu", dev_num);
if (index > 0) {
diff --git a/src/dpp.c b/src/dpp.c
index 239dfb52b4e7249206d9d312de66576cc436fc4a..bdc4886e3a1d1fa74c96de65176d139bae4e352f 100644
--- a/src/dpp.c
+++ b/src/dpp.c
@@ -179,7 +179,7 @@ char *agent_get_backhaul_hex(struct agent *a, enum wifi_band band,
str2hex(ssid, strlen(ssid), hex_ssid);
str2hex(key, strlen(key), hex_key);
- strncpy(encryption, ap->cfg->encryption, 32);
+ strncpy(encryption, ap->cfg->encryption, 31);
ifname = (char *)ap->cfg->name;
break;
}
@@ -392,7 +392,7 @@ int dpp_gen_uri_wifi(struct netif_bk *bk)
if (!strlen(buf))
return -1;
- strncpy(p->uri, buf, sizeof(p->uri));
+ strncpy(p->uri, buf, sizeof(p->uri) - 1);
warn("|%s:%d| ifname:%s added uri:%s\n", __func__, __LINE__, p->ifname, p->uri);
/* TODO: write to UCI */
@@ -1001,14 +1001,14 @@ void dpp_enrollee_evh(void *agent, struct blob_attr *msg)
warn("|%s:%d| dpp-confobj-akm:%s\n", __func__, __LINE__, data);
- strncpy(akm, data, sizeof(creds->akm));
+ strncpy(akm, data, sizeof(creds->akm) - 1);
creds->stored |= DPP_CONFOBJ_AKM;
} else if (!strcmp(event, "dpp-confobj-ssid")) {
char *ssid = creds->ssid;
warn("|%s:%d| dpp-confobj-ssid:%s\n", __func__, __LINE__, data);
- strncpy(ssid, data, sizeof(creds->ssid));
+ strncpy(ssid, data, sizeof(creds->ssid) - 1);
creds->stored |= DPP_CONFOBJ_SSID;
} else if (!strcmp(event, "dpp-confobj-pass")) {
char *key;
@@ -1024,7 +1024,7 @@ void dpp_enrollee_evh(void *agent, struct blob_attr *msg)
warn("|%s:%d| dpp-confobj-pass:%s\n", __func__, __LINE__, data);
warn("|%s:%d| dpp-confobj-pass-ascii:%s\n", __func__, __LINE__, key);
- strncpy(creds->key, key, sizeof(creds->key));
+ strncpy(creds->key, key, sizeof(creds->key) - 1);
creds->stored |= DPP_CONFOBJ_KEY;
} else if (!strcmp(event, "dpp-connector")) {
int len = strlen(data);
diff --git a/src/dynbh/dynbh.c b/src/dynbh/dynbh.c
index 65ff1d0627ca324a3fa04f471875b7241b1cef58..bf27a01ce3aa732a30010e352689e43377455f3b 100644
--- a/src/dynbh/dynbh.c
+++ b/src/dynbh/dynbh.c
@@ -218,7 +218,7 @@ struct ethport *alloc_ethport_search(struct mapclient_private *priv,
if (!ap)
return NULL;
- strncpy(ap->ifname, ifname, 16);
+ strncpy(ap->ifname, ifname, sizeof(ap->ifname) - 1);
timer_init(&ap->send_query, send_query_cb);
timer_init(&ap->bridge_add, bridge_readd);
list_add_tail(&ap->list, &priv->ethportlist);
@@ -380,7 +380,8 @@ static char *agent_get_backhaul_ifname(char *ifname)
if (!tb[0])
goto out;
- strncpy(ifname, blobmsg_data(tb[0]), 16);
+ strncpy(ifname, blobmsg_data(tb[0]), 15);
+ ifname[15] = '\0';
blob_buf_free(&bk);
return ifname;
diff --git a/src/nl.c b/src/nl.c
index 2cb3d2acdb2ffecc06988512d2cd16d2440558f5..c83a225d2ae23f57ed9a1ce274b87f45f509fb86 100644
--- a/src/nl.c
+++ b/src/nl.c
@@ -79,7 +79,7 @@ static struct ts_iface *ts_configure_iface(struct ts_context *ts,
for (i = 0; i < TS_IFACE_MAX_NUM; i++) {
tsif = &ts->iface_array[i];
if (tsif->name[0] == '\0') {
- strncpy(tsif->name, ifname, IFNAMSIZ);
+ strncpy(tsif->name, ifname, IFNAMSIZ - 1);
ts->check_tags = true;
break;
}
@@ -307,7 +307,7 @@ static void ts_set_system(struct ts_context *ts)
if (ts->primary_vid == 0)
return;
- strncpy(cmd, "/lib/wifi/multiap ts keep", sizeof(cmd));
+ strncpy(cmd, "/lib/wifi/multiap ts keep", sizeof(cmd) - 1);
for (i = 0; i < ts->num_vids; i++) {
vid = ts->all_vids[i];
@@ -372,7 +372,7 @@ int if_updown(const char *ifname, bool up)
}
memset(&ifr, 0, sizeof(ifr));
- strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
+ strncpy(ifr.ifr_name, ifname, IFNAMSIZ - 1);
if (ioctl(fd, SIOCGIFFLAGS, &ifr) != 0) {
close(fd);