blob: fd1680b4cf3d48bb885972af03b820dfe9388390 [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>
Nick Kralevich5bcf3982013-06-28 10:34:09 -070018
Yabin Cui9df70402014-11-05 18:01:01 -080019#include <fcntl.h>
20#include <malloc.h>
Elliott Hughes4674e382015-02-02 09:15:19 -080021#include <poll.h>
Yabin Cui9df70402014-11-05 18:01:01 -080022#include <signal.h>
23#include <stdarg.h>
24#include <string.h>
25#include <sys/socket.h>
26#include <sys/stat.h>
27#include <sys/types.h>
Yabin Cuif4fe6932015-02-03 17:52:32 -080028#include <time.h>
Yabin Cui9df70402014-11-05 18:01:01 -080029
Elliott Hughes141b9172021-04-09 17:13:09 -070030#include <android-base/silent_death_test.h>
31
Elliott Hughese7943f82023-09-28 08:20:20 -070032#if defined(__BIONIC__)
Elliott Hughesd036e942015-02-02 11:18:58 -080033#define ASSERT_FORTIFY(expr) ASSERT_EXIT(expr, testing::KilledBySignal(SIGABRT), "FORTIFY")
34#else
35#define ASSERT_FORTIFY(expr) ASSERT_EXIT(expr, testing::KilledBySignal(SIGABRT), "")
36#endif
37
Yabin Cui9df70402014-11-05 18:01:01 -080038// Fortify test code needs to run multiple times, so TEST_NAME macro is used to
39// distinguish different tests. TEST_NAME is defined in compilation command.
Nick Kralevich5bcf3982013-06-28 10:34:09 -070040#define DEATHTEST_PASTER(name) name##_DeathTest
41#define DEATHTEST_EVALUATOR(name) DEATHTEST_PASTER(name)
42#define DEATHTEST DEATHTEST_EVALUATOR(TEST_NAME)
43
Elliott Hughes141b9172021-04-09 17:13:09 -070044using DEATHTEST = SilentDeathTest;
Nick Kralevichbe0e43b2014-07-23 13:56:23 -070045
Elliott Hughes6fc9aa72025-03-14 12:40:40 -070046#if defined(_FORTIFY_SOURCE) && _FORTIFY_SOURCE >= 2
Nick Kralevich5bcf3982013-06-28 10:34:09 -070047struct foo {
48 char empty[0];
49 char one[1];
50 char a[10];
51 char b[10];
52};
53
Nick Kralevichbe0e43b2014-07-23 13:56:23 -070054TEST_F(DEATHTEST, stpncpy_fortified2) {
Christopher Ferris950a58e2014-04-04 14:38:18 -070055 foo myfoo;
Elliott Hughes58666732025-01-28 13:15:01 -080056 volatile int copy_amt = 11;
Elliott Hughesd036e942015-02-02 11:18:58 -080057 ASSERT_FORTIFY(stpncpy(myfoo.a, "01234567890", copy_amt));
Christopher Ferris950a58e2014-04-04 14:38:18 -070058}
Christopher Ferris950a58e2014-04-04 14:38:18 -070059
Nick Kralevichbe0e43b2014-07-23 13:56:23 -070060TEST_F(DEATHTEST, stpncpy2_fortified2) {
Christopher Ferris2a391882024-12-19 13:44:35 -080061 foo myfoo = {};
Christopher Ferris950a58e2014-04-04 14:38:18 -070062 myfoo.one[0] = 'A'; // not null terminated string
Elliott Hughesd036e942015-02-02 11:18:58 -080063 ASSERT_FORTIFY(stpncpy(myfoo.b, myfoo.one, sizeof(myfoo.b)));
Christopher Ferris950a58e2014-04-04 14:38:18 -070064}
Christopher Ferris950a58e2014-04-04 14:38:18 -070065
Nick Kralevichbe0e43b2014-07-23 13:56:23 -070066TEST_F(DEATHTEST, strncpy_fortified2) {
Nick Kralevich5bcf3982013-06-28 10:34:09 -070067 foo myfoo;
Elliott Hughes58666732025-01-28 13:15:01 -080068 volatile int copy_amt = 11;
Elliott Hughesd036e942015-02-02 11:18:58 -080069 ASSERT_FORTIFY(strncpy(myfoo.a, "01234567890", copy_amt));
Nick Kralevich5bcf3982013-06-28 10:34:09 -070070}
Nick Kralevich5bcf3982013-06-28 10:34:09 -070071
Nick Kralevichbe0e43b2014-07-23 13:56:23 -070072TEST_F(DEATHTEST, strncpy2_fortified2) {
Christopher Ferris2a391882024-12-19 13:44:35 -080073 foo myfoo = {};
Nick Kralevich93501d32013-08-28 10:47:43 -070074 myfoo.one[0] = 'A'; // not null terminated string
Elliott Hughesd036e942015-02-02 11:18:58 -080075 ASSERT_FORTIFY(strncpy(myfoo.b, myfoo.one, sizeof(myfoo.b)));
Nick Kralevich93501d32013-08-28 10:47:43 -070076}
Nick Kralevich93501d32013-08-28 10:47:43 -070077
Nick Kralevichbe0e43b2014-07-23 13:56:23 -070078TEST_F(DEATHTEST, sprintf_fortified2) {
Nick Kralevich5bcf3982013-06-28 10:34:09 -070079 foo myfoo;
80 char source_buf[15];
81 memcpy(source_buf, "12345678901234", 15);
Elliott Hughesd036e942015-02-02 11:18:58 -080082 ASSERT_FORTIFY(sprintf(myfoo.a, "%s", source_buf));
Nick Kralevich5bcf3982013-06-28 10:34:09 -070083}
Nick Kralevich5bcf3982013-06-28 10:34:09 -070084
Nick Kralevich884a3de2014-10-06 00:39:47 +000085TEST_F(DEATHTEST, sprintf2_fortified2) {
Nick Kralevich884a3de2014-10-06 00:39:47 +000086 foo myfoo;
Elliott Hughesd036e942015-02-02 11:18:58 -080087 ASSERT_FORTIFY(sprintf(myfoo.a, "0123456789"));
Nick Kralevich884a3de2014-10-06 00:39:47 +000088}
Nick Kralevich884a3de2014-10-06 00:39:47 +000089
Elliott Hughes58666732025-01-28 13:15:01 -080090static int vsprintf_helper2(const char* fmt, ...) {
Nick Kralevich5bcf3982013-06-28 10:34:09 -070091 va_list va;
Nick Kralevich5bcf3982013-06-28 10:34:09 -070092 va_start(va, fmt);
Elliott Hughes58666732025-01-28 13:15:01 -080093 foo myfoo;
94 int result = vsprintf(myfoo.a, fmt, va); // should crash here
Nick Kralevich5bcf3982013-06-28 10:34:09 -070095 va_end(va);
96 return result;
97}
98
Nick Kralevichbe0e43b2014-07-23 13:56:23 -070099TEST_F(DEATHTEST, vsprintf_fortified2) {
Elliott Hughesd036e942015-02-02 11:18:58 -0800100 ASSERT_FORTIFY(vsprintf_helper2("%s", "0123456789"));
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700101}
102
Nick Kralevichbe0e43b2014-07-23 13:56:23 -0700103TEST_F(DEATHTEST, vsprintf2_fortified2) {
Elliott Hughesd036e942015-02-02 11:18:58 -0800104 ASSERT_FORTIFY(vsprintf_helper2("0123456789"));
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700105}
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700106
Elliott Hughes58666732025-01-28 13:15:01 -0800107static int vsnprintf_helper2(const char* fmt, ...) {
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700108 va_list va;
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700109 va_start(va, fmt);
Elliott Hughes58666732025-01-28 13:15:01 -0800110 foo myfoo;
111 volatile size_t size = 11;
112 int result = vsnprintf(myfoo.a, size, fmt, va); // should crash here
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700113 va_end(va);
114 return result;
115}
116
Nick Kralevichbe0e43b2014-07-23 13:56:23 -0700117TEST_F(DEATHTEST, vsnprintf_fortified2) {
Elliott Hughesd036e942015-02-02 11:18:58 -0800118 ASSERT_FORTIFY(vsnprintf_helper2("%s", "0123456789"));
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700119}
120
Nick Kralevichbe0e43b2014-07-23 13:56:23 -0700121TEST_F(DEATHTEST, vsnprintf2_fortified2) {
Elliott Hughesd036e942015-02-02 11:18:58 -0800122 ASSERT_FORTIFY(vsnprintf_helper2("0123456789"));
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700123}
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700124
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700125// zero sized target with "\0" source (should fail)
Nick Kralevichbe0e43b2014-07-23 13:56:23 -0700126TEST_F(DEATHTEST, stpcpy_fortified2) {
Christopher Ferris950a58e2014-04-04 14:38:18 -0700127#if defined(__BIONIC__)
Christopher Ferris950a58e2014-04-04 14:38:18 -0700128 foo myfoo;
129 char* src = strdup("");
Elliott Hughesd036e942015-02-02 11:18:58 -0800130 ASSERT_FORTIFY(stpcpy(myfoo.empty, src));
Christopher Ferris950a58e2014-04-04 14:38:18 -0700131 free(src);
132#else // __BIONIC__
Elliott Hughesbcaa4542019-03-08 15:20:23 -0800133 GTEST_SKIP() << "stpcpy not available";
Christopher Ferris950a58e2014-04-04 14:38:18 -0700134#endif // __BIONIC__
135}
Christopher Ferris950a58e2014-04-04 14:38:18 -0700136
Christopher Ferris950a58e2014-04-04 14:38:18 -0700137// zero sized target with "\0" source (should fail)
Nick Kralevichbe0e43b2014-07-23 13:56:23 -0700138TEST_F(DEATHTEST, strcpy_fortified2) {
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800139#if defined(__BIONIC__)
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700140 foo myfoo;
141 char* src = strdup("");
Elliott Hughesd036e942015-02-02 11:18:58 -0800142 ASSERT_FORTIFY(strcpy(myfoo.empty, src));
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700143 free(src);
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800144#else // __BIONIC__
Elliott Hughesbcaa4542019-03-08 15:20:23 -0800145 GTEST_SKIP() << "glibc is broken";
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800146#endif // __BIONIC__
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700147}
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700148
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700149// zero sized target with longer source (should fail)
Nick Kralevichbe0e43b2014-07-23 13:56:23 -0700150TEST_F(DEATHTEST, strcpy2_fortified2) {
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800151#if defined(__BIONIC__)
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700152 foo myfoo;
153 char* src = strdup("1");
Elliott Hughesd036e942015-02-02 11:18:58 -0800154 ASSERT_FORTIFY(strcpy(myfoo.empty, src));
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700155 free(src);
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800156#else // __BIONIC__
Elliott Hughesbcaa4542019-03-08 15:20:23 -0800157 GTEST_SKIP() << "glibc is broken";
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800158#endif // __BIONIC__
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700159}
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700160
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700161// one byte target with longer source (should fail)
Nick Kralevichbe0e43b2014-07-23 13:56:23 -0700162TEST_F(DEATHTEST, strcpy3_fortified2) {
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800163#if defined(__BIONIC__)
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700164 foo myfoo;
165 char* src = strdup("12");
Elliott Hughesd036e942015-02-02 11:18:58 -0800166 ASSERT_FORTIFY(strcpy(myfoo.one, src));
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700167 free(src);
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800168#else // __BIONIC__
Elliott Hughesbcaa4542019-03-08 15:20:23 -0800169 GTEST_SKIP() << "glibc is broken";
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800170#endif // __BIONIC__
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700171}
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700172
Nick Kralevichbe0e43b2014-07-23 13:56:23 -0700173TEST_F(DEATHTEST, strchr_fortified2) {
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800174#if defined(__BIONIC__)
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700175 foo myfoo;
176 memcpy(myfoo.a, "0123456789", sizeof(myfoo.a));
177 myfoo.b[0] = '\0';
Elliott Hughesd036e942015-02-02 11:18:58 -0800178 ASSERT_FORTIFY(printf("%s", strchr(myfoo.a, 'a')));
George Burgess IVbd3d2082017-04-04 17:34:02 -0700179 ASSERT_FORTIFY(printf("%s", strchr(static_cast<const char*>(myfoo.a), 'a')));
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800180#else // __BIONIC__
Elliott Hughesbcaa4542019-03-08 15:20:23 -0800181 GTEST_SKIP() << "glibc is broken";
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800182#endif // __BIONIC__
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700183}
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700184
Nick Kralevichbe0e43b2014-07-23 13:56:23 -0700185TEST_F(DEATHTEST, strrchr_fortified2) {
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800186#if defined(__BIONIC__)
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700187 foo myfoo;
188 memcpy(myfoo.a, "0123456789", 10);
189 memcpy(myfoo.b, "01234", 6);
Elliott Hughesd036e942015-02-02 11:18:58 -0800190 ASSERT_FORTIFY(printf("%s", strrchr(myfoo.a, 'a')));
George Burgess IVbd3d2082017-04-04 17:34:02 -0700191 ASSERT_FORTIFY(printf("%s", strrchr(static_cast<const char*>(myfoo.a), 'a')));
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800192#else // __BIONIC__
Elliott Hughesbcaa4542019-03-08 15:20:23 -0800193 GTEST_SKIP() << "glibc is broken";
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800194#endif // __BIONIC__
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700195}
George Burgess IVbd3d2082017-04-04 17:34:02 -0700196
197TEST_F(DEATHTEST, memchr_fortified2) {
198#if defined(__BIONIC__)
199 foo myfoo;
200 volatile int asize = sizeof(myfoo.a) + 1;
201 memcpy(myfoo.a, "0123456789", sizeof(myfoo.a));
Stephen Hines62165a12020-08-18 01:38:14 -0700202 ASSERT_FORTIFY(printf("%s", static_cast<const char*>(memchr(myfoo.a, 'a', asize))));
203 ASSERT_FORTIFY(printf(
204 "%s", static_cast<const char*>(memchr(static_cast<const void*>(myfoo.a), 'a', asize))));
George Burgess IVbd3d2082017-04-04 17:34:02 -0700205#else // __BIONIC__
Elliott Hughesbcaa4542019-03-08 15:20:23 -0800206 GTEST_SKIP() << "glibc is broken";
George Burgess IVbd3d2082017-04-04 17:34:02 -0700207#endif // __BIONIC__
208}
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700209
Elliott Hughes55a8cc22017-11-08 21:22:44 -0800210TEST_F(DEATHTEST, memrchr_fortified2) {
211#if defined(__BIONIC__)
212 foo myfoo;
213 volatile int asize = sizeof(myfoo.a) + 1;
214 memcpy(myfoo.a, "0123456789", sizeof(myfoo.a));
Stephen Hines62165a12020-08-18 01:38:14 -0700215 ASSERT_FORTIFY(printf("%s", static_cast<const char*>(memrchr(myfoo.a, 'a', asize))));
216 ASSERT_FORTIFY(printf(
217 "%s", static_cast<const char*>(memrchr(static_cast<const void*>(myfoo.a), 'a', asize))));
Elliott Hughes55a8cc22017-11-08 21:22:44 -0800218#else // __BIONIC__
Elliott Hughesbcaa4542019-03-08 15:20:23 -0800219 GTEST_SKIP() << "glibc is broken";
Elliott Hughes55a8cc22017-11-08 21:22:44 -0800220#endif // __BIONIC__
221}
222
Nick Kralevichbe0e43b2014-07-23 13:56:23 -0700223TEST_F(DEATHTEST, strlcpy_fortified2) {
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800224#if defined(__BIONIC__)
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700225 foo myfoo;
226 strcpy(myfoo.a, "01");
227 size_t n = strlen(myfoo.a);
Elliott Hughesd036e942015-02-02 11:18:58 -0800228 ASSERT_FORTIFY(strlcpy(myfoo.one, myfoo.a, n));
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800229#else // __BIONIC__
Elliott Hughesbcaa4542019-03-08 15:20:23 -0800230 GTEST_SKIP() << "strlcpy not available";
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800231#endif // __BIONIC__
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700232}
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700233
Nick Kralevichbe0e43b2014-07-23 13:56:23 -0700234TEST_F(DEATHTEST, strlcat_fortified2) {
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800235#if defined(__BIONIC__)
Nick Kralevicha6cde392013-06-29 08:15:25 -0700236 foo myfoo;
237 strcpy(myfoo.a, "01");
238 myfoo.one[0] = '\0';
239 size_t n = strlen(myfoo.a);
Elliott Hughesd036e942015-02-02 11:18:58 -0800240 ASSERT_FORTIFY(strlcat(myfoo.one, myfoo.a, n));
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800241#else // __BIONIC__
Elliott Hughesbcaa4542019-03-08 15:20:23 -0800242 GTEST_SKIP() << "strlcat not available";
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800243#endif // __BIONIC__
Nick Kralevicha6cde392013-06-29 08:15:25 -0700244}
Nick Kralevicha6cde392013-06-29 08:15:25 -0700245
Nick Kralevichbe0e43b2014-07-23 13:56:23 -0700246TEST_F(DEATHTEST, strncat_fortified2) {
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700247 foo myfoo;
Elliott Hughes58666732025-01-28 13:15:01 -0800248 volatile size_t n = 10;
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700249 strncpy(myfoo.a, "012345678", n);
Elliott Hughesd036e942015-02-02 11:18:58 -0800250 ASSERT_FORTIFY(strncat(myfoo.a, "9", n));
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700251}
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700252
Nick Kralevichbe0e43b2014-07-23 13:56:23 -0700253TEST_F(DEATHTEST, strncat2_fortified2) {
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700254 foo myfoo;
255 myfoo.a[0] = '\0';
Elliott Hughes58666732025-01-28 13:15:01 -0800256 volatile size_t n = 10;
Elliott Hughesd036e942015-02-02 11:18:58 -0800257 ASSERT_FORTIFY(strncat(myfoo.a, "0123456789", n));
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700258}
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700259
Nick Kralevichbe0e43b2014-07-23 13:56:23 -0700260TEST_F(DEATHTEST, strncat3_fortified2) {
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700261 foo myfoo;
262 memcpy(myfoo.a, "0123456789", sizeof(myfoo.a)); // unterminated string
263 myfoo.b[0] = '\0';
Elliott Hughes58666732025-01-28 13:15:01 -0800264 volatile size_t n = 10;
Elliott Hughesd036e942015-02-02 11:18:58 -0800265 ASSERT_FORTIFY(strncat(myfoo.b, myfoo.a, n));
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700266}
267
Nick Kralevichbe0e43b2014-07-23 13:56:23 -0700268TEST_F(DEATHTEST, strcat_fortified2) {
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700269 char src[11];
270 strcpy(src, "0123456789");
271 foo myfoo;
272 myfoo.a[0] = '\0';
Elliott Hughesd036e942015-02-02 11:18:58 -0800273 ASSERT_FORTIFY(strcat(myfoo.a, src));
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700274}
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700275
Nick Kralevichbe0e43b2014-07-23 13:56:23 -0700276TEST_F(DEATHTEST, strcat2_fortified2) {
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700277 foo myfoo;
278 memcpy(myfoo.a, "0123456789", sizeof(myfoo.a)); // unterminated string
279 myfoo.b[0] = '\0';
Elliott Hughesd036e942015-02-02 11:18:58 -0800280 ASSERT_FORTIFY(strcat(myfoo.b, myfoo.a));
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700281}
282
Nick Kralevichbe0e43b2014-07-23 13:56:23 -0700283TEST_F(DEATHTEST, snprintf_fortified2) {
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700284 foo myfoo;
285 strcpy(myfoo.a, "012345678");
286 size_t n = strlen(myfoo.a) + 2;
Elliott Hughesd036e942015-02-02 11:18:58 -0800287 ASSERT_FORTIFY(snprintf(myfoo.b, n, "a%s", myfoo.a));
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700288}
289
Nick Kralevichbe0e43b2014-07-23 13:56:23 -0700290TEST_F(DEATHTEST, bzero_fortified2) {
Nick Kralevicha6cde392013-06-29 08:15:25 -0700291 foo myfoo;
292 memcpy(myfoo.b, "0123456789", sizeof(myfoo.b));
Elliott Hughes58666732025-01-28 13:15:01 -0800293 volatile size_t n = 11;
Elliott Hughesd036e942015-02-02 11:18:58 -0800294 ASSERT_FORTIFY(bzero(myfoo.b, n));
Nick Kralevicha6cde392013-06-29 08:15:25 -0700295}
296
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700297#endif /* defined(_FORTIFY_SOURCE) && _FORTIFY_SOURCE=2 */
298
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700299// multibyte target where we over fill (should fail)
Nick Kralevichbe0e43b2014-07-23 13:56:23 -0700300TEST_F(DEATHTEST, strcpy_fortified) {
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800301#if defined(__BIONIC__)
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700302 char buf[10];
Elliott Hughes58666732025-01-28 13:15:01 -0800303 char* orig = strdup("0123456789");
Elliott Hughesd036e942015-02-02 11:18:58 -0800304 ASSERT_FORTIFY(strcpy(buf, orig));
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700305 free(orig);
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800306#else // __BIONIC__
Elliott Hughesbcaa4542019-03-08 15:20:23 -0800307 GTEST_SKIP() << "glibc is broken";
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800308#endif // __BIONIC__
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700309}
310
311// zero sized target with "\0" source (should fail)
Nick Kralevichbe0e43b2014-07-23 13:56:23 -0700312TEST_F(DEATHTEST, strcpy2_fortified) {
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800313#if defined(__BIONIC__)
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700314 char buf[0];
Elliott Hughes58666732025-01-28 13:15:01 -0800315 char* orig = strdup("");
Elliott Hughesd036e942015-02-02 11:18:58 -0800316 ASSERT_FORTIFY(strcpy(buf, orig));
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700317 free(orig);
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800318#else // __BIONIC__
Elliott Hughesbcaa4542019-03-08 15:20:23 -0800319 GTEST_SKIP() << "glibc is broken";
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800320#endif // __BIONIC__
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700321}
322
323// zero sized target with longer source (should fail)
Nick Kralevichbe0e43b2014-07-23 13:56:23 -0700324TEST_F(DEATHTEST, strcpy3_fortified) {
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800325#if defined(__BIONIC__)
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700326 char buf[0];
Elliott Hughes58666732025-01-28 13:15:01 -0800327 char* orig = strdup("1");
Elliott Hughesd036e942015-02-02 11:18:58 -0800328 ASSERT_FORTIFY(strcpy(buf, orig));
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700329 free(orig);
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800330#else // __BIONIC__
Elliott Hughesbcaa4542019-03-08 15:20:23 -0800331 GTEST_SKIP() << "glibc is broken";
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800332#endif // __BIONIC__
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700333}
334
335// one byte target with longer source (should fail)
Nick Kralevichbe0e43b2014-07-23 13:56:23 -0700336TEST_F(DEATHTEST, strcpy4_fortified) {
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800337#if defined(__BIONIC__)
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700338 char buf[1];
Elliott Hughes58666732025-01-28 13:15:01 -0800339 char* orig = strdup("12");
Elliott Hughesd036e942015-02-02 11:18:58 -0800340 ASSERT_FORTIFY(strcpy(buf, orig));
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700341 free(orig);
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800342#else // __BIONIC__
Elliott Hughesbcaa4542019-03-08 15:20:23 -0800343 GTEST_SKIP() << "glibc is broken";
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800344#endif // __BIONIC__
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700345}
346
Nick Kralevichbe0e43b2014-07-23 13:56:23 -0700347TEST_F(DEATHTEST, strlen_fortified) {
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800348#if defined(__BIONIC__)
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700349 char buf[10];
350 memcpy(buf, "0123456789", sizeof(buf));
Elliott Hughesd036e942015-02-02 11:18:58 -0800351 ASSERT_FORTIFY(printf("%zd", strlen(buf)));
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800352#else // __BIONIC__
Elliott Hughesbcaa4542019-03-08 15:20:23 -0800353 GTEST_SKIP() << "glibc is broken";
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800354#endif // __BIONIC__
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700355}
356
Nick Kralevichbe0e43b2014-07-23 13:56:23 -0700357TEST_F(DEATHTEST, strchr_fortified) {
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800358#if defined(__BIONIC__)
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700359 char buf[10];
360 memcpy(buf, "0123456789", sizeof(buf));
Elliott Hughesd036e942015-02-02 11:18:58 -0800361 ASSERT_FORTIFY(printf("%s", strchr(buf, 'a')));
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800362#else // __BIONIC__
Elliott Hughesbcaa4542019-03-08 15:20:23 -0800363 GTEST_SKIP() << "glibc is broken";
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800364#endif // __BIONIC__
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700365}
366
Nick Kralevichbe0e43b2014-07-23 13:56:23 -0700367TEST_F(DEATHTEST, strrchr_fortified) {
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800368#if defined(__BIONIC__)
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700369 char buf[10];
370 memcpy(buf, "0123456789", sizeof(buf));
Elliott Hughesd036e942015-02-02 11:18:58 -0800371 ASSERT_FORTIFY(printf("%s", strrchr(buf, 'a')));
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800372#else // __BIONIC__
Elliott Hughesbcaa4542019-03-08 15:20:23 -0800373 GTEST_SKIP() << "glibc is broken";
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800374#endif // __BIONIC__
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700375}
376
Nick Kralevichbe0e43b2014-07-23 13:56:23 -0700377TEST_F(DEATHTEST, strlcpy_fortified) {
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800378#if defined(__BIONIC__)
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700379 char bufa[15];
380 char bufb[10];
381 strcpy(bufa, "01234567890123");
382 size_t n = strlen(bufa);
Elliott Hughesd036e942015-02-02 11:18:58 -0800383 ASSERT_FORTIFY(strlcpy(bufb, bufa, n));
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800384#else // __BIONIC__
Elliott Hughesbcaa4542019-03-08 15:20:23 -0800385 GTEST_SKIP() << "strlcpy not available";
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800386#endif // __BIONIC__
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700387}
388
Nick Kralevichbe0e43b2014-07-23 13:56:23 -0700389TEST_F(DEATHTEST, strlcat_fortified) {
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800390#if defined(__BIONIC__)
Nick Kralevicha6cde392013-06-29 08:15:25 -0700391 char bufa[15];
392 char bufb[10];
393 bufb[0] = '\0';
394 strcpy(bufa, "01234567890123");
395 size_t n = strlen(bufa);
Elliott Hughesd036e942015-02-02 11:18:58 -0800396 ASSERT_FORTIFY(strlcat(bufb, bufa, n));
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800397#else // __BIONIC__
Elliott Hughesbcaa4542019-03-08 15:20:23 -0800398 GTEST_SKIP() << "strlcat not available";
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800399#endif // __BIONIC__
Nick Kralevicha6cde392013-06-29 08:15:25 -0700400}
401
Nick Kralevichbe0e43b2014-07-23 13:56:23 -0700402TEST_F(DEATHTEST, sprintf_fortified) {
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700403 char buf[10];
404 char source_buf[15];
405 memcpy(source_buf, "12345678901234", 15);
Elliott Hughesd036e942015-02-02 11:18:58 -0800406 ASSERT_FORTIFY(sprintf(buf, "%s", source_buf));
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700407}
408
Nick Kralevichbe0e43b2014-07-23 13:56:23 -0700409TEST_F(DEATHTEST, sprintf_malloc_fortified) {
Elliott Hughes58666732025-01-28 13:15:01 -0800410 char* buf = static_cast<char*>(malloc(10));
Nick Kralevichb91791d2013-10-02 14:14:40 -0700411 char source_buf[11];
412 memcpy(source_buf, "1234567890", 11);
Elliott Hughesd036e942015-02-02 11:18:58 -0800413 ASSERT_FORTIFY(sprintf(buf, "%s", source_buf));
Nick Kralevichb91791d2013-10-02 14:14:40 -0700414 free(buf);
415}
Nick Kralevichb91791d2013-10-02 14:14:40 -0700416
Nick Kralevich884a3de2014-10-06 00:39:47 +0000417TEST_F(DEATHTEST, sprintf2_fortified) {
Nick Kralevich884a3de2014-10-06 00:39:47 +0000418 char buf[5];
Elliott Hughesd036e942015-02-02 11:18:58 -0800419 ASSERT_FORTIFY(sprintf(buf, "aaaaa"));
Nick Kralevich884a3de2014-10-06 00:39:47 +0000420}
421
Elliott Hughes58666732025-01-28 13:15:01 -0800422static int vsprintf_helper(const char* fmt, ...) {
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700423 va_list va;
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700424 va_start(va, fmt);
Elliott Hughes58666732025-01-28 13:15:01 -0800425 char buf[10];
426 int result = vsprintf(buf, fmt, va); // should crash here
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700427 va_end(va);
428 return result;
429}
430
Nick Kralevichbe0e43b2014-07-23 13:56:23 -0700431TEST_F(DEATHTEST, vsprintf_fortified) {
Elliott Hughesd036e942015-02-02 11:18:58 -0800432 ASSERT_FORTIFY(vsprintf_helper("%s", "0123456789"));
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700433}
434
Nick Kralevichbe0e43b2014-07-23 13:56:23 -0700435TEST_F(DEATHTEST, vsprintf2_fortified) {
Elliott Hughesd036e942015-02-02 11:18:58 -0800436 ASSERT_FORTIFY(vsprintf_helper("0123456789"));
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700437}
438
Elliott Hughes58666732025-01-28 13:15:01 -0800439static int vsnprintf_helper(const char* fmt, ...) {
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700440 va_list va;
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700441 va_start(va, fmt);
Elliott Hughes58666732025-01-28 13:15:01 -0800442 char buf[10];
443 volatile size_t size = 11;
444 int result = vsnprintf(buf, size, fmt, va); // should crash here
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700445 va_end(va);
446 return result;
447}
448
Nick Kralevichbe0e43b2014-07-23 13:56:23 -0700449TEST_F(DEATHTEST, vsnprintf_fortified) {
Elliott Hughesd036e942015-02-02 11:18:58 -0800450 ASSERT_FORTIFY(vsnprintf_helper("%s", "0123456789"));
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700451}
452
Nick Kralevichbe0e43b2014-07-23 13:56:23 -0700453TEST_F(DEATHTEST, vsnprintf2_fortified) {
Elliott Hughesd036e942015-02-02 11:18:58 -0800454 ASSERT_FORTIFY(vsnprintf_helper("0123456789"));
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700455}
456
Nick Kralevichbe0e43b2014-07-23 13:56:23 -0700457TEST_F(DEATHTEST, strncat_fortified) {
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700458 char buf[10];
Elliott Hughes58666732025-01-28 13:15:01 -0800459 volatile size_t n = 10;
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700460 strncpy(buf, "012345678", n);
Elliott Hughesd036e942015-02-02 11:18:58 -0800461 ASSERT_FORTIFY(strncat(buf, "9", n));
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700462}
463
Nick Kralevichbe0e43b2014-07-23 13:56:23 -0700464TEST_F(DEATHTEST, strncat2_fortified) {
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700465 char buf[10];
466 buf[0] = '\0';
Elliott Hughes58666732025-01-28 13:15:01 -0800467 volatile size_t n = 10;
Elliott Hughesd036e942015-02-02 11:18:58 -0800468 ASSERT_FORTIFY(strncat(buf, "0123456789", n));
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700469}
470
Nick Kralevichbe0e43b2014-07-23 13:56:23 -0700471TEST_F(DEATHTEST, strcat_fortified) {
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700472 char src[11];
473 strcpy(src, "0123456789");
474 char buf[10];
475 buf[0] = '\0';
Elliott Hughesd036e942015-02-02 11:18:58 -0800476 ASSERT_FORTIFY(strcat(buf, src));
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700477}
478
Nick Kralevichbe0e43b2014-07-23 13:56:23 -0700479TEST_F(DEATHTEST, memmove_fortified) {
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700480 char buf[20];
481 strcpy(buf, "0123456789");
Elliott Hughes58666732025-01-28 13:15:01 -0800482 volatile size_t n = 10;
Elliott Hughesd036e942015-02-02 11:18:58 -0800483 ASSERT_FORTIFY(memmove(buf + 11, buf, n));
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700484}
485
Nick Kralevichbe0e43b2014-07-23 13:56:23 -0700486TEST_F(DEATHTEST, memcpy_fortified) {
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700487 char bufa[10];
488 char bufb[10];
489 strcpy(bufa, "012345678");
Elliott Hughes58666732025-01-28 13:15:01 -0800490 volatile size_t n = 11;
Elliott Hughesd036e942015-02-02 11:18:58 -0800491 ASSERT_FORTIFY(memcpy(bufb, bufa, n));
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700492}
493
Elliott Hughes62e59642016-03-01 11:22:42 -0800494TEST_F(DEATHTEST, memset_fortified) {
495 char buf[10];
Elliott Hughes58666732025-01-28 13:15:01 -0800496 volatile size_t n = 11;
Elliott Hughes62e59642016-03-01 11:22:42 -0800497 ASSERT_FORTIFY(memset(buf, 0, n));
498}
499
Nick Kralevichbe0e43b2014-07-23 13:56:23 -0700500TEST_F(DEATHTEST, stpncpy_fortified) {
Christopher Ferris950a58e2014-04-04 14:38:18 -0700501 char bufa[15];
502 char bufb[10];
503 strcpy(bufa, "01234567890123");
504 size_t n = strlen(bufa);
Elliott Hughesd036e942015-02-02 11:18:58 -0800505 ASSERT_FORTIFY(stpncpy(bufb, bufa, n));
Christopher Ferris950a58e2014-04-04 14:38:18 -0700506}
507
Nick Kralevichbe0e43b2014-07-23 13:56:23 -0700508TEST_F(DEATHTEST, stpncpy2_fortified) {
Christopher Ferris950a58e2014-04-04 14:38:18 -0700509 char dest[11];
510 char src[10];
511 memcpy(src, "0123456789", sizeof(src)); // src is not null terminated
Elliott Hughesd036e942015-02-02 11:18:58 -0800512 ASSERT_FORTIFY(stpncpy(dest, src, sizeof(dest)));
Christopher Ferris950a58e2014-04-04 14:38:18 -0700513}
514
Nick Kralevichbe0e43b2014-07-23 13:56:23 -0700515TEST_F(DEATHTEST, strncpy_fortified) {
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700516 char bufa[15];
517 char bufb[10];
518 strcpy(bufa, "01234567890123");
519 size_t n = strlen(bufa);
Elliott Hughesd036e942015-02-02 11:18:58 -0800520 ASSERT_FORTIFY(strncpy(bufb, bufa, n));
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700521}
522
Christopher Ferris950a58e2014-04-04 14:38:18 -0700523
Nick Kralevichbe0e43b2014-07-23 13:56:23 -0700524TEST_F(DEATHTEST, strncpy2_fortified) {
Nick Kralevich93501d32013-08-28 10:47:43 -0700525 char dest[11];
526 char src[10];
527 memcpy(src, "0123456789", sizeof(src)); // src is not null terminated
Elliott Hughesd036e942015-02-02 11:18:58 -0800528 ASSERT_FORTIFY(strncpy(dest, src, sizeof(dest)));
Nick Kralevich93501d32013-08-28 10:47:43 -0700529}
530
Nick Kralevichbe0e43b2014-07-23 13:56:23 -0700531TEST_F(DEATHTEST, snprintf_fortified) {
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700532 char bufa[15];
533 char bufb[10];
534 strcpy(bufa, "0123456789");
535 size_t n = strlen(bufa) + 1;
Elliott Hughesd036e942015-02-02 11:18:58 -0800536 ASSERT_FORTIFY(snprintf(bufb, n, "%s", bufa));
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700537}
538
Nick Kralevichbe0e43b2014-07-23 13:56:23 -0700539TEST_F(DEATHTEST, bzero_fortified) {
Nick Kralevicha6cde392013-06-29 08:15:25 -0700540 char buf[10];
541 memcpy(buf, "0123456789", sizeof(buf));
Elliott Hughes58666732025-01-28 13:15:01 -0800542 size_t n = 11;
Elliott Hughesd036e942015-02-02 11:18:58 -0800543 ASSERT_FORTIFY(bzero(buf, n));
Nick Kralevicha6cde392013-06-29 08:15:25 -0700544}
545
Nick Kralevichbe0e43b2014-07-23 13:56:23 -0700546TEST_F(DEATHTEST, umask_fortified) {
Elliott Hughes58666732025-01-28 13:15:01 -0800547 volatile mode_t mask = 01777;
Elliott Hughesd036e942015-02-02 11:18:58 -0800548 ASSERT_FORTIFY(umask(mask));
Nick Kralevicha6cde392013-06-29 08:15:25 -0700549}
550
Nick Kralevichbe0e43b2014-07-23 13:56:23 -0700551TEST_F(DEATHTEST, recv_fortified) {
Elliott Hughes58666732025-01-28 13:15:01 -0800552 volatile size_t data_len = 11;
Nick Kralevich60f4f9a2013-09-24 16:32:07 -0700553 char buf[10];
Elliott Hughesd036e942015-02-02 11:18:58 -0800554 ASSERT_FORTIFY(recv(0, buf, data_len, 0));
Nick Kralevich60f4f9a2013-09-24 16:32:07 -0700555}
556
Daniel Micay95b59c52017-02-13 17:27:59 -0800557TEST_F(DEATHTEST, send_fortified) {
Elliott Hughes58666732025-01-28 13:15:01 -0800558 volatile size_t data_len = 11;
Daniel Micay95b59c52017-02-13 17:27:59 -0800559 char buf[10] = {0};
560 ASSERT_FORTIFY(send(0, buf, data_len, 0));
561}
562
Nick Kralevichbe0e43b2014-07-23 13:56:23 -0700563TEST_F(DEATHTEST, FD_ISSET_fortified) {
Elliott Hughes063525c2014-05-13 11:19:57 -0700564#if defined(__BIONIC__) // glibc catches this at compile-time.
Christopher Ferris2a391882024-12-19 13:44:35 -0800565 fd_set set = {};
Elliott Hughesd036e942015-02-02 11:18:58 -0800566 ASSERT_FORTIFY(FD_ISSET(-1, &set));
Elliott Hughes409588c2014-04-23 23:02:43 -0700567#endif
Nick Kralevich90201d52013-10-02 16:11:30 -0700568}
569
Nick Kralevichbe0e43b2014-07-23 13:56:23 -0700570TEST_F(DEATHTEST, FD_ISSET_2_fortified) {
Nick Kralevich7943df62013-10-03 14:08:39 -0700571 char buf[1];
572 fd_set* set = (fd_set*) buf;
Elliott Hughesd036e942015-02-02 11:18:58 -0800573 ASSERT_FORTIFY(FD_ISSET(0, set));
Nick Kralevich7943df62013-10-03 14:08:39 -0700574}
575
Daniel Micay9101b002015-05-20 15:31:26 -0400576TEST_F(DEATHTEST, getcwd_fortified) {
577 char buf[1];
Elliott Hughes58666732025-01-28 13:15:01 -0800578 volatile size_t n = 2;
579 ASSERT_FORTIFY(getcwd(buf, n));
Daniel Micay9101b002015-05-20 15:31:26 -0400580}
581
Daniel Micaye7e1c872015-04-16 09:07:45 -0400582TEST_F(DEATHTEST, pread_fortified) {
583 char buf[1];
Elliott Hughes58666732025-01-28 13:15:01 -0800584 volatile size_t n = 2;
Daniel Micaye7e1c872015-04-16 09:07:45 -0400585 int fd = open("/dev/null", O_RDONLY);
Elliott Hughes58666732025-01-28 13:15:01 -0800586 ASSERT_FORTIFY(pread(fd, buf, n, 0));
Daniel Micaye7e1c872015-04-16 09:07:45 -0400587 close(fd);
588}
589
590TEST_F(DEATHTEST, pread64_fortified) {
591 char buf[1];
Elliott Hughes58666732025-01-28 13:15:01 -0800592 volatile size_t n = 2;
Daniel Micaye7e1c872015-04-16 09:07:45 -0400593 int fd = open("/dev/null", O_RDONLY);
Elliott Hughes58666732025-01-28 13:15:01 -0800594 ASSERT_FORTIFY(pread64(fd, buf, n, 0));
Daniel Micaye7e1c872015-04-16 09:07:45 -0400595 close(fd);
596}
597
Daniel Micayafdd1542015-07-20 21:37:29 -0400598TEST_F(DEATHTEST, pwrite_fortified) {
599 char buf[1] = {0};
Elliott Hughes58666732025-01-28 13:15:01 -0800600 volatile size_t n = 2;
Daniel Micayafdd1542015-07-20 21:37:29 -0400601 int fd = open("/dev/null", O_WRONLY);
Elliott Hughes58666732025-01-28 13:15:01 -0800602 ASSERT_FORTIFY(pwrite(fd, buf, n, 0));
Daniel Micayafdd1542015-07-20 21:37:29 -0400603 close(fd);
604}
605
606TEST_F(DEATHTEST, pwrite64_fortified) {
607 char buf[1] = {0};
Elliott Hughes58666732025-01-28 13:15:01 -0800608 volatile size_t n = 2;
Daniel Micayafdd1542015-07-20 21:37:29 -0400609 int fd = open("/dev/null", O_WRONLY);
Elliott Hughes58666732025-01-28 13:15:01 -0800610 ASSERT_FORTIFY(pwrite64(fd, buf, n, 0));
Daniel Micayafdd1542015-07-20 21:37:29 -0400611 close(fd);
612}
613
Nick Kralevichbe0e43b2014-07-23 13:56:23 -0700614TEST_F(DEATHTEST, read_fortified) {
Nick Kralevichb036b5c2013-10-09 20:16:34 -0700615 char buf[1];
Elliott Hughes58666732025-01-28 13:15:01 -0800616 volatile size_t n = 2;
Nick Kralevichb036b5c2013-10-09 20:16:34 -0700617 int fd = open("/dev/null", O_RDONLY);
Elliott Hughes58666732025-01-28 13:15:01 -0800618 ASSERT_FORTIFY(read(fd, buf, n));
Nick Kralevichb036b5c2013-10-09 20:16:34 -0700619 close(fd);
620}
621
Daniel Micayafdd1542015-07-20 21:37:29 -0400622TEST_F(DEATHTEST, write_fortified) {
623 char buf[1] = {0};
Elliott Hughes58666732025-01-28 13:15:01 -0800624 volatile size_t n = 2;
Daniel Micayafdd1542015-07-20 21:37:29 -0400625 int fd = open("/dev/null", O_WRONLY);
Elliott Hughes58666732025-01-28 13:15:01 -0800626 ASSERT_FORTIFY(write(fd, buf, n));
Daniel Micayafdd1542015-07-20 21:37:29 -0400627 close(fd);
628}
629
Daniel Micayfed26592015-07-18 13:55:51 -0400630TEST_F(DEATHTEST, fread_fortified) {
631 char buf[1];
Elliott Hughes58666732025-01-28 13:15:01 -0800632 volatile size_t n = 2;
Daniel Micayfed26592015-07-18 13:55:51 -0400633 FILE* fp = fopen("/dev/null", "r");
Elliott Hughes58666732025-01-28 13:15:01 -0800634 ASSERT_FORTIFY(fread(buf, 1, n, fp));
Daniel Micayfed26592015-07-18 13:55:51 -0400635 fclose(fp);
636}
637
638TEST_F(DEATHTEST, fwrite_fortified) {
639 char buf[1] = {0};
Elliott Hughes58666732025-01-28 13:15:01 -0800640 volatile size_t n = 2;
Daniel Micayfed26592015-07-18 13:55:51 -0400641 FILE* fp = fopen("/dev/null", "w");
Elliott Hughes58666732025-01-28 13:15:01 -0800642 ASSERT_FORTIFY(fwrite(buf, 1, n, fp));
Daniel Micayfed26592015-07-18 13:55:51 -0400643 fclose(fp);
644}
645
Daniel Micay42281882015-04-17 11:26:36 -0400646TEST_F(DEATHTEST, readlink_fortified) {
647 char buf[1];
Elliott Hughes58666732025-01-28 13:15:01 -0800648 volatile size_t n = 2;
649 ASSERT_FORTIFY(readlink("/dev/null", buf, n));
Daniel Micay42281882015-04-17 11:26:36 -0400650}
651
652TEST_F(DEATHTEST, readlinkat_fortified) {
653 char buf[1];
Elliott Hughes58666732025-01-28 13:15:01 -0800654 volatile size_t n = 2;
655 ASSERT_FORTIFY(readlinkat(AT_FDCWD, "/dev/null", buf, n));
Daniel Micay42281882015-04-17 11:26:36 -0400656}
657
zijunzhaoe1833e52023-04-26 21:43:30 +0000658TEST(TEST_NAME, snprintf_nullptr_valid) {
659 ASSERT_EQ(10, snprintf(nullptr, 0, "0123456789"));
660}
661
Nick Kralevich5bcf3982013-06-28 10:34:09 -0700662extern "C" char* __strncat_chk(char*, const char*, size_t, size_t);
663extern "C" char* __strcat_chk(char*, const char*, size_t);
664
665TEST(TEST_NAME, strncat) {
666 char buf[10];
667 memset(buf, 'A', sizeof(buf));
668 buf[0] = 'a';
669 buf[1] = '\0';
670 char* res = __strncat_chk(buf, "01234", sizeof(buf) - strlen(buf) - 1, sizeof(buf));
671 ASSERT_EQ(buf, res);
672 ASSERT_EQ('a', buf[0]);
673 ASSERT_EQ('0', buf[1]);
674 ASSERT_EQ('1', buf[2]);
675 ASSERT_EQ('2', buf[3]);
676 ASSERT_EQ('3', buf[4]);
677 ASSERT_EQ('4', buf[5]);
678 ASSERT_EQ('\0', buf[6]);
679 ASSERT_EQ('A', buf[7]);
680 ASSERT_EQ('A', buf[8]);
681 ASSERT_EQ('A', buf[9]);
682}
683
684TEST(TEST_NAME, strncat2) {
685 char buf[10];
686 memset(buf, 'A', sizeof(buf));
687 buf[0] = 'a';
688 buf[1] = '\0';
689 char* res = __strncat_chk(buf, "0123456789", 5, sizeof(buf));
690 ASSERT_EQ(buf, res);
691 ASSERT_EQ('a', buf[0]);
692 ASSERT_EQ('0', buf[1]);
693 ASSERT_EQ('1', buf[2]);
694 ASSERT_EQ('2', buf[3]);
695 ASSERT_EQ('3', buf[4]);
696 ASSERT_EQ('4', buf[5]);
697 ASSERT_EQ('\0', buf[6]);
698 ASSERT_EQ('A', buf[7]);
699 ASSERT_EQ('A', buf[8]);
700 ASSERT_EQ('A', buf[9]);
701}
702
703TEST(TEST_NAME, strncat3) {
704 char buf[10];
705 memset(buf, 'A', sizeof(buf));
706 buf[0] = '\0';
707 char* res = __strncat_chk(buf, "0123456789", 5, sizeof(buf));
708 ASSERT_EQ(buf, res);
709 ASSERT_EQ('0', buf[0]);
710 ASSERT_EQ('1', buf[1]);
711 ASSERT_EQ('2', buf[2]);
712 ASSERT_EQ('3', buf[3]);
713 ASSERT_EQ('4', buf[4]);
714 ASSERT_EQ('\0', buf[5]);
715 ASSERT_EQ('A', buf[6]);
716 ASSERT_EQ('A', buf[7]);
717 ASSERT_EQ('A', buf[8]);
718 ASSERT_EQ('A', buf[9]);
719}
720
721TEST(TEST_NAME, strncat4) {
722 char buf[10];
723 memset(buf, 'A', sizeof(buf));
724 buf[9] = '\0';
725 char* res = __strncat_chk(buf, "", 5, sizeof(buf));
726 ASSERT_EQ(buf, res);
727 ASSERT_EQ('A', buf[0]);
728 ASSERT_EQ('A', buf[1]);
729 ASSERT_EQ('A', buf[2]);
730 ASSERT_EQ('A', buf[3]);
731 ASSERT_EQ('A', buf[4]);
732 ASSERT_EQ('A', buf[5]);
733 ASSERT_EQ('A', buf[6]);
734 ASSERT_EQ('A', buf[7]);
735 ASSERT_EQ('A', buf[8]);
736 ASSERT_EQ('\0', buf[9]);
737}
738
739TEST(TEST_NAME, strncat5) {
740 char buf[10];
741 memset(buf, 'A', sizeof(buf));
742 buf[0] = 'a';
743 buf[1] = '\0';
744 char* res = __strncat_chk(buf, "01234567", 8, sizeof(buf));
745 ASSERT_EQ(buf, res);
746 ASSERT_EQ('a', buf[0]);
747 ASSERT_EQ('0', buf[1]);
748 ASSERT_EQ('1', buf[2]);
749 ASSERT_EQ('2', buf[3]);
750 ASSERT_EQ('3', buf[4]);
751 ASSERT_EQ('4', buf[5]);
752 ASSERT_EQ('5', buf[6]);
753 ASSERT_EQ('6', buf[7]);
754 ASSERT_EQ('7', buf[8]);
755 ASSERT_EQ('\0', buf[9]);
756}
757
758TEST(TEST_NAME, strncat6) {
759 char buf[10];
760 memset(buf, 'A', sizeof(buf));
761 buf[0] = 'a';
762 buf[1] = '\0';
763 char* res = __strncat_chk(buf, "01234567", 9, sizeof(buf));
764 ASSERT_EQ(buf, res);
765 ASSERT_EQ('a', buf[0]);
766 ASSERT_EQ('0', buf[1]);
767 ASSERT_EQ('1', buf[2]);
768 ASSERT_EQ('2', buf[3]);
769 ASSERT_EQ('3', buf[4]);
770 ASSERT_EQ('4', buf[5]);
771 ASSERT_EQ('5', buf[6]);
772 ASSERT_EQ('6', buf[7]);
773 ASSERT_EQ('7', buf[8]);
774 ASSERT_EQ('\0', buf[9]);
775}
776
777
778TEST(TEST_NAME, strcat) {
779 char buf[10];
780 memset(buf, 'A', sizeof(buf));
781 buf[0] = 'a';
782 buf[1] = '\0';
783 char* res = __strcat_chk(buf, "01234", sizeof(buf));
784 ASSERT_EQ(buf, res);
785 ASSERT_EQ('a', buf[0]);
786 ASSERT_EQ('0', buf[1]);
787 ASSERT_EQ('1', buf[2]);
788 ASSERT_EQ('2', buf[3]);
789 ASSERT_EQ('3', buf[4]);
790 ASSERT_EQ('4', buf[5]);
791 ASSERT_EQ('\0', buf[6]);
792 ASSERT_EQ('A', buf[7]);
793 ASSERT_EQ('A', buf[8]);
794 ASSERT_EQ('A', buf[9]);
795}
796
797TEST(TEST_NAME, strcat2) {
798 char buf[10];
799 memset(buf, 'A', sizeof(buf));
800 buf[0] = 'a';
801 buf[1] = '\0';
802 char* res = __strcat_chk(buf, "01234567", sizeof(buf));
803 ASSERT_EQ(buf, res);
804 ASSERT_EQ('a', buf[0]);
805 ASSERT_EQ('0', buf[1]);
806 ASSERT_EQ('1', buf[2]);
807 ASSERT_EQ('2', buf[3]);
808 ASSERT_EQ('3', buf[4]);
809 ASSERT_EQ('4', buf[5]);
810 ASSERT_EQ('5', buf[6]);
811 ASSERT_EQ('6', buf[7]);
812 ASSERT_EQ('7', buf[8]);
813 ASSERT_EQ('\0', buf[9]);
814}
Nick Kralevich93501d32013-08-28 10:47:43 -0700815
Christopher Ferris950a58e2014-04-04 14:38:18 -0700816TEST(TEST_NAME, stpncpy) {
817 char src[10];
818 char dst[10];
819 memcpy(src, "0123456789", sizeof(src)); // non null terminated string
820 stpncpy(dst, src, sizeof(dst));
821 ASSERT_EQ('0', dst[0]);
822 ASSERT_EQ('1', dst[1]);
823 ASSERT_EQ('2', dst[2]);
824 ASSERT_EQ('3', dst[3]);
825 ASSERT_EQ('4', dst[4]);
826 ASSERT_EQ('5', dst[5]);
827 ASSERT_EQ('6', dst[6]);
828 ASSERT_EQ('7', dst[7]);
829 ASSERT_EQ('8', dst[8]);
830 ASSERT_EQ('9', dst[9]);
831}
832
833TEST(TEST_NAME, stpncpy2) {
834 char src[10];
835 char dst[15];
836 memcpy(src, "012345678\0", sizeof(src));
837 stpncpy(dst, src, sizeof(dst));
838 ASSERT_EQ('0', dst[0]);
839 ASSERT_EQ('1', dst[1]);
840 ASSERT_EQ('2', dst[2]);
841 ASSERT_EQ('3', dst[3]);
842 ASSERT_EQ('4', dst[4]);
843 ASSERT_EQ('5', dst[5]);
844 ASSERT_EQ('6', dst[6]);
845 ASSERT_EQ('7', dst[7]);
846 ASSERT_EQ('8', dst[8]);
847 ASSERT_EQ('\0', dst[9]);
848 ASSERT_EQ('\0', dst[10]);
849 ASSERT_EQ('\0', dst[11]);
850 ASSERT_EQ('\0', dst[12]);
851 ASSERT_EQ('\0', dst[13]);
852 ASSERT_EQ('\0', dst[14]);
853}
854
Nick Kralevich93501d32013-08-28 10:47:43 -0700855TEST(TEST_NAME, strncpy) {
856 char src[10];
857 char dst[10];
858 memcpy(src, "0123456789", sizeof(src)); // non null terminated string
859 strncpy(dst, src, sizeof(dst));
860 ASSERT_EQ('0', dst[0]);
861 ASSERT_EQ('1', dst[1]);
862 ASSERT_EQ('2', dst[2]);
863 ASSERT_EQ('3', dst[3]);
864 ASSERT_EQ('4', dst[4]);
865 ASSERT_EQ('5', dst[5]);
866 ASSERT_EQ('6', dst[6]);
867 ASSERT_EQ('7', dst[7]);
868 ASSERT_EQ('8', dst[8]);
869 ASSERT_EQ('9', dst[9]);
870}
871
872TEST(TEST_NAME, strncpy2) {
873 char src[10];
874 char dst[15];
875 memcpy(src, "012345678\0", sizeof(src));
876 strncpy(dst, src, sizeof(dst));
877 ASSERT_EQ('0', dst[0]);
878 ASSERT_EQ('1', dst[1]);
879 ASSERT_EQ('2', dst[2]);
880 ASSERT_EQ('3', dst[3]);
881 ASSERT_EQ('4', dst[4]);
882 ASSERT_EQ('5', dst[5]);
883 ASSERT_EQ('6', dst[6]);
884 ASSERT_EQ('7', dst[7]);
885 ASSERT_EQ('8', dst[8]);
886 ASSERT_EQ('\0', dst[9]);
887 ASSERT_EQ('\0', dst[10]);
888 ASSERT_EQ('\0', dst[11]);
889 ASSERT_EQ('\0', dst[12]);
890 ASSERT_EQ('\0', dst[13]);
891 ASSERT_EQ('\0', dst[14]);
892}
Christopher Ferris16e185c2013-09-10 16:56:34 -0700893
894TEST(TEST_NAME, strcat_chk_max_int_size) {
895 char buf[10];
896 memset(buf, 'A', sizeof(buf));
897 buf[0] = 'a';
898 buf[1] = '\0';
Elliott Hughes58666732025-01-28 13:15:01 -0800899 volatile size_t n = -1;
900 char* res = __strcat_chk(buf, "01234567", n);
Christopher Ferris16e185c2013-09-10 16:56:34 -0700901 ASSERT_EQ(buf, res);
902 ASSERT_EQ('a', buf[0]);
903 ASSERT_EQ('0', buf[1]);
904 ASSERT_EQ('1', buf[2]);
905 ASSERT_EQ('2', buf[3]);
906 ASSERT_EQ('3', buf[4]);
907 ASSERT_EQ('4', buf[5]);
908 ASSERT_EQ('5', buf[6]);
909 ASSERT_EQ('6', buf[7]);
910 ASSERT_EQ('7', buf[8]);
911 ASSERT_EQ('\0', buf[9]);
912}
913
George Burgess IV849c0b92019-06-10 16:22:09 -0700914TEST(TEST_NAME, mempcpy_chk) {
915 const char input_str[] = "abcdefg";
916 size_t input_str_size = strlen(input_str) + 1;
917
918 char buf1[10] = {};
919 char buf2[10] = {};
920
921 __builtin_mempcpy(buf1, input_str, input_str_size);
922 __builtin___mempcpy_chk(buf2, input_str, input_str_size, __bos0(buf2));
923
924 ASSERT_EQ(memcmp(buf1, buf2, sizeof(buf2)), 0);
925
926 void *builtin_ptr = __builtin_mempcpy(buf1, input_str, input_str_size);
927 void *fortify_ptr = __builtin___mempcpy_chk(buf1, input_str, input_str_size, __bos0(buf2));
928
929 ASSERT_EQ(builtin_ptr, fortify_ptr);
930}
931
Christopher Ferris950a58e2014-04-04 14:38:18 -0700932extern "C" char* __stpcpy_chk(char*, const char*, size_t);
933
934TEST(TEST_NAME, stpcpy_chk_max_int_size) {
935 char buf[10];
Elliott Hughes58666732025-01-28 13:15:01 -0800936 volatile size_t n = -1;
937 char* res = __stpcpy_chk(buf, "012345678", n);
Christopher Ferris950a58e2014-04-04 14:38:18 -0700938 ASSERT_EQ(buf + strlen("012345678"), res);
939 ASSERT_STREQ("012345678", buf);
940}
941
Christopher Ferris16e185c2013-09-10 16:56:34 -0700942extern "C" char* __strcpy_chk(char*, const char*, size_t);
943
944TEST(TEST_NAME, strcpy_chk_max_int_size) {
945 char buf[10];
Elliott Hughes58666732025-01-28 13:15:01 -0800946 volatile size_t n = -1;
947 char* res = __strcpy_chk(buf, "012345678", n);
Christopher Ferris16e185c2013-09-10 16:56:34 -0700948 ASSERT_EQ(buf, res);
Christopher Ferris950a58e2014-04-04 14:38:18 -0700949 ASSERT_STREQ("012345678", buf);
Christopher Ferris16e185c2013-09-10 16:56:34 -0700950}
951
952extern "C" void* __memcpy_chk(void*, const void*, size_t, size_t);
953
Daniel Verkampdf4e06c2025-01-24 14:08:16 -0800954TEST(TEST_NAME, memcpy_chk_smaller) {
955 char buf[10] = "XXXXXXXXX";
Elliott Hughes58666732025-01-28 13:15:01 -0800956 volatile size_t n = 5;
Daniel Verkampdf4e06c2025-01-24 14:08:16 -0800957 void* res = __memcpy_chk(buf, "012346578", n, sizeof(buf));
958 ASSERT_EQ((void*)buf, res);
959 ASSERT_EQ('0', buf[0]);
960 ASSERT_EQ('1', buf[1]);
961 ASSERT_EQ('2', buf[2]);
962 ASSERT_EQ('3', buf[3]);
963 ASSERT_EQ('4', buf[4]);
964 ASSERT_EQ('X', buf[5]);
965 ASSERT_EQ('X', buf[6]);
966 ASSERT_EQ('X', buf[7]);
967 ASSERT_EQ('X', buf[8]);
968 ASSERT_EQ('\0', buf[9]);
969}
970
971TEST(TEST_NAME, memcpy_chk_exact_size) {
972 char buf[10] = "XXXXXXXXX";
Elliott Hughes58666732025-01-28 13:15:01 -0800973 volatile size_t n = 10;
Daniel Verkampdf4e06c2025-01-24 14:08:16 -0800974 void* res = __memcpy_chk(buf, "012345678", n, sizeof(buf));
975 ASSERT_EQ((void*)buf, res);
976 ASSERT_EQ('0', buf[0]);
977 ASSERT_EQ('1', buf[1]);
978 ASSERT_EQ('2', buf[2]);
979 ASSERT_EQ('3', buf[3]);
980 ASSERT_EQ('4', buf[4]);
981 ASSERT_EQ('5', buf[5]);
982 ASSERT_EQ('6', buf[6]);
983 ASSERT_EQ('7', buf[7]);
984 ASSERT_EQ('8', buf[8]);
985 ASSERT_EQ('\0', buf[9]);
986}
987
Christopher Ferris16e185c2013-09-10 16:56:34 -0700988TEST(TEST_NAME, memcpy_chk_max_int_size) {
989 char buf[10];
Elliott Hughes58666732025-01-28 13:15:01 -0800990 volatile size_t n = -1;
991 void* res = __memcpy_chk(buf, "012345678", sizeof(buf), n);
Christopher Ferris16e185c2013-09-10 16:56:34 -0700992 ASSERT_EQ((void*)buf, res);
993 ASSERT_EQ('0', buf[0]);
994 ASSERT_EQ('1', buf[1]);
995 ASSERT_EQ('2', buf[2]);
996 ASSERT_EQ('3', buf[3]);
997 ASSERT_EQ('4', buf[4]);
998 ASSERT_EQ('5', buf[5]);
999 ASSERT_EQ('6', buf[6]);
1000 ASSERT_EQ('7', buf[7]);
1001 ASSERT_EQ('8', buf[8]);
1002 ASSERT_EQ('\0', buf[9]);
1003}
Stephen Hines6e380722013-10-11 00:45:24 -07001004
1005// Verify that macro expansion is done properly for sprintf/snprintf (which
1006// are defined as macros in stdio.h under clang).
1007#define CONTENTS "macro expansion"
1008#define BUF_AND_SIZE(A) A, sizeof(A)
1009#define BUF_AND_CONTENTS(A) A, CONTENTS
1010#define BUF_AND_SIZE_AND_CONTENTS(A) A, sizeof(A), CONTENTS
1011TEST(TEST_NAME, s_n_printf_macro_expansion) {
1012 char buf[BUFSIZ];
1013 snprintf(BUF_AND_SIZE(buf), CONTENTS);
1014 EXPECT_STREQ(CONTENTS, buf);
1015
1016 snprintf(BUF_AND_SIZE_AND_CONTENTS(buf));
1017 EXPECT_STREQ(CONTENTS, buf);
1018
1019 sprintf(BUF_AND_CONTENTS(buf));
1020 EXPECT_STREQ(CONTENTS, buf);
1021}
Elliott Hughes4674e382015-02-02 09:15:19 -08001022
1023TEST_F(DEATHTEST, poll_fortified) {
Elliott Hughes58666732025-01-28 13:15:01 -08001024 volatile nfds_t fd_count = 2;
Elliott Hughes4674e382015-02-02 09:15:19 -08001025 pollfd buf[1] = {{0, POLLIN, 0}};
Yabin Cuif4fe6932015-02-03 17:52:32 -08001026 // Set timeout to zero to prevent waiting in poll when fortify test fails.
1027 ASSERT_FORTIFY(poll(buf, fd_count, 0));
Elliott Hughes4674e382015-02-02 09:15:19 -08001028}
1029
1030TEST_F(DEATHTEST, ppoll_fortified) {
Elliott Hughes58666732025-01-28 13:15:01 -08001031 volatile nfds_t fd_count = 2;
Elliott Hughes4674e382015-02-02 09:15:19 -08001032 pollfd buf[1] = {{0, POLLIN, 0}};
Elliott Hughes58666732025-01-28 13:15:01 -08001033 // Set timeout to zero to prevent waiting in ppoll if fortify test fails.
1034 timespec timeout = {};
Elliott Hughesb83bf142018-03-22 11:01:25 -07001035 ASSERT_FORTIFY(ppoll(buf, fd_count, &timeout, nullptr));
1036}
1037
1038TEST_F(DEATHTEST, ppoll64_fortified) {
Elliott Hughese7943f82023-09-28 08:20:20 -07001039#if defined(__BIONIC__) // glibc doesn't have ppoll64.
Elliott Hughes58666732025-01-28 13:15:01 -08001040 volatile nfds_t fd_count = 2;
Elliott Hughesb83bf142018-03-22 11:01:25 -07001041 pollfd buf[1] = {{0, POLLIN, 0}};
Elliott Hughes58666732025-01-28 13:15:01 -08001042 // Set timeout to zero to prevent waiting in ppoll if fortify test fails.
1043 timespec timeout= {};
Elliott Hughesb83bf142018-03-22 11:01:25 -07001044 ASSERT_FORTIFY(ppoll64(buf, fd_count, &timeout, nullptr));
1045#endif
Elliott Hughes4674e382015-02-02 09:15:19 -08001046}
Elliott Hughesb115aef2017-08-04 09:34:19 -07001047
1048TEST_F(DEATHTEST, open_O_CREAT_without_mode_fortified) {
Elliott Hughes58666732025-01-28 13:15:01 -08001049 volatile int flags = O_CREAT;
Elliott Hughesb115aef2017-08-04 09:34:19 -07001050 ASSERT_FORTIFY(open("", flags));
1051}
1052
1053TEST_F(DEATHTEST, open_O_TMPFILE_without_mode_fortified) {
Elliott Hughes58666732025-01-28 13:15:01 -08001054 volatile int flags = O_TMPFILE;
Elliott Hughesb115aef2017-08-04 09:34:19 -07001055 ASSERT_FORTIFY(open("", flags));
Elliott Hughesb115aef2017-08-04 09:34:19 -07001056}