Make sure to free default @text format on error
It seems that bison doesn't call destructors for mid-rule action components on error, since it does not know their type. A mid-rule action was used to allocate the "text" string used as format by string literals without a format, which would leak on error. This patch replaces it with a new NoFormat component of type <literal>. Now bison will call jv_free() on that string after a syntax error. Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=60836 $ ./jq '"' jq: error: syntax error, unexpected end of file, expecting QQSTRING_TEXT or QQSTRING_INTERP_START or QQSTRING_END (Unix shell quoting issues?) at <top-level>, line 1: " jq: 1 compile error ================================================================= ==1495450==ERROR: LeakSanitizer: detected memory leaks Direct leak of 21 byte(s) in 1 object(s) allocated from: #0 0x7fc21aee1359 in __interceptor_malloc /usr/src/debug/gcc/gcc/libsanitizer/asan/asan_malloc_linux.cpp:69 #1 0x557ccb6ff608 in jv_mem_alloc src/jv_alloc.c:141 SUMMARY: AddressSanitizer: 21 byte(s) leaked in 1 allocation(s).
This commit is contained in:
1 parent
a949745059
commit
ae95864b6b
2 files changed
+585
-571
No files matched your search
Generated
+577
-569
File diff suppressed because it is too large.
Load diff
+8
-2
@@ -122,6 +122,7 @@ struct lexer_param;
|
|||||||
%type <blk> Param Params Arg Args
|
%type <blk> Param Params Arg Args
|
||||||
%type <blk> Patterns RepPatterns Pattern ArrayPats ObjPats ObjPat
|
%type <blk> Patterns RepPatterns Pattern ArrayPats ObjPats ObjPat
|
||||||
%type <literal> Keyword
|
%type <literal> Keyword
|
||||||
|
%type <literal> NoFormat
|
||||||
%{
|
%{
|
||||||
#include "lexer.h"
|
#include "lexer.h"
|
||||||
struct lexer_param {
|
struct lexer_param {
|
||||||
@@ -593,10 +594,15 @@ IDENT {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
NoFormat:
|
||||||
|
%empty {
|
||||||
|
$$ = jv_string("text");
|
||||||
|
}
|
||||||
|
|
||||||
String:
|
String:
|
||||||
QQSTRING_START { $<literal>$ = jv_string("text"); } QQString QQSTRING_END {
|
QQSTRING_START NoFormat QQString QQSTRING_END {
|
||||||
$$ = $3;
|
$$ = $3;
|
||||||
jv_free($<literal>2);
|
jv_free($2);
|
||||||
} |
|
} |
|
||||||
FORMAT QQSTRING_START { $<literal>$ = $1; } QQString QQSTRING_END {
|
FORMAT QQSTRING_START { $<literal>$ = $1; } QQString QQSTRING_END {
|
||||||
$$ = $4;
|
$$ = $4;
|
||||||
|
|||||||
Reference in new issue
Block a user