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;