Fix some memory leakage found

This commit is contained in:
Bi-Ruei, Chiu 2017-05-04 21:45:05 +08:00
parent 0eca8c3227
commit 3dcf05bbb0
13 changed files with 109 additions and 17 deletions

View File

@ -65,6 +65,7 @@ main(int ac, char **av) {
int ret; /* Return value from misc functions */
int ch; /* Command line character */
int i; /* Index in some loops */
int exit_code = 0; /* Exit code */
/*
* Process command-line options.
@ -262,7 +263,8 @@ main(int ac, char **av) {
new_asn = asn1p_parse_file(av[i], asn1_parser_flags);
if(new_asn == NULL) {
fprintf(stderr, "Cannot parse \"%s\"\n", av[i]);
exit(EX_DATAERR);
exit_code = EX_DATAERR;
goto cleanup;
}
/*
@ -286,7 +288,10 @@ main(int ac, char **av) {
* Dump the parsed ASN.1 tree if -E specified and -F is NOT given.
*/
if(print_arg__print_out && !print_arg__fix_n_print) {
if(asn1print(asn, asn1_printer_flags)) exit(EX_SOFTWARE);
if(asn1print(asn, asn1_printer_flags)) {
exit_code = EX_SOFTWARE;
goto cleanup;
}
return 0;
}
@ -294,7 +299,10 @@ main(int ac, char **av) {
* Read in the files from skeletons/standard-modules
*/
if(importStandardModules(asn, skeletons_dir)) {
if(warnings_as_errors) exit(EX_DATAERR);
if(warnings_as_errors) {
exit_code = EX_DATAERR;
goto cleanup;
}
}
/*
@ -310,14 +318,18 @@ main(int ac, char **av) {
case 0:
break; /* All clear */
case -1:
exit(EX_DATAERR); /* Fatal failure */
exit_code = EX_DATAERR; /* Fatal failure */
goto cleanup;
}
/*
* Dump the parsed ASN.1 tree if -E specified and -F is given.
*/
if(print_arg__print_out && print_arg__fix_n_print) {
if(asn1print(asn, asn1_printer_flags)) exit(EX_SOFTWARE);
if(asn1print(asn, asn1_printer_flags)) {
exit_code = EX_SOFTWARE;
goto cleanup;
}
return 0;
}
@ -327,10 +339,13 @@ main(int ac, char **av) {
*/
if(asn1_compile(asn, skeletons_dir, asn1_compiler_flags, ac + optind,
optind, av - optind)) {
exit(EX_SOFTWARE);
exit_code = EX_SOFTWARE;
}
cleanup:
asn1p_delete(asn);
asn1p_lex_destroy();
if (exit_code) exit(exit_code);
return 0;
}
@ -415,6 +430,7 @@ importStandardModules(asn1p_t *asn, const char *skeletons_dir) {
TQ_ADD(&(asn->modules), mod, mod_next);
}
asn1p_delete(new_asn);
asn1p_lex_destroy();
#ifdef _WIN32
} while(_findnext(dir, &c_file) == 0);

View File

@ -267,6 +267,7 @@ asn1c_emit_constraint_tables(arg_t *arg, int got_size) {
*/
assert(range->el_count == 0);
/* The full range is specified. Ignore it. */
asn1constraint_range_free(range);
return 0;
}

View File

