From 1e1719239ae3fc8d8e3a375ededc40a847a29896 Mon Sep 17 00:00:00 2001 From: Krasimir Angelov Date: Sun, 29 Jan 2023 13:44:32 +0100 Subject: [PATCH] spotted more potential crashes --- src/runtime/c/pgf/reader.cxx | 56 ++++++++++++++++++++++++------------ 1 file changed, 38 insertions(+), 18 deletions(-) diff --git a/src/runtime/c/pgf/reader.cxx b/src/runtime/c/pgf/reader.cxx index 525cb8a54..cc9019e93 100644 --- a/src/runtime/c/pgf/reader.cxx +++ b/src/runtime/c/pgf/reader.cxx @@ -267,7 +267,7 @@ PgfExpr PgfReader::read_expr() auto type = read_type(); ref etyped = PgfDB::malloc(); etyped->expr = expr; - etyped->type = type; + etyped->type = type.as_object(); expr = etyped.tagged(); break; } @@ -310,9 +310,8 @@ ref PgfReader::read_absfun() { ref absfun = read_name(&PgfAbsFun::name); - ref efun = - ref::from_ptr((PgfExprFun*) &absfun->name); - absfun->type = read_type(); + auto type = read_type(); + absfun->type = type; absfun->arity = read_int(); uint8_t tag = read_tag(); @@ -322,7 +321,8 @@ ref PgfReader::read_absfun() break; case 1: { read_len(); - absfun->bytecode = PgfDB::malloc(0); + auto dummy = PgfDB::malloc(0); + absfun->bytecode = dummy; break; } default: @@ -335,7 +335,8 @@ ref PgfReader::read_absfun() ref PgfReader::read_abscat() { ref abscat = read_name(&PgfAbsCat::name); - abscat->context = read_vector(&PgfReader::read_hypo); + auto context = read_vector(&PgfReader::read_hypo); + abscat->context = context; abscat->prob = read_prob(&abscat->name); return abscat; } @@ -410,10 +411,15 @@ void PgfReader::read_abstract(ref abstract) { this->abstract = abstract; - abstract->name = read_name(); - abstract->aflags = read_namespace(&PgfReader::read_flag); - abstract->funs = read_namespace(&PgfReader::read_absfun); - abstract->cats = read_namespace(&PgfReader::read_abscat); + auto name = read_name(); + auto aflags = read_namespace(&PgfReader::read_flag); + auto funs = read_namespace(&PgfReader::read_absfun); + auto cats = read_namespace(&PgfReader::read_abscat); + + abstract->name = name; + abstract->aflags = aflags; + abstract->funs = funs; + abstract->cats = cats; if (probs_callback != NULL) { PgfExn err; @@ -477,7 +483,7 @@ void PgfReader::read_variable_range(ref var_info) void PgfReader::read_parg(ref parg) { - parg->param = read_lparam(); + auto param = read_lparam(); parg->param = param; } ref PgfReader::read_presult() @@ -820,13 +826,25 @@ ref PgfReader::read_printname() ref PgfReader::read_concrete() { concrete = read_name(&PgfConcr::name); - concrete->cflags = read_namespace(&PgfReader::read_flag); - concrete->phrasetable = read_phrasetable(); - concrete->lincats = read_namespace(&PgfReader::read_lincat); - concrete->lins = read_namespace(&PgfReader::read_lin); - concrete->printnames = read_namespace(&PgfReader::read_printname); + + auto cflags = read_namespace(&PgfReader::read_flag); + concrete->cflags = cflags; + + auto phrasetable = read_phrasetable(); + concrete->phrasetable = phrasetable; + + auto lincats = read_namespace(&PgfReader::read_lincat); + concrete->lincats = lincats; + + auto lins = read_namespace(&PgfReader::read_lin); + concrete->lins = lins; + + auto printnames = read_namespace(&PgfReader::read_printname); + concrete->printnames = printnames; + concrete->prev = 0; concrete->next = 0; + return concrete; } @@ -842,11 +860,13 @@ ref PgfReader::read_pgf() throw pgf_error("Unsupported format version"); } - pgf->gflags = read_namespace(&PgfReader::read_flag); + auto gflags = read_namespace(&PgfReader::read_flag); + pgf->gflags = gflags; read_abstract(ref::from_ptr(&pgf->abstract)); - pgf->concretes = read_namespace(&PgfReader::read_concrete); + auto concretes = read_namespace(&PgfReader::read_concrete); + pgf->concretes = concretes; return pgf; }