summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWilliam Langford <wlangfor@gmail.com>2019-02-22 19:33:24 -0500
committerWilliam Langford <wlangfor@gmail.com>2019-02-22 19:50:26 -0500
commit22e6f9e966dc5896a37ad2bc3d9238a66efe518f (patch)
tree9358792c239e8a5d98c5b133bcb00cd5ff2fa723
parentdf8346a935035c920a230111a5a4f3a488689b8a (diff)
Change contains to return true for empty string needles
The behavior of memmem for an empty needle is inconsistent between implementations of libc. Our tests imply that we want an empty string needle to be true, so check for an empty needle before calling memmem.
-rw-r--r--src/jv.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/src/jv.c b/src/jv.c
index 06b4e6a2..2427b009 100644
--- a/src/jv.c
+++ b/src/jv.c
@@ -1344,8 +1344,13 @@ int jv_contains(jv a, jv b) {
} else if (jv_get_kind(a) == JV_KIND_ARRAY) {
r = jv_array_contains(jv_copy(a), jv_copy(b));
} else if (jv_get_kind(a) == JV_KIND_STRING) {
- r = _jq_memmem(jv_string_value(a), jv_string_length_bytes(jv_copy(a)),
- jv_string_value(b), jv_string_length_bytes(jv_copy(b))) != 0;
+ int b_len = jv_string_length_bytes(jv_copy(b));
+ if (b_len != 0) {
+ r = _jq_memmem(jv_string_value(a), jv_string_length_bytes(jv_copy(a)),
+ jv_string_value(b), b_len) != 0;
+ } else {
+ r = 1;
+ }
} else {
r = jv_equal(jv_copy(a), jv_copy(b));
}