When insmod work had moved to module-init-tools, there was
some modifications to check for allocation failures and avoid using invalid
results. These changes were made in the
https://git.kernel.org/pub/scm/utils/kernel/module-init-tools/module-init-tools.git
repository. This ports those changes back to klibc.
Signed-off-by: Kevin Guthrie <Kevin.Guthrie at itron.com>
---
usr/utils/insmod.c | 35 ++++++++++++++++++++++++++++++-----
1 file changed, 30 insertions(+), 5 deletions(-)
diff --git a/usr/utils/insmod.c b/usr/utils/insmod.c
index 47b58800..435fed21 100644
--- a/usr/utils/insmod.c
+++ b/usr/utils/insmod.c
@@ -58,8 +58,8 @@ static const char *moderror(int err)
static void *grab_file(const char *filename, unsigned long *size)
{
unsigned int max = 16384;
- int ret, fd;
- void *buffer = malloc(max);
+ int ret, fd, err_save;
+ void *buffer;
if (streq(filename, "-"))
fd = dup(STDIN_FILENO);
@@ -69,11 +69,21 @@ static void *grab_file(const char *filename, unsigned long
*size)
if (fd < 0)
return NULL;
+ buffer = malloc(max);
+ if (!buffer)
+ goto out_error;
+
*size = 0;
while ((ret = read(fd, buffer + *size, max - *size)) > 0) {
*size += ret;
- if (*size == max)
- buffer = realloc(buffer, max *= 2);
+ if (*size == max) {
+ void* p;
+
+ p = realloc(buffer, max *= 2);
+ if (!p)
+ goto out_error;
+ buffer = p;
+ }
}
if (ret < 0) {
free(buffer);
@@ -81,6 +91,13 @@ static void *grab_file(const char *filename, unsigned long
*size)
}
close(fd);
return buffer;
+
+out_error:
+ err_save = errno;
+ free(buffer);
+ close(fd);
+ errno = err_save;
+ return NULL;
}
int main(int argc, char *argv[])
@@ -113,6 +130,11 @@ int main(int argc, char *argv[])
for (i = 2; i < argc; i++) {
options = realloc(options,
strlen(options) + 2 + strlen(argv[i]) + 2);
+ if (!options) {
+ fprintf(stderr, "insmod: can't allocate memory: %sn",
+ strerror(errno));
+ exit(1);
+ }
/* Spaces handled by "" pairs, but no way of escaping
quotes */
if (strchr(argv[i], ' '))
@@ -134,7 +156,10 @@ int main(int argc, char *argv[])
if (ret != 0) {
fprintf(stderr, "insmod: error inserting '%s': %li %s\n",
filename, ret, moderror(errno));
- exit(1);
}
+ free(file);
+
+ if (ret != 0)
+ exit(1);
exit(0);
}
--
2.48.1