From 33a89b7ea8db4d9a6fcc802aa85264e13a4ebbaf Mon Sep 17 00:00:00 2001 From: Jean-Marc Valin <jmvalin@jmvalin.ca> Date: Sun, 3 Mar 2024 00:14:55 -0500 Subject: [PATCH] Add checks when loading blob data --- dnn/lpcnet_demo.c | 30 +++++++++++++++++++++++++++--- src/opus_demo.c | 28 ++++++++++++++++++++++++---- 2 files changed, 51 insertions(+), 7 deletions(-) diff --git a/dnn/lpcnet_demo.c b/dnn/lpcnet_demo.c index 8e3acdd7..59651f3e 100644 --- a/dnn/lpcnet_demo.c +++ b/dnn/lpcnet_demo.c @@ -52,26 +52,50 @@ void *load_blob(const char *filename, int *len) { int fd; void *data; struct stat st; - stat(filename, &st); + if (stat(filename, &st)) { + *len = 0; + return NULL; + } *len = st.st_size; fd = open(filename, O_RDONLY); + if (fd<0) { + *len = 0; + return NULL; + } data = mmap(NULL, *len, PROT_READ, MAP_SHARED, fd, 0); + if (data == MAP_FAILED) { + *len = 0; + data = NULL; + } close(fd); return data; } void free_blob(void *blob, int len) { - munmap(blob, len); + if (blob) munmap(blob, len); } # else void *load_blob(const char *filename, int *len) { FILE *file; void *data; file = fopen(filename, "r"); + if (file == NULL) + { + perror("could not open blob file"); + *len = 0; + return NULL; + } fseek(file, 0L, SEEK_END); *len = ftell(file); fseek(file, 0L, SEEK_SET); - if (*len <= 0) return NULL; + if (*len <= 0) { + *len = 0; + return NULL; + } data = malloc(*len); + if (!data) { + *len = 0; + return NULL; + } *len = fread(data, 1, *len, file); return data; } diff --git a/src/opus_demo.c b/src/opus_demo.c index 365cb965..1ea8454a 100644 --- a/src/opus_demo.c +++ b/src/opus_demo.c @@ -58,15 +58,26 @@ void *load_blob(const char *filename, int *len) { int fd; void *data; struct stat st; - stat(filename, &st); + if (stat(filename, &st)) { + *len = 0; + return NULL; + } *len = st.st_size; fd = open(filename, O_RDONLY); + if (fd<0) { + *len = 0; + return NULL; + } data = mmap(NULL, *len, PROT_READ, MAP_SHARED, fd, 0); + if (data == MAP_FAILED) { + *len = 0; + data = NULL; + } close(fd); return data; } void free_blob(void *blob, int len) { - munmap(blob, len); + if (blob) munmap(blob, len); } # else void *load_blob(const char *filename, int *len) { @@ -75,13 +86,22 @@ void *load_blob(const char *filename, int *len) { file = fopen(filename, "r"); if (file == NULL) { - perror("could not open blob file\n"); + perror("could not open blob file"); + *len = 0; + return NULL; } fseek(file, 0L, SEEK_END); *len = ftell(file); fseek(file, 0L, SEEK_SET); - if (*len <= 0) return NULL; + if (*len <= 0) { + *len = 0; + return NULL; + } data = malloc(*len); + if (!data) { + *len = 0; + return NULL; + } *len = fread(data, 1, *len, file); return data; }