fix double-free in map literal containing non-ephemerals

This commit is contained in:
John Kerl 2017-01-05 18:32:22 -05:00
parent 60b3359568
commit aeeef5cc7a
3 changed files with 15 additions and 12 deletions

View file

@ -1464,7 +1464,7 @@ static void handle_dump(
mlhmmv_level_print_stacked(boxed_xval.xval.pnext_level, 0, FALSE, FALSE, "", pstate->stdfp); // xxx mk simpler call w/ dfl args
}
if (!boxed_xval.xval.is_terminal && boxed_xval.is_ephemeral) {
if (boxed_xval.is_ephemeral) {
mlhmmv_xvalue_free(&boxed_xval.xval);
}
}
@ -1500,7 +1500,7 @@ static void handle_dump_to_file(
free(filename);
mv_free(&filename_mv);
if (!boxed_xval.xval.is_terminal && boxed_xval.is_ephemeral) {
if (boxed_xval.is_ephemeral) {
mlhmmv_xvalue_free(&boxed_xval.xval);
}
}

View file

@ -190,11 +190,11 @@ static void rxval_evaluator_from_map_literal_aux(
if (pkvpair->is_terminal) {
boxed_xval_t boxed_xval = pkvpair->pxval_evaluator->pprocess_func(
pkvpair->pxval_evaluator->pvstate, pvars);
if (!boxed_xval.xval.is_terminal && !boxed_xval.is_ephemeral) {
if (boxed_xval.is_ephemeral) {
mlhmmv_level_put_xvalue_singly_keyed(plevel, &mvkey, &boxed_xval.xval);
} else {
mlhmmv_xvalue_t copy_xval = mlhmmv_xvalue_copy(&boxed_xval.xval);
mlhmmv_level_put_xvalue_singly_keyed(plevel, &mvkey, &copy_xval);
} else {
mlhmmv_level_put_xvalue_singly_keyed(plevel, &mvkey, &boxed_xval.xval);
}
} else {
mlhmmv_level_t* pnext_level = mlhmmv_level_put_empty_map(plevel, &mvkey);

View file

@ -1,13 +1,6 @@
================================================================
BUGFIXES
* segv:
k mlr --from segv.tsv --itsvlite --oxtab put 'o=splitnv($b, ":"); for (k,v in o) {$["b".k]=v}'
k mlr --from segv.tsv --itsvlite --oxtab put 'o=splitnv($b, ","); for (k,v in o) {$["b".k]=v}'
k mlr --from segv.tsv --itsvlite --oxtab put -q 'o=splitnv($b, ","); for (k,v in o) {emit mapsum($*, {"b":v})}'
mlr --from segv.tsv --itsvlite --oxtab put -q 'o=splitnv($b, ":"); for (k,v in o) {emit mapsum($*, {"b":v})}'
mlr --from segv.tsv --itsvlite --oxtab put -q 'o=splitnv($b, ":"); for (k,v in o) {emit {k:v}}'
* non-strings should be non-split (length-1 omap). or, coerced to string.
================================================================
@ -74,6 +67,16 @@ cook 2: verbs vs. dsl/func list
* seqgen vs.
mlr -n put 'begin {for (int i = 0; i < 10; i += 1) {emit {"a":i,"b":i**2} }}' then sort -nr a
* xxx:
mlr --from segv.tsv --itsvlite --oxtab put 'o=splitnv($b, ":"); for (k,v in o) {$["b".k]=v}'
mlr --from segv.tsv --itsvlite --oxtab put 'o=splitnv($b, ","); for (k,v in o) {$["b".k]=v}'
mlr --from segv.tsv --itsvlite --oxtab put -q 'o=splitnv($b, ","); for (k,v in o) {emit mapsum($*, {"b":v})}'
mlr --from segv.tsv --itsvlite --oxtab put -q 'o=splitnv($b, ":"); for (k,v in o) {emit mapsum($*, {"b":v})}'
mlr --from segv.tsv --itsvlite --oxtab put -q 'o=splitnv($b, ":"); for (k,v in o) {emit {k:v}}'
mlr --from segv.tsv --itsvlite --oxtab put -q ' for (k,v in $*) {emit {k:v}}'
mlr --from segv.tsv --itsvlite --oxtab put -q 'o={}; for (k,v in $*) {o[k]=v}; emit o'
mlr --from segv.tsv --itsvlite --oxtab put -q ' for (k,v in {1:2}) {emit {k:v}}'
cook 3: fun stuff:
* mand
* sieve