46
46
#include <signal.h>
47
47
#include <fcntl.h>
48
48
#include <limits.h>
49
+ #include <poll.h>
49
50
#include <sys/time.h>
50
51
#include <sys/wait.h>
51
52
#include <sys/resource.h>
52
- #include <sys/select.h>
53
53
#include <sys/stat.h>
54
54
#include <grp.h>
55
55
@@ -400,31 +400,28 @@ void afl_fsrv_setup_preload(afl_forkserver_t *fsrv, char *argv0) {
400
400
401
401
}
402
402
403
- /* Wrapper for select () and read(), reading a 32 bit var.
403
+ /* Wrapper for poll () and read(), reading a 32 bit var.
404
404
Returns the time passed to read.
405
405
If the wait times out, returns timeout_ms + 1;
406
406
Returns 0 if an error occurred (fd closed, signal, ...); */
407
407
static u32 __attribute__((hot )) read_s32_timed (s32 fd , s32 * buf , u32 timeout_ms ,
408
408
volatile u8 * stop_soon_p ) {
409
409
410
- fd_set readfds ;
411
- FD_ZERO (& readfds );
412
- FD_SET (fd , & readfds );
413
- struct timeval timeout ;
414
- int sret ;
415
- ssize_t len_read ;
410
+ int pret ;
411
+ ssize_t len_read ;
412
+ struct pollfd fds [1 ];
413
+ int nfds = 1 ;
416
414
417
- timeout .tv_sec = (timeout_ms / 1000 );
418
- timeout .tv_usec = (timeout_ms % 1000 ) * 1000 ;
419
- #if !defined(__linux__ )
420
415
u32 read_start = get_cur_time_us ();
421
- #endif
422
416
423
- /* set exceptfds as well to return when a child exited/closed the pipe. */
424
- restart_select :
425
- sret = select ( fd + 1 , & readfds , NULL , NULL , & timeout ) ;
417
+ memset ( & fds , 0 , sizeof ( fds ));
418
+ fds [ 0 ]. fd = fd ;
419
+ fds [ 0 ]. events = POLLIN ;
426
420
427
- if (likely (sret > 0 )) {
421
+ /* set exceptfds as well to return when a child exited/closed the pipe. */
422
+ restart_poll :
423
+ pret = poll (fds , nfds , timeout_ms );
424
+ if (likely (pret > 0 )) {
428
425
429
426
restart_read :
430
427
if (* stop_soon_p ) {
@@ -438,13 +435,7 @@ static u32 __attribute__((hot)) read_s32_timed(s32 fd, s32 *buf, u32 timeout_ms,
438
435
439
436
if (likely (len_read == 4 )) { // for speed we put this first
440
437
441
- #if defined(__linux__ )
442
- u32 exec_ms = MIN (
443
- timeout_ms ,
444
- ((u64 )timeout_ms - (timeout .tv_sec * 1000 + timeout .tv_usec / 1000 )));
445
- #else
446
438
u32 exec_ms = MIN (timeout_ms , (get_cur_time_us () - read_start ) / 1000 );
447
- #endif
448
439
449
440
// ensure to report 1 ms has passed (0 is an error)
450
441
return exec_ms > 0 ? exec_ms : 1 ;
@@ -459,14 +450,14 @@ static u32 __attribute__((hot)) read_s32_timed(s32 fd, s32 *buf, u32 timeout_ms,
459
450
460
451
}
461
452
462
- } else if (unlikely (!sret )) {
453
+ } else if (unlikely (!pret )) {
463
454
464
455
* buf = -1 ;
465
456
return timeout_ms + 1 ;
466
457
467
- } else if (unlikely (sret < 0 )) {
458
+ } else if (unlikely (pret < 0 )) {
468
459
469
- if (likely (errno == EINTR )) goto restart_select ;
460
+ if (likely (errno == EINTR )) goto restart_poll ;
470
461
471
462
* buf = -1 ;
472
463
return 0 ;
0 commit comments