From 4c04c2665c4418ade3d9af39027fb9c1ec568f11 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Wed, 27 Mar 2013 16:01:16 +0100 Subject: [PATCH] Add missing NUL terminator in lb_steal(). --- lib/config/config_lexer.cc | 148 +++++++++++++++++++------------------ lib/config/config_lexer.ll | 18 +++-- 2 files changed, 85 insertions(+), 81 deletions(-) diff --git a/lib/config/config_lexer.cc b/lib/config/config_lexer.cc index dc9c4a771..3d679e1ad 100644 --- a/lib/config/config_lexer.cc +++ b/lib/config/config_lexer.cc @@ -664,23 +664,15 @@ static void lb_cleanup(lex_buf *lb) free(lb->buf); } -static char *lb_steal(lex_buf *lb) -{ - char *buf = lb->buf; - lb->buf = NULL; - lb->size = 0; - return buf; -} - static void lb_append_char(lex_buf *lb, char new_char) { const size_t block_size = 64; - size_t old_alloc = (lb->size + (block_size - 1)) / block_size; - size_t new_alloc = ((lb->size + 1) + (block_size - 1)) / block_size; + size_t old_blocks = (lb->size + (block_size - 1)) / block_size; + size_t new_blocks = ((lb->size + 1) + (block_size - 1)) / block_size; - if (old_alloc != new_alloc) { - char *new_buf = (char *)realloc(lb->buf, new_alloc); + if (old_blocks != new_blocks) { + char *new_buf = (char *)realloc(lb->buf, new_blocks * block_size); if (new_buf == NULL && new_alloc > 0) throw std::bad_alloc(); @@ -691,11 +683,21 @@ static void lb_append_char(lex_buf *lb, char new_char) lb->size++; lb->buf[lb->size - 1] = new_char; } + +static char *lb_steal(lex_buf *lb) +{ + lb_append_char(lb, '\0'); + + char *buf = lb->buf; + lb->buf = NULL; + lb->size = 0; + return buf; +} #define YY_NO_UNISTD_H 1 -#line 699 "config_lexer.cc" +#line 701 "config_lexer.cc" #define INITIAL 0 #define C_COMMENT 1 @@ -948,11 +950,11 @@ YY_DECL register int yy_act; struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; -#line 99 "config_lexer.ll" +#line 101 "config_lexer.ll" lex_buf string_buf; -#line 956 "config_lexer.cc" +#line 958 "config_lexer.cc" yylval = yylval_param; @@ -1049,12 +1051,12 @@ do_action: /* This label is used only to access EOF actions. */ case 1: YY_RULE_SETUP -#line 102 "config_lexer.ll" +#line 104 "config_lexer.ll" { lb_init(&string_buf); BEGIN(STRING); } YY_BREAK case 2: YY_RULE_SETUP -#line 104 "config_lexer.ll" +#line 106 "config_lexer.ll" { BEGIN(INITIAL); @@ -1068,7 +1070,7 @@ YY_RULE_SETUP case 3: /* rule 3 can match eol */ YY_RULE_SETUP -#line 114 "config_lexer.ll" +#line 116 "config_lexer.ll" { std::ostringstream msgbuf; msgbuf << "Unterminated string found: " << *yylloc; @@ -1078,7 +1080,7 @@ YY_RULE_SETUP YY_BREAK case 4: YY_RULE_SETUP -#line 121 "config_lexer.ll" +#line 123 "config_lexer.ll" { /* octal escape sequence */ int result; @@ -1097,7 +1099,7 @@ YY_RULE_SETUP YY_BREAK case 5: YY_RULE_SETUP -#line 137 "config_lexer.ll" +#line 139 "config_lexer.ll" { /* generate error - bad escape sequence; something * like '\48' or '\0777777' @@ -1109,38 +1111,38 @@ YY_RULE_SETUP YY_BREAK case 6: YY_RULE_SETUP -#line 146 "config_lexer.ll" +#line 148 "config_lexer.ll" { lb_append_char(&string_buf, '\n'); } YY_BREAK case 7: YY_RULE_SETUP -#line 147 "config_lexer.ll" +#line 149 "config_lexer.ll" { lb_append_char(&string_buf, '\t'); } YY_BREAK case 8: YY_RULE_SETUP -#line 148 "config_lexer.ll" +#line 150 "config_lexer.ll" { lb_append_char(&string_buf, '\r'); } YY_BREAK case 9: YY_RULE_SETUP -#line 149 "config_lexer.ll" +#line 151 "config_lexer.ll" { lb_append_char(&string_buf, '\b'); } YY_BREAK case 10: YY_RULE_SETUP -#line 150 "config_lexer.ll" +#line 152 "config_lexer.ll" { lb_append_char(&string_buf, '\f'); } YY_BREAK case 11: /* rule 11 can match eol */ YY_RULE_SETUP -#line 151 "config_lexer.ll" +#line 153 "config_lexer.ll" { lb_append_char(&string_buf, yytext[1]); } YY_BREAK case 12: YY_RULE_SETUP -#line 153 "config_lexer.ll" +#line 155 "config_lexer.ll" { char *yptr = yytext; @@ -1150,12 +1152,12 @@ YY_RULE_SETUP YY_BREAK case 13: YY_RULE_SETUP -#line 160 "config_lexer.ll" +#line 162 "config_lexer.ll" { lb_init(&string_buf); BEGIN(HEREDOC); } YY_BREAK case 14: YY_RULE_SETUP -#line 162 "config_lexer.ll" +#line 164 "config_lexer.ll" { BEGIN(INITIAL); @@ -1169,224 +1171,224 @@ YY_RULE_SETUP case 15: /* rule 15 can match eol */ YY_RULE_SETUP -#line 172 "config_lexer.ll" +#line 174 "config_lexer.ll" { lb_append_char(&string_buf, yytext[0]); } YY_BREAK case 16: YY_RULE_SETUP -#line 175 "config_lexer.ll" +#line 177 "config_lexer.ll" BEGIN(C_COMMENT); YY_BREAK case 17: YY_RULE_SETUP -#line 179 "config_lexer.ll" +#line 181 "config_lexer.ll" BEGIN(INITIAL); YY_BREAK case 18: /* rule 18 can match eol */ YY_RULE_SETUP -#line 180 "config_lexer.ll" +#line 182 "config_lexer.ll" /* ignore comment */ YY_BREAK case 19: YY_RULE_SETUP -#line 181 "config_lexer.ll" +#line 183 "config_lexer.ll" /* ignore star */ YY_BREAK case 20: YY_RULE_SETUP -#line 184 "config_lexer.ll" +#line 186 "config_lexer.ll" /* ignore C++-style comments */ YY_BREAK case 21: /* rule 21 can match eol */ YY_RULE_SETUP -#line 185 "config_lexer.ll" +#line 187 "config_lexer.ll" /* ignore whitespace */ YY_BREAK case 22: YY_RULE_SETUP -#line 188 "config_lexer.ll" +#line 190 "config_lexer.ll" return T_TYPE; YY_BREAK case 23: YY_RULE_SETUP -#line 189 "config_lexer.ll" +#line 191 "config_lexer.ll" { yylval->type = TypeDictionary; return T_TYPE_DICTIONARY; } YY_BREAK case 24: YY_RULE_SETUP -#line 190 "config_lexer.ll" +#line 192 "config_lexer.ll" { yylval->type = TypeArray; return T_TYPE_ARRAY; } YY_BREAK case 25: YY_RULE_SETUP -#line 191 "config_lexer.ll" +#line 193 "config_lexer.ll" { yylval->type = TypeNumber; return T_TYPE_NUMBER; } YY_BREAK case 26: YY_RULE_SETUP -#line 192 "config_lexer.ll" +#line 194 "config_lexer.ll" { yylval->type = TypeString; return T_TYPE_STRING; } YY_BREAK case 27: YY_RULE_SETUP -#line 193 "config_lexer.ll" +#line 195 "config_lexer.ll" { yylval->type = TypeScalar; return T_TYPE_SCALAR; } YY_BREAK case 28: YY_RULE_SETUP -#line 194 "config_lexer.ll" +#line 196 "config_lexer.ll" { yylval->type = TypeAny; return T_TYPE_ANY; } YY_BREAK case 29: YY_RULE_SETUP -#line 195 "config_lexer.ll" +#line 197 "config_lexer.ll" { return T_VALIDATOR; } YY_BREAK case 30: YY_RULE_SETUP -#line 196 "config_lexer.ll" +#line 198 "config_lexer.ll" { return T_REQUIRE; } YY_BREAK case 31: YY_RULE_SETUP -#line 197 "config_lexer.ll" +#line 199 "config_lexer.ll" { return T_ATTRIBUTE; } YY_BREAK case 32: YY_RULE_SETUP -#line 198 "config_lexer.ll" +#line 200 "config_lexer.ll" return T_ABSTRACT; YY_BREAK case 33: YY_RULE_SETUP -#line 199 "config_lexer.ll" +#line 201 "config_lexer.ll" return T_LOCAL; YY_BREAK case 34: YY_RULE_SETUP -#line 200 "config_lexer.ll" +#line 202 "config_lexer.ll" return T_OBJECT; YY_BREAK case 35: YY_RULE_SETUP -#line 201 "config_lexer.ll" +#line 203 "config_lexer.ll" return T_TEMPLATE; YY_BREAK case 36: YY_RULE_SETUP -#line 202 "config_lexer.ll" +#line 204 "config_lexer.ll" return T_INCLUDE; YY_BREAK case 37: YY_RULE_SETUP -#line 203 "config_lexer.ll" +#line 205 "config_lexer.ll" return T_LIBRARY; YY_BREAK case 38: YY_RULE_SETUP -#line 204 "config_lexer.ll" +#line 206 "config_lexer.ll" return T_INHERITS; YY_BREAK case 39: YY_RULE_SETUP -#line 205 "config_lexer.ll" +#line 207 "config_lexer.ll" return T_NULL; YY_BREAK case 40: YY_RULE_SETUP -#line 206 "config_lexer.ll" +#line 208 "config_lexer.ll" return T_PARTIAL; YY_BREAK case 41: YY_RULE_SETUP -#line 207 "config_lexer.ll" +#line 209 "config_lexer.ll" { yylval->num = 1; return T_NUMBER; } YY_BREAK case 42: YY_RULE_SETUP -#line 208 "config_lexer.ll" +#line 210 "config_lexer.ll" { yylval->num = 0; return T_NUMBER; } YY_BREAK case 43: YY_RULE_SETUP -#line 209 "config_lexer.ll" +#line 211 "config_lexer.ll" { yylval->text = strdup(yytext); return T_IDENTIFIER; } YY_BREAK case 44: /* rule 44 can match eol */ YY_RULE_SETUP -#line 210 "config_lexer.ll" +#line 212 "config_lexer.ll" { yytext[yyleng-1] = '\0'; yylval->text = strdup(yytext + 1); return T_STRING_ANGLE; } YY_BREAK case 45: YY_RULE_SETUP -#line 211 "config_lexer.ll" +#line 213 "config_lexer.ll" { yylval->num = strtod(yytext, NULL) / 1000; return T_NUMBER; } YY_BREAK case 46: YY_RULE_SETUP -#line 212 "config_lexer.ll" +#line 214 "config_lexer.ll" { yylval->num = strtod(yytext, NULL) * 60 * 60; return T_NUMBER; } YY_BREAK case 47: YY_RULE_SETUP -#line 213 "config_lexer.ll" +#line 215 "config_lexer.ll" { yylval->num = strtod(yytext, NULL) * 60; return T_NUMBER; } YY_BREAK case 48: YY_RULE_SETUP -#line 214 "config_lexer.ll" +#line 216 "config_lexer.ll" { yylval->num = strtod(yytext, NULL); return T_NUMBER; } YY_BREAK case 49: YY_RULE_SETUP -#line 215 "config_lexer.ll" +#line 217 "config_lexer.ll" { yylval->num = strtod(yytext, NULL); return T_NUMBER; } YY_BREAK case 50: YY_RULE_SETUP -#line 216 "config_lexer.ll" +#line 218 "config_lexer.ll" { yylval->op = OperatorSet; return T_EQUAL; } YY_BREAK case 51: YY_RULE_SETUP -#line 217 "config_lexer.ll" +#line 219 "config_lexer.ll" { yylval->op = OperatorPlus; return T_PLUS_EQUAL; } YY_BREAK case 52: YY_RULE_SETUP -#line 218 "config_lexer.ll" +#line 220 "config_lexer.ll" { yylval->op = OperatorMinus; return T_MINUS_EQUAL; } YY_BREAK case 53: YY_RULE_SETUP -#line 219 "config_lexer.ll" +#line 221 "config_lexer.ll" { yylval->op = OperatorMultiply; return T_MULTIPLY_EQUAL; } YY_BREAK case 54: YY_RULE_SETUP -#line 220 "config_lexer.ll" +#line 222 "config_lexer.ll" { yylval->op = OperatorDivide; return T_DIVIDE_EQUAL; } YY_BREAK case 55: YY_RULE_SETUP -#line 223 "config_lexer.ll" +#line 225 "config_lexer.ll" return yytext[0]; YY_BREAK case 56: YY_RULE_SETUP -#line 225 "config_lexer.ll" +#line 227 "config_lexer.ll" ECHO; YY_BREAK -#line 1390 "config_lexer.cc" +#line 1392 "config_lexer.cc" case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(C_COMMENT): case YY_STATE_EOF(STRING): @@ -2576,7 +2578,7 @@ void yyfree (void * ptr , yyscan_t yyscanner) #define YYTABLES_NAME "yytables" -#line 225 "config_lexer.ll" +#line 227 "config_lexer.ll" diff --git a/lib/config/config_lexer.ll b/lib/config/config_lexer.ll index ae1df9bce..28906277c 100644 --- a/lib/config/config_lexer.ll +++ b/lib/config/config_lexer.ll @@ -59,14 +59,6 @@ static void lb_cleanup(lex_buf *lb) free(lb->buf); } -static char *lb_steal(lex_buf *lb) -{ - char *buf = lb->buf; - lb->buf = NULL; - lb->size = 0; - return buf; -} - static void lb_append_char(lex_buf *lb, char new_char) { const size_t block_size = 64; @@ -86,6 +78,16 @@ static void lb_append_char(lex_buf *lb, char new_char) lb->size++; lb->buf[lb->size - 1] = new_char; } + +static char *lb_steal(lex_buf *lb) +{ + lb_append_char(lb, '\0'); + + char *buf = lb->buf; + lb->buf = NULL; + lb->size = 0; + return buf; +} %} %option reentrant noyywrap yylineno -- 2.49.0