]> git.ipfire.org Git - thirdparty/kmod.git/commitdiff
libkmod: keep gzFile gzf local to load_zlib()
authorEmil Velikov <emil.l.velikov@gmail.com>
Mon, 12 Feb 2024 17:23:03 +0000 (17:23 +0000)
committerLucas De Marchi <lucas.de.marchi@gmail.com>
Tue, 30 Apr 2024 17:33:52 +0000 (12:33 -0500)
There is no need to keep the root gzFile context open for the whole
duration. Once we've copied the decompressed module to file->memory we
can close the handle.

Signed-off-by: Emil Velikov <emil.l.velikov@gmail.com>
Reviewed-by: Lucas De Marchi <lucas.demarchi@intel.com>
Signed-off-by: Lucas De Marchi <lucas.de.marchi@gmail.com>
libkmod/libkmod-file.c

index b97062bfe07a7676011fb1ca5c51d5326b0a1919..9a014ea340397f210dda03fc8cdd9b7b6591a894 100644 (file)
@@ -53,9 +53,6 @@ struct kmod_file {
 #endif
 #ifdef ENABLE_XZ
        bool xz_used;
-#endif
-#ifdef ENABLE_ZLIB
-       gzFile gzf;
 #endif
        int fd;
        enum kmod_file_compression_type compression;
@@ -317,6 +314,7 @@ static int load_zlib(struct kmod_file *file)
        int err = 0;
        off_t did = 0, total = 0;
        _cleanup_free_ unsigned char *p = NULL;
+       gzFile gzf;
        int gzfd;
 
        errno = 0;
@@ -324,8 +322,8 @@ static int load_zlib(struct kmod_file *file)
        if (gzfd < 0)
                return -errno;
 
-       file->gzf = gzdopen(gzfd, "rb"); /* takes ownership of the fd */
-       if (file->gzf == NULL) {
+       gzf = gzdopen(gzfd, "rb"); /* takes ownership of the fd */
+       if (gzf == NULL) {
                close(gzfd);
                return -errno;
        }
@@ -343,12 +341,12 @@ static int load_zlib(struct kmod_file *file)
                        p = tmp;
                }
 
-               r = gzread(file->gzf, p + did, total - did);
+               r = gzread(gzf, p + did, total - did);
                if (r == 0)
                        break;
                else if (r < 0) {
                        int gzerr;
-                       const char *gz_errmsg = gzerror(file->gzf, &gzerr);
+                       const char *gz_errmsg = gzerror(gzf, &gzerr);
 
                        ERR(file->ctx, "gzip: %s\n", gz_errmsg);
 
@@ -362,19 +360,17 @@ static int load_zlib(struct kmod_file *file)
        file->memory = p;
        file->size = did;
        p = NULL;
+       gzclose(gzf);
        return 0;
 
 error:
-       gzclose(file->gzf); /* closes the gzfd */
+       gzclose(gzf); /* closes the gzfd */
        return err;
 }
 
 static void unload_zlib(struct kmod_file *file)
 {
-       if (file->gzf == NULL)
-               return;
        free(file->memory);
-       gzclose(file->gzf);
 }
 
 static const char magic_zlib[] = {0x1f, 0x8b};