Don't leave dangling pointers in webm_ctx->buffer.

Maintain the invariant that webm_ctx->buffer is equal to the *buffer
argument of webm_read_frame().

Change-Id: I25af444c153e9fc8568f877bba49954e4723ab22
diff --git a/webmdec.cc b/webmdec.cc
index d0e576b..27cfb23 100644
--- a/webmdec.cc
+++ b/webmdec.cc
@@ -11,6 +11,7 @@
 
 #include "./webmdec.h"
 
+#include <cassert>
 #include <cstring>
 #include <cstdio>
 
@@ -119,6 +120,7 @@
 
 int webm_read_frame(struct WebmInputContext *webm_ctx, uint8_t **buffer,
                     size_t *bytes_read, size_t *buffer_size) {
+  assert(webm_ctx->buffer == *buffer);
   // This check is needed for frame parallel decoding, in which case this
   // function could be called even after it has reached end of input stream.
   if (webm_ctx->reached_eos) {
@@ -180,10 +182,10 @@
   if (frame.len > static_cast<long>(*buffer_size)) {
     delete[] * buffer;
     *buffer = new uint8_t[frame.len];
+    webm_ctx->buffer = *buffer;
     if (*buffer == NULL) {
       return -1;
     }
-    webm_ctx->buffer = *buffer;
     *buffer_size = frame.len;
   }
   *bytes_read = frame.len;
@@ -201,6 +203,7 @@
   uint8_t *buffer = NULL;
   size_t buffer_size = 0;
   size_t bytes_read = 0;
+  assert(webm_ctx->buffer == NULL);
   while (webm_ctx->timestamp_ns < 1000000000 && i < 50) {
     if (webm_read_frame(webm_ctx, &buffer, &bytes_read, &buffer_size)) {
       break;
@@ -211,6 +214,7 @@
   aom_ctx->framerate.denominator =
       static_cast<int>(webm_ctx->timestamp_ns / 1000);
   delete[] buffer;
+  webm_ctx->buffer = NULL;
 
   get_first_cluster(webm_ctx);
   webm_ctx->block = NULL;