blob: 68b5517d665db4d6b403f9af1a0d2699728e5f40 [file] [log] [blame]
Nick Kralevich5bcf3982013-06-28 10:34:09 -07001/*
2 * Copyright (C) 2013 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <gtest/gtest.h>
18#include <string.h>
19#include <stdarg.h>
20
21// We have to say "DeathTest" here so gtest knows to run this test (which exits)
22// in its own process. Unfortunately, the C preprocessor doesn't give us an
23// easy way to concatenate strings, so we need to use the complicated method
24// below. *sigh*
25#define DEATHTEST_PASTER(name) name##_DeathTest
26#define DEATHTEST_EVALUATOR(name) DEATHTEST_PASTER(name)
27#define DEATHTEST DEATHTEST_EVALUATOR(TEST_NAME)
28
29#if defined(_FORTIFY_SOURCE) && _FORTIFY_SOURCE == 2
30struct foo {
31 char empty[0];
32 char one[1];
33 char a[10];
34 char b[10];
35};
36
37#ifndef __clang__
38// This test is disabled in clang because clang doesn't properly detect
39// this buffer overflow. TODO: Fix clang.
40TEST(DEATHTEST, strncpy_fortified2) {
41 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
42 foo myfoo;
43 int copy_amt = atoi("11");
44 ASSERT_EXIT(strncpy(myfoo.a, "01234567890", copy_amt),
45 testing::KilledBySignal(SIGABRT), "");
46}
47#endif
48
49#ifndef __clang__
50// This test is disabled in clang because clang doesn't properly detect
51// this buffer overflow. TODO: Fix clang.
52TEST(DEATHTEST, sprintf_fortified2) {
53 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
54 foo myfoo;
55 char source_buf[15];
56 memcpy(source_buf, "12345678901234", 15);
57 ASSERT_EXIT(sprintf(myfoo.a, "%s", source_buf),
58 testing::KilledBySignal(SIGABRT), "");
59}
60#endif
61
62#ifndef __clang__
63// This test is disabled in clang because clang doesn't properly detect
64// this buffer overflow. TODO: Fix clang.
65TEST(DEATHTEST, sprintf2_fortified2) {
66 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
67 foo myfoo;
68 ASSERT_EXIT(sprintf(myfoo.a, "0123456789"),
69 testing::KilledBySignal(SIGABRT), "");
70}
71#endif
72
73#ifndef __clang__
74// These tests are disabled in clang because clang doesn't properly detect
75// this buffer overflow. TODO: Fix clang.
76static int vsprintf_helper2(const char *fmt, ...) {
77 foo myfoo;
78 va_list va;
79 int result;
80
81 va_start(va, fmt);
82 result = vsprintf(myfoo.a, fmt, va); // should crash here
83 va_end(va);
84 return result;
85}
86
87TEST(DEATHTEST, vsprintf_fortified2) {
88 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
89 ASSERT_EXIT(vsprintf_helper2("%s", "0123456789"), testing::KilledBySignal(SIGABRT), "");
90}
91
92TEST(DEATHTEST, vsprintf2_fortified2) {
93 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
94 ASSERT_EXIT(vsprintf_helper2("0123456789"), testing::KilledBySignal(SIGABRT), "");
95}
96#endif
97
98#ifndef __clang__
99// These tests are disabled in clang because clang doesn't properly detect
100// this buffer overflow. TODO: Fix clang.
101static int vsnprintf_helper2(const char *fmt, ...) {
102 foo myfoo;
103 va_list va;
104 int result;
105 size_t size = atoi("11");
106
107 va_start(va, fmt);
108 result = vsnprintf(myfoo.a, size, fmt, va); // should crash here
109 va_end(va);
110 return result;
111}
112
113TEST(DEATHTEST, vsnprintf_fortified2) {
114 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
115 ASSERT_EXIT(vsnprintf_helper2("%s", "0123456789"), testing::KilledBySignal(SIGABRT), "");
116}
117
118TEST(DEATHTEST, vsnprintf2_fortified2) {
119 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
120 ASSERT_EXIT(vsnprintf_helper2("0123456789"), testing::KilledBySignal(SIGABRT), "");
121}
122#endif
123
124#if __BIONIC__
125
126#ifndef __clang__
127// zero sized target with "\0" source (should fail)
128// This test is disabled in clang because clang doesn't properly detect
129// this buffer overflow. TODO: Fix clang.
130TEST(DEATHTEST, strcpy_fortified2) {
131 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
132 foo myfoo;
133 char* src = strdup("");
134 ASSERT_EXIT(strcpy(myfoo.empty, src),
135 testing::KilledBySignal(SIGABRT), "");
136 free(src);
137}
138#endif
139
140#ifndef __clang__
141// zero sized target with longer source (should fail)
142// This test is disabled in clang because clang doesn't properly detect
143// this buffer overflow. TODO: Fix clang.
144TEST(DEATHTEST, strcpy2_fortified2) {
145 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
146 foo myfoo;
147 char* src = strdup("1");
148 ASSERT_EXIT(strcpy(myfoo.empty, src),
149 testing::KilledBySignal(SIGABRT), "");
150 free(src);
151}
152#endif
153
154#ifndef __clang__
155// one byte target with longer source (should fail)
156// This test is disabled in clang because clang doesn't properly detect
157// this buffer overflow. TODO: Fix clang.
158TEST(DEATHTEST, strcpy3_fortified2) {
159 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
160 foo myfoo;
161 char* src = strdup("12");
162 ASSERT_EXIT(strcpy(myfoo.one, src),
163 testing::KilledBySignal(SIGABRT), "");
164 free(src);
165}
166#endif
167
168#ifndef __clang__
169// This test is disabled in clang because clang doesn't properly detect
170// this buffer overflow. TODO: Fix clang.
171TEST(DEATHTEST, strchr_fortified2) {
172 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
173 foo myfoo;
174 memcpy(myfoo.a, "0123456789", sizeof(myfoo.a));
175 myfoo.b[0] = '\0';
176 ASSERT_EXIT(printf("%s", strchr(myfoo.a, 'a')),
177 testing::KilledBySignal(SIGABRT), "");
178}
179#endif
180
181#ifndef __clang__
182// This test is disabled in clang because clang doesn't properly detect
183// this buffer overflow. TODO: Fix clang.
184TEST(DEATHTEST, strrchr_fortified2) {
185 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
186 foo myfoo;
187 memcpy(myfoo.a, "0123456789", 10);
188 memcpy(myfoo.b, "01234", 6);
189 ASSERT_EXIT(printf("%s", strrchr(myfoo.a, 'a')),
190 testing::KilledBySignal(SIGABRT), "");
191}
192#endif
193
194#ifndef __clang__
195// This test is disabled in clang because clang doesn't properly detect
196// this buffer overflow. TODO: Fix clang.
197TEST(DEATHTEST, strlcpy_fortified2) {
198 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
199 foo myfoo;
200 strcpy(myfoo.a, "01");
201 size_t n = strlen(myfoo.a);
202 ASSERT_EXIT(strlcpy(myfoo.one, myfoo.a, n),
203 testing::KilledBySignal(SIGABRT), "");
204}
205#endif
206
207#endif /* __BIONIC__ */
208
209#ifndef __clang__
210// This test is disabled in clang because clang doesn't properly detect
211// this buffer overflow. TODO: Fix clang.
212TEST(DEATHTEST, strncat_fortified2) {
213 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
214 foo myfoo;
215 size_t n = atoi("10"); // avoid compiler optimizations
216 strncpy(myfoo.a, "012345678", n);
217 ASSERT_EXIT(strncat(myfoo.a, "9", n), testing::KilledBySignal(SIGABRT), "");
218}
219#endif
220
221#ifndef __clang__
222// This test is disabled in clang because clang doesn't properly detect
223// this buffer overflow. TODO: Fix clang.
224TEST(DEATHTEST, strncat2_fortified2) {
225 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
226 foo myfoo;
227 myfoo.a[0] = '\0';
228 size_t n = atoi("10"); // avoid compiler optimizations
229 ASSERT_EXIT(strncat(myfoo.a, "0123456789", n), testing::KilledBySignal(SIGABRT), "");
230}
231#endif
232
233TEST(DEATHTEST, strncat3_fortified2) {
234 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
235 foo myfoo;
236 memcpy(myfoo.a, "0123456789", sizeof(myfoo.a)); // unterminated string
237 myfoo.b[0] = '\0';
238 size_t n = atoi("10"); // avoid compiler optimizations
239 ASSERT_EXIT(strncat(myfoo.b, myfoo.a, n), testing::KilledBySignal(SIGABRT), "");
240}
241
242#ifndef __clang__
243// This test is disabled in clang because clang doesn't properly detect
244// this buffer overflow. TODO: Fix clang.
245TEST(DEATHTEST, strcat_fortified2) {
246 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
247 char src[11];
248 strcpy(src, "0123456789");
249 foo myfoo;
250 myfoo.a[0] = '\0';
251 ASSERT_EXIT(strcat(myfoo.a, src), testing::KilledBySignal(SIGABRT), "");
252}
253#endif
254
255TEST(DEATHTEST, strcat2_fortified2) {
256 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
257 foo myfoo;
258 memcpy(myfoo.a, "0123456789", sizeof(myfoo.a)); // unterminated string
259 myfoo.b[0] = '\0';
260 ASSERT_EXIT(strcat(myfoo.b, myfoo.a), testing::KilledBySignal(SIGABRT), "");
261}
262
263TEST(DEATHTEST, snprintf_fortified2) {
264 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
265 foo myfoo;
266 strcpy(myfoo.a, "012345678");
267 size_t n = strlen(myfoo.a) + 2;
268 ASSERT_EXIT(snprintf(myfoo.b, n, "a%s", myfoo.a), testing::KilledBySignal(SIGABRT), "");
269}
270
271#endif /* defined(_FORTIFY_SOURCE) && _FORTIFY_SOURCE=2 */
272
273#if __BIONIC__
274// multibyte target where we over fill (should fail)
275TEST(DEATHTEST, strcpy_fortified) {
276 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
277 char buf[10];
278 char *orig = strdup("0123456789");
279 ASSERT_EXIT(strcpy(buf, orig), testing::KilledBySignal(SIGABRT), "");
280 free(orig);
281}
282
283// zero sized target with "\0" source (should fail)
284TEST(DEATHTEST, strcpy2_fortified) {
285 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
286 char buf[0];
287 char *orig = strdup("");
288 ASSERT_EXIT(strcpy(buf, orig), testing::KilledBySignal(SIGABRT), "");
289 free(orig);
290}
291
292// zero sized target with longer source (should fail)
293TEST(DEATHTEST, strcpy3_fortified) {
294 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
295 char buf[0];
296 char *orig = strdup("1");
297 ASSERT_EXIT(strcpy(buf, orig), testing::KilledBySignal(SIGABRT), "");
298 free(orig);
299}
300
301// one byte target with longer source (should fail)
302TEST(DEATHTEST, strcpy4_fortified) {
303 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
304 char buf[1];
305 char *orig = strdup("12");
306 ASSERT_EXIT(strcpy(buf, orig), testing::KilledBySignal(SIGABRT), "");
307 free(orig);
308}
309
310TEST(DEATHTEST, strlen_fortified) {
311 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
312 char buf[10];
313 memcpy(buf, "0123456789", sizeof(buf));
314 ASSERT_EXIT(printf("%d", strlen(buf)), testing::KilledBySignal(SIGABRT), "");
315}
316
317TEST(DEATHTEST, strchr_fortified) {
318 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
319 char buf[10];
320 memcpy(buf, "0123456789", sizeof(buf));
321 ASSERT_EXIT(printf("%s", strchr(buf, 'a')), testing::KilledBySignal(SIGABRT), "");
322}
323
324TEST(DEATHTEST, strrchr_fortified) {
325 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
326 char buf[10];
327 memcpy(buf, "0123456789", sizeof(buf));
328 ASSERT_EXIT(printf("%s", strrchr(buf, 'a')), testing::KilledBySignal(SIGABRT), "");
329}
330
331TEST(DEATHTEST, strlcpy_fortified) {
332 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
333 char bufa[15];
334 char bufb[10];
335 strcpy(bufa, "01234567890123");
336 size_t n = strlen(bufa);
337 ASSERT_EXIT(strlcpy(bufb, bufa, n), testing::KilledBySignal(SIGABRT), "");
338}
339
340#endif
341
342TEST(DEATHTEST, sprintf_fortified) {
343 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
344 char buf[10];
345 char source_buf[15];
346 memcpy(source_buf, "12345678901234", 15);
347 ASSERT_EXIT(sprintf(buf, "%s", source_buf), testing::KilledBySignal(SIGABRT), "");
348}
349
350TEST(DEATHTEST, sprintf2_fortified) {
351 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
352 char buf[5];
353 ASSERT_EXIT(sprintf(buf, "aaaaa"), testing::KilledBySignal(SIGABRT), "");
354}
355
356static int vsprintf_helper(const char *fmt, ...) {
357 char buf[10];
358 va_list va;
359 int result;
360
361 va_start(va, fmt);
362 result = vsprintf(buf, fmt, va); // should crash here
363 va_end(va);
364 return result;
365}
366
367TEST(DEATHTEST, vsprintf_fortified) {
368 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
369 ASSERT_EXIT(vsprintf_helper("%s", "0123456789"), testing::KilledBySignal(SIGABRT), "");
370}
371
372TEST(DEATHTEST, vsprintf2_fortified) {
373 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
374 ASSERT_EXIT(vsprintf_helper("0123456789"), testing::KilledBySignal(SIGABRT), "");
375}
376
377static int vsnprintf_helper(const char *fmt, ...) {
378 char buf[10];
379 va_list va;
380 int result;
381 size_t size = atoi("11");
382
383 va_start(va, fmt);
384 result = vsnprintf(buf, size, fmt, va); // should crash here
385 va_end(va);
386 return result;
387}
388
389TEST(DEATHTEST, vsnprintf_fortified) {
390 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
391 ASSERT_EXIT(vsnprintf_helper("%s", "0123456789"), testing::KilledBySignal(SIGABRT), "");
392}
393
394TEST(DEATHTEST, vsnprintf2_fortified) {
395 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
396 ASSERT_EXIT(vsnprintf_helper("0123456789"), testing::KilledBySignal(SIGABRT), "");
397}
398
399TEST(DEATHTEST, strncat_fortified) {
400 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
401 char buf[10];
402 size_t n = atoi("10"); // avoid compiler optimizations
403 strncpy(buf, "012345678", n);
404 ASSERT_EXIT(strncat(buf, "9", n), testing::KilledBySignal(SIGABRT), "");
405}
406
407TEST(DEATHTEST, strncat2_fortified) {
408 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
409 char buf[10];
410 buf[0] = '\0';
411 size_t n = atoi("10"); // avoid compiler optimizations
412 ASSERT_EXIT(strncat(buf, "0123456789", n), testing::KilledBySignal(SIGABRT), "");
413}
414
415TEST(DEATHTEST, strcat_fortified) {
416 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
417 char src[11];
418 strcpy(src, "0123456789");
419 char buf[10];
420 buf[0] = '\0';
421 ASSERT_EXIT(strcat(buf, src), testing::KilledBySignal(SIGABRT), "");
422}
423
424TEST(DEATHTEST, memmove_fortified) {
425 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
426 char buf[20];
427 strcpy(buf, "0123456789");
428 size_t n = atoi("10");
429 ASSERT_EXIT(memmove(buf + 11, buf, n), testing::KilledBySignal(SIGABRT), "");
430}
431
432TEST(DEATHTEST, memcpy_fortified) {
433 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
434 char bufa[10];
435 char bufb[10];
436 strcpy(bufa, "012345678");
437 size_t n = atoi("11");
438 ASSERT_EXIT(memcpy(bufb, bufa, n), testing::KilledBySignal(SIGABRT), "");
439}
440
441TEST(DEATHTEST, strncpy_fortified) {
442 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
443 char bufa[15];
444 char bufb[10];
445 strcpy(bufa, "01234567890123");
446 size_t n = strlen(bufa);
447 ASSERT_EXIT(strncpy(bufb, bufa, n), testing::KilledBySignal(SIGABRT), "");
448}
449
450TEST(DEATHTEST, snprintf_fortified) {
451 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
452 char bufa[15];
453 char bufb[10];
454 strcpy(bufa, "0123456789");
455 size_t n = strlen(bufa) + 1;
456 ASSERT_EXIT(snprintf(bufb, n, "%s", bufa), testing::KilledBySignal(SIGABRT), "");
457}
458
459extern "C" char* __strncat_chk(char*, const char*, size_t, size_t);
460extern "C" char* __strcat_chk(char*, const char*, size_t);
461
462TEST(TEST_NAME, strncat) {
463 char buf[10];
464 memset(buf, 'A', sizeof(buf));
465 buf[0] = 'a';
466 buf[1] = '\0';
467 char* res = __strncat_chk(buf, "01234", sizeof(buf) - strlen(buf) - 1, sizeof(buf));
468 ASSERT_EQ(buf, res);
469 ASSERT_EQ('a', buf[0]);
470 ASSERT_EQ('0', buf[1]);
471 ASSERT_EQ('1', buf[2]);
472 ASSERT_EQ('2', buf[3]);
473 ASSERT_EQ('3', buf[4]);
474 ASSERT_EQ('4', buf[5]);
475 ASSERT_EQ('\0', buf[6]);
476 ASSERT_EQ('A', buf[7]);
477 ASSERT_EQ('A', buf[8]);
478 ASSERT_EQ('A', buf[9]);
479}
480
481TEST(TEST_NAME, strncat2) {
482 char buf[10];
483 memset(buf, 'A', sizeof(buf));
484 buf[0] = 'a';
485 buf[1] = '\0';
486 char* res = __strncat_chk(buf, "0123456789", 5, sizeof(buf));
487 ASSERT_EQ(buf, res);
488 ASSERT_EQ('a', buf[0]);
489 ASSERT_EQ('0', buf[1]);
490 ASSERT_EQ('1', buf[2]);
491 ASSERT_EQ('2', buf[3]);
492 ASSERT_EQ('3', buf[4]);
493 ASSERT_EQ('4', buf[5]);
494 ASSERT_EQ('\0', buf[6]);
495 ASSERT_EQ('A', buf[7]);
496 ASSERT_EQ('A', buf[8]);
497 ASSERT_EQ('A', buf[9]);
498}
499
500TEST(TEST_NAME, strncat3) {
501 char buf[10];
502 memset(buf, 'A', sizeof(buf));
503 buf[0] = '\0';
504 char* res = __strncat_chk(buf, "0123456789", 5, sizeof(buf));
505 ASSERT_EQ(buf, res);
506 ASSERT_EQ('0', buf[0]);
507 ASSERT_EQ('1', buf[1]);
508 ASSERT_EQ('2', buf[2]);
509 ASSERT_EQ('3', buf[3]);
510 ASSERT_EQ('4', buf[4]);
511 ASSERT_EQ('\0', buf[5]);
512 ASSERT_EQ('A', buf[6]);
513 ASSERT_EQ('A', buf[7]);
514 ASSERT_EQ('A', buf[8]);
515 ASSERT_EQ('A', buf[9]);
516}
517
518TEST(TEST_NAME, strncat4) {
519 char buf[10];
520 memset(buf, 'A', sizeof(buf));
521 buf[9] = '\0';
522 char* res = __strncat_chk(buf, "", 5, sizeof(buf));
523 ASSERT_EQ(buf, res);
524 ASSERT_EQ('A', buf[0]);
525 ASSERT_EQ('A', buf[1]);
526 ASSERT_EQ('A', buf[2]);
527 ASSERT_EQ('A', buf[3]);
528 ASSERT_EQ('A', buf[4]);
529 ASSERT_EQ('A', buf[5]);
530 ASSERT_EQ('A', buf[6]);
531 ASSERT_EQ('A', buf[7]);
532 ASSERT_EQ('A', buf[8]);
533 ASSERT_EQ('\0', buf[9]);
534}
535
536TEST(TEST_NAME, strncat5) {
537 char buf[10];
538 memset(buf, 'A', sizeof(buf));
539 buf[0] = 'a';
540 buf[1] = '\0';
541 char* res = __strncat_chk(buf, "01234567", 8, sizeof(buf));
542 ASSERT_EQ(buf, res);
543 ASSERT_EQ('a', buf[0]);
544 ASSERT_EQ('0', buf[1]);
545 ASSERT_EQ('1', buf[2]);
546 ASSERT_EQ('2', buf[3]);
547 ASSERT_EQ('3', buf[4]);
548 ASSERT_EQ('4', buf[5]);
549 ASSERT_EQ('5', buf[6]);
550 ASSERT_EQ('6', buf[7]);
551 ASSERT_EQ('7', buf[8]);
552 ASSERT_EQ('\0', buf[9]);
553}
554
555TEST(TEST_NAME, strncat6) {
556 char buf[10];
557 memset(buf, 'A', sizeof(buf));
558 buf[0] = 'a';
559 buf[1] = '\0';
560 char* res = __strncat_chk(buf, "01234567", 9, sizeof(buf));
561 ASSERT_EQ(buf, res);
562 ASSERT_EQ('a', buf[0]);
563 ASSERT_EQ('0', buf[1]);
564 ASSERT_EQ('1', buf[2]);
565 ASSERT_EQ('2', buf[3]);
566 ASSERT_EQ('3', buf[4]);
567 ASSERT_EQ('4', buf[5]);
568 ASSERT_EQ('5', buf[6]);
569 ASSERT_EQ('6', buf[7]);
570 ASSERT_EQ('7', buf[8]);
571 ASSERT_EQ('\0', buf[9]);
572}
573
574
575TEST(TEST_NAME, strcat) {
576 char buf[10];
577 memset(buf, 'A', sizeof(buf));
578 buf[0] = 'a';
579 buf[1] = '\0';
580 char* res = __strcat_chk(buf, "01234", sizeof(buf));
581 ASSERT_EQ(buf, res);
582 ASSERT_EQ('a', buf[0]);
583 ASSERT_EQ('0', buf[1]);
584 ASSERT_EQ('1', buf[2]);
585 ASSERT_EQ('2', buf[3]);
586 ASSERT_EQ('3', buf[4]);
587 ASSERT_EQ('4', buf[5]);
588 ASSERT_EQ('\0', buf[6]);
589 ASSERT_EQ('A', buf[7]);
590 ASSERT_EQ('A', buf[8]);
591 ASSERT_EQ('A', buf[9]);
592}
593
594TEST(TEST_NAME, strcat2) {
595 char buf[10];
596 memset(buf, 'A', sizeof(buf));
597 buf[0] = 'a';
598 buf[1] = '\0';
599 char* res = __strcat_chk(buf, "01234567", sizeof(buf));
600 ASSERT_EQ(buf, res);
601 ASSERT_EQ('a', buf[0]);
602 ASSERT_EQ('0', buf[1]);
603 ASSERT_EQ('1', buf[2]);
604 ASSERT_EQ('2', buf[3]);
605 ASSERT_EQ('3', buf[4]);
606 ASSERT_EQ('4', buf[5]);
607 ASSERT_EQ('5', buf[6]);
608 ASSERT_EQ('6', buf[7]);
609 ASSERT_EQ('7', buf[8]);
610 ASSERT_EQ('\0', buf[9]);
611}