From 5b5ecc6934614194ef0ffe221f68d7a1da0f690f Mon Sep 17 00:00:00 2001 From: krangelov Date: Thu, 23 Dec 2021 14:26:51 +0100 Subject: [PATCH] prevent crashes --- src/runtime/c/pgf/reader.cxx | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/src/runtime/c/pgf/reader.cxx b/src/runtime/c/pgf/reader.cxx index 2e32f54bd..0b7c1d50a 100644 --- a/src/runtime/c/pgf/reader.cxx +++ b/src/runtime/c/pgf/reader.cxx @@ -255,21 +255,25 @@ PgfExpr PgfReader::read_expr() PgfBindType bind_type = (PgfBindType) read_tag(); ref eabs = read_name(&PgfExprAbs::name); eabs->bind_type = bind_type; - eabs->body = read_expr(); + PgfExpr body = read_expr(); + eabs->body = body; expr = ref::tagged(eabs); break; } case PgfExprApp::tag: { + PgfExpr fun = read_expr(); + PgfExpr arg = read_expr(); ref eapp = PgfDB::malloc(); - eapp->fun = read_expr(); - eapp->arg = read_expr(); + eapp->fun = fun; + eapp->arg = arg; expr = ref::tagged(eapp); break; } case PgfExprLit::tag: { + PgfExpr lit = read_literal(); ref elit = PgfDB::malloc(); - elit->lit = read_literal(); - expr = ref::tagged(elit); + elit->lit = lit; + expr = ref::tagged(elit); break; } case PgfExprMeta::tag: { @@ -290,15 +294,18 @@ PgfExpr PgfReader::read_expr() break; } case PgfExprTyped::tag: { + auto expr = read_expr(); + auto type = read_type(); ref etyped = PgfDB::malloc(); - etyped->expr = read_expr(); - etyped->type = read_type(); + etyped->expr = expr; + etyped->type = type; expr = ref::tagged(etyped); - break; + break; } case PgfExprImplArg::tag: { + auto expr = read_expr(); ref eimpl = current_db->malloc(); - eimpl->expr = read_expr(); + eimpl->expr = expr; expr = ref::tagged(eimpl); break; } @@ -312,18 +319,21 @@ PgfExpr PgfReader::read_expr() void PgfReader::read_hypo(ref hypo) { hypo->bind_type = (PgfBindType) read_tag(); - hypo->cid = read_name(); - hypo->type = read_type(); + auto cid = read_name(); + hypo->cid = cid; + auto type = read_type(); + hypo->type = type; } ref PgfReader::read_type() { - ref> hypos = + auto hypos = read_vector(&PgfReader::read_hypo); ref tp = read_name(&PgfDTyp::name); tp->hypos = hypos; - tp->exprs = + auto exprs = read_vector(&PgfReader::read_expr); + tp->exprs = exprs; return tp; }