mirror of
https://github.com/asterisk/asterisk.git
synced 2025-11-01 03:04:19 +00:00
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
This commit is contained in:
36
ast_expr2.fl
36
ast_expr2.fl
@@ -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 )
|
||||||
|
|||||||
36
ast_expr2f.c
36
ast_expr2f.c
@@ -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 )
|
||||||
|
|||||||
Reference in New Issue
Block a user