From d73cc5013b0b250fea23254cd5ee7d394ea5d1c6 Mon Sep 17 00:00:00 2001 From: Fabrizio Fabbri Date: Sat, 3 Jun 2017 11:57:01 +0200 Subject: [PATCH] Coverity fix issue Proper cleanup of vararg. Fix buffer corruption on dpp. --- src/c/character.d | 16 ++++++++-------- src/c/dpp.c | 44 ++++++++++++++++++++++++++++++++------------ 2 files changed, 40 insertions(+), 20 deletions(-) diff --git a/src/c/character.d b/src/c/character.d index 1717e8ae9..949ca83d5 100644 --- a/src/c/character.d +++ b/src/c/character.d @@ -240,22 +240,22 @@ ecl_char_cmp(cl_object x, cl_object y) @(defun char< (&rest args) @ - return Lchar_cmp(the_env, narg, 1, 1, args); + @(return Lchar_cmp(the_env, narg, 1, 1, args)); @) @(defun char> (&rest args) @ - return Lchar_cmp(the_env, narg,-1, 1, args); + @(return Lchar_cmp(the_env, narg,-1, 1, args)); @) @(defun char<= (&rest args) @ - return Lchar_cmp(the_env, narg, 1, 0, args); + @(return Lchar_cmp(the_env, narg, 1, 0, args)); @) @(defun char>= (&rest args) @ - return Lchar_cmp(the_env, narg,-1, 0, args); + @(return Lchar_cmp(the_env, narg,-1, 0, args)); @) @(defun char_equal (c &rest cs) @@ -331,22 +331,22 @@ ecl_char_compare(cl_object x, cl_object y) @(defun char-lessp (&rest args) @ - return Lchar_compare(the_env, narg, 1, 1, args); + @(return Lchar_compare(the_env, narg, 1, 1, args)); @) @(defun char-greaterp (&rest args) @ - return Lchar_compare(the_env, narg,-1, 1, args); + @(return Lchar_compare(the_env, narg,-1, 1, args)); @) @(defun char-not-greaterp (&rest args) @ - return Lchar_compare(the_env, narg, 1, 0, args); + @(return Lchar_compare(the_env, narg, 1, 0, args)); @) @(defun char-not-lessp (&rest args) @ - return Lchar_compare(the_env, narg,-1, 0, args); + @(return Lchar_compare(the_env, narg,-1, 0, args)); @) diff --git a/src/c/dpp.c b/src/c/dpp.c index d6b5d56a6..b4cb5ff01 100755 --- a/src/c/dpp.c +++ b/src/c/dpp.c @@ -120,6 +120,11 @@ char *required[MAXREQ]; int nreq; int the_env_defined = 0; +enum vararg_status_t { + VARARG_NOT_DEFINED, + VARARG_SIMPLE, + VARARG_ECL}; +enum vararg_status_t vararg_status = VARARG_NOT_DEFINED; struct optional { char *o_var; @@ -470,6 +475,7 @@ reset(void) aux[i].a_var = aux[i].a_init = NULL; + vararg_status = VARARG_NOT_DEFINED; } void @@ -726,13 +732,16 @@ put_declaration(void) } } put_lineno(); - if (simple_varargs) + if (simple_varargs) { + vararg_status = VARARG_SIMPLE; fprintf(out,"\tva_list %s;\n\tva_start(%s, %s);\n", rest_var, rest_var, ((nreq > 0) ? required[nreq-1] : "narg")); - else + } else { + vararg_status = VARARG_ECL; fprintf(out,"\tecl_va_list %s;\n\tecl_va_start(%s, %s, narg, %d);\n", rest_var, rest_var, ((nreq > 0) ? required[nreq-1] : "narg"), nreq); + } put_lineno(); fprintf(out, "\tif (ecl_unlikely(narg < %d", nreq); if (nopt > 0 && !rest_flag && !key_flag) { @@ -764,11 +773,6 @@ put_declaration(void) put_lineno(); fprintf(out, "\t}\n"); } - if (simple_varargs) { - fprintf(out,"\tva_end(%s);\n", rest_var); - } else { - fprintf(out,"\tecl_va_end(%s);\n", rest_var); - } if (key_flag) { put_lineno(); fprintf(out, "\tcl_parse_key(ARGS, %d, KEYS, KEY_VARS, NULL, %d);\n", @@ -804,6 +808,16 @@ put_declaration(void) } } +void unregister_varargs() +{ + if (vararg_status == VARARG_SIMPLE) { + fprintf(out, "va_end(%s);\n", rest_var); + } + else if (vararg_status == VARARG_ECL) { + fprintf(out, "ecl_va_end(%s);\n", rest_var); + } +} + void put_return(void) { @@ -831,6 +845,8 @@ put_return(void) fprintf(out, "the_env->values[%d] = __value%d;\n", i, i); } put_tabs(t); + unregister_varargs(); + put_tabs(t); fprintf(out, "return __value0;\n"); } put_tabs(tab_save); @@ -873,24 +889,28 @@ main_loop(void) goto LOOP; } else if (c == '\'') { char *p; - poolp = pool; + char* tmp = poolp; p = read_symbol(0); pushc('\0'); fprintf(out,"%s",p); + poolp = tmp; goto LOOP; } else if (c == '[') { char *p; - poolp = pool; + char * tmp = poolp; p = read_symbol(1); pushc('\0'); fprintf(out,"%s",p); + poolp = tmp; goto LOOP; } else if (c != '(') { char *p; + char * tmp = poolp; unreadc(c); - poolp = pool; - poolp = p = read_function(); - fprintf(out,"%s",translate_function(poolp)); + //poolp = pool; + p = read_function(); + fprintf(out,"%s",translate_function(p)); + poolp = tmp; goto LOOP; } p = read_token();