]> git.ipfire.org Git - thirdparty/libsolv.git/commitdiff
Tweak system zchunk code
authorMichael Schroeder <mls@suse.de>
Mon, 8 Oct 2018 09:55:13 +0000 (11:55 +0200)
committerMichael Schroeder <mls@suse.de>
Mon, 8 Oct 2018 09:55:13 +0000 (11:55 +0200)
- rename USE_SYSTEM_ZCHUNK to WITH_SYSTEM_ZCHUNK
- fix file descriptor leak
- fix memory leaks

CMakeLists.txt
ext/solv_xfopen.c

index 6def381856da9907afc98b0e19fce3f5b9fd1f87..1deef57d28137e94bfa805e9d0209ef17e4db395 100644 (file)
@@ -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)
index d5764ee06430bf2bf1795b93f783d0fe219ed66a..4a3105682b070d20ed08b7e4a252842fd0b49016 100644 (file)
@@ -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 <zck.h>
 
 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)