aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEmil Velikov <emil.l.velikov@gmail.com>2024-02-12 17:23:03 +0000
committerLucas De Marchi <lucas.de.marchi@gmail.com>2024-04-30 12:33:52 -0500
commit09256b9a4f79976b28d2b15c4be3ee805d57edff (patch)
treebe94871c4da5b16c9151d1e7cd1e7ba0be14dcc5
parentd6cd6c74d2d225306cc50a8ca9cc03cf015c5c4b (diff)
downloadkmod-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.c18
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};