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