Commit f3c6d592 authored by Michael Meskes's avatar Michael Meskes

- Fixed segfault due to missing check for variable declaration.

- Added check for multidimensional array usage.
parent c934cf1e
...@@ -1754,6 +1754,11 @@ Tue Feb 24 16:48:57 CET 2004 ...@@ -1754,6 +1754,11 @@ Tue Feb 24 16:48:57 CET 2004
Mon Mar 1 08:56:37 CET 2004 Mon Mar 1 08:56:37 CET 2004
- Added partly missing VOLATILE keyword. - Added partly missing VOLATILE keyword.
Thu Mar 4 08:29:02 CET 2004
- Fixed segfault due to missing check for variable declaration.
- Added check for multidimensional array usage.
- Set pgtypeslib version to 1.2. - Set pgtypeslib version to 1.2.
- Set ecpg version to 3.2.0. - Set ecpg version to 3.2.0.
/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/preproc.y,v 1.276 2004/03/02 06:45:05 meskes Exp $ */ /* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/preproc.y,v 1.277 2004/03/04 07:32:01 meskes Exp $ */
/* Copyright comment */ /* Copyright comment */
%{ %{
...@@ -541,7 +541,7 @@ add_additional_variables(char *name, bool insert) ...@@ -541,7 +541,7 @@ add_additional_variables(char *name, bool insert)
%type <str> ECPGTypeName using_list ECPGColLabelCommon UsingConst %type <str> ECPGTypeName using_list ECPGColLabelCommon UsingConst
%type <str> inf_val_list inf_col_list using_descriptor into_descriptor %type <str> inf_val_list inf_col_list using_descriptor into_descriptor
%type <str> ecpg_into_using prepared_name struct_union_type_with_symbol %type <str> ecpg_into_using prepared_name struct_union_type_with_symbol
%type <str> ECPGunreserved ECPGunreserved_interval %type <str> ECPGunreserved ECPGunreserved_interval cvariable
%type <struct_union> s_struct_union_symbol %type <struct_union> s_struct_union_symbol
...@@ -4220,7 +4220,7 @@ connection_target: database_name opt_server opt_port ...@@ -4220,7 +4220,7 @@ connection_target: database_name opt_server opt_port
} }
; ;
db_prefix: ident CVARIABLE db_prefix: ident cvariable
{ {
if (strcmp($2, "postgresql") != 0 && strcmp($2, "postgres") != 0) if (strcmp($2, "postgresql") != 0 && strcmp($2, "postgres") != 0)
{ {
...@@ -4311,7 +4311,7 @@ user_name: UserId ...@@ -4311,7 +4311,7 @@ user_name: UserId
} }
; ;
char_variable: CVARIABLE char_variable: cvariable
{ {
/* check if we have a char variable */ /* check if we have a char variable */
struct variable *p = find_variable($1); struct variable *p = find_variable($1);
...@@ -5241,14 +5241,14 @@ ECPGAllocateDescr: SQL_ALLOCATE SQL_DESCRIPTOR quoted_ident_stringvar ...@@ -5241,14 +5241,14 @@ ECPGAllocateDescr: SQL_ALLOCATE SQL_DESCRIPTOR quoted_ident_stringvar
* read from descriptor * read from descriptor
*/ */
ECPGGetDescHeaderItem: CVARIABLE '=' desc_header_item ECPGGetDescHeaderItem: cvariable '=' desc_header_item
{ push_assignment($1, $3); } { push_assignment($1, $3); }
; ;
desc_header_item: SQL_COUNT { $$ = ECPGd_count; } desc_header_item: SQL_COUNT { $$ = ECPGd_count; }
; ;
ECPGGetDescItem: CVARIABLE '=' descriptor_item { push_assignment($1, $3); }; ECPGGetDescItem: cvariable '=' descriptor_item { push_assignment($1, $3); };
descriptor_item: SQL_CARDINALITY { $$ = ECPGd_cardinality; } descriptor_item: SQL_CARDINALITY { $$ = ECPGd_cardinality; }
| SQL_DATA { $$ = ECPGd_data; } | SQL_DATA { $$ = ECPGd_data; }
...@@ -5280,7 +5280,7 @@ ECPGGetDescriptorHeader: GET SQL_DESCRIPTOR quoted_ident_stringvar ...@@ -5280,7 +5280,7 @@ ECPGGetDescriptorHeader: GET SQL_DESCRIPTOR quoted_ident_stringvar
{ $$ = $3; } { $$ = $3; }
; ;
ECPGGetDescriptor: GET SQL_DESCRIPTOR quoted_ident_stringvar SQL_VALUE CVARIABLE ECPGGetDescItems ECPGGetDescriptor: GET SQL_DESCRIPTOR quoted_ident_stringvar SQL_VALUE cvariable ECPGGetDescItems
{ $$.str = $5; $$.name = $3; } { $$.str = $5; $$.name = $3; }
| GET SQL_DESCRIPTOR quoted_ident_stringvar SQL_VALUE Iconst ECPGGetDescItems | GET SQL_DESCRIPTOR quoted_ident_stringvar SQL_VALUE Iconst ECPGGetDescItems
{ $$.str = $5; $$.name = $3; } { $$.str = $5; $$.name = $3; }
...@@ -6047,14 +6047,14 @@ c_args: /*EMPTY*/ { $$ = EMPTY; } ...@@ -6047,14 +6047,14 @@ c_args: /*EMPTY*/ { $$ = EMPTY; }
| c_list { $$ = $1; } | c_list { $$ = $1; }
; ;
coutputvariable: CVARIABLE indicator coutputvariable: cvariable indicator
{ add_variable_to_head(&argsresult, find_variable($1), find_variable($2)); } { add_variable_to_head(&argsresult, find_variable($1), find_variable($2)); }
| CVARIABLE | cvariable
{ add_variable_to_head(&argsresult, find_variable($1), &no_indicator); } { add_variable_to_head(&argsresult, find_variable($1), &no_indicator); }
; ;
civarind: CVARIABLE indicator civarind: cvariable indicator
{ {
if (find_variable($2)->type->type == ECPGt_array) if (find_variable($2)->type->type == ECPGt_array)
mmerror(PARSE_ERROR, ET_ERROR, "arrays of indicators are not allowed on input"); mmerror(PARSE_ERROR, ET_ERROR, "arrays of indicators are not allowed on input");
...@@ -6064,18 +6064,47 @@ civarind: CVARIABLE indicator ...@@ -6064,18 +6064,47 @@ civarind: CVARIABLE indicator
} }
; ;
civar: CVARIABLE civar: cvariable
{ {
add_variable_to_head(&argsinsert, find_variable($1), &no_indicator); add_variable_to_head(&argsinsert, find_variable($1), &no_indicator);
$$ = create_questionmarks($1, false); $$ = create_questionmarks($1, false);
} }
; ;
indicator: CVARIABLE { check_indicator((find_variable($1))->type); $$ = $1; } indicator: cvariable { check_indicator((find_variable($1))->type); $$ = $1; }
| SQL_INDICATOR CVARIABLE { check_indicator((find_variable($2))->type); $$ = $2; } | SQL_INDICATOR cvariable { check_indicator((find_variable($2))->type); $$ = $2; }
| SQL_INDICATOR name { check_indicator((find_variable($2))->type); $$ = $2; } | SQL_INDICATOR name { check_indicator((find_variable($2))->type); $$ = $2; }
; ;
cvariable: CVARIABLE
{
/* As long as multidimensional arrays are not implemented we have to check for those here */
char *ptr = $1;
int brace_open=0, brace = false;
for (; *ptr; ptr++)
{
switch (*ptr)
{
case '[': if (brace)
{
mmerror(PARSE_ERROR, ET_FATAL, "No multidimensional array support for simple data types");
}
brace_open++;
break;
case ']': brace_open--;
if (brace_open == 0) brace = true;
break;
case '\t':
case ' ': break;
default: if (brace_open == 0) brace = false;
break;
}
}
$$ = $1;
}
;
ident: IDENT { $$ = $1; } ident: IDENT { $$ = $1; }
| CSTRING { $$ = make3_str(make_str("\""), $1, make_str("\"")); } | CSTRING { $$ = make3_str(make_str("\""), $1, make_str("\"")); }
; ;
......
...@@ -218,7 +218,7 @@ find_variable(char *name) ...@@ -218,7 +218,7 @@ find_variable(char *name)
{ {
/* /*
* We don't care about what's inside the array braces so just * We don't care about what's inside the array braces so just
* eat up the character * eat up the characters
*/ */
for (count = 1, end = next + 1; count; end++) for (count = 1, end = next + 1; count; end++)
{ {
...@@ -242,6 +242,11 @@ find_variable(char *name) ...@@ -242,6 +242,11 @@ find_variable(char *name)
*next = '\0'; *next = '\0';
p = find_simple(name); p = find_simple(name);
if (p == NULL)
{
snprintf(errortext, sizeof(errortext), "The variable %s is not declared", name);
mmerror(PARSE_ERROR, ET_FATAL, errortext);
}
*next = c; *next = c;
switch (p->type->u.element->type) switch (p->type->u.element->type)
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment