Rob Shearman : widl: Check for [string] attribute being applied when the elements are ranged.
Alexandre Julliard
julliard at winehq.org
Mon Nov 9 15:14:20 CST 2009
Module: wine
Branch: master
Commit: 3885dd778a389802c04ac4a99b45433526786bdd
URL: http://source.winehq.org/git/wine.git/?a=commit;h=3885dd778a389802c04ac4a99b45433526786bdd
Author: Rob Shearman <robertshearman at gmail.com>
Date: Sat Nov 7 15:54:32 2009 +0100
widl: Check for [string] attribute being applied when the elements are ranged.
The range will not be verified in and misconception could turn into a
security problem.
Move [string] attribute validation from reg_typedefs to set_type.
---
tools/widl/parser.y | 52 ++++++++++++++++++++++++++++----------------------
1 files changed, 29 insertions(+), 23 deletions(-)
diff --git a/tools/widl/parser.y b/tools/widl/parser.y
index 42123d3..70a7c9c 100644
--- a/tools/widl/parser.y
+++ b/tools/widl/parser.y
@@ -1384,9 +1384,26 @@ static void set_type(var_t *v, decl_spec_t *decl_spec, const declarator_t *decl,
error_loc("%s: pointer attribute applied to non-pointer type\n", v->name);
}
- if (is_attr(v->attrs, ATTR_STRING) && !is_ptr(v->type) && !arr)
- error_loc("'%s': [string] attribute applied to non-pointer, non-array type\n",
- v->name);
+ if (is_attr(v->attrs, ATTR_STRING))
+ {
+ type_t *t = type;
+
+ if (!is_ptr(v->type) && !arr)
+ error_loc("'%s': [string] attribute applied to non-pointer, non-array type\n",
+ v->name);
+
+ while (is_ptr(t))
+ t = type_pointer_get_ref(t);
+
+ if (type_get_type(t) != TYPE_BASIC &&
+ (get_basic_fc(t) != RPC_FC_CHAR &&
+ get_basic_fc(t) != RPC_FC_BYTE &&
+ get_basic_fc(t) != RPC_FC_WCHAR))
+ {
+ error_loc("'%s': [string] attribute is only valid on 'char', 'byte', or 'wchar_t' pointers and arrays\n",
+ v->name);
+ }
+ }
if (is_attr(v->attrs, ATTR_V1ENUM))
{
@@ -1747,27 +1764,8 @@ static void fix_incomplete_types(type_t *complete_type)
static type_t *reg_typedefs(decl_spec_t *decl_spec, declarator_list_t *decls, attr_list_t *attrs)
{
const declarator_t *decl;
- int is_str = is_attr(attrs, ATTR_STRING);
type_t *type = decl_spec->type;
- if (is_str)
- {
- type_t *t = decl_spec->type;
-
- while (is_ptr(t))
- t = type_pointer_get_ref(t);
-
- if (type_get_type(t) != TYPE_BASIC &&
- (get_basic_fc(t) != RPC_FC_CHAR &&
- get_basic_fc(t) != RPC_FC_BYTE &&
- get_basic_fc(t) != RPC_FC_WCHAR))
- {
- decl = LIST_ENTRY( list_head( decls ), const declarator_t, entry );
- error_loc("'%s': [string] attribute is only valid on 'char', 'byte', or 'wchar_t' pointers and arrays\n",
- decl->var->name);
- }
- }
-
/* We must generate names for tagless enum, struct or union.
Typedef-ing a tagless enum, struct or union means we want the typedef
to be included in a library hence the public attribute. */
@@ -2361,6 +2359,15 @@ static void check_field_common(const type_t *container_type,
case TGT_CTXT_HANDLE_POINTER:
/* FIXME */
break;
+ case TGT_STRING:
+ {
+ const type_t *t = type;
+ while (is_ptr(t))
+ t = type_pointer_get_ref(t);
+ if (is_aliaschain_attr(t, ATTR_RANGE))
+ warning_loc_info(&arg->loc_info, "%s: range not verified for a string of ranged types\n", arg->name);
+ break;
+ }
case TGT_POINTER:
type = type_pointer_get_ref(type);
more_to_do = TRUE;
@@ -2370,7 +2377,6 @@ static void check_field_common(const type_t *container_type,
more_to_do = TRUE;
break;
case TGT_USER_TYPE:
- case TGT_STRING:
case TGT_IFACE_POINTER:
case TGT_BASIC:
case TGT_ENUM:
More information about the wine-cvs
mailing list