From d84fa9fd6eb96202f5721ae3ce6410d1cbb19f96 Mon Sep 17 00:00:00 2001
From: Gregory Maxwell <greg@xiph.org>
Date: Fri, 28 Oct 2011 11:06:37 -0400
Subject: [PATCH] Fixes a bug in ec_enc_done when no range coded data was coded
 and adds test cases to test_unit_entropy.

---
 celt/entenc.c                  |  2 +-
 celt/tests/test_unit_entropy.c | 19 +++++++++++++++++++
 2 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/celt/entenc.c b/celt/entenc.c
index 2e20c3578..3913d8e85 100644
--- a/celt/entenc.c
+++ b/celt/entenc.c
@@ -287,8 +287,8 @@ void ec_enc_done(ec_enc *_this){
           window&=(1<<l)-1;
           _this->error=-1;
         }
+        _this->buf[_this->storage-_this->end_offs-1]|=(unsigned char)window;
       }
-      _this->buf[_this->storage-_this->end_offs-1]|=(unsigned char)window;
     }
   }
 }
diff --git a/celt/tests/test_unit_entropy.c b/celt/tests/test_unit_entropy.c
index 982722ca2..a1ff668b6 100644
--- a/celt/tests/test_unit_entropy.c
+++ b/celt/tests/test_unit_entropy.c
@@ -326,6 +326,25 @@ int main(int _argc,char **_argv){
     fprintf(stderr,"Got %d when expecting 63 for patch_initial_bits",ptr[0]);
     ret=-1;
   }
+  ec_enc_init(&enc,ptr,2);
+  ec_enc_bit_logp(&enc,0,2);
+  for(i=0;i<48;i++){
+    ec_enc_bits(&enc,0,1);
+  }
+  ec_enc_done(&enc);
+  if(!enc.error){
+    fprintf(stderr,"Raw bits overfill didn't fail when it should have");
+    ret=-1;
+  }
+  ec_enc_init(&enc,ptr,2);
+  for(i=0;i<17;i++){
+    ec_enc_bits(&enc,0,1);
+  }
+  ec_enc_done(&enc);
+  if(!enc.error){
+    fprintf(stderr,"17 raw bits encoded in two bytes");
+    ret=-1;
+  }
   free(ptr);
   return ret;
 }
-- 
GitLab