From 4c504ac53e07a98481da934475f15e84a30e7c30 Mon Sep 17 00:00:00 2001 From: Sam Hocevar Date: Wed, 6 Oct 2010 22:44:47 +0000 Subject: [PATCH] Implement ReOpenFile and fix a few Win32 compilation warnings. --- configure.ac | 2 +- msvc/config.h | 1 + src/common/fd.c | 8 ++++---- src/common/fuzz.c | 4 ++-- src/common/ranges.c | 10 +++++----- src/common/ranges.h | 4 ++-- src/libzzuf/lib-win32.c | 29 ++++++++++++++++++++++++++--- src/libzzuf/libzzuf.c | 5 ++++- 8 files changed, 45 insertions(+), 18 deletions(-) diff --git a/configure.ac b/configure.ac index 0d9fb0e..93d19be 100644 --- a/configure.ac +++ b/configure.ac @@ -54,7 +54,7 @@ AC_CHECK_FUNCS(__getdelim __srefill __filbuf __srget __uflow) AC_CHECK_FUNCS(open64 lseek64 mmap64 fopen64 freopen64 ftello64 fseeko64 fsetpos64) AC_CHECK_FUNCS(__open64 __lseek64 __fopen64 __freopen64 __ftello64 __fseeko64 __fsetpos64) AC_CHECK_FUNCS(__fgets_chk __fgets_unlocked_chk __fread_chk __fread_unlocked_chk __read_chk __recv_chk __recvfrom_chk) -AC_CHECK_FUNCS(CreateFileA CreateFileW ReadFile CloseHandle) +AC_CHECK_FUNCS(CreateFileA CreateFileW ReOpenFile ReadFile CloseHandle) AC_CHECK_TYPES(sighandler_t, [], [], [#define _GNU_SOURCE diff --git a/msvc/config.h b/msvc/config.h index b15bdb4..3874a9c 100644 --- a/msvc/config.h +++ b/msvc/config.h @@ -79,6 +79,7 @@ #define HAVE_RECVFROM 1 /* #undef HAVE_RECVMSG */ /* #undef HAVE_REGEX_H */ +#define HAVE_REOPENFILE 1 /* #undef HAVE_SETENV */ /* #undef HAVE_SETRLIMIT */ /* #undef HAVE_SIGACTION */ diff --git a/src/common/fd.c b/src/common/fd.c index 25b81a0..750047b 100644 --- a/src/common/fd.c +++ b/src/common/fd.c @@ -45,8 +45,8 @@ static int has_include = 0, has_exclude = 0; #endif /* File descriptor cherry picking */ -static int *list = NULL; -static int static_list[512]; +static int64_t *list = NULL; +static int64_t static_list[512]; /* File descriptor stuff. When program is launched, we use the static array of * 32 structures, which ought to be enough for most programs. If it happens @@ -397,8 +397,8 @@ int _zz_getfuzzed(int fd) + files[fds[fd]].already_fuzzed) return 0; - return files[fds[fd]].already_fuzzed + files[fds[fd]].already_pos - - files[fds[fd]].pos; + return (int)(files[fds[fd]].already_fuzzed + files[fds[fd]].already_pos + - files[fds[fd]].pos); } struct fuzz *_zz_getfuzz(int fd) diff --git a/src/common/fuzz.c b/src/common/fuzz.c index 24f06c0..1a06a48 100644 --- a/src/common/fuzz.c +++ b/src/common/fuzz.c @@ -46,8 +46,8 @@ static enum fuzzing fuzzing; /* Per-offset byte protection */ -static int *ranges = NULL; -static int static_ranges[512]; +static int64_t *ranges = NULL; +static int64_t static_ranges[512]; /* Per-value byte protection */ static unsigned char protect[256]; diff --git a/src/common/ranges.c b/src/common/ranges.c index 35d24c3..14058ab 100644 --- a/src/common/ranges.c +++ b/src/common/ranges.c @@ -32,10 +32,10 @@ * If more than 256 slots are required, new memory is allocated, otherwise * the static array static_ranges is used. It is the caller's duty to call * free() if the returned value is not static_ranges. */ -int *_zz_allocrange(char const *list, int *static_ranges) +int64_t *_zz_allocrange(char const *list, int64_t *static_ranges) { char const *parser; - int *ranges; + int64_t *ranges; unsigned int i, chunks; /* Count commas */ @@ -44,7 +44,7 @@ int *_zz_allocrange(char const *list, int *static_ranges) chunks++; if(chunks >= 256) - ranges = malloc((chunks + 1) * 2 * sizeof(unsigned int)); + ranges = malloc((chunks + 1) * 2 * sizeof(int64_t)); else ranges = static_ranges; @@ -69,9 +69,9 @@ int *_zz_allocrange(char const *list, int *static_ranges) return ranges; } -int _zz_isinrange(int value, int const *ranges) +int _zz_isinrange(int64_t value, int64_t const *ranges) { - int const *r; + int64_t const *r; if(!ranges) return 1; diff --git a/src/common/ranges.h b/src/common/ranges.h index 1092f3c..560bbcf 100644 --- a/src/common/ranges.h +++ b/src/common/ranges.h @@ -14,6 +14,6 @@ * ranges.c: range handling helper functions */ -int *_zz_allocrange(char const *, int *); -int _zz_isinrange(int, int const *); +int64_t *_zz_allocrange(char const *, int64_t *); +int _zz_isinrange(int64_t, int64_t const *); diff --git a/src/libzzuf/lib-win32.c b/src/libzzuf/lib-win32.c index 157e902..634c4dd 100644 --- a/src/libzzuf/lib-win32.c +++ b/src/libzzuf/lib-win32.c @@ -27,6 +27,9 @@ #if defined HAVE_WINDOWS_H # include #endif +#if defined HAVE_IO_H +# include +#endif #include "common.h" #include "libzzuf.h" @@ -46,6 +49,10 @@ static HANDLE (__stdcall *ORIG(CreateFileW))(LPCWSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE); #endif +#if defined HAVE_REOPENFILE +static HANDLE (__stdcall *ORIG(ReOpenFile))(HANDLE, DWORD, + DWORD, DWORD); +#endif #if defined HAVE_READFILE static BOOL (__stdcall *ORIG(ReadFile))(HANDLE, LPVOID, DWORD, LPDWORD, LPOVERLAPPED); @@ -68,7 +75,7 @@ HANDLE __stdcall NEW(CreateFileA)(LPCTSTR lpFileName, DWORD dwDesiredAccess, ret = ORIG(CreateFileA)(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile); - debug("CreateFileA(\"%s\", 0x%x, 0x%x, ..., 0x%x, 0x%x, ...) = [%i]", + debug("CreateFileA(\"%s\", 0x%x, 0x%x, {...}, 0x%x, 0x%x, {...}) = %i", lpFileName, dwDesiredAccess, dwShareMode, dwCreationDisposition, dwFlagsAndAttributes, (int)ret); return ret; @@ -85,13 +92,26 @@ HANDLE __stdcall NEW(CreateFileW)(LPCWSTR lpFileName, DWORD dwDesiredAccess, ret = ORIG(CreateFileW)(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile); - debug("CreateFileW(\"%S\", 0x%x, 0x%x, ..., 0x%x, 0x%x, ...) = [%i]", + debug("CreateFileW(\"%S\", 0x%x, 0x%x, {...}, 0x%x, 0x%x, {...}) = %i", lpFileName, dwDesiredAccess, dwShareMode, dwCreationDisposition, dwFlagsAndAttributes, (int)ret); return ret; } #endif +#if defined HAVE_REOPENFILE +HANDLE __stdcall NEW(ReOpenFile)(HANDLE hOriginalFile, DWORD dwDesiredAccess, + DWORD dwShareMode, DWORD dwFlags) +{ + HANDLE ret; + ret = ORIG(ReOpenFile)(hOriginalFile, dwDesiredAccess, + dwShareMode, dwFlags); + debug("ReOpenFile(%i, 0x%x, 0x%x, 0x%x) = %i", (int)hOriginalFile, + dwDesiredAccess, dwShareMode, dwFlags, (int)ret); + return ret; +} +#endif + /* * ReadFile */ @@ -113,7 +133,10 @@ BOOL __stdcall NEW(ReadFile)(HANDLE hFile, LPVOID lpBuffer, #if defined HAVE_CLOSEHANDLE BOOL __stdcall NEW(CloseHandle)(HANDLE hObject) { - return ORIG(CloseHandle)(hObject); + BOOL ret; + ret = ORIG(CloseHandle)(hObject); + debug("CloseHandle(%i) = %i", (int)hObject, ret); + return ret; } #endif diff --git a/src/libzzuf/libzzuf.c b/src/libzzuf/libzzuf.c index 2bd0b53..7ebb23c 100644 --- a/src/libzzuf/libzzuf.c +++ b/src/libzzuf/libzzuf.c @@ -25,6 +25,9 @@ #if defined HAVE_WINDOWS_H # include #endif +#if defined HAVE_IO_H +# include +#endif #if defined HAVE_PROCESS_H # include #endif @@ -117,7 +120,7 @@ void _zz_init(void) tmp = getenv("ZZUF_DEBUGFD"); if(tmp) #if defined _WIN32 - _zz_debugfd = _open_osfhandle((HANDLE)atoi(tmp)); + _zz_debugfd = _open_osfhandle((long)atoi(tmp), 0); #else _zz_debugfd = atoi(tmp); #endif