Merged revisions 7736 via svnmerge from

https://origsvn.digium.com/svn/asterisk/branches/1.2

........
r7736 | kpfleming | 2006-01-03 10:34:12 -0600 (Tue, 03 Jan 2006) | 2 lines

don't leak memory for (most) expression evaluations

........


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@7737 65c4cc65-6c06-0410-ace0-fbb531ad65f3
1.4
Kevin P. Fleming 20 years ago
parent 1e6ada5f68
commit 142ef858a5

@ -98,42 +98,42 @@ int ast_yyerror(const char *, YYLTYPE *, struct parse_io *); /* likewise */
int ast_expr(char *expr, char *buf, int length) int ast_expr(char *expr, char *buf, int length)
{ {
struct parse_io *io; struct parse_io io;
int return_value = 0;
io = calloc(sizeof(struct parse_io),1); memset(&io, 0, sizeof(io));
io->string = expr; /* to pass to the error routine */ io.string = expr; /* to pass to the error routine */
ast_yylex_init(&io->scanner); ast_yylex_init(&io.scanner);
ast_yy_scan_string(expr, io->scanner); ast_yy_scan_string(expr, io.scanner);
ast_yyparse ((void *) io); ast_yyparse ((void *) &io);
ast_yylex_destroy(io->scanner); ast_yylex_destroy(io.scanner);
if (io->val == NULL) { if (!io.val) {
if (length > 1) { if (length > 1) {
strcpy(buf, "0"); strcpy(buf, "0");
return 1; return_value = 1;
} }
} else { } else {
if (io->val->type == AST_EXPR_integer) { if (io.val->type == AST_EXPR_integer) {
int res_length; int res_length;
res_length = snprintf(buf, length, "%ld", (long int) io->val->u.i); res_length = snprintf(buf, length, "%ld", (long int) io.val->u.i);
return res_length <= length ? res_length : length; return_value = (res_length <= length) ? res_length : length;
} else { } else {
#ifdef STANDALONE #ifdef STANDALONE
strncpy(buf, io->val->u.s, length - 1); strncpy(buf, io.val->u.s, length - 1);
#else /* !STANDALONE */ #else /* !STANDALONE */
ast_copy_string(buf, io->val->u.s, length); ast_copy_string(buf, io.val->u.s, length);
#endif /* STANDALONE */ #endif /* STANDALONE */
return strlen(buf); return_value = strlen(buf);
} }
free(io->val); free(io.val);
} }
free(io); return return_value;
return 0;
} }
int ast_yyerror (const char *s, yyltype *loc, struct parse_io *parseio ) int ast_yyerror (const char *s, yyltype *loc, struct parse_io *parseio )

@ -2562,42 +2562,42 @@ int ast_yyerror(const char *, YYLTYPE *, struct parse_io *); /* likewise */
int ast_expr(char *expr, char *buf, int length) int ast_expr(char *expr, char *buf, int length)
{ {
struct parse_io *io; struct parse_io io;
int return_value = 0;
io = calloc(sizeof(struct parse_io),1); memset(&io, 0, sizeof(io));
io->string = expr; /* to pass to the error routine */ io.string = expr; /* to pass to the error routine */
ast_yylex_init(&io->scanner); ast_yylex_init(&io.scanner);
ast_yy_scan_string(expr, io->scanner); ast_yy_scan_string(expr, io.scanner);
ast_yyparse ((void *) io); ast_yyparse ((void *) &io);
ast_yylex_destroy(io->scanner); ast_yylex_destroy(io.scanner);
if (io->val == NULL) { if (!io.val) {
if (length > 1) { if (length > 1) {
strcpy(buf, "0"); strcpy(buf, "0");
return 1; return_value = 1;
} }
} else { } else {
if (io->val->type == AST_EXPR_integer) { if (io.val->type == AST_EXPR_integer) {
int res_length; int res_length;
res_length = snprintf(buf, length, "%ld", (long int) io->val->u.i); res_length = snprintf(buf, length, "%ld", (long int) io.val->u.i);
return res_length <= length ? res_length : length; return_value = (res_length <= length) ? res_length : length;
} else { } else {
#ifdef STANDALONE #ifdef STANDALONE
strncpy(buf, io->val->u.s, length - 1); strncpy(buf, io.val->u.s, length - 1);
#else /* !STANDALONE */ #else /* !STANDALONE */
ast_copy_string(buf, io->val->u.s, length); ast_copy_string(buf, io.val->u.s, length);
#endif /* STANDALONE */ #endif /* STANDALONE */
return strlen(buf); return_value = strlen(buf);
} }
free(io->val); free(io.val);
} }
free(io); return return_value;
return 0;
} }
int ast_yyerror (const char *s, yyltype *loc, struct parse_io *parseio ) int ast_yyerror (const char *s, yyltype *loc, struct parse_io *parseio )

Loading…
Cancel
Save