@ -60,7 +60,7 @@ asn1f_pull_components_of(arg_t *arg) {
coft = asn1p_expr_clone(terminal, 1 /* Skip extensions */);
if(!coft) return -1; /* ENOMEM */
if(0) {
if(1) {
asn1p_expr_free(memb); /* Don't need it anymore*/
} else {
/* Actual removal clashes with constraints... skip. */

View File

@ -206,12 +206,14 @@ _asn1f_assign_cell_value(arg_t *arg, struct asn1p_ioc_row_s *row, struct asn1p_i
ref = asn1p_ref_new(arg->expr->_lineno);
asn1p_ref_add_component(ref, p, RLT_UNKNOWN);
assert(ref);
expr = asn1f_lookup_symbol(arg, arg->mod, arg->expr->rhs_pspecs, ref);
if(!expr) {
FATAL("Cannot find %s referenced by %s at line %d",
p, arg->expr->Identifier,
arg->expr->_lineno);
asn1p_ref_free(ref);
free(p);
return -1;
}
}

View File

@ -26,7 +26,7 @@ asn1f_printable_value(asn1p_value_t *v) {
size_t tmp_len = (len); \
if(tmp_len >= managedptr_len) { \
free(managedptr); \
managedptr = malloc(tmp_len + 1); \
managedptr = calloc(1, tmp_len + 1); \
if(managedptr) { \
managedptr_len = tmp_len; \
} else { \

View File

@ -222,8 +222,8 @@ void
asn1p_expr_add_many(asn1p_expr_t *to, asn1p_expr_t *from_what) {
asn1p_expr_t *expr;
TQ_FOR(expr, &(from_what->members), next) {
expr->parent_expr = to;
}
expr->parent_expr = to;
}
TQ_CONCAT(&(to->members), &(from_what->members), next);
}
@ -257,9 +257,25 @@ asn1p_expr_free(asn1p_expr_t *expr) {
asn1p_constraint_free(expr->constraints);
asn1p_constraint_free(expr->combined_constraints);
asn1p_paramlist_free(expr->lhs_params);
asn1p_expr_free(expr->rhs_pspecs);
asn1p_value_free(expr->value);
asn1p_value_free(expr->marker.default_value);
asn1p_wsyntx_free(expr->with_syntax);
if(expr->specializations.pspec) {
int pspec;
for(pspec = 0; pspec < expr->specializations.pspecs_count; pspec++) {
asn1p_expr_free(expr->specializations.pspec[pspec].rhs_pspecs);
asn1p_expr_free(expr->specializations.pspec[pspec].my_clone);
}
free(expr->specializations.pspec);
}
if(expr->object_class_matrix.row) {
int row;
for(row = 0; row < expr->object_class_matrix.rows; row++) {
asn1p_ioc_row_delete(expr->object_class_matrix.row[row]);
}
free(expr->object_class_matrix.row);
}
if(expr->data && expr->data_free)
expr->data_free(expr->data);

View File

@ -209,7 +209,7 @@ WSP [\t\r\v\f\n ]
'[0-9A-F \t\r\v\f\n]+'H {
/* " \t\r\n" weren't allowed in ASN.1:1990. */
asn1p_lval.tv_str = yytext;
asn1p_lval.tv_str = strdup(yytext);
return TOK_hstring;
}

View File

@ -26,12 +26,19 @@ void
asn1p_module_free(asn1p_module_t *mod) {
if(mod) {
asn1p_expr_t *expr;
asn1p_xports_t *xports;
free(mod->ModuleName);
free(mod->source_file_name);
asn1p_oid_free(mod->module_oid);
while((xports = TQ_REMOVE(&(mod->exports), xp_next)))
asn1p_xports_free(xports);
while((xports = TQ_REMOVE(&(mod->imports), xp_next)))
asn1p_xports_free(xports);
while((expr = TQ_REMOVE(&(mod->members), next)))
asn1p_expr_free(expr);

View File

@ -25,8 +25,14 @@ asn1p_xports_new() {
void
asn1p_xports_free(asn1p_xports_t *xp) {
if(xp) {
asn1p_expr_t *expr;
free(xp->fromModuleName);
asn1p_oid_free(xp->identifier.oid);
while((expr = TQ_REMOVE(&(xp->members), next)))
asn1p_expr_free(expr);
free(xp);
}
}

View File

@ -2449,6 +2449,10 @@ yyreduce:
AL_IMPORT((yyval.a_module), exports, (yyvsp[(1) - (3)].a_module), xp_next);
AL_IMPORT((yyval.a_module), imports, (yyvsp[(2) - (3)].a_module), xp_next);
AL_IMPORT((yyval.a_module), members, (yyvsp[(3) - (3)].a_module), next);
asn1p_module_free((yyvsp[(1) - (3)].a_module));
asn1p_module_free((yyvsp[(2) - (3)].a_module));
asn1p_module_free((yyvsp[(3) - (3)].a_module));
}
break;
@ -2469,6 +2473,8 @@ yyreduce:
break;
}
AL_IMPORT((yyval.a_module), members, (yyvsp[(2) - (2)].a_module), next);
asn1p_module_free((yyvsp[(2) - (2)].a_module));
}
break;
@ -2925,7 +2931,7 @@ yyreduce:
{
(yyval.a_expr) = NEW_EXPR();
checkmem((yyval.a_expr));
(yyval.a_expr)->Identifier = "?";
(yyval.a_expr)->Identifier = strdup("?");
(yyval.a_expr)->expr_type = A1TC_REFERENCE;
(yyval.a_expr)->meta_type = AMT_VALUE;
(yyval.a_expr)->value = (yyvsp[(1) - (1)].a_value);
@ -2989,6 +2995,7 @@ yyreduce:
{
(yyval.a_expr) = (yyvsp[(1) - (5)].a_expr);
asn1p_expr_add_many((yyval.a_expr), (yyvsp[(4) - (5)].a_expr));
asn1p_expr_free((yyvsp[(4) - (5)].a_expr));
}
break;
@ -3324,6 +3331,8 @@ yyreduce:
} else {
if((yyval.a_expr)->constraints) {
assert(!(yyvsp[(2) - (3)].a_expr));
/* Check this : optConstraints is not used ?! */
asn1p_constraint_free((yyvsp[(3) - (3)].a_constr));
} else {
(yyval.a_expr)->constraints = (yyvsp[(3) - (3)].a_constr);
}
@ -4412,6 +4421,7 @@ yyreduce:
(yyval.a_constr) = asn1p_constraint_new(yylineno);
(yyval.a_constr)->type = ACT_CT_CTNG;
(yyval.a_constr)->value = asn1p_value_fromtype((yyvsp[(2) - (2)].a_expr));
asn1p_expr_free((yyvsp[(2) - (2)].a_expr));
}
break;

View File

@ -529,6 +529,10 @@ ModuleBody:
AL_IMPORT($$, exports, $1, xp_next);
AL_IMPORT($$, imports, $2, xp_next);
AL_IMPORT($$, members, $3, next);
asn1p_module_free($1);
asn1p_module_free($2);
asn1p_module_free($3);
}
;
@ -544,6 +548,7 @@ AssignmentList:
break;
}
AL_IMPORT($$, members, $2, next);
asn1p_module_free($2);
}
;
@ -874,6 +879,7 @@ ParameterArgumentName:
ret = asn1p_ref_add_component($$.governor, $1, 0);
checkmem(ret == 0);
$$.argument = $3;
free($1);
}
| TypeRefName ':' TypeRefName {
int ret;
@ -881,6 +887,7 @@ ParameterArgumentName:
ret = asn1p_ref_add_component($$.governor, $1, 0);
checkmem(ret == 0);
$$.argument = $3;
free($1);
}
| BasicTypeId ':' Identifier {
int ret;
@ -919,7 +926,7 @@ ActualParameter:
| SimpleValue {
$$ = NEW_EXPR();
checkmem($$);
$$->Identifier = "?";
$$->Identifier = strdup("?");
$$->expr_type = A1TC_REFERENCE;
$$->meta_type = AMT_VALUE;
$$->value = $1;
@ -972,8 +979,9 @@ ComponentTypeLists:
asn1p_expr_add($$, $3);
}
| ComponentTypeLists ',' TOK_VBracketLeft ComponentTypeLists TOK_VBracketRight {
$$ = $1;
$$ = $1;
asn1p_expr_add_many($$, $4);
asn1p_expr_free($4);
}
;
@ -1225,6 +1233,8 @@ Type:
} else {
if($$->constraints) {
assert(!$2);
/* Check this : optConstraints is not used ?! */
asn1p_constraint_free($3);
} else {
$$->constraints = $3;
}
@ -1316,6 +1326,7 @@ TypeDeclarationSet:
checkmem(ret == 0);
$$->expr_type = ASN_TYPE_ANY;
$$->meta_type = AMT_TYPE;
free($4);
}
| TOK_INSTANCE TOK_OF ComplexTypeReference {
$$ = NEW_EXPR();
@ -1349,6 +1360,7 @@ ComplexTypeReference:
ret = asn1p_ref_add_component($$, $3, RLT_UNKNOWN);
checkmem(ret == 0);
free($1);
free($3);
}
| ObjectClassReference '.' TypeRefName {
int ret;
@ -1359,6 +1371,7 @@ ComplexTypeReference:
ret = asn1p_ref_add_component($$, $3, RLT_UNKNOWN);
checkmem(ret == 0);
free($1);
free($3);
}
| TOK_typereference '.' Identifier {
int ret;
@ -1369,6 +1382,7 @@ ComplexTypeReference:
ret = asn1p_ref_add_component($$, $3, RLT_lowercase);
checkmem(ret == 0);
free($1);
free($3);
}
| ObjectClassReference {
int ret;
@ -1438,14 +1452,17 @@ FieldName:
TOK_typefieldreference {
$$ = asn1p_ref_new(yylineno);
asn1p_ref_add_component($$, $1, RLT_AmpUppercase);
free($1);
}
| FieldName '.' TOK_typefieldreference {
$$ = $$;
asn1p_ref_add_component($$, $3, RLT_AmpUppercase);
free($3);
}
| FieldName '.' TOK_valuefieldreference {
$$ = $$;
asn1p_ref_add_component($$, $3, RLT_Amplowercase);
free($3);
}
;
@ -1453,12 +1470,15 @@ DefinedObjectClass:
TOK_capitalreference {
$$ = asn1p_ref_new(yylineno);
asn1p_ref_add_component($$, $1, RLT_CAPITALS);
free($1);
}
/*
| TypeRefName '.' TOK_capitalreference {
$$ = asn1p_ref_new(yylineno);
asn1p_ref_add_component($$, $1, RLT_AmpUppercase);
asn1p_ref_add_component($$, $3, RLT_CAPITALS);
free($1);
free($3);
}
*/
;
@ -1515,10 +1535,12 @@ SimpleValue:
| TOK_bstring {
$$ = _convert_bitstring2binary($1, 'B');
checkmem($$);
free($1);
}
| TOK_hstring {
$$ = _convert_bitstring2binary($1, 'H');
checkmem($$);
free($1);
}
| RestrictedCharacterStringValue {
$$ = $$;
@ -1849,6 +1871,7 @@ PatternConstraint:
ref = asn1p_ref_new(yylineno);
asn1p_ref_add_component(ref, $2, RLT_lowercase);
$$->value = asn1p_value_fromref(ref, 0);
free($2);
}
;
@ -1892,10 +1915,12 @@ BitStringValue:
TOK_bstring {
$$ = _convert_bitstring2binary($1, 'B');
checkmem($$);
free($1);
}
| TOK_hstring {
$$ = _convert_bitstring2binary($1, 'H');
checkmem($$);
free($1);
}
;
@ -1993,6 +2018,7 @@ ContentsConstraint:
$$ = asn1p_constraint_new(yylineno);
$$->type = ACT_CT_CTNG;
$$->value = asn1p_value_fromtype($2);
asn1p_expr_free($2);
}
;
@ -2026,6 +2052,7 @@ SimpleTableConstraint:
ct->type = ACT_EL_VALUE;
ct->value = asn1p_value_fromref(ref, 0);
CONSTRAINT_INSERT($$, ACT_CA_CRC, ct, 0);
free($2);
}
;
@ -2094,6 +2121,8 @@ ComponentIdList:
$$[l1] = '.';
memcpy($$ + l1 + 1, $3, l3);
$$[l1 + 1 + l3] = '\0';
free($1);
free($3);
}
;

View File

@ -53,8 +53,10 @@ asn1p_parse_buffer(const char *buffer, int size /* = -1 */, enum asn1p_flags fla
if(ret == 0) {
assert(a);
if(_asn1p_fix_modules(a, "-"))
if(_asn1p_fix_modules(a, "-")) {
asn1p_delete(a);
return NULL; /* FIXME: destroy (a) */
}
} else if(a) {
asn1p_delete(a);
a = NULL;
@ -110,8 +112,10 @@ asn1p_parse_file(const char *filename, enum asn1p_flags flags) {
if(ret == 0) {
assert(a);
if(_asn1p_fix_modules(a, filename))
if(_asn1p_fix_modules(a, filename)) {
asn1p_delete(a);
return NULL; /* FIXME: destroy (a) */
}
} else if(a) {
asn1p_delete(a);
a = NULL;

View File

@ -70,5 +70,6 @@ asn1p_t *asn1p_parse_buffer(const char *buffer, int size /* = -1 */,
enum asn1p_flags);
int asn1p_atoi(const char *ptr, asn1c_integer_t *r_value);
int asn1p_lex_destroy();
#endif /* ASN1PARSER_H */