]> git.ozlabs.org Git - ccan/commitdiff
rune: fix encoding of alternates which need escapes.
authorRusty Russell <rusty@rustcorp.com.au>
Thu, 18 Aug 2022 02:06:59 +0000 (11:36 +0930)
committerRusty Russell <rusty@rustcorp.com.au>
Thu, 18 Aug 2022 02:10:57 +0000 (11:40 +0930)
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
ccan/rune/coding.c
ccan/rune/test/run-altern-escape.c [new file with mode: 0644]

index b9255b0b5b02f9f39eea564954a3f811ebfaee3b..380a225c948319c66dbb5e004383e8bd07dc28f5 100644 (file)
@@ -98,7 +98,7 @@ static void rune_altern_encode(const struct rune_altern *altern,
                        break;
                esc[1] = p[len];
                cb(esc, 2, arg);
-               p++;
+               p += len + 1;
        }
 }
 
diff --git a/ccan/rune/test/run-altern-escape.c b/ccan/rune/test/run-altern-escape.c
new file mode 100644 (file)
index 0000000..550cafa
--- /dev/null
@@ -0,0 +1,37 @@
+#include <ccan/rune/rune.c>
+#include <ccan/rune/coding.c>
+#include <ccan/tal/grab_file/grab_file.h>
+#include <ccan/tal/str/str.h>
+#include <ccan/tap/tap.h>
+
+int main(void)
+{
+       static const u8 secret_zero[16];
+       struct rune *rune;
+       struct rune_restr *restr;
+       const tal_t *ctx = tal(NULL, char);
+
+       plan_tests(9);
+       restr = rune_restr_from_string(ctx, "desc=@tipjar\\|jb55@sendsats.lol",
+                                      strlen("desc=@tipjar\\|jb55@sendsats.lol"));
+       ok1(tal_count(restr->alterns) == 1);
+       ok1(restr->alterns[0]->condition == '=');
+       ok1(streq(restr->alterns[0]->fieldname, "desc"));
+       ok1(streq(restr->alterns[0]->value, "@tipjar|jb55@sendsats.lol"));
+
+       rune = rune_new(ctx, secret_zero, sizeof(secret_zero), NULL); 
+       rune_add_restr(rune, take(restr));
+
+       /* Converting via base64 should not change it! */
+       rune = rune_from_base64(ctx, rune_to_base64(ctx, rune));
+       ok1(tal_count(rune->restrs) == 1);
+       restr = rune->restrs[0];
+       ok1(tal_count(restr->alterns) == 1);
+       ok1(restr->alterns[0]->condition == '=');
+       ok1(streq(restr->alterns[0]->fieldname, "desc"));
+       ok1(streq(restr->alterns[0]->value, "@tipjar|jb55@sendsats.lol"));
+       
+       tal_free(ctx);
+       /* This exits depending on whether all tests passed */
+       return exit_status();
+}