From f6248369fe4e1e5c92f0d20348256e4bab51c5f6 Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Wed, 28 Jun 2023 08:18:43 -0500 Subject: [PATCH] Update janet_getcbytes to padd buffers with trailing 0. --- src/core/capi.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/src/core/capi.c b/src/core/capi.c index c1109c5f..be4f03e3 100644 --- a/src/core/capi.c +++ b/src/core/capi.c @@ -216,12 +216,31 @@ const char *janet_getcstring(const Janet *argv, int32_t n) { } const char *janet_getcbytes(const Janet *argv, int32_t n) { + /* Ensure buffer 0-padded */ + if (janet_checktype(argv[n], JANET_BUFFER)) { + JanetBuffer *b = janet_unwrap_buffer(argv[n]); + if (b->gc.flags & JANET_BUFFER_FLAG_NO_REALLOC) { + /* Make a copy with janet_smalloc in the rare case we have a buffer that cannot be realloced */ + char *new_string = janet_smalloc(b->count + 1); + memcpy(new_string, b->data, b->count); + new_string[b->count] = 0; + if (strlen(new_string) != (size_t) b->count) goto badzeros; + return new_string; + } else { + /* Ensure trailing 0 */ + janet_buffer_push_u8(b, 0); + b->count--; + if (strlen((char *)b->data) != (size_t) b->count) goto badzeros; + return (const char *) b->data; + } + } JanetByteView view = janet_getbytes(argv, n); const char *cstr = (const char *)view.bytes; - if (strlen(cstr) != (size_t) view.len) { - janet_panic("bytes contain embedded 0s"); - } + if (strlen(cstr) != (size_t) view.len) goto badzeros; return cstr; + +badzeros: + janet_panic("bytes contain embedded 0s"); } const char *janet_optcbytes(const Janet *argv, int32_t argc, int32_t n, const char *dflt) {