Skip to content

Commit 0a8e95f

Browse files
committed
strings.c: enforce null-termination on strncpy, optimize strcat
F/439 F/440
1 parent 62dedfc commit 0a8e95f

2 files changed

Lines changed: 18 additions & 1 deletion

File tree

src/string.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,9 @@ char *strcat(char *dest, const char *src)
9898
{
9999
size_t i = 0;
100100
size_t j = strlen(dest);
101+
size_t src_len = strlen(src);
101102

102-
for (i = 0; i < strlen(src); i++) {
103+
for (i = 0; i < src_len; i++) {
103104
dest[j++] = src[i];
104105
}
105106
dest[j] = '\0';
@@ -186,6 +187,10 @@ char *strncpy(char *dst, const char *src, size_t n)
186187
break;
187188
}
188189

190+
while (++i < n) {
191+
dst[i] = '\0';
192+
}
193+
189194
return dst;
190195
}
191196

tools/unit-tests/unit-string.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,7 @@ START_TEST(test_strcpy_strncpy_strcat_strncat)
237237
char buf[8];
238238
char dest[8];
239239
char short_dest[4];
240+
char padded[8];
240241

241242
strcpy(buf, "hi");
242243
ck_assert_str_eq(buf, "hi");
@@ -245,6 +246,17 @@ START_TEST(test_strcpy_strncpy_strcat_strncat)
245246
strncpy(dest, "abc", 4);
246247
ck_assert_str_eq(dest, "abc");
247248

249+
memset(padded, 'X', sizeof(padded));
250+
strncpy(padded, "abc", sizeof(padded));
251+
ck_assert_int_eq(padded[0], 'a');
252+
ck_assert_int_eq(padded[1], 'b');
253+
ck_assert_int_eq(padded[2], 'c');
254+
ck_assert_int_eq(padded[3], '\0');
255+
ck_assert_int_eq(padded[4], '\0');
256+
ck_assert_int_eq(padded[5], '\0');
257+
ck_assert_int_eq(padded[6], '\0');
258+
ck_assert_int_eq(padded[7], '\0');
259+
248260
memset(short_dest, 'X', sizeof(short_dest));
249261
strncpy(short_dest, "abcdef", 3);
250262
ck_assert_int_eq(short_dest[0], 'a');

0 commit comments

Comments
 (0)