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;
 }