diff options
author | Emil Velikov <emil.l.velikov@gmail.com> | 2024-02-12 17:23:03 +0000 |
---|---|---|
committer | Lucas De Marchi <lucas.de.marchi@gmail.com> | 2024-04-30 12:33:52 -0500 |
commit | 09256b9a4f79976b28d2b15c4be3ee805d57edff (patch) | |
tree | be94871c4da5b16c9151d1e7cd1e7ba0be14dcc5 | |
parent | d6cd6c74d2d225306cc50a8ca9cc03cf015c5c4b (diff) | |
download | kmod-09256b9a4f79976b28d2b15c4be3ee805d57edff.tar.gz |
libkmod: keep gzFile gzf local to load_zlib()
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>
-rw-r--r-- | libkmod/libkmod-file.c | 18 |
1 files changed, 7 insertions, 11 deletions
diff --git a/libkmod/libkmod-file.c b/libkmod/libkmod-file.c index b97062b..9a014ea 100644 --- a/libkmod/libkmod-file.c +++ b/libkmod/libkmod-file.c @@ -54,9 +54,6 @@ struct kmod_file { #ifdef ENABLE_XZ bool xz_used; #endif -#ifdef ENABLE_ZLIB - gzFile gzf; -#endif int fd; enum kmod_file_compression_type compression; off_t size; @@ -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}; |