Fix memory leak for { $foo: bar }
{ BINDING: ExpD } wasn't freeing BINDING.
Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=60865
This commit is contained in:
1 parent
5b9d0750db
commit
17889a1a85
3 files changed
+24
-18
No files matched your search
Generated
+18
-17
@@ -980,8 +980,8 @@ static const yytype_int16 yyrline[] =
|
|||||||
869, 874, 877, 880, 883, 886, 889, 897, 903, 906,
|
869, 874, 877, 880, 883, 886, 889, 897, 903, 906,
|
||||||
909, 912, 915, 918, 921, 924, 927, 930, 933, 936,
|
909, 912, 915, 918, 921, 924, 927, 930, 933, 936,
|
||||||
939, 942, 945, 948, 951, 954, 959, 962, 963, 964,
|
939, 942, 945, 948, 951, 954, 959, 962, 963, 964,
|
||||||
967, 970, 973, 976, 980, 984, 988, 992, 996, 1000,
|
967, 970, 973, 976, 980, 985, 989, 993, 997, 1001,
|
||||||
1008
|
1009
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -4065,48 +4065,49 @@ yyreduce:
|
|||||||
{
|
{
|
||||||
(yyval.blk) = gen_dictpair(gen_location((yyloc), locations, gen_op_unbound(LOADV, jv_string_value((yyvsp[-2].literal)))),
|
(yyval.blk) = gen_dictpair(gen_location((yyloc), locations, gen_op_unbound(LOADV, jv_string_value((yyvsp[-2].literal)))),
|
||||||
(yyvsp[0].blk));
|
(yyvsp[0].blk));
|
||||||
|
jv_free((yyvsp[-2].literal));
|
||||||
}
|
}
|
||||||
#line 4070 "src/parser.c"
|
#line 4071 "src/parser.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 165: /* MkDictPair: BINDING */
|
case 165: /* MkDictPair: BINDING */
|
||||||
#line 984 "src/parser.y"
|
#line 985 "src/parser.y"
|
||||||
{
|
{
|
||||||
(yyval.blk) = gen_dictpair(gen_const((yyvsp[0].literal)),
|
(yyval.blk) = gen_dictpair(gen_const((yyvsp[0].literal)),
|
||||||
gen_location((yyloc), locations, gen_op_unbound(LOADV, jv_string_value((yyvsp[0].literal)))));
|
gen_location((yyloc), locations, gen_op_unbound(LOADV, jv_string_value((yyvsp[0].literal)))));
|
||||||
}
|
}
|
||||||
#line 4079 "src/parser.c"
|
#line 4080 "src/parser.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 166: /* MkDictPair: IDENT */
|
case 166: /* MkDictPair: IDENT */
|
||||||
#line 988 "src/parser.y"
|
#line 989 "src/parser.y"
|
||||||
{
|
{
|
||||||
(yyval.blk) = gen_dictpair(gen_const(jv_copy((yyvsp[0].literal))),
|
(yyval.blk) = gen_dictpair(gen_const(jv_copy((yyvsp[0].literal))),
|
||||||
gen_index(gen_noop(), gen_const((yyvsp[0].literal))));
|
gen_index(gen_noop(), gen_const((yyvsp[0].literal))));
|
||||||
}
|
}
|
||||||
#line 4088 "src/parser.c"
|
#line 4089 "src/parser.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 167: /* MkDictPair: "$__loc__" */
|
case 167: /* MkDictPair: "$__loc__" */
|
||||||
#line 992 "src/parser.y"
|
#line 993 "src/parser.y"
|
||||||
{
|
{
|
||||||
(yyval.blk) = gen_dictpair(gen_const(jv_string("__loc__")),
|
(yyval.blk) = gen_dictpair(gen_const(jv_string("__loc__")),
|
||||||
gen_loc_object(&(yyloc), locations));
|
gen_loc_object(&(yyloc), locations));
|
||||||
}
|
}
|
||||||
#line 4097 "src/parser.c"
|
#line 4098 "src/parser.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 168: /* MkDictPair: Keyword */
|
case 168: /* MkDictPair: Keyword */
|
||||||
#line 996 "src/parser.y"
|
#line 997 "src/parser.y"
|
||||||
{
|
{
|
||||||
(yyval.blk) = gen_dictpair(gen_const(jv_copy((yyvsp[0].literal))),
|
(yyval.blk) = gen_dictpair(gen_const(jv_copy((yyvsp[0].literal))),
|
||||||
gen_index(gen_noop(), gen_const((yyvsp[0].literal))));
|
gen_index(gen_noop(), gen_const((yyvsp[0].literal))));
|
||||||
}
|
}
|
||||||
#line 4106 "src/parser.c"
|
#line 4107 "src/parser.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 169: /* MkDictPair: '(' Exp ')' ':' ExpD */
|
case 169: /* MkDictPair: '(' Exp ')' ':' ExpD */
|
||||||
#line 1000 "src/parser.y"
|
#line 1001 "src/parser.y"
|
||||||
{
|
{
|
||||||
jv msg = check_object_key((yyvsp[-3].blk));
|
jv msg = check_object_key((yyvsp[-3].blk));
|
||||||
if (jv_is_valid(msg)) {
|
if (jv_is_valid(msg)) {
|
||||||
@@ -4115,20 +4116,20 @@ yyreduce:
|
|||||||
jv_free(msg);
|
jv_free(msg);
|
||||||
(yyval.blk) = gen_dictpair((yyvsp[-3].blk), (yyvsp[0].blk));
|
(yyval.blk) = gen_dictpair((yyvsp[-3].blk), (yyvsp[0].blk));
|
||||||
}
|
}
|
||||||
#line 4119 "src/parser.c"
|
#line 4120 "src/parser.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 170: /* MkDictPair: error ':' ExpD */
|
case 170: /* MkDictPair: error ':' ExpD */
|
||||||
#line 1008 "src/parser.y"
|
#line 1009 "src/parser.y"
|
||||||
{
|
{
|
||||||
FAIL((yyloc), "May need parentheses around object key expression");
|
FAIL((yyloc), "May need parentheses around object key expression");
|
||||||
(yyval.blk) = (yyvsp[0].blk);
|
(yyval.blk) = (yyvsp[0].blk);
|
||||||
}
|
}
|
||||||
#line 4128 "src/parser.c"
|
#line 4129 "src/parser.c"
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
||||||
#line 4132 "src/parser.c"
|
#line 4133 "src/parser.c"
|
||||||
|
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
@@ -4357,7 +4358,7 @@ yyreturnlab:
|
|||||||
return yyresult;
|
return yyresult;
|
||||||
}
|
}
|
||||||
|
|
||||||
#line 1012 "src/parser.y"
|
#line 1013 "src/parser.y"
|
||||||
|
|
||||||
|
|
||||||
int jq_parse(struct locfile* locations, block* answer) {
|
int jq_parse(struct locfile* locations, block* answer) {
|
||||||
|
|||||||
@@ -980,6 +980,7 @@ IDENT ':' ExpD {
|
|||||||
| BINDING ':' ExpD {
|
| BINDING ':' ExpD {
|
||||||
$$ = gen_dictpair(gen_location(@$, locations, gen_op_unbound(LOADV, jv_string_value($1))),
|
$$ = gen_dictpair(gen_location(@$, locations, gen_op_unbound(LOADV, jv_string_value($1))),
|
||||||
$3);
|
$3);
|
||||||
|
jv_free($1);
|
||||||
}
|
}
|
||||||
| BINDING {
|
| BINDING {
|
||||||
$$ = gen_dictpair(gen_const($1),
|
$$ = gen_dictpair(gen_const($1),
|
||||||
|
|||||||
+5
-1
@@ -1849,12 +1849,16 @@ reduce .[] as $then (4 as $else | $else; . as $elif | . + $then * $elif)
|
|||||||
[10,19,27,34]
|
[10,19,27,34]
|
||||||
|
|
||||||
|
|
||||||
# { $__loc__ } works
|
# Object construction
|
||||||
|
|
||||||
{ a, $__loc__, c }
|
{ a, $__loc__, c }
|
||||||
{"a":[1,2,3],"b":"foo","c":{"hi":"hey"}}
|
{"a":[1,2,3],"b":"foo","c":{"hi":"hey"}}
|
||||||
{"a":[1,2,3],"__loc__":{"file":"<top-level>","line":1},"c":{"hi":"hey"}}
|
{"a":[1,2,3],"__loc__":{"file":"<top-level>","line":1},"c":{"hi":"hey"}}
|
||||||
|
|
||||||
|
1 as $x | "2" as $y | "3" as $z | { $x, as, $y: 4, ($z): 5, if: 6, foo: 7 }
|
||||||
|
{"as":8}
|
||||||
|
{"x":1,"as":8,"2":4,"3":5,"if":6,"foo":7}
|
||||||
|
|
||||||
|
|
||||||
# nan is parsed as a valid NaN value from JSON
|
# nan is parsed as a valid NaN value from JSON
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user