|
@@ -250,8 +250,10 @@ bool dso__needs_decompress(struct dso *dso)
|
|
|
dso->symtab_type == DSO_BINARY_TYPE__GUEST_KMODULE_COMP;
|
|
|
}
|
|
|
|
|
|
-static int decompress_kmodule(struct dso *dso, const char *name, char *tmpbuf)
|
|
|
+static int decompress_kmodule(struct dso *dso, const char *name,
|
|
|
+ char *pathname, size_t len)
|
|
|
{
|
|
|
+ char tmpbuf[] = KMOD_DECOMP_NAME;
|
|
|
int fd = -1;
|
|
|
|
|
|
if (!dso__needs_decompress(dso))
|
|
@@ -272,34 +274,27 @@ static int decompress_kmodule(struct dso *dso, const char *name, char *tmpbuf)
|
|
|
fd = -1;
|
|
|
}
|
|
|
|
|
|
+ if (!pathname || (fd < 0))
|
|
|
+ unlink(tmpbuf);
|
|
|
+
|
|
|
+ if (pathname && (fd >= 0))
|
|
|
+ strncpy(pathname, tmpbuf, len);
|
|
|
+
|
|
|
return fd;
|
|
|
}
|
|
|
|
|
|
int dso__decompress_kmodule_fd(struct dso *dso, const char *name)
|
|
|
{
|
|
|
- char tmpbuf[] = KMOD_DECOMP_NAME;
|
|
|
- int fd;
|
|
|
-
|
|
|
- fd = decompress_kmodule(dso, name, tmpbuf);
|
|
|
- unlink(tmpbuf);
|
|
|
- return fd;
|
|
|
+ return decompress_kmodule(dso, name, NULL, 0);
|
|
|
}
|
|
|
|
|
|
int dso__decompress_kmodule_path(struct dso *dso, const char *name,
|
|
|
char *pathname, size_t len)
|
|
|
{
|
|
|
- char tmpbuf[] = KMOD_DECOMP_NAME;
|
|
|
- int fd;
|
|
|
-
|
|
|
- fd = decompress_kmodule(dso, name, tmpbuf);
|
|
|
- if (fd < 0) {
|
|
|
- unlink(tmpbuf);
|
|
|
- return -1;
|
|
|
- }
|
|
|
+ int fd = decompress_kmodule(dso, name, pathname, len);
|
|
|
|
|
|
- strncpy(pathname, tmpbuf, len);
|
|
|
close(fd);
|
|
|
- return 0;
|
|
|
+ return fd >= 0 ? 0 : -1;
|
|
|
}
|
|
|
|
|
|
/*
|