diff --git a/src/libzzuf.c b/src/libzzuf.c index ad837ec..cc024e4 100644 --- a/src/libzzuf.c +++ b/src/libzzuf.c @@ -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; diff --git a/src/libzzuf.h b/src/libzzuf.h index c029c8b..6d3ab7d 100644 --- a/src/libzzuf.h +++ b/src/libzzuf.h @@ -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; diff --git a/src/load-fd.c b/src/load-fd.c index 9b6e2dc..0f8e31f 100644 --- a/src/load-fd.c +++ b/src/load-fd.c @@ -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); diff --git a/src/load-stream.c b/src/load-stream.c index 6641c14..8dd7bf0 100644 --- a/src/load-stream.c +++ b/src/load-stream.c @@ -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; \