From 7f3e4e6a145aad0e7a5bb8d2507d0fb5302ab32d Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Sat, 2 Jul 2022 10:31:14 +0930 Subject: [PATCH] ccan/rune: add explicit-length variants. Signed-off-by: Rusty Russell --- ccan/rune/_info | 2 +- ccan/rune/coding.c | 29 +++++++++++++++++------------ ccan/rune/rune.h | 17 ++++++++++++++--- 3 files changed, 32 insertions(+), 16 deletions(-) diff --git a/ccan/rune/_info b/ccan/rune/_info index e3601560..aaed15d8 100644 --- a/ccan/rune/_info +++ b/ccan/rune/_info @@ -73,7 +73,7 @@ * rune = rune_from_base64(NULL, argv[2]); * if (!rune) * errx(1, "Bad rune"); - * restr = rune_restr_from_string(NULL, argv[3]); + * restr = rune_restr_from_string(NULL, argv[3], strlen(argv[3])); * if (!restr) * errx(1, "Bad restriction string"); * rune_add_restr(rune, restr); diff --git a/ccan/rune/coding.c b/ccan/rune/coding.c index 201553d8..b9255b0b 100644 --- a/ccan/rune/coding.c +++ b/ccan/rune/coding.c @@ -306,9 +306,9 @@ static struct rune *from_string(const tal_t *ctx, } struct rune_restr *rune_restr_from_string(const tal_t *ctx, - const char *str) + const char *str, + size_t len) { - size_t len = strlen(str); struct rune_restr *restr; restr = rune_restr_decode(NULL, &str, &len); @@ -334,26 +334,26 @@ static void to_string(struct wbuf *wbuf, const struct rune *rune, u8 *hash32) to_wbuf("", 1, wbuf); } -struct rune *rune_from_base64(const tal_t *ctx, const char *str) +struct rune *rune_from_base64n(const tal_t *ctx, const char *str, size_t len) { - size_t len; + size_t blen; u8 *data; struct rune *rune; - data = tal_arr(NULL, u8, base64_decoded_length(strlen(str)) + 1); + data = tal_arr(NULL, u8, base64_decoded_length(len) + 1); - len = base64_decode_using_maps(&base64_maps_urlsafe, + blen = base64_decode_using_maps(&base64_maps_urlsafe, (char *)data, tal_bytelen(data), - str, strlen(str)); - if (len == -1) + str, len); + if (blen == -1) goto fail; - - if (len < 32) + + if (blen < 32) goto fail; - data[len] = '\0'; + data[blen] = '\0'; /* Sanity check that it's a valid string! */ - if (strlen((char *)data + 32) != len - 32) + if (strlen((char *)data + 32) != blen - 32) goto fail; rune = from_string(ctx, (const char *)data + 32, data); @@ -365,6 +365,11 @@ fail: return NULL; } +struct rune *rune_from_base64(const tal_t *ctx, const char *str) +{ + return rune_from_base64n(ctx, str, strlen(str)); +} + char *rune_to_base64(const tal_t *ctx, const struct rune *rune) { u8 hash32[32]; diff --git a/ccan/rune/rune.h b/ccan/rune/rune.h index a284b733..59406db3 100644 --- a/ccan/rune/rune.h +++ b/ccan/rune/rune.h @@ -321,6 +321,16 @@ const char *rune_test_(const tal_t *ctx, */ struct rune *rune_from_base64(const tal_t *ctx, const char *str); +/** + * rune_from_base64n - convert base64 string to rune. + * @ctx: context to allocate rune off. + * @str: base64 string. + * @len: length of @str. + * + * Returns NULL if it's malformed. + */ +struct rune *rune_from_base64n(const tal_t *ctx, const char *str, size_t len); + /** * rune_to_base64 - convert run to base64 string. * @ctx: context to allocate rune off. @@ -340,10 +350,11 @@ char *rune_to_string(const tal_t *ctx, const struct rune *rune); * rune_restr_from_string - convenience routine to parse a single restriction. * @ctx: context to allocate rune off. * @str: the string of form "[|]*" + * @len: the length of @str. * - * This is really an internal routine, exposed for simple examples. + * This is useful for writing simple tests and making simple runes. */ struct rune_restr *rune_restr_from_string(const tal_t *ctx, - const char *str); - + const char *str, + size_t len); #endif /* CCAN_RUNE_RUNE_H */ -- 2.39.2