From 094cc51e50bdb877fa4c245dbde47e4dfbf94387 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Mon, 17 Jan 2011 14:58:27 +0100 Subject: insmod: check for module read errors Signed-off-by: Denys Vlasenko --- include/libbb.h | 4 ++-- modutils/modprobe-small.c | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/include/libbb.h b/include/libbb.h index 67dfbc3..5551031 100644 --- a/include/libbb.h +++ b/include/libbb.h @@ -674,6 +674,8 @@ extern char *xmalloc_reads(int fd, char *pfx, size_t *maxsz_p) FAST_FUNC; extern void *xmalloc_read(int fd, size_t *maxsz_p) FAST_FUNC RETURNS_MALLOC; /* Returns NULL if file can't be opened (default max size: INT_MAX - 4095) */ extern void *xmalloc_open_read_close(const char *filename, size_t *maxsz_p) FAST_FUNC RETURNS_MALLOC; +/* Never returns NULL */ +extern void *xmalloc_xopen_read_close(const char *filename, size_t *maxsz_p) FAST_FUNC RETURNS_MALLOC; /* Autodetects gzip/bzip2 formats. fd may be in the middle of the file! */ #if ENABLE_FEATURE_SEAMLESS_LZMA \ || ENABLE_FEATURE_SEAMLESS_BZ2 \ @@ -686,8 +688,6 @@ extern void setup_unzip_on_fd(int fd /*, int fail_if_not_detected*/) FAST_FUNC; /* Autodetects .gz etc */ extern int open_zipped(const char *fname) FAST_FUNC; extern void *xmalloc_open_zipped_read_close(const char *fname, size_t *maxsz_p) FAST_FUNC RETURNS_MALLOC; -/* Never returns NULL */ -extern void *xmalloc_xopen_read_close(const char *filename, size_t *maxsz_p) FAST_FUNC RETURNS_MALLOC; extern ssize_t safe_write(int fd, const void *buf, size_t count) FAST_FUNC; // NB: will return short write on error, not -1, diff --git a/modutils/modprobe-small.c b/modutils/modprobe-small.c index f4f17e7..188a7f2 100644 --- a/modutils/modprobe-small.c +++ b/modutils/modprobe-small.c @@ -205,6 +205,7 @@ static void parse_module(module_info *info, const char *pathname) /* Read (possibly compressed) module */ len = 64 * 1024 * 1024; /* 64 Mb at most */ module_image = xmalloc_open_zipped_read_close(pathname, &len); + /* module_image == NULL is ok here, find_keyword handles it */ //TODO: optimize redundant module body reads /* "alias1 symbol:sym1 alias2 symbol:sym2" */ @@ -845,6 +846,8 @@ int modprobe_main(int argc UNUSED_PARAM, char **argv) len = MAXINT(ssize_t); map = xmalloc_open_zipped_read_close(*argv, &len); + if (!map) + bb_perror_msg_and_die("can't read '%s'", *argv); if (init_module(map, len, IF_FEATURE_MODPROBE_SMALL_OPTIONS_ON_CMDLINE(options ? options : "") IF_NOT_FEATURE_MODPROBE_SMALL_OPTIONS_ON_CMDLINE("") -- cgit v1.1