From: Stephen Dolan Date: Thu, 7 Nov 2013 12:18:48 +0000 (+0000) Subject: Fix a crash on group_by of empty list. Fixes #208. X-Git-Tag: jq-1.4~82 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8d4748c8df283d06e58ac6202505057e99a4a83a;p=jq Fix a crash on group_by of empty list. Fixes #208. --- diff --git a/jv_aux.c b/jv_aux.c index b73c905..89f36e6 100644 --- a/jv_aux.c +++ b/jv_aux.c @@ -545,21 +545,23 @@ jv jv_group(jv objects, jv keys) { int n = jv_array_length(jv_copy(objects)); struct sort_entry* entries = sort_items(objects, keys); jv ret = jv_array(); - jv curr_key = entries[0].key; - jv group = jv_array_append(jv_array(), entries[0].object); - for (int i = 1; i < n; i++) { - if (jv_equal(jv_copy(curr_key), jv_copy(entries[i].key))) { - jv_free(entries[i].key); - } else { - jv_free(curr_key); - curr_key = entries[i].key; - ret = jv_array_append(ret, group); - group = jv_array(); + if (n > 0) { + jv curr_key = entries[0].key; + jv group = jv_array_append(jv_array(), entries[0].object); + for (int i = 1; i < n; i++) { + if (jv_equal(jv_copy(curr_key), jv_copy(entries[i].key))) { + jv_free(entries[i].key); + } else { + jv_free(curr_key); + curr_key = entries[i].key; + ret = jv_array_append(ret, group); + group = jv_array(); + } + group = jv_array_append(group, entries[i].object); } - group = jv_array_append(group, entries[i].object); + jv_free(curr_key); + ret = jv_array_append(ret, group); } - jv_free(curr_key); - ret = jv_array_append(ret, group); jv_mem_free(entries); return ret; } diff --git a/tests/all.test b/tests/all.test index c16b7eb..aa02e90 100644 --- a/tests/all.test +++ b/tests/all.test @@ -610,6 +610,10 @@ unique [1,2,5,3,5,3,1,3] [1,2,3,5] +unique +[] +[] + [min, max, min_by(.[1]), max_by(.[1]), min_by(.[2]), max_by(.[2])] [[4,2,"a"],[3,1,"a"],[2,4,"a"],[1,3,"a"]] [[1,3,"a"],[4,2,"a"],[3,1,"a"],[2,4,"a"],[4,2,"a"],[1,3,"a"]]