diff --git a/libzio-1.00.dif b/libzio-1.00.dif new file mode 100644 index 0000000..325f42e --- /dev/null +++ b/libzio-1.00.dif @@ -0,0 +1,458 @@ +--- zio.c ++++ zio.c 2013-02-26 16:40:47.165444637 +0000 +@@ -42,6 +42,7 @@ static zio_int_t zseek(void *cookie, zio + errno = EINVAL; + return -1; + } ++ off_t offset = (off_t)*poffset; + return (zio_int_t)gzseek((gzFile)cookie, (z_off_t)(*poffset), whence); + } + +@@ -74,8 +75,9 @@ static cookie_io_functions_t ioz = { + # endif + + typedef struct bzfile_s { +- size_t total_out; ++ size_t position; + BZFILE *file; ++ FILE *stdio; + char *mode; + char *path; + int fd; +@@ -90,7 +92,7 @@ static ssize_t bzread(void *cookie, ch + if (bzf->file) + len = (ssize_t)BZ2_bzread(bzf->file, (void*)buf, count); + if (len > 0) +- bzf->total_out += len; ++ bzf->position += len; + out: + if (len < 0) + errno = EINVAL; +@@ -104,9 +106,9 @@ static ssize_t bzwrite(void *cookie, c + if (!bzf) + goto out; + if (bzf->file) +- len = (ssize_t)BZ2_bzread(bzf->file, (void*)buf, count); ++ len = (ssize_t)BZ2_bzwrite(bzf->file, (void*)buf, count); + if (len > 0) +- bzf->total_out += len; ++ bzf->position += len; + out: + if (len < 0) + errno = EINVAL; +@@ -116,24 +118,29 @@ out: + static zio_int_t bzseek(void *cookie, zio_off_t *poffset, int whence) + { + bzfile_t *bzf = (bzfile_t*)cookie; +- off_t offset = (off_t)*poffset; +- off_t oldpos, newpos; ++ off_t offset, curpos, newpos; + if (!bzf) { + errno = EINVAL; + return -1; + } + +- oldpos = (off_t)bzf->total_out; ++ offset = (off_t)*poffset; ++ curpos = (off_t)bzf->position; ++ + switch (whence) { + case SEEK_SET: +- if (offset < 0) ++ if (offset < 0) { ++ errno = EINVAL; + return -1; ++ } + newpos = offset; + break; + case SEEK_CUR: +- if ((offset < 0 && (off_t)(-1 * offset) > oldpos) || (offset > 0 && (offset+oldpos) < oldpos)) ++ if ((offset < 0 && (off_t)(-1 * offset) > curpos) || (offset > 0 && (offset+curpos) < curpos)) { ++ errno = EINVAL; + return -1; +- newpos = (off_t)bzf->total_out + offset; ++ } ++ newpos = curpos + offset; + break; + case SEEK_END: + newpos = -1; +@@ -143,7 +150,7 @@ static zio_int_t bzseek(void *cookie, zi + return -1; + } + +- if (whence != SEEK_END && newpos < oldpos) { ++ if (whence != SEEK_END && newpos < curpos) { + int status = BZ2_bzflush(bzf->file); + BZ2_bzclose(bzf->file); + if (status < 0) { +@@ -163,27 +170,36 @@ static zio_int_t bzseek(void *cookie, zi + errno = EINVAL; + return -1; + } +- bzf->total_out = 0; ++ curpos = (off_t)0; ++ bzf->position = curpos; + } +- if (newpos == oldpos) +- return oldpos; +- else { ++ if (newpos == curpos) ++ goto out; ++ if (newpos == -1) { ++ char buf[1<<12]; ++ while (1) { ++ ssize_t got_size = BZ2_bzread(bzf->file, buf, sizeof(buf)); ++ if (got_size < 0) ++ return -1; ++ if (got_size == 0) ++ break; ++ curpos += got_size; ++ } ++ } else { + char buf[1<<12]; +- while (newpos > oldpos || newpos == -1) { +- size_t req_size = MIN(sizeof(buf), newpos - oldpos); ++ while (newpos > curpos) { ++ size_t req_size = MIN(sizeof(buf), newpos - curpos); + ssize_t got_size = BZ2_bzread(bzf->file, buf, req_size); +- if (got_size != (ssize_t)(req_size)) { +- if (got_size < 0) +- return -1; +- else { +- newpos = oldpos + got_size; +- break; +- } +- } +- oldpos += got_size; ++ if (got_size < 0) ++ return -1; ++ if (got_size == 0) ++ break; ++ curpos += got_size; + } +- return newpos; + } ++out: ++ bzf->position = curpos; ++ return curpos; + } + + static int bzclose(void *cookie) +@@ -223,6 +239,7 @@ typedef struct lzfile_s { + uint8_t buf[1<<12]; + lzma_stream strm; + FILE *file; ++ FILE *stdio; + int encoding; + int level; + int what; +@@ -291,9 +308,9 @@ static ssize_t lzmawrite(void *cookie, + lzfile_t *lzma = (lzfile_t*)cookie; + lzma_stream *strm; + if (!lzma || !lzma->encoding) +- return -1; ++ return -1; + if (!count) +- return 0; ++ return 0; + strm = &lzma->strm; + + strm->next_in = (uint8_t*)buf; +@@ -318,24 +335,31 @@ static ssize_t lzmawrite(void *cookie, + static zio_int_t lzmaseek(void *cookie, zio_off_t *poffset, int whence) + { + lzfile_t *lzma = (lzfile_t*)cookie; +- off_t offset = (off_t)*poffset; + lzma_stream *strm; +- off_t oldpos, newpos; +- if (!lzma) ++ off_t offset, curpos, newpos; ++ if (!lzma) { ++ errno = EINVAL; + return -1; ++ } ++ + strm = &lzma->strm; ++ offset = (off_t)*poffset; ++ curpos = (off_t)strm->total_out; + +- oldpos = (off_t)strm->total_out; + switch (whence) { + case SEEK_SET: +- if (offset < 0) ++ if (offset < 0) { ++ errno = EINVAL; + return -1; ++ } + newpos = offset; + break; + case SEEK_CUR: +- if ((offset < 0 && (off_t)(-1 * offset) > oldpos) || (offset > 0 && (offset+oldpos) < oldpos)) ++ if ((offset < 0 && (off_t)(-1 * offset) > curpos) || (offset > 0 && (offset+curpos) < curpos)) { ++ errno = EINVAL; + return -1; +- newpos = (off_t)strm->total_out + offset; ++ } ++ newpos = curpos + offset; + break; + case SEEK_END: + newpos = -1; +@@ -344,37 +368,51 @@ static zio_int_t lzmaseek(void *cookie, + errno = EINVAL; + return -1; + } +- +- if (whence != SEEK_END && newpos < oldpos) { ++ if (whence != SEEK_END && newpos < curpos) { + lzma_ret ret; ++ + lzma_end(strm); ++ lzma->strm = (lzma_stream)LZMA_STREAM_INIT; ++ strm = &lzma->strm; ++ + rewind(lzma->file); ++ clearerr(lzma->file); ++ lzma->eof = 0; ++ + ret = lzmaopen(strm, lzma->encoding ? 'w' : 'r', lzma->what, lzma->level); + if (ret != LZMA_OK || strm->total_out != 0) { + fclose(lzma->file); + errno = EINVAL; + return -1; + } ++ curpos = (off_t)0; + } +- if (newpos == oldpos) +- return oldpos; +- else { ++ if (newpos == curpos) ++ goto out; ++ if (newpos == -1) { ++ char buf[sizeof(lzma->buf)]; ++ while (1) { ++ ssize_t got_size = lzmaread(cookie, buf, sizeof(buf)); ++ if (got_size < 0) ++ return -1; ++ if (got_size == 0) ++ break; ++ curpos += got_size; ++ } ++ } else { + char buf[sizeof(lzma->buf)]; +- while (newpos > oldpos || newpos == -1) { +- size_t req_size = MIN(sizeof(buf), newpos - oldpos); ++ while (newpos > curpos) { ++ size_t req_size = MIN(sizeof(buf), newpos - curpos); + ssize_t got_size = lzmaread(cookie, buf, req_size); +- if (got_size != (ssize_t)(req_size)) { +- if (got_size < 0) +- return -1; +- else { +- newpos = oldpos + got_size; +- break; +- } +- } +- oldpos += got_size; ++ if (got_size < 0) ++ return -1; ++ if (got_size == 0) ++ break; ++ curpos += got_size; + } +- return newpos; + } ++out: ++ return curpos; + } + + static int lzmaclose(void *cookie) +@@ -466,8 +504,9 @@ static cookie_io_functions_t iolzma = { + #endif /* !HAS_LZMA_H */ + + typedef struct lzwfile_s { +- size_t total_out; ++ size_t position; + LZW_t *file; ++ FILE *stdio; + char *mode; + char *path; + int fd; +@@ -482,7 +521,7 @@ static ssize_t lzwread(void *cookie, c + if (lzw->file) + len = readlzw(lzw->file, buf, count); + if (len > 0) +- lzw->total_out += len; ++ lzw->position += len; + out: + if (len < 0) + errno = EINVAL; +@@ -498,24 +537,29 @@ static ssize_t lzwwrite(void *cookie, + static zio_int_t lzwseek(void *cookie, zio_off_t *poffset, int whence) + { + lzwfile_t *lzw = (lzwfile_t*)cookie; +- off_t offset = (off_t)*poffset; +- off_t oldpos, newpos; ++ off_t offset, curpos, newpos; + if (!lzw) { + errno = EINVAL; + return -1; + } + +- oldpos = (off_t)lzw->total_out; ++ offset = (off_t)*poffset; ++ curpos = (off_t)lzw->position; ++ + switch (whence) { + case SEEK_SET: +- if (offset < 0) ++ if (offset < 0) { ++ errno = EINVAL; + return -1; ++ } + newpos = offset; + break; + case SEEK_CUR: +- if ((offset < 0 && (off_t)(-1 * offset) > oldpos) || (offset > 0 && (offset+oldpos) < oldpos)) ++ if ((offset < 0 && (off_t)(-1 * offset) > curpos) || (offset > 0 && (offset+curpos) < curpos)) { ++ errno = EINVAL; + return -1; +- newpos = (off_t)lzw->total_out + offset; ++ } ++ newpos = curpos + offset; + break; + case SEEK_END: + newpos = -1; +@@ -525,7 +569,7 @@ static zio_int_t lzwseek(void *cookie, z + return -1; + } + +- if (whence != SEEK_END && newpos < oldpos) { ++ if (whence != SEEK_END && newpos < curpos) { + closelzw(lzw->file); + if (lzw->fd >= 0) { + lseek(lzw->fd, 0, SEEK_SET); +@@ -540,27 +584,36 @@ static zio_int_t lzwseek(void *cookie, z + errno = EINVAL; + return -1; + } +- lzw->total_out = 0; ++ curpos = (off_t)0; ++ lzw->position = curpos; + } +- if (newpos == oldpos) +- return oldpos; +- else { ++ if (newpos == curpos) ++ goto out; ++ if (newpos == -1) { ++ char buf[1<<12]; ++ while (1) { ++ ssize_t got_size = readlzw(lzw->file, buf, sizeof(buf)); ++ if (got_size < 0) ++ return -1; ++ if (got_size == 0) ++ break; ++ curpos += got_size; ++ } ++ } else { + char buf[1<<12]; +- while (newpos > oldpos || newpos == -1) { +- size_t req_size = MIN(sizeof(buf), newpos - oldpos); ++ while (newpos > curpos) { ++ size_t req_size = MIN(sizeof(buf), newpos - curpos); + ssize_t got_size = readlzw(lzw->file, buf, req_size); +- if (got_size != (ssize_t)(req_size)) { +- if (got_size < 0) +- return -1; +- else { +- newpos = oldpos + got_size; +- break; +- } +- } +- oldpos += got_size; ++ if (got_size < 0) ++ return -1; ++ if (got_size == 0) ++ break; ++ curpos += got_size; + } +- return newpos; + } ++out: ++ lzw->position = curpos; ++ return curpos; + } + + static int lzwclose(void *cookie) +@@ -787,6 +840,7 @@ FILE * fzopen(const char * path, const c + if (ret->_fileno < 0) + ret->_fileno = 0; + # endif ++ cookie->stdio = ret; + } + break; + case 'b': +@@ -834,6 +888,7 @@ FILE * fzopen(const char * path, const c + if (ret->_fileno < 0) + ret->_fileno = 0; + # endif ++ cookie->stdio = ret; + } + #else /* !HAS_BZLIB_H */ + errno = ENOTSUP; +@@ -892,6 +947,7 @@ FILE * fzopen(const char * path, const c + if (ret->_fileno < 0) + ret->_fileno = 0; + # endif ++ cookie->stdio = ret; + } + break; + #else /* !HAS_LZMA_H */ +@@ -928,6 +984,7 @@ FILE * fzopen(const char * path, const c + if (ret->_fileno < 0) + ret->_fileno = 0; + # endif ++ cookie->stdio = ret; + } + # else /* !HAS_LZMADEC_H */ + errno = ENOTSUP; +@@ -1048,6 +1105,7 @@ FILE * fdzopen(int fildes, const char * + if (ret->_fileno < 0) + ret->_fileno = 0; + # endif ++ cookie->stdio = ret; + } + break; + case 'b': +@@ -1097,6 +1155,7 @@ FILE * fdzopen(int fildes, const char * + if (ret->_fileno < 0) + ret->_fileno = 0; + # endif ++ cookie->stdio = ret; + } + #else /* !HAS_BZLIB_H */ + errno = ENOTSUP; +@@ -1137,6 +1196,7 @@ FILE * fdzopen(int fildes, const char * + cookie->level = level; + cookie->encoding = (check[0] == 'w') ? 1 : 0; + lret = lzmaopen(&cookie->strm, check[0], *what, level); ++ + if (lret != LZMA_OK) { + fclose(cookie->file); + free(cookie); +@@ -1154,6 +1214,7 @@ FILE * fdzopen(int fildes, const char * + if (ret->_fileno < 0) + ret->_fileno = 0; + # endif ++ cookie->stdio = ret; + } + break; + #else /* !HAS_LZMA_H */ +@@ -1190,6 +1251,7 @@ FILE * fdzopen(int fildes, const char * + if (ret->_fileno < 0) + ret->_fileno = 0; + # endif ++ cookie->stdio = ret; + } + # else /* !HAS_LZMADEC_H */ + errno = ENOTSUP; diff --git a/libzio.changes b/libzio.changes index cd71b08..bf2bed5 100644 --- a/libzio.changes +++ b/libzio.changes @@ -1,3 +1,8 @@ +------------------------------------------------------------------- +Tue Feb 26 16:41:39 UTC 2013 - werner@suse.de + +- Fix seeking cookie functions (related to bnc#805149) + ------------------------------------------------------------------- Mon Jan 7 21:32:08 UTC 2013 - jengelh@inai.de diff --git a/libzio.spec b/libzio.spec index f956322..f35bf27 100644 --- a/libzio.spec +++ b/libzio.spec @@ -26,6 +26,7 @@ Group: System/Libraries Url: http://libzio.sourceforge.net/ Source: libzio-%{version}.tar.bz2 Source1: baselibs.conf +Patch0: libzio-1.00.dif BuildRequires: libbz2-devel BuildRequires: zlib-devel %if %suse_version <= 1110 @@ -85,6 +86,7 @@ Authors: %prep %setup -q +%patch0 %build make %{?_smp_mflags} noweak