summaryrefslogtreecommitdiff
path: root/libavformat/md5proto.c
diff options
context:
space:
mode:
authorMartin Storsjö <martin@martin.st>2012-10-11 15:27:25 +0300
committerMartin Storsjö <martin@martin.st>2012-10-11 23:35:29 +0300
commitda18e918a4ec015dd0aef1c7ec9cab09f3a019bf (patch)
treeddbc6765428ae3093e5ae8d0fad58396e3c06e78 /libavformat/md5proto.c
parente002e3291e6dc7953f843abf56fc14f08f238b21 (diff)
md5: Allocate a normal private context for the opaque md5 context pointer
This avoids having to overestimate the md5 context size, which isn't known beforehand, allowing us to use the new allocate functions instead. Signed-off-by: Martin Storsjö <martin@martin.st>
Diffstat (limited to 'libavformat/md5proto.c')
-rw-r--r--libavformat/md5proto.c24
1 files changed, 15 insertions, 9 deletions
diff --git a/libavformat/md5proto.c b/libavformat/md5proto.c
index 796b4ea682..12ddde3d8c 100644
--- a/libavformat/md5proto.c
+++ b/libavformat/md5proto.c
@@ -27,37 +27,41 @@
#include "avio.h"
#include "url.h"
-#define PRIV_SIZE 128
+struct MD5Context {
+ struct AVMD5 *md5;
+};
static int md5_open(URLContext *h, const char *filename, int flags)
{
- if (PRIV_SIZE < av_md5_size) {
- av_log(NULL, AV_LOG_ERROR, "Insuffient size for MD5 context\n");
- return -1;
- }
+ struct MD5Context *c = h->priv_data;
if (!(flags & AVIO_FLAG_WRITE))
return AVERROR(EINVAL);
- av_md5_init(h->priv_data);
+ c->md5 = av_md5_alloc();
+ if (!c->md5)
+ return AVERROR(ENOMEM);
+ av_md5_init(c->md5);
return 0;
}
static int md5_write(URLContext *h, const unsigned char *buf, int size)
{
- av_md5_update(h->priv_data, buf, size);
+ struct MD5Context *c = h->priv_data;
+ av_md5_update(c->md5, buf, size);
return size;
}
static int md5_close(URLContext *h)
{
+ struct MD5Context *c = h->priv_data;
const char *filename = h->filename;
uint8_t md5[16], buf[64];
URLContext *out;
int i, err = 0;
- av_md5_final(h->priv_data, md5);
+ av_md5_final(c->md5, md5);
for (i = 0; i < sizeof(md5); i++)
snprintf(buf + i*2, 3, "%02x", md5[i]);
buf[i*2] = '\n';
@@ -76,6 +80,8 @@ static int md5_close(URLContext *h)
err = AVERROR(errno);
}
+ av_freep(&c->md5);
+
return err;
}
@@ -85,5 +91,5 @@ URLProtocol ff_md5_protocol = {
.url_open = md5_open,
.url_write = md5_write,
.url_close = md5_close,
- .priv_data_size = PRIV_SIZE,
+ .priv_data_size = sizeof(struct MD5Context),
};