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);