commit 21d6b2bfd1f4b6a88dba094262929f1014831c2a
parent 878e335ed883b0764e3a02884f25eeec27269614
Author: William Casarin <jb55@jb55.com>
Date: Thu, 1 Aug 2024 16:55:22 -0700
Fix issue where id tag filters are pushed as strings
When creating filters, sometimes IDs are pushed as strings, so if there
is ever a 0 byte, the id prematurely ends, causing the filter to not
match
Fixes: https://github.com/rust-nostr/nostr/issues/454
Signed-off-by: William Casarin <jb55@jb55.com>
Diffstat:
2 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/src/nostrdb.c b/src/nostrdb.c
@@ -784,8 +784,18 @@ static int ndb_filter_add_element(struct ndb_filter *filter, union ndb_filter_el
offset = el.integer;
break;
case NDB_FILTER_TAGS:
- if (!cursor_push_c_str(&filter->data_buf, el.string))
+ switch (current->field.elem_type) {
+ case NDB_ELEMENT_ID:
+ if (!cursor_push(&filter->data_buf, (unsigned char *)el.id, 32))
+ return 0;
+ break;
+ case NDB_ELEMENT_STRING:
+ if (!cursor_push_c_str(&filter->data_buf, el.string))
+ return 0;
+ break;
+ case NDB_ELEMENT_UNKNOWN:
return 0;
+ }
// push a pointer of the string in the databuf as an element
break;
}
diff --git a/test.c b/test.c
@@ -1546,8 +1546,8 @@ int main(int argc, const char *argv[]) {
test_bech32_parsing();
test_single_url_parsing();
test_url_parsing();
- test_weird_note_corruption();
test_query();
+ test_weird_note_corruption();
test_tag_query();
test_parse_content();
test_subscriptions();