Skip to content

Commit bd221db

Browse files
author
Noam Preil
committed
Fix more leaks
1 parent 068073f commit bd221db

File tree

4 files changed

+14
-16
lines changed

4 files changed

+14
-16
lines changed

assembler/assembler.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ void transform_relative_labels(tokenized_expression_t *expression, int last_rela
8888
const char *fmtstring = "relative@%d";
8989
int len = log10_u64(relative_label);
9090
const int size = strlen(fmtstring) - 2 + len + 1;
91+
free(token->symbol);
9192
token->symbol = malloc(size);
9293
if (snprintf(token->symbol, size, fmtstring, relative_label) != size - 1) {
9394
scas_log(L_ERROR, "UNREACHABLE");

assembler/directives.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -732,6 +732,7 @@ int handle_equ(struct assembler_state *state, char **argv, int argc) {
732732
return 1;
733733
} else {
734734
result = evaluate_expression(expression, state->equates, &error, &symbol);
735+
free_expression(expression);
735736
}
736737
if (error == EXPRESSION_BAD_SYMBOL) {
737738
ERROR(ERROR_UNKNOWN_SYMBOL, state->column, symbol);
@@ -747,7 +748,6 @@ int handle_equ(struct assembler_state *state, char **argv, int argc) {
747748
list_add(state->equates, sym);
748749
scas_log(L_DEBUG, "Added equate '%s' with value 0x%08X", sym->name, sym->value);
749750
}
750-
free_expression(expression);
751751
return 1;
752752
}
753753

@@ -923,6 +923,7 @@ int handle_if(struct assembler_state *state, char **argv, int argc) {
923923
return 1;
924924
} else {
925925
result = evaluate_expression(expression, state->equates, &error, &symbol);
926+
free_expression(expression);
926927
}
927928
if (error == EXPRESSION_BAD_SYNTAX) {
928929
ERROR(ERROR_INVALID_SYNTAX, state->column);
@@ -1239,6 +1240,7 @@ int handle_org(struct assembler_state *state, char **argv, int argc) {
12391240
return 1;
12401241
} else {
12411242
result = evaluate_expression(expression, state->equates, &error, &symbol);
1243+
free_expression(expression);
12421244
}
12431245
if (error == EXPRESSION_BAD_SYMBOL) {
12441246
ERROR(ERROR_UNKNOWN_SYMBOL, state->column, symbol);

assembler/privatize.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,7 @@ void rename_symbol(area_t *a, const char *original, const char *new) {
2020
if (tok->type == SYMBOL) {
2121
if (strcasecmp(tok->symbol, original) == 0) {
2222
free(tok->symbol);
23-
tok->symbol = malloc(strlen(new) + 1);
24-
strcpy(tok->symbol, new);
23+
tok->symbol = strdup(new);
2524
}
2625
}
2726
}

common/expression.c

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,6 @@ uint64_t evaluate_expression(tokenized_expression_t *expression, list_t
108108
*symbols, int *error, char **symbol) {
109109
stack_type *stack = create_stack();
110110
list_t *to_free = create_list();
111-
expression_token_t *token;
112111
expression_token_t *resolved;
113112
operator_t op;
114113
uint64_t res = 0;
@@ -158,7 +157,7 @@ uint64_t evaluate_expression(tokenized_expression_t *expression, list_t
158157
if (stack->length == 0) {
159158
*error = 1;
160159
} else {
161-
token = stack_pop(stack);
160+
expression_token_t *token = stack_pop(stack);
162161
if (token->type != NUMBER) {
163162
*error = 1;
164163
} else {
@@ -279,10 +278,7 @@ void free_expression(tokenized_expression_t *expression) {
279278
free_expression_token((expression_token_t*)expression->tokens->items[i]);
280279
}
281280
list_free(expression->tokens);
282-
for (int i = 0; i < expression->symbols->length; i += 1) {
283-
free_expression_token((expression_token_t*)expression->symbols->items[i]);
284-
}
285-
list_free(expression->symbols);
281+
free_flat_list(expression->symbols);
286282
free(expression);
287283
}
288284

@@ -313,7 +309,7 @@ tokenized_expression_t *parse_expression(const char *str) {
313309
break;
314310
} else if (isdigit(*current) || *current == '\'') {
315311
if (tokenizer_state == STATE_VALUE) {
316-
free(list);
312+
free_expression(list);
317313
list = NULL;
318314
goto exit;
319315
}
@@ -326,7 +322,7 @@ tokenized_expression_t *parse_expression(const char *str) {
326322
tokenizer_state = STATE_VALUE;
327323
} else if (*current == '(') {
328324
if (tokenizer_state == STATE_VALUE) {
329-
free(list);
325+
free_expression(list);
330326
list = NULL;
331327
goto exit;
332328
}
@@ -338,7 +334,7 @@ tokenized_expression_t *parse_expression(const char *str) {
338334
continue;
339335
} else if (*current == ')') {
340336
if (stack->length == 0 || tokenizer_state == STATE_OPERATOR) {
341-
free(list);
337+
free_expression(list);
342338
list = NULL;
343339
goto exit;
344340
}
@@ -349,7 +345,7 @@ tokenized_expression_t *parse_expression(const char *str) {
349345

350346
if (stack->length <= 0) {
351347
expr = 0;
352-
free(list);
348+
free_expression(list);
353349
list = NULL;
354350
goto exit;
355351
}
@@ -365,14 +361,14 @@ tokenized_expression_t *parse_expression(const char *str) {
365361
} else if(strchr(operator_cache, *current)) {
366362
expr = parse_operator(&current, tokenizer_state == STATE_OPERATOR);
367363
if (expr == 0) {
368-
free(list);
364+
free_expression(list);
369365
list = NULL;
370366
goto exit;
371367
}
372368
tokenizer_state = STATE_OPERATOR;
373369
} else {
374370
if (tokenizer_state == STATE_VALUE) {
375-
free(list);
371+
free_expression(list);
376372
list = NULL;
377373
goto exit;
378374
}
@@ -382,7 +378,7 @@ tokenized_expression_t *parse_expression(const char *str) {
382378
}
383379

384380
if (!expr) {
385-
free(list);
381+
free_expression(list);
386382
list = NULL;
387383
goto exit;
388384
}

0 commit comments

Comments
 (0)