Skip to content

Commit 6c15e8f

Browse files
committed
btshell: use strlcpy and strlcat to avoid buffer overflow
1 parent 06397ae commit 6c15e8f

File tree

1 file changed

+12
-6
lines changed

1 file changed

+12
-6
lines changed

apps/btshell/src/cmd.c

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -99,22 +99,26 @@ parse_dev_addr(const char *prefix, const struct kv_pair *addr_types,
9999
char name[32];
100100
int rc;
101101

102-
/* XXX string operations below are not quite safe, but do we care? */
103-
104102
if (!prefix) {
105103
name[0] = '\0';
106104
} else {
107-
strcpy(name, prefix);
105+
if (strlcpy(name, prefix, sizeof(name)) >= sizeof(name)) {
106+
return EINVAL;
107+
}
108108
}
109109

110-
strcat(name, "addr");
110+
if (strlcat(name, "addr", sizeof(name)) >= sizeof(name)) {
111+
return EINVAL;
112+
}
111113
rc = parse_arg_addr(name, addr);
112114
if (rc == ENOENT) {
113115
/* not found */
114116
return rc;
115117
} else if (rc == EAGAIN) {
116118
/* address found, but no type provided */
117-
strcat(name, "_type");
119+
if (strlcat(name, "_type", sizeof(name)) >= sizeof(name)) {
120+
return EINVAL;
121+
}
118122
addr->type = parse_arg_kv(name, addr_types, &rc);
119123
if (rc == ENOENT) {
120124
addr->type = BLE_ADDR_PUBLIC;
@@ -126,7 +130,9 @@ parse_dev_addr(const char *prefix, const struct kv_pair *addr_types,
126130
return rc;
127131
} else {
128132
/* full address found, but let's just make sure there is no type arg */
129-
strcat(name, "_type");
133+
if (strlcat(name, "_type", sizeof(name)) >= sizeof(name)) {
134+
return EINVAL;
135+
}
130136
if (parse_arg_extract(name)) {
131137
return E2BIG;
132138
}

0 commit comments

Comments
 (0)