* Added a _zz_disabled flag. This is needed on OS X where we protect the
fopen_orig() call because it will call our own diverted open() function
and we don't want it to fiddle with our structures.
This commit is contained in:
@@ -39,6 +39,7 @@
|
||||
|
||||
/* Global variables */
|
||||
int _zz_ready = 0;
|
||||
int _zz_disabled = 0;
|
||||
int _zz_hasdebug = 0;
|
||||
float _zz_ratio = 0.004f;
|
||||
int _zz_seed = 0;
|
||||
|
||||
@@ -33,6 +33,7 @@ struct fuzz
|
||||
|
||||
/* Internal variables */
|
||||
extern int _zz_ready;
|
||||
extern int _zz_disabled;
|
||||
extern int _zz_hasdebug;
|
||||
extern float _zz_ratio;
|
||||
extern int _zz_seed;
|
||||
|
||||
+4
-4
@@ -85,7 +85,7 @@ void _zz_load_fd(void)
|
||||
{ \
|
||||
ret = ORIG(fn)(file, oflag); \
|
||||
} \
|
||||
if(!_zz_ready) \
|
||||
if(!_zz_ready || _zz_disabled) \
|
||||
return ret; \
|
||||
if(ret >= 0 \
|
||||
&& ((oflag & (O_RDONLY | O_RDWR | O_WRONLY)) != O_WRONLY) \
|
||||
@@ -119,7 +119,7 @@ ssize_t read(int fd, void *buf, size_t count)
|
||||
if(!_zz_ready)
|
||||
LOADSYM(read);
|
||||
ret = read_orig(fd, buf, count);
|
||||
if(!_zz_ready || !_zz_iswatched(fd))
|
||||
if(!_zz_ready || !_zz_iswatched(fd) || _zz_disabled)
|
||||
return ret;
|
||||
|
||||
debug("read(%i, %p, %li) = %i", fd, buf, (long int)count, ret);
|
||||
@@ -145,7 +145,7 @@ ssize_t read(int fd, void *buf, size_t count)
|
||||
if(!_zz_ready) \
|
||||
LOADSYM(fn); \
|
||||
ret = ORIG(fn)(fd, offset, whence); \
|
||||
if(!_zz_ready || !_zz_iswatched(fd)) \
|
||||
if(!_zz_ready || !_zz_iswatched(fd) || _zz_disabled) \
|
||||
return ret; \
|
||||
debug(STR(fn)"(%i, %lli, %i) = %lli", \
|
||||
fd, (long long int)offset, whence, (long long int)ret); \
|
||||
@@ -181,7 +181,7 @@ int close(int fd)
|
||||
return 0;
|
||||
|
||||
ret = close_orig(fd);
|
||||
if(!_zz_ready || !_zz_iswatched(fd))
|
||||
if(!_zz_ready || !_zz_iswatched(fd) || _zz_disabled)
|
||||
return ret;
|
||||
|
||||
debug("close(%i) = %i", fd, ret);
|
||||
|
||||
+17
-1
@@ -95,7 +95,9 @@ void _zz_load_stream(void)
|
||||
LOADSYM(fn); \
|
||||
return ORIG(fn)(path, mode); \
|
||||
} \
|
||||
_zz_disabled = 1; \
|
||||
ret = ORIG(fn)(path, mode); \
|
||||
_zz_disabled = 0; \
|
||||
if(ret && _zz_mustwatch(path)) \
|
||||
{ \
|
||||
int fd = fileno(ret); \
|
||||
@@ -126,7 +128,9 @@ int fseek(FILE *stream, long offset, int whence)
|
||||
if(!_zz_ready || !_zz_iswatched(fd))
|
||||
return fseek_orig(stream, offset, whence);
|
||||
|
||||
_zz_disabled = 1;
|
||||
ret = fseek_orig(stream, offset, whence);
|
||||
_zz_disabled = 0;
|
||||
debug("fseek([%i], %li, %i) = %i", fd, offset, whence, ret);
|
||||
if(ret != 0)
|
||||
return ret;
|
||||
@@ -159,7 +163,9 @@ size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
|
||||
return fread_orig(ptr, size, nmemb, stream);
|
||||
|
||||
pos = ftell(stream);
|
||||
_zz_disabled = 1;
|
||||
ret = fread_orig(ptr, size, nmemb, stream);
|
||||
_zz_disabled = 0;
|
||||
debug("fread(%p, %li, %li, [%i]) = %li",
|
||||
ptr, (long int)size, (long int)nmemb, fd, (long int)ret);
|
||||
if(ret >= 0)
|
||||
@@ -184,7 +190,9 @@ size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
|
||||
fd = fileno(stream); \
|
||||
if(!_zz_ready || !_zz_iswatched(fd)) \
|
||||
return ORIG(fn)(stream); \
|
||||
_zz_disabled = 1; \
|
||||
ret = ORIG(fn)(stream); \
|
||||
_zz_disabled = 0; \
|
||||
if(ret != EOF) \
|
||||
{ \
|
||||
uint8_t ch = ret; \
|
||||
@@ -227,7 +235,11 @@ char *fgets(char *s, int size, FILE *stream)
|
||||
{
|
||||
for(i = 0; i < size - 1; i++)
|
||||
{
|
||||
int ch = fgetc_orig(stream);
|
||||
int ch;
|
||||
|
||||
_zz_disabled = 1;
|
||||
ch = fgetc_orig(stream);
|
||||
_zz_disabled = 0;
|
||||
|
||||
if(ch == EOF)
|
||||
{
|
||||
@@ -286,7 +298,9 @@ int fclose(FILE *fp)
|
||||
if(!_zz_ready || !_zz_iswatched(fd))
|
||||
return fclose_orig(fp);
|
||||
|
||||
_zz_disabled = 1;
|
||||
ret = fclose_orig(fp);
|
||||
_zz_disabled = 0;
|
||||
debug("fclose([%i]) = %i", fd, ret);
|
||||
_zz_unregister(fd);
|
||||
|
||||
@@ -318,7 +332,9 @@ int fclose(FILE *fp)
|
||||
*lineptr = line; \
|
||||
break; \
|
||||
} \
|
||||
_zz_disabled = 1; \
|
||||
ch = fgetc_orig(stream); \
|
||||
_zz_disabled = 0; \
|
||||
if(ch == EOF) \
|
||||
{ \
|
||||
finished = 1; \
|
||||
|
||||
Reference in New Issue
Block a user