18
18
#if SANITIZER_APPLE
19
19
#include < libkern/OSAtomic.h>
20
20
#include < os/lock.h>
21
+ #include < sys/types.h>
22
+ #include < unistd.h>
21
23
#endif
22
24
23
25
#if SANITIZER_INTERCEPT_MEMALIGN || SANITIZER_INTERCEPT_PVALLOC
33
35
#include < pthread.h>
34
36
#include < stdio.h>
35
37
#include < sys/socket.h>
38
+ #include < sys/uio.h>
36
39
37
40
using namespace testing ;
38
41
using namespace rtsan_testing ;
@@ -280,23 +283,43 @@ TEST_F(RtsanFileTest, FopenDiesWhenRealtime) {
280
283
ExpectNonRealtimeSurvival (func);
281
284
}
282
285
283
- TEST_F (RtsanFileTest, FreadDiesWhenRealtime) {
284
- auto fd = fopen (GetTemporaryFilePath (), " w" );
285
- auto func = [fd]() {
286
+ class RtsanOpenedFileTest : public RtsanFileTest {
287
+ protected:
288
+ void SetUp () override {
289
+ RtsanFileTest::SetUp ();
290
+ file = fopen (GetTemporaryFilePath (), " w" );
291
+ ASSERT_THAT (file, Ne (nullptr ));
292
+ fd = fileno (file);
293
+ ASSERT_THAT (fd, Ne (-1 ));
294
+ }
295
+
296
+ void TearDown () override {
297
+ if (file != nullptr )
298
+ fclose (file);
299
+ RtsanFileTest::TearDown ();
300
+ }
301
+
302
+ FILE *GetOpenFile () { return file; }
303
+
304
+ int GetOpenFd () { return fd; }
305
+
306
+ private:
307
+ FILE *file = nullptr ;
308
+ int fd = -1 ;
309
+ };
310
+
311
+ TEST_F (RtsanOpenedFileTest, FreadDiesWhenRealtime) {
312
+ auto func = [this ]() {
286
313
char c{};
287
- fread (&c, 1 , 1 , fd );
314
+ fread (&c, 1 , 1 , GetOpenFile () );
288
315
};
289
316
ExpectRealtimeDeath (func, " fread" );
290
317
ExpectNonRealtimeSurvival (func);
291
- if (fd != nullptr )
292
- fclose (fd);
293
318
}
294
319
295
- TEST_F (RtsanFileTest, FwriteDiesWhenRealtime) {
296
- auto fd = fopen (GetTemporaryFilePath (), " w" );
297
- ASSERT_NE (nullptr , fd);
298
- auto message = " Hello, world!" ;
299
- auto func = [&]() { fwrite (&message, 1 , 4 , fd); };
320
+ TEST_F (RtsanOpenedFileTest, FwriteDiesWhenRealtime) {
321
+ const char *message = " Hello, world!" ;
322
+ auto func = [&]() { fwrite (&message, 1 , 4 , GetOpenFile ()); };
300
323
ExpectRealtimeDeath (func, " fwrite" );
301
324
ExpectNonRealtimeSurvival (func);
302
325
}
@@ -315,14 +338,66 @@ TEST(TestRtsanInterceptors, PutsDiesWhenRealtime) {
315
338
ExpectNonRealtimeSurvival (func);
316
339
}
317
340
318
- TEST_F (RtsanFileTest, FputsDiesWhenRealtime) {
319
- auto fd = fopen (GetTemporaryFilePath (), " w" );
320
- ASSERT_THAT (fd, Ne (nullptr )) << errno;
321
- auto func = [fd]() { fputs (" Hello, world!\n " , fd); };
341
+ TEST_F (RtsanOpenedFileTest, FputsDiesWhenRealtime) {
342
+ auto func = [this ]() { fputs (" Hello, world!\n " , GetOpenFile ()); };
322
343
ExpectRealtimeDeath (func);
323
344
ExpectNonRealtimeSurvival (func);
324
- if (fd != nullptr )
325
- fclose (fd);
345
+ }
346
+
347
+ TEST_F (RtsanOpenedFileTest, ReadDiesWhenRealtime) {
348
+ auto Func = [this ]() {
349
+ char c{};
350
+ read (GetOpenFd (), &c, 1 );
351
+ };
352
+ ExpectRealtimeDeath (Func, " read" );
353
+ ExpectNonRealtimeSurvival (Func);
354
+ }
355
+
356
+ TEST_F (RtsanOpenedFileTest, WriteDiesWhenRealtime) {
357
+ auto Func = [this ]() {
358
+ char c = ' a' ;
359
+ write (GetOpenFd (), &c, 1 );
360
+ };
361
+ ExpectRealtimeDeath (Func, " write" );
362
+ ExpectNonRealtimeSurvival (Func);
363
+ }
364
+
365
+ TEST_F (RtsanOpenedFileTest, PreadDiesWhenRealtime) {
366
+ auto Func = [this ]() {
367
+ char c{};
368
+ pread (GetOpenFd (), &c, 1 , 0 );
369
+ };
370
+ ExpectRealtimeDeath (Func, " pread" );
371
+ ExpectNonRealtimeSurvival (Func);
372
+ }
373
+
374
+ TEST_F (RtsanOpenedFileTest, ReadvDiesWhenRealtime) {
375
+ auto Func = [this ]() {
376
+ char c{};
377
+ iovec iov{&c, 1 };
378
+ readv (GetOpenFd (), &iov, 1 );
379
+ };
380
+ ExpectRealtimeDeath (Func, " readv" );
381
+ ExpectNonRealtimeSurvival (Func);
382
+ }
383
+
384
+ TEST_F (RtsanOpenedFileTest, PwriteDiesWhenRealtime) {
385
+ auto Func = [this ]() {
386
+ char c = ' a' ;
387
+ pwrite (GetOpenFd (), &c, 1 , 0 );
388
+ };
389
+ ExpectRealtimeDeath (Func, " pwrite" );
390
+ ExpectNonRealtimeSurvival (Func);
391
+ }
392
+
393
+ TEST_F (RtsanOpenedFileTest, WritevDiesWhenRealtime) {
394
+ auto Func = [this ]() {
395
+ char c = ' a' ;
396
+ iovec iov{&c, 1 };
397
+ writev (GetOpenFd (), &iov, 1 );
398
+ };
399
+ ExpectRealtimeDeath (Func, " writev" );
400
+ ExpectNonRealtimeSurvival (Func);
326
401
}
327
402
328
403
/*
0 commit comments