From: Michael Schroeder Date: Mon, 8 Oct 2018 09:55:13 +0000 (+0200) Subject: Tweak system zchunk code X-Git-Tag: 0.7.0~15 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9b413e2c3790ca11eb89debffe881d43856e0bc1;p=thirdparty%2Flibsolv.git Tweak system zchunk code - rename USE_SYSTEM_ZCHUNK to WITH_SYSTEM_ZCHUNK - fix file descriptor leak - fix memory leaks --- diff --git a/CMakeLists.txt b/CMakeLists.txt index 6def3818..1deef57d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,9 +1,6 @@ PROJECT (libsolv) CMAKE_MINIMUM_REQUIRED (VERSION 2.4) -IF (COMMAND CMAKE_POLICY) -CMAKE_POLICY(SET CMP0003 NEW) -ENDIF (COMMAND CMAKE_POLICY) OPTION (ENABLE_STATIC "Build a static version of the libraries?" OFF) OPTION (DISABLE_SHARED "Do not build a shared version of the libraries?" OFF) @@ -38,7 +35,7 @@ OPTION (ENABLE_LZMA_COMPRESSION "Build with lzma/xz compression support?" OFF) OPTION (ENABLE_BZIP2_COMPRESSION "Build with bzip2 compression support?" OFF) OPTION (ENABLE_ZSTD_COMPRESSION "Build with zstd compression support?" OFF) OPTION (ENABLE_ZCHUNK_COMPRESSION "Build with zchunk compression support?" OFF) -OPTION (USE_SYSTEM_ZCHUNK "Use system zchunk library?" OFF) +OPTION (WITH_SYSTEM_ZCHUNK "Use system zchunk library?" OFF) OPTION (WITH_LIBXML2 "Build with libxml2 instead of libexpat?" OFF) # Library @@ -159,11 +156,11 @@ IF (ENABLE_ARCHREPO OR ENABLE_DEBIAN) SET (ENABLE_LZMA_COMPRESSION ON) ENDIF (ENABLE_ARCHREPO OR ENABLE_DEBIAN) -IF (USE_SYSTEM_ZCHUNK) +IF (WITH_SYSTEM_ZCHUNK) SET (ENABLE_ZCHUNK_COMPRESSION ON) FIND_PACKAGE(PkgConfig REQUIRED) PKG_CHECK_MODULES(ZCHUNK zck REQUIRED) -ENDIF (USE_SYSTEM_ZCHUNK) +ENDIF (WITH_SYSTEM_ZCHUNK) IF (ENABLE_ZCHUNK_COMPRESSION) SET (ENABLE_ZSTD_COMPRESSION ON) @@ -304,7 +301,7 @@ FOREACH (VAR ENABLE_HELIXREPO ENABLE_MDKREPO ENABLE_ARCHREPO ENABLE_DEBIAN ENABLE_HAIKU ENABLE_ZLIB_COMPRESSION ENABLE_LZMA_COMPRESSION ENABLE_BZIP2_COMPRESSION ENABLE_ZSTD_COMPRESSION ENABLE_ZCHUNK_COMPRESSION ENABLE_PGPVRFY ENABLE_APPDATA - USE_SYSTEM_ZCHUNK) + WITH_SYSTEM_ZCHUNK) IF(${VAR}) ADD_DEFINITIONS (-D${VAR}=1) SET (SWIG_FLAGS ${SWIG_FLAGS} -D${VAR}) @@ -409,9 +406,9 @@ ENDIF (ENABLE_BZIP2_COMPRESSION) IF (ENABLE_ZSTD_COMPRESSION) SET (SYSTEM_LIBRARIES ${SYSTEM_LIBRARIES} ${ZSTD_LIBRARY}) ENDIF (ENABLE_ZSTD_COMPRESSION) -IF (USE_SYSTEM_ZCHUNK) +IF (WITH_SYSTEM_ZCHUNK) SET (SYSTEM_LIBRARIES ${SYSTEM_LIBRARIES} ${ZCHUNK_LIBRARIES}) -ENDIF (USE_SYSTEM_ZCHUNK) +ENDIF (WITH_SYSTEM_ZCHUNK) IF (ENABLE_RPMDB) SET (SYSTEM_LIBRARIES ${RPMDB_LIBRARY} ${SYSTEM_LIBRARIES}) ENDIF (ENABLE_RPMDB) diff --git a/ext/solv_xfopen.c b/ext/solv_xfopen.c index d5764ee0..4a310568 100644 --- a/ext/solv_xfopen.c +++ b/ext/solv_xfopen.c @@ -504,7 +504,9 @@ static inline FILE *myzstdfdopen(int fd, const char *mode) #ifdef ENABLE_ZCHUNK_COMPRESSION -#ifdef USE_SYSTEM_ZCHUNK +#ifdef WITH_SYSTEM_ZCHUNK +/* use the system's zchunk library that supports reading and writing of zchunk files */ + #include static ssize_t cookie_zckread(void *cookie, char *buf, size_t nbytes) @@ -520,16 +522,56 @@ static ssize_t cookie_zckwrite(void *cookie, const char *buf, size_t nbytes) static int cookie_zckclose(void *cookie) { zckCtx *zck = (zckCtx *)cookie; + int fd = zck_get_fd(zck); + if (fd != -1) + close(fd); zck_free(&zck); return 0; } + +static void *zchunkopen(const char *path, const char *mode, int fd) +{ + zckCtx *f; + + if (!path && fd < 0) + return 0; + if (fd == -1) + { + if (*mode != 'w') + fd = open(path, O_RDONLY); + else + fd = open(path, O_WRONLY | O_CREAT, 0666); + if (fd == -1) + return 0; + } + f = zck_create(); + if (!f) + { + close(fd); + return 0; + } + if (*mode != 'w') + { + if(!zck_init_read(f, fd); + return 0; + } + else + { + if(!zck_init_write(f, fd); + return 0; + } + return cookieopen(f, mode, cookie_zckread, cookie_zckwrite, cookie_zckclose); +} + #else + #include "solv_zchunk.h" -#endif +/* use the libsolv's limited zchunk implementation that only supports reading of zchunk files */ static void *zchunkopen(const char *path, const char *mode, int fd) { FILE *fp; + void *f; if (!path && fd < 0) return 0; if (fd != -1) @@ -538,31 +580,16 @@ static void *zchunkopen(const char *path, const char *mode, int fd) fp = fopen(path, mode); if (!fp) return 0; - -#ifdef USE_SYSTEM_ZCHUNK - zckCtx *f = zck_create(); - if(!f) - return NULL; - if(strncmp(mode, "r", 2) == 0) { - if(!zck_init_read(f, fileno(fp))) - return NULL; - } else { - if(!zck_init_write(f, fileno(fp))) - return NULL; - } - return cookieopen(f, mode, cookie_zckread, cookie_zckwrite, cookie_zckclose); -#else if (strcmp(mode, "r") != 0) return 0; - - void *f; f = solv_zchunk_open(fp, 1); if (!f) fclose(fp); return cookieopen(f, mode, (ssize_t (*)(void *, char *, size_t))solv_zchunk_read, 0, (int (*)(void *))solv_zchunk_close); -#endif } +#endif + static inline FILE *myzchunkfopen(const char *fn, const char *mode) { return zchunkopen(fn, mode, -1); @@ -572,7 +599,9 @@ static inline FILE *myzchunkfdopen(int fd, const char *mode) { return zchunkopen(0, mode, fd); } -#endif + +#endif /* ENABLE_ZCHUNK_COMPRESSION */ + FILE * solv_xfopen(const char *fn, const char *mode)