Fix memory leaks in error paths of get_mode().

This commit is contained in:
Olaf Seibert
2021-11-14 18:58:58 +01:00
parent 5098927591
commit 2df94bfc43

View File

@@ -216,6 +216,8 @@ int get_mode(
int ok = expr_ok(mode->offset); int ok = expr_ok(mode->offset);
if (!ok) { if (!ok) {
*error = "Invalid expression after '#'"; *error = "Invalid expression after '#'";
free_tree(mode->offset);
mode->offset = NULL;
} }
return ok; return ok;
} }
@@ -302,6 +304,8 @@ int get_mode(
if (!expr_ok(mode->offset)) { if (!expr_ok(mode->offset)) {
*error = "Invalid expression"; *error = "Invalid expression";
free_tree(mode->offset);
mode->offset = NULL;
return FALSE; return FALSE;
} }
@@ -316,11 +320,15 @@ int get_mode(
if (reg == NO_REG) { if (reg == NO_REG) {
*error = "Register expected after 'offset('"; *error = "Register expected after 'offset('";
free_tree(value); free_tree(value);
free_tree(mode->offset);
mode->offset = NULL;
return FALSE; /* Syntax error in addressing mode */ return FALSE; /* Syntax error in addressing mode */
} }
if (cp = skipwhite(value->cp), *cp++ != ')') { if (cp = skipwhite(value->cp), *cp++ != ')') {
*error = "')' expected after 'offset(register'"; *error = "')' expected after 'offset(register'";
free_tree(value); free_tree(value);
free_tree(mode->offset);
mode->offset = NULL;
return FALSE; /* Syntax error in addressing mode */ return FALSE; /* Syntax error in addressing mode */
} }