* Hack around to get HP-UX tools to work. It still fails the most nasty

zzcat test, though. But a more massive redesign is probably necessary.
This commit is contained in:
Sam Hocevar 2008-07-23 23:40:13 +00:00 committed by sam
parent 93cca9a5c1
commit 4fced1a352
3 changed files with 83 additions and 13 deletions

View File

@ -59,8 +59,8 @@ static int static_list[512];
#define STATIC_FILES 32
static struct files
{
int managed, locked, active;
int64_t pos;
int managed, locked, active, already_fuzzed;
int64_t pos, already_pos;
/* Public stuff */
struct fuzz fuzz;
}
@ -385,6 +385,36 @@ void _zz_addpos(int fd, int64_t off)
files[fds[fd]].pos += off;
}
void _zz_setfuzzed(int fd, int count)
{
if(fd < 0 || fd >= maxfd || fds[fd] == -1)
return;
/* FIXME: what if we just slightly advanced? */
if(files[fds[fd]].pos == files[fds[fd]].already_pos
&& count <= files[fds[fd]].already_fuzzed)
return;
files[fds[fd]].already_pos = files[fds[fd]].pos;
files[fds[fd]].already_fuzzed = count;
}
int _zz_getfuzzed(int fd)
{
if(fd < 0 || fd >= maxfd || fds[fd] == -1)
return 0;
if(files[fds[fd]].pos < files[fds[fd]].already_pos)
return 0;
if(files[fds[fd]].pos >= files[fds[fd]].already_pos
+ files[fds[fd]].already_fuzzed)
return 0;
return files[fds[fd]].already_fuzzed + files[fds[fd]].already_pos
- files[fds[fd]].pos;
}
struct fuzz *_zz_getfuzz(int fd)
{
if(fd < 0 || fd >= maxfd || fds[fd] == -1)

View File

@ -37,5 +37,8 @@ extern int _zz_isactive(int);
extern int64_t _zz_getpos(int);
extern void _zz_setpos(int, int64_t);
extern void _zz_addpos(int, int64_t);
extern void _zz_setfuzzed(int, int);
extern int _zz_getfuzzed(int);
extern struct fuzz *_zz_getfuzz(int);

View File

@ -358,6 +358,20 @@ void NEW(rewind)(FILE *stream)
#endif
}
#if defined HAVE___FILBUF || defined HAVE___SRGET
# define FREAD_PREFUZZ() \
do \
{ \
int64_t tmp = _zz_getpos(fd); \
_zz_setpos(fd, pos); \
already_fuzzed = _zz_getfuzzed(fd); \
_zz_setpos(fd, tmp); \
} \
while(0)
#else
# define FREAD_PREFUZZ() do {} while(0)
#endif
#if defined REFILL_ONLY_STDIO /* Don't fuzz or seek if we have __srefill() */
# define FREAD_FUZZ() \
do \
@ -382,8 +396,12 @@ void NEW(rewind)(FILE *stream)
if(newpos != pos) \
{ \
char *b = ptr; \
_zz_setpos(fd, pos); \
_zz_fuzz(fd, ptr, newpos - pos); \
/* Skip bytes that were already fuzzed by __filbuf or __srget */ \
if(newpos > pos + already_fuzzed) \
{ \
_zz_setpos(fd, pos + already_fuzzed); \
_zz_fuzz(fd, ptr, newpos - pos - already_fuzzed); \
} \
_zz_setpos(fd, newpos); \
if(newpos >= pos + 4) \
debug("%s(%p, %li, %li, [%i]) = %li \"%c%c%c%c...", __func__, \
@ -404,7 +422,7 @@ void NEW(rewind)(FILE *stream)
do \
{ \
int64_t pos; \
int fd; \
int fd, already_fuzzed = 0; \
LOADSYM(fn); \
fd = fileno(stream); \
if(!_zz_ready || !_zz_iswatched(fd) || !_zz_isactive(fd)) \
@ -413,6 +431,7 @@ void NEW(rewind)(FILE *stream)
_zz_lock(fd); \
ret = ORIG(fn)(ptr, size, nmemb, stream); \
_zz_unlock(fd); \
FREAD_PREFUZZ(); \
FREAD_FUZZ(); \
} while(0)
@ -429,6 +448,12 @@ size_t NEW(fread_unlocked)(void *ptr, size_t size, size_t nmemb, FILE *stream)
}
#endif
#if defined HAVE___FILBUF || defined HAVE___SRGET
# define FGETC_PREFUZZ already_fuzzed = _zz_getfuzzed(fd);
#else
# define FGETC_PREFUZZ
#endif
#if defined REFILL_ONLY_STDIO /* Don't fuzz or seek if we have __srefill() */
# define FGETC_FUZZ
#else
@ -436,7 +461,8 @@ size_t NEW(fread_unlocked)(void *ptr, size_t size, size_t nmemb, FILE *stream)
if(ret != EOF) \
{ \
uint8_t ch = ret; \
_zz_fuzz(fd, &ch, 1); \
if(already_fuzzed <= 0) \
_zz_fuzz(fd, &ch, 1); \
_zz_addpos(fd, 1); \
ret = ch; \
}
@ -444,7 +470,7 @@ size_t NEW(fread_unlocked)(void *ptr, size_t size, size_t nmemb, FILE *stream)
#define FGETC(fn, s, arg) \
do { \
int fd; \
int fd, already_fuzzed = 0; \
LOADSYM(fn); \
fd = fileno(s); \
if(!_zz_ready || !_zz_iswatched(fd) || !_zz_isactive(fd)) \
@ -452,6 +478,7 @@ size_t NEW(fread_unlocked)(void *ptr, size_t size, size_t nmemb, FILE *stream)
_zz_lock(fd); \
ret = ORIG(fn)(arg); \
_zz_unlock(fd); \
FGETC_PREFUZZ \
FGETC_FUZZ \
if(ret == EOF) \
debug("%s([%i]) = EOF", __func__, fd); \
@ -758,37 +785,47 @@ char *NEW(fgetln)(FILE *stream, size_t *len)
#define REFILL(fn, fn_advances) \
do \
{ \
int64_t pos; \
off_t newpos; \
int fd; \
LOADSYM(fn); \
fd = fileno(fp); \
if(!_zz_ready || !_zz_iswatched(fd) || !_zz_isactive(fd)) \
return ORIG(fn)(fp); \
pos = _zz_getpos(fd); \
_zz_lock(fd); \
ret = ORIG(fn)(fp); \
newpos = lseek(fd, 0, SEEK_CUR); \
_zz_unlock(fd); \
if(ret != EOF) \
{ \
int already_fuzzed = 0; \
if(fn_advances) \
{ \
uint8_t ch = (uint8_t)(unsigned int)ret; \
if(newpos != -1) \
_zz_setpos(fd, newpos - fp->FILE_CNT - 1); \
uint8_t ch = (uint8_t)(unsigned int)ret; \
already_fuzzed = _zz_getfuzzed(fd); \
_zz_fuzz(fd, &ch, 1); \
ret = ch; \
ret = fp->FILE_PTR[-1] = ch; \
_zz_setfuzzed(fd, fp->FILE_CNT + 1); \
_zz_addpos(fd, 1); \
} \
else \
{ \
_zz_setfuzzed(fd, fp->FILE_CNT); \
if(newpos != -1) \
_zz_setpos(fd, newpos - fp->FILE_CNT); \
} \
_zz_fuzz(fd, fp->FILE_PTR, fp->FILE_CNT); \
_zz_addpos(fd, fp->FILE_CNT); \
if(fp->FILE_CNT > already_fuzzed) \
{ \
_zz_addpos(fd, already_fuzzed); \
_zz_fuzz(fd, fp->FILE_PTR, fp->FILE_CNT - already_fuzzed); \
} \
_zz_addpos(fd, fp->FILE_CNT - already_fuzzed); \
} \
if(!_zz_islocked(fd)) \
debug("%s([%i]) = %i", __func__, fd, ret); \
_zz_setpos(fd, pos); /* FIXME: do we always need to do this? */ \
debug("%s([%i]) = %i", __func__, fd, ret); \
} \
while(0)