From f3bc6bacd25a4cd5b69e680348727997b3f177d1 Mon Sep 17 00:00:00 2001
From: Jean-Marc Valin <jmvalin@amazon.com>
Date: Thu, 3 Feb 2022 00:26:44 -0500
Subject: [PATCH] Avoiding tmp buffer overflows

---
 dnn/lpcnet.c     | 1 -
 dnn/lpcnet_plc.c | 2 +-
 dnn/nnet.c       | 9 ++++++---
 3 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/dnn/lpcnet.c b/dnn/lpcnet.c
index bd61d6f75..48dca42d6 100644
--- a/dnn/lpcnet.c
+++ b/dnn/lpcnet.c
@@ -98,7 +98,6 @@ void run_frame_network(LPCNetState *lpcnet, float *gru_a_condition, float *gru_b
     compute_conv1d(&feature_conv1, conv1_out, net->feature_conv1_state, in);
     if (lpcnet->frame_count < FEATURE_CONV1_DELAY) RNN_CLEAR(conv1_out, FEATURE_CONV1_OUT_SIZE);
     compute_conv1d(&feature_conv2, conv2_out, net->feature_conv2_state, conv1_out);
-    celt_assert(FRAME_INPUT_SIZE == FEATURE_CONV2_OUT_SIZE);
     if (lpcnet->frame_count < FEATURES_DELAY) RNN_CLEAR(conv2_out, FEATURE_CONV2_OUT_SIZE);
     _lpcnet_compute_dense(&feature_dense1, dense1_out, conv2_out);
     _lpcnet_compute_dense(&feature_dense2, condition, dense1_out);
diff --git a/dnn/lpcnet_plc.c b/dnn/lpcnet_plc.c
index 9e67c2cce..788801b0b 100644
--- a/dnn/lpcnet_plc.c
+++ b/dnn/lpcnet_plc.c
@@ -62,7 +62,7 @@ LPCNET_EXPORT void lpcnet_plc_destroy(LPCNetPLCState *st) {
 }
 
 static void compute_plc_pred(PLCNetState *net, float *out, const float *in) {
-  float zeros[1024] = {0};
+  float zeros[3*PLC_MAX_RNN_NEURONS] = {0};
   float dense_out[PLC_DENSE1_OUT_SIZE];
   _lpcnet_compute_dense(&plc_dense1, dense_out, in);
   compute_gruB(&plc_gru1, zeros, net->plc_gru1_state, dense_out);
diff --git a/dnn/nnet.c b/dnn/nnet.c
index 8af887137..2f78ac0cc 100644
--- a/dnn/nnet.c
+++ b/dnn/nnet.c
@@ -38,6 +38,7 @@
 #include "tansig_table.h"
 #include "nnet.h"
 #include "nnet_data.h"
+#include "plc_data.h"
 
 #ifdef NO_OPTIMIZATIONS
 #warning Compiling without any vectorization. This code will be very slow
@@ -315,13 +316,15 @@ void compute_gru2(const GRULayer *gru, float *state, const float *input)
       state[i] = h[i];
 }
 
+#define MAX_RNN_NEURONS_ALL IMAX(MAX_RNN_NEURONS, PLC_MAX_RNN_NEURONS)
+
 void compute_gruB(const GRULayer *gru, const float* gru_b_condition, float *state, const float *input)
 {
    int i;
    int N, M;
    int stride;
-   float zrh[3*MAX_RNN_NEURONS];
-   float recur[3*MAX_RNN_NEURONS];
+   float zrh[3*MAX_RNN_NEURONS_ALL];
+   float recur[3*MAX_RNN_NEURONS_ALL];
    float *z;
    float *r;
    float *h;
@@ -330,7 +333,7 @@ void compute_gruB(const GRULayer *gru, const float* gru_b_condition, float *stat
    z = zrh;
    r = &zrh[N];
    h = &zrh[2*N];
-   celt_assert(gru->nb_neurons <= MAX_RNN_NEURONS);
+   celt_assert(gru->nb_neurons <= MAX_RNN_NEURONS_ALL);
    celt_assert(input != state);
    celt_assert(gru->reset_after);
    stride = 3*N;
-- 
GitLab