diff --git a/silk/dred_encoder.c b/silk/dred_encoder.c
index 5ab56ed10524d3cac02c44fa9afc69776242086e..ca9b6f0dfb2d8ddbf07af76705e783d3d1231412 100644
--- a/silk/dred_encoder.c
+++ b/silk/dred_encoder.c
@@ -92,6 +92,9 @@ int dred_encode_silk_frame(DREDEnc *enc, unsigned char *buf, int max_chunks, int
 
     for (i = 0; i < IMIN(2*max_chunks, enc->latents_buffer_fill-1); i += 2)
     {
+        ec_enc ec_bak;
+        ec_bak = ec_encoder;
+
         q_level = (int) floor(0.5f + DRED_ENC_Q0 + 1.f * (DRED_ENC_Q1 - DRED_ENC_Q0) * i / (DRED_NUM_REDUNDANCY_FRAMES - 2));
         offset = q_level * DRED_LATENT_DIM;
 
@@ -103,6 +106,10 @@ int dred_encode_silk_frame(DREDEnc *enc, unsigned char *buf, int max_chunks, int
             r + offset,
             p0 + offset
         );
+        if (ec_tell(&ec_encoder) > 8*max_bytes) {
+          ec_encoder = ec_bak;
+          break;
+        }
     }
 
     ec_buffer_fill = (ec_tell(&ec_encoder)+7)/8;