From 21cb0847127aeac54d664a84e33de4927ff7a39e Mon Sep 17 00:00:00 2001 From: Sam Hocevar Date: Fri, 16 Jan 2015 03:14:03 +0100 Subject: [PATCH] misc: factor several common tests into one must_fuzz_fd() function. --- src/common/fd.h | 2 ++ src/libzzuf/lib-fd.c | 25 +++++++++++-------------- src/libzzuf/lib-mem.c | 9 ++++----- src/libzzuf/lib-stream.c | 37 +++++++++++++++++-------------------- src/libzzuf/lib-win32.c | 10 +++++----- src/libzzuf/libzzuf.h | 11 +++++++++++ 6 files changed, 50 insertions(+), 44 deletions(-) diff --git a/src/common/fd.h b/src/common/fd.h index 9dbba48..c7fc373 100644 --- a/src/common/fd.h +++ b/src/common/fd.h @@ -11,6 +11,8 @@ * See http://www.wtfpl.net/ for more details. */ +#pragma once + /* * fd.h: file descriptor functions */ diff --git a/src/libzzuf/lib-fd.c b/src/libzzuf/lib-fd.c index 1523d57..747ed10 100644 --- a/src/libzzuf/lib-fd.c +++ b/src/libzzuf/lib-fd.c @@ -378,9 +378,9 @@ int NEW(socket)(int domain, int type, int protocol) LOADSYM(myrecv); \ \ ret = ORIG(myrecv) myargs; \ - if (!_zz_ready || !_zz_iswatched(s) || !_zz_hostwatched(s) \ - || _zz_islocked(s) || !_zz_isactive(s)) \ + if (!must_fuzz_fd(s) || !_zz_hostwatched(s)) \ return ret; \ + \ if (ret > 0) \ { \ char *b = buf; \ @@ -421,9 +421,9 @@ RECV_T NEW(__recv_chk)(int s, void *buf, size_t len, size_t buflen, int flags) LOADSYM(myrecvfrom); \ \ ret = ORIG(myrecvfrom) myargs; \ - if (!_zz_ready || !_zz_iswatched(s) || !_zz_hostwatched(s) \ - || _zz_islocked(s) || !_zz_isactive(s)) \ + if (!must_fuzz_fd(s) || !_zz_hostwatched(s)) \ return ret; \ + \ if (ret > 0) \ { \ char tmp[128]; \ @@ -477,8 +477,7 @@ RECV_T NEW(recvmsg)(int s, struct msghdr *hdr, int flags) LOADSYM(recvmsg); ssize_t ret = ORIG(recvmsg)(s, hdr, flags); - if (!_zz_ready || !_zz_iswatched(s) || !_zz_hostwatched(s) - || _zz_islocked(s) || !_zz_isactive(s)) + if (!must_fuzz_fd(s) || !_zz_hostwatched(s)) return ret; fuzz_iovec(s, hdr->msg_iov, ret); @@ -494,9 +493,9 @@ RECV_T NEW(recvmsg)(int s, struct msghdr *hdr, int flags) LOADSYM(myread); \ \ ret = ORIG(myread) myargs; \ - if (!_zz_ready || !_zz_iswatched(fd) || !_zz_hostwatched(fd) \ - || _zz_islocked(fd) || !_zz_isactive(fd)) \ + if (!must_fuzz_fd(fd) || !_zz_hostwatched(fd)) \ return ret; \ + \ if (ret > 0) \ { \ char *b = buf; \ @@ -544,8 +543,7 @@ ssize_t NEW(readv)(int fd, const struct iovec *iov, int count) LOADSYM(readv); ssize_t ret = ORIG(readv)(fd, iov, count); - if (!_zz_ready || !_zz_iswatched(fd) || _zz_islocked(fd) - || !_zz_isactive(fd)) + if (!must_fuzz_fd(fd)) return ret; fuzz_iovec(fd, iov, ret); @@ -563,8 +561,7 @@ ssize_t NEW(pread)(int fd, void *buf, size_t count, off_t offset) LOADSYM(pread); int ret = ORIG(pread)(fd, buf, count, offset); - if (!_zz_ready || !_zz_iswatched(fd) || _zz_islocked(fd) - || !_zz_isactive(fd)) + if (!must_fuzz_fd(fd)) return ret; if (ret > 0) @@ -598,9 +595,9 @@ ssize_t NEW(pread)(int fd, void *buf, size_t count, off_t offset) LOADSYM(mylseek); \ \ ret = ORIG(mylseek)(fd, offset, whence); \ - if (!_zz_ready || !_zz_iswatched(fd) || _zz_islocked(fd) \ - || !_zz_isactive(fd)) \ + if (!must_fuzz_fd(fd)) \ return ret; \ + \ debug("%s(%i, %lli, %i) = %lli", __func__, fd, \ (long long int)offset, whence, (long long int)ret); \ if (ret != (off_t)-1) \ diff --git a/src/libzzuf/lib-mem.c b/src/libzzuf/lib-mem.c index 2c1286e..e1a890d 100644 --- a/src/libzzuf/lib-mem.c +++ b/src/libzzuf/lib-mem.c @@ -298,10 +298,10 @@ int nbmaps = 0; do { \ LOADSYM(mymmap); \ \ - char *b = MAP_FAILED; \ - if (!_zz_ready || !_zz_iswatched(fd) || _zz_islocked(fd) \ - || !_zz_isactive(fd)) \ + if (!must_fuzz_fd(fd)) \ return ORIG(mymmap)(start, length, prot, flags, fd, offset); \ + \ + char *b = MAP_FAILED; \ ret = ORIG(mymmap)(NULL, length, prot, flags, fd, offset); \ if (ret != MAP_FAILED && length) \ { \ @@ -396,8 +396,7 @@ kern_return_t NEW(map_fd)(int fd, vm_offset_t offset, vm_offset_t *addr, LOADSYM(map_fd); kern_return_t ret = ORIG(map_fd)(fd, offset, addr, find_space, numbytes); - if (!_zz_ready || !_zz_iswatched(fd) || _zz_islocked(fd) - || !_zz_isactive(fd)) + if (!must_fuzz_fd(fd)) return ret; if (ret == 0 && numbytes) diff --git a/src/libzzuf/lib-stream.c b/src/libzzuf/lib-stream.c index d53ab13..c030297 100644 --- a/src/libzzuf/lib-stream.c +++ b/src/libzzuf/lib-stream.c @@ -368,9 +368,9 @@ FILE *NEW(__freopen64)(const char *path, const char *mode, FILE *stream) LOADSYM(myfseek); \ \ int fd = fileno(stream); \ - if (!_zz_ready || !_zz_iswatched(fd) || !_zz_isactive(fd) \ - || _zz_islocked(fd)) \ + if (!must_fuzz_fd(fd)) \ return ORIG(myfseek)(stream, offset, whence); \ + \ debug_stream("before", stream); \ /* FIXME: ftell() will return -1 on a pipe such as stdin */ \ int64_t oldpos = ZZ_FTELL(stream); \ @@ -404,9 +404,9 @@ FILE *NEW(__freopen64)(const char *path, const char *mode, FILE *stream) LOADSYM(myfsetpos); \ \ int fd = fileno(stream); \ - if (!_zz_ready || !_zz_iswatched(fd) || !_zz_isactive(fd) \ - || _zz_islocked(fd)) \ + if (!must_fuzz_fd(fd)) \ return ORIG(myfsetpos)(stream, pos); \ + \ debug_stream("before", stream); \ /* FIXME: ftell() will return -1 on a pipe such as stdin */ \ int64_t oldpos = ZZ_FTELL(stream); \ @@ -435,8 +435,7 @@ FILE *NEW(__freopen64)(const char *path, const char *mode, FILE *stream) LOADSYM(rewind); \ \ int fd = fileno(stream); \ - if (!_zz_ready || !_zz_iswatched(fd) || !_zz_isactive(fd) \ - || _zz_islocked(fd)) \ + if (!must_fuzz_fd(fd)) \ { \ ORIG(rewind)(stream); \ return; \ @@ -529,9 +528,9 @@ void NEW(rewind)(FILE *stream) \ uint8_t *b = (uint8_t *)ptr; \ int fd = fileno(stream); \ - if (!_zz_ready || !_zz_iswatched(fd) || !_zz_isactive(fd) \ - || _zz_islocked(fd)) \ + if (!must_fuzz_fd(fd)) \ return ORIG(myfread) myargs; \ + \ debug_stream("before", stream); \ /* FIXME: ftell() will return -1 on a pipe such as stdin */ \ int64_t oldpos = ZZ_FTELL(stream); \ @@ -617,9 +616,9 @@ size_t NEW(__fread_unlocked_chk)(void *ptr, size_t ptrlen, size_t size, LOADSYM(myfgetc); \ \ int fd = fileno(s); \ - if (!_zz_ready || !_zz_iswatched(fd) || !_zz_isactive(fd) \ - || _zz_islocked(fd)) \ + if (!must_fuzz_fd(fd)) \ return ORIG(myfgetc)(arg); \ + \ debug_stream("before", s); \ int64_t oldpos = ZZ_FTELL(s); \ int oldcnt = get_stream_cnt(s); \ @@ -712,9 +711,9 @@ int NEW(fgetc_unlocked)(FILE *stream) \ ret = s; \ int fd = fileno(stream); \ - if (!_zz_ready || !_zz_iswatched(fd) || !_zz_isactive(fd) \ - || _zz_islocked(fd)) \ + if (!must_fuzz_fd(fd)) \ return ORIG(myfgets) myargs; \ + \ debug_stream("before", stream); \ int64_t oldpos = ZZ_FTELL(stream); \ int oldcnt = get_stream_cnt(stream); \ @@ -815,8 +814,7 @@ int NEW(ungetc)(int c, FILE *stream) LOADSYM(ungetc); int fd = fileno(stream); - if (!_zz_ready || !_zz_iswatched(fd) || !_zz_isactive(fd) - || _zz_islocked(fd)) + if (!must_fuzz_fd(fd)) return ORIG(ungetc)(c, stream); debug_stream("before", stream); @@ -868,9 +866,9 @@ int NEW(fclose)(FILE *fp) LOADSYM(fgetc); \ \ int fd = fileno(stream); \ - if (!_zz_ready || !_zz_iswatched(fd) || !_zz_isactive(fd) \ - || _zz_islocked(fd)) \ + if (!must_fuzz_fd(fd)) \ return ORIG(getdelim)(lineptr, n, delim, stream); \ + \ debug_stream("before", stream); \ int64_t oldpos = ZZ_FTELL(stream); \ int oldcnt = get_stream_cnt(stream); \ @@ -976,8 +974,7 @@ char *NEW(fgetln)(FILE *stream, size_t *len) LOADSYM(fgetc); int fd = fileno(stream); - if (!_zz_ready || !_zz_iswatched(fd) || !_zz_isactive(fd) - || _zz_islocked(fd)) + if (!must_fuzz_fd(fd)) return ORIG(fgetln)(stream, len); debug_stream("before", stream); @@ -1052,9 +1049,9 @@ char *NEW(fgetln)(FILE *stream, size_t *len) LOADSYM(myrefill); \ \ int fd = fileno(fp); \ - if (!_zz_ready || !_zz_iswatched(fd) || !_zz_isactive(fd) \ - || _zz_islocked(fd)) \ + if (!must_fuzz_fd(fd)) \ return ORIG(myrefill)(fp); \ + \ debug_stream("before", fp); \ int64_t pos = _zz_getpos(fd); \ _zz_lockfd(fd); \ diff --git a/src/libzzuf/lib-win32.c b/src/libzzuf/lib-win32.c index fd3ecdd..9a33ecc 100644 --- a/src/libzzuf/lib-win32.c +++ b/src/libzzuf/lib-win32.c @@ -192,7 +192,7 @@ BOOL __stdcall NEW(ReadFile)(HANDLE hFile, LPVOID lpBuffer, debug("ReadFile(%#08x, %p, %#08x, %#08x, %p) = %s", hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped, (ret ? "TRUE" : "FALSE")); - if (!_zz_ready || !_zz_iswatched(hFile) /*|| !_zz_hostwatched(hFile)*/ || _zz_islocked(hFile) || !_zz_isactive(hFile)) + if (!must_fuzz_fd(hFile) /*|| !_zz_hostwatched(hFile)*/) return ret; if (ret) @@ -219,7 +219,7 @@ BOOL __stdcall NEW(ReadFileEx)(HANDLE hFile, LPVOID lpBuffer, debug("ReadFileEx(%#08x, %p, %#08x, %p, %p, %p) = %s", hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped, lpCompletionRoutine, (ret ? "TRUE" : "FALSE")); - if (!_zz_ready || !_zz_iswatched(hFile) /*|| !_zz_hostwatched(hFile)*/ || _zz_islocked(hFile) || !_zz_isactive(hFile)) + if (!must_fuzz_fd(hFile) /*|| !_zz_hostwatched(hFile)*/) return ret; if (ret) @@ -245,7 +245,7 @@ HANDLE __stdcall NEW(CreateIoCompletionPort)(HANDLE FileHandle, HANDLE ExistingC FileHandle, ExistingCompletionPort, CompletionKey, NumberOfConcurrentThreads, ret); - if (!_zz_ready || !_zz_iswatched(FileHandle) /*|| !_zz_hostwatched(hFile)*/ || _zz_islocked(FileHandle) || !_zz_isactive(FileHandle)) + if (!must_fuzz_fd(FileHandle) /*|| !_zz_hostwatched(FileHandle)*/) return ret; if (ret != NULL) @@ -302,7 +302,7 @@ HANDLE __stdcall NEW(CreateFileMappingA)(HANDLE hFile, LPSECURITY_ATTRIBUTES lpA if (ret == NULL) return ret; - if (!_zz_ready || !_zz_iswatched(hFile) /*|| !_zz_hostwatched(hFile)*/ || _zz_islocked(hFile) || !_zz_isactive(hFile) || _zz_islocked(-1)) + if (!must_fuzz_fd(hFile) /*|| !_zz_hostwatched(hFile)*/ || _zz_islocked(-1)) return ret; debug("handle %#08x is registered", ret); @@ -328,7 +328,7 @@ HANDLE __stdcall NEW(CreateFileMappingW)(HANDLE hFile, LPSECURITY_ATTRIBUTES lpA if (ret == NULL) return ret; - if (!_zz_ready || !_zz_iswatched(hFile) /*|| !_zz_hostwatched(hFile)*/ || _zz_islocked(hFile) || !_zz_isactive(hFile) || _zz_islocked(-1)) + if (!must_fuzz_fd(hFile) /*|| !_zz_hostwatched(hFile)*/ || _zz_islocked(-1)) return ret; debug("handle %#08x is registered", ret); diff --git a/src/libzzuf/libzzuf.h b/src/libzzuf/libzzuf.h index d53fd27..75a89f1 100644 --- a/src/libzzuf/libzzuf.h +++ b/src/libzzuf/libzzuf.h @@ -10,10 +10,14 @@ * See http://www.wtfpl.net/ for more details. */ +#pragma once + /* * libzzuf.h: preloaded wrapper library */ +#include "fd.h" + /* Internal variables */ extern int _zz_ready; extern int _zz_disabled; @@ -40,3 +44,10 @@ extern void _zz_mem_init(void); # include extern CRITICAL_SECTION _zz_pipe_cs; #endif + +static inline int must_fuzz_fd(int fd) +{ + return _zz_ready && _zz_iswatched(fd) + && !_zz_islocked(fd) && _zz_isactive(fd); +} +