Skip to content

Commit 89a6f7f

Browse files
committed
fix asan
1 parent 9b3d7f6 commit 89a6f7f

1 file changed

Lines changed: 17 additions & 6 deletions

File tree

src/protocol/config.c

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -162,27 +162,38 @@ size_t _z_str_intmap_strlen(const _z_str_intmap_t *s, uint8_t argc, _z_str_intma
162162

163163
void _z_str_intmap_onto_str(char *dst, size_t dst_len, const _z_str_intmap_t *s, uint8_t argc,
164164
_z_str_intmapping_t argv[]) {
165-
size_t len = dst_len;
165+
if (dst == NULL || dst_len == 0) {
166+
return;
167+
}
168+
169+
// Remaining length excluding '\0'
170+
size_t len = dst_len - (size_t)1;
166171
dst[0] = '\0';
167172
for (size_t i = 0; i < argc; i++) {
168173
char *v = _z_str_intmap_get(s, argv[i]._key);
169174
if (v != NULL) {
170-
if (len > (size_t)0) {
175+
if (len > (size_t)0 && dst[0] != '\0') {
171176
_z_str_append(dst, INT_STR_MAP_LIST_SEPARATOR); // List separator
172177
len = len - (size_t)1;
173178
}
174179

180+
size_t key_len = strlen(argv[i]._str);
175181
if (len > (size_t)0) {
176-
(void)strncat(dst, argv[i]._str, len); // Key
177-
len = len - strlen(argv[i]._str);
182+
size_t n = key_len < len ? key_len : len;
183+
(void)strncat(dst, argv[i]._str, n); // Key
184+
len = len - n;
178185
}
186+
179187
if (len > (size_t)0) {
180188
_z_str_append(dst, INT_STR_MAP_KEYVALUE_SEPARATOR); // KeyValue separator
181189
len = len - (size_t)1;
182190
}
191+
192+
size_t value_len = strlen(v);
183193
if (len > (size_t)0) {
184-
(void)strncat(dst, v, len); // Value
185-
len = len - strlen(v);
194+
size_t n = value_len < len ? value_len : len;
195+
(void)strncat(dst, v, n); // Value
196+
len = len - n;
186197
}
187198
}
188199
}

0 commit comments

Comments
 (0)