aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPablo Neira Ayuso <pablo@gnumonks.org>2013-07-05 15:00:13 +0200
committerPablo Neira Ayuso <pablo@gnumonks.org>2013-07-05 15:05:30 +0200
commit4bab3bf415985f778e826aaf68e4e1c0815edf2d (patch)
treefe843ecac7aa989b8ce7c5e6aba9f83cbab746e9
parenta8c4871a2a4ebeeba9f0a612d838330f77a53769 (diff)
input: ipaccess: stricter string handling in ipa_bts_id_resp
These strings are locally set via the BTS configuration, not the network, but make sure we don't overrun the buffer. Reference: CID 1040690
-rw-r--r--src/input/ipaccess.c38
1 files changed, 22 insertions, 16 deletions
diff --git a/src/input/ipaccess.c b/src/input/ipaccess.c
index fadfb431..91021048 100644
--- a/src/input/ipaccess.c
+++ b/src/input/ipaccess.c
@@ -709,11 +709,13 @@ err_line:
return ret;
}
+#define IPA_STRING_MAX 64
+
static struct msgb *
ipa_bts_id_resp(struct ipaccess_unit *dev, uint8_t *data, int len)
{
struct msgb *nmsg;
- char str[64];
+ char str[IPA_STRING_MAX];
uint8_t *tag;
nmsg = ipa_msg_alloc(0);
@@ -730,36 +732,38 @@ ipa_bts_id_resp(struct ipaccess_unit *dev, uint8_t *data, int len)
}
switch (data[1]) {
case IPAC_IDTAG_UNIT:
- sprintf(str, "%u/%u/%u",
+ snprintf(str, sizeof(str), "%u/%u/%u",
dev->site_id, dev->bts_id, dev->trx_id);
break;
case IPAC_IDTAG_MACADDR:
- sprintf(str, "%02x:%02x:%02x:%02x:%02x:%02x",
- dev->mac_addr[0], dev->mac_addr[1],
- dev->mac_addr[2], dev->mac_addr[3],
- dev->mac_addr[4], dev->mac_addr[5]);
+ snprintf(str, sizeof(str),
+ "%02x:%02x:%02x:%02x:%02x:%02x",
+ dev->mac_addr[0], dev->mac_addr[1],
+ dev->mac_addr[2], dev->mac_addr[3],
+ dev->mac_addr[4], dev->mac_addr[5]);
break;
case IPAC_IDTAG_LOCATION1:
- strcpy(str, dev->location1);
+ strncpy(str, dev->location1, IPA_STRING_MAX);
break;
case IPAC_IDTAG_LOCATION2:
- strcpy(str, dev->location2);
+ strncpy(str, dev->location2, IPA_STRING_MAX);
break;
case IPAC_IDTAG_EQUIPVERS:
- strcpy(str, dev->equipvers);
+ strncpy(str, dev->equipvers, IPA_STRING_MAX);
break;
case IPAC_IDTAG_SWVERSION:
- strcpy(str, dev->swversion);
+ strncpy(str, dev->swversion, IPA_STRING_MAX);
break;
case IPAC_IDTAG_UNITNAME:
- sprintf(str, "%s-%02x-%02x-%02x-%02x-%02x-%02x",
- dev->unit_name,
- dev->mac_addr[0], dev->mac_addr[1],
- dev->mac_addr[2], dev->mac_addr[3],
- dev->mac_addr[4], dev->mac_addr[5]);
+ snprintf(str, sizeof(str),
+ "%s-%02x-%02x-%02x-%02x-%02x-%02x",
+ dev->unit_name,
+ dev->mac_addr[0], dev->mac_addr[1],
+ dev->mac_addr[2], dev->mac_addr[3],
+ dev->mac_addr[4], dev->mac_addr[5]);
break;
case IPAC_IDTAG_SERNR:
- strcpy(str, dev->serno);
+ strncpy(str, dev->serno, IPA_STRING_MAX);
break;
default:
LOGP(DLINP, LOGL_NOTICE,
@@ -767,6 +771,8 @@ ipa_bts_id_resp(struct ipaccess_unit *dev, uint8_t *data, int len)
msgb_free(nmsg);
return NULL;
}
+ str[IPA_STRING_MAX-1] = '\0';
+
LOGP(DLINP, LOGL_INFO, " tag %d: %s\n", data[1], str);
tag = msgb_put(nmsg, 3 + strlen(str) + 1);
tag[0] = 0x00;