summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2021-05-04 06:47:24 -0700
committerKaz Kylheku <kaz@kylheku.com>2021-05-04 06:47:24 -0700
commit0c07bd4a499379c47916ce7cbf8d03af79e3aa98 (patch)
tree93f223db2e75262e024e2f84012241a67ec5211b
parent9a7f2d51807c182c7cb7e554c3be109ccd066ad8 (diff)
downloadtxr-0c07bd4a499379c47916ce7cbf8d03af79e3aa98.tar.gz
txr-0c07bd4a499379c47916ce7cbf8d03af79e3aa98.tar.bz2
txr-0c07bd4a499379c47916ce7cbf8d03af79e3aa98.zip
sha256/md5: leak: don't use borrowed buffer for hash.
It's incorrect to use a borrowed buf, because a borrowed buf assumes that the memory isn't dynamically allocated, and will not free it when it is finalized by the garbage collector. The buffer which holds the hash returned by sha256 and md5 does in fact own the memory. * buf.c (make_owned_buf): Static function becomes external. * buf.h (make_owned_buf): Declared. * chksum.c (chksum_ensure_buf): Use make_owned_buf rather than make_borrowed_buf.
-rw-r--r--buf.c2
-rw-r--r--buf.h1
-rw-r--r--chksum.c2
3 files changed, 3 insertions, 2 deletions
diff --git a/buf.c b/buf.c
index 4305952e..5d0fb268 100644
--- a/buf.c
+++ b/buf.c
@@ -130,7 +130,7 @@ val make_duplicate_buf(val len, mem_t *data)
return obj;
}
-static val make_owned_buf(val len, mem_t *data)
+val make_owned_buf(val len, mem_t *data)
{
val buf = make_borrowed_buf(len, data);
buf->b.size = len;
diff --git a/buf.h b/buf.h
index 683d5438..1805f3b8 100644
--- a/buf.h
+++ b/buf.h
@@ -29,6 +29,7 @@ val make_buf(val len, val init_val, val alloc_size);
val bufp(val object);
val make_borrowed_buf(val len, mem_t *data);
val init_borrowed_buf(obj_t *buf, val len, mem_t *data);
+val make_owned_buf(val len, mem_t *data);
val make_duplicate_buf(val len, mem_t *data);
val copy_buf(val buf);
val buf_trim(val buf);
diff --git a/chksum.c b/chksum.c
index ad12d7d4..215d4f57 100644
--- a/chksum.c
+++ b/chksum.c
@@ -97,7 +97,7 @@ static val chksum_ensure_buf(val self, val buf_in,
{
if (null_or_missing_p(buf_in)) {
*phash = chk_malloc(c_unum(len, self));
- return make_borrowed_buf(len, *phash);
+ return make_owned_buf(len, *phash);
} else {
*phash = buf_get(buf_in, self);
if (lt(length_buf(buf_in), len))