diff -urN poldek-0.18.8.org/pkgfl.c poldek-0.18.8/pkgfl.c --- poldek-0.18.8.org/pkgfl.c 2004-12-30 13:05:22.000000000 +0100 +++ poldek-0.18.8/pkgfl.c 2005-04-21 22:06:58.126819592 +0200 @@ -530,7 +530,7 @@ tn_buf *nbuf; tn_buf_it nbufi; uint32_t size; - char *buf; + char *buf, dummy; if (fread(&size, sizeof(size), 1, stream) != 1) return NULL; @@ -548,7 +548,7 @@ fl = pkgfl_restore(&nbufi, dirs, include); n_buf_free(nbuf); - fseek(stream, 1, SEEK_CUR); /* skip final '\n' */ + fread(&dummy, 1, 1, stream); /* skip final '\n' */ return fl; } @@ -557,12 +557,18 @@ int pkgfl_skip_f(FILE *stream) { uint32_t size; + char *buf; if (fread(&size, sizeof(size), 1, stream) != 1) return 0; size = ntoh32(size); - fseek(stream, size + 1, SEEK_CUR); + buf = malloc(size + 1); + if (buf) + fread(buf, 1, size + 1, stream); + else + fseek(stream, size + 1, SEEK_CUR); + free(buf); return 1; } diff -urN poldek-0.18.8.org/pkgu.c poldek-0.18.8/pkgu.c --- poldek-0.18.8.org/pkgu.c 2002-05-15 17:42:48.000000000 +0200 +++ poldek-0.18.8/pkgu.c 2005-04-21 22:47:36.188177928 +0200 @@ -180,11 +180,36 @@ void *rawhdr; Header hdr; - if (offset > 0) - if (fseek(stream, offset, SEEK_SET) != 0) { - logn(LOGERR, "pkguinf_restore: fseek %ld: %m", offset); - return NULL; - } + if (offset > 0) { + long currseek = ftell(stream); + char *buf = NULL; + if (currseek == -1) { + logn(LOGERR, "pkguinf_restore: ftell %ld: %m", currseek); + return NULL; + } + if (offset >= currseek) { + currseek = offset - currseek; + if (currseek) { + buf = malloc(currseek); + if (!buf) { + logn(LOGERR, "pkguinf_restore: malloc: %m"); + return NULL; + } + if (fread(buf, 1, currseek, stream) != currseek) { + logn(LOGERR, "pkguinf_restore: fread error currseek: at %ld %p", + ftell(stream), stream); + return NULL; + } + free(buf); + } + } else { + + if (fseek(stream, offset, SEEK_SET) != 0) { + logn(LOGERR, "pkguinf_restore: fseek %ld: %m", offset); + return NULL; + } + } + } if (fread(&nlangs, sizeof(nlangs), 1, stream) != 1) { logn(LOGERR, "pkguinf_restore: read error nlangs (%m) at %ld %p", @@ -239,8 +264,8 @@ { uint16_t nsize, nlangs; - fseek(stream, sizeof(nlangs), SEEK_CUR); - if (fread(&nsize, sizeof(nsize), 1, stream) != 1) { + if ((fread(&nlangs, sizeof(nlangs), 1, stream) != 1) || + (fread(&nsize, sizeof(nsize), 1, stream) != 1)) { nsize = 0; } else { nsize = ntoh16(nsize); diff -urN poldek-0.18.8.org/trurlib/nstream.c poldek-0.18.8/trurlib/nstream.c --- poldek-0.18.8.org/trurlib/nstream.c 2004-05-06 09:57:45.000000000 +0200 +++ poldek-0.18.8/trurlib/nstream.c 2005-04-21 22:04:22.622459848 +0200 @@ -57,8 +57,10 @@ z_off_t rc, off = *offset; rc = gzseek(stream, off, whence); - if (rc >= 0) + if (rc >= 0) { + *offset = rc; rc = 0; + } #if ZLIB_TRACE printf("zfseek (%p, %ld, %lld, %d) = %d\n", stream, off, *offset, whence, rc); #endif @@ -281,7 +283,7 @@ } else { st->stream = stream; - fseek(st->stream, 0, SEEK_SET); /* glibc BUG (?) */ + fseek(st->stream, 0, SEEK_SET); /* XXX glibc BUG (?) */ st->type = type; }; break; diff -urN poldek-0.18.8.org/vfile/vfile.c poldek-0.18.8/vfile/vfile.c --- poldek-0.18.8.org/vfile/vfile.c 2004-02-26 19:22:28.000000000 +0100 +++ poldek-0.18.8/vfile/vfile.c 2005-04-21 22:04:22.630458632 +0200 @@ -129,8 +129,10 @@ z_off_t rc, off = *offset; rc = gzseek(stream, off, whence); - if (rc >= 0) + if (rc >= 0) { + *offset = rc; rc = 0; + } #if ZLIB_TRACE printf("zfseek (%p, %ld, %lld, %d) = %d\n", stream, off, *offset, whence, rc); #endif @@ -344,7 +346,16 @@ vf->vf_stream = fopencookie(gzstream, mode, gzio_cookie); if (vf->vf_stream != NULL) { rc = 1; - fseek(vf->vf_stream, 0, SEEK_SET); /* glibc BUG (?) */ + vf->vf_buf = malloc(128); /* use small buffer to avoid reverse gzseeks on small forward fseeks */ + if(vf->vf_buf == NULL) + vfile_err_fn("buffer malloc failed for %s\n", CL_URL(path)); + else + if(setvbuf(vf->vf_stream, vf->vf_buf, _IOFBF, 128) != 0) { + vfile_err_fn("setvbuf failed for %s\n", CL_URL(path)); + free(vf->vf_buf); + vf->vf_buf = NULL; + } + fseek(vf->vf_stream, 0, SEEK_SET); /* XXX glibc BUG (?) */ } else vfile_err_fn("fopencookie %s: hgw error\n", CL_URL(path)); @@ -484,6 +495,7 @@ vf.vf_type = vftype; vf.vf_mode = vfmode; vf.vf_flags = 0; + vf.vf_buf = NULL; urltype = vf_url_type(path); opened = 0; @@ -681,6 +693,8 @@ free(vf->vf_tmpath); vf->vf_tmpath = NULL; } + if (vf->vf_buf) + free(vf->vf_buf); memset(vf, 0, sizeof(*vf)); free(vf); } diff -urN poldek-0.18.8.org/vfile/vfile.h poldek-0.18.8/vfile/vfile.h --- poldek-0.18.8.org/vfile/vfile.h 2004-06-08 15:57:03.000000000 +0200 +++ poldek-0.18.8/vfile/vfile.h 2005-04-21 22:04:22.634458024 +0200 @@ -81,6 +81,7 @@ char *vf_path; char *vf_tmpath; + char *vf_buf; int16_t _refcnt; };