[PATCH 2/3] wbemprox: Store the element size in struct array.
Hans Leidekker
hans at codeweavers.com
Tue Aug 27 09:35:55 CDT 2019
Signed-off-by: Hans Leidekker <hans at codeweavers.com>
---
dlls/wbemprox/builtin.c | 45 ++++++++++++++++++--------------
dlls/wbemprox/class.c | 6 ++---
dlls/wbemprox/query.c | 12 ++++-----
dlls/wbemprox/wbemprox_private.h | 1 +
4 files changed, 33 insertions(+), 31 deletions(-)
diff --git a/dlls/wbemprox/builtin.c b/dlls/wbemprox/builtin.c
index 06ade746a5..8c4ebe44b0 100644
--- a/dlls/wbemprox/builtin.c
+++ b/dlls/wbemprox/builtin.c
@@ -1251,6 +1251,7 @@ static UINT16 systemenclosure_chassistypes[] =
};
static const struct array systemenclosure_chassistypes_array =
{
+ sizeof(*systemenclosure_chassistypes),
ARRAY_SIZE(systemenclosure_chassistypes),
&systemenclosure_chassistypes
};
@@ -2484,8 +2485,9 @@ static struct array *get_defaultipgateway( IP_ADAPTER_GATEWAY_ADDRESS *list )
return NULL;
}
}
- ret->count = count;
- ret->ptr = ptr;
+ ret->elem_size = sizeof(*ptr);
+ ret->count = count;
+ ret->ptr = ptr;
return ret;
}
static struct array *get_dnsserversearchorder( IP_ADAPTER_DNS_SERVER_ADDRESS *list )
@@ -2517,8 +2519,9 @@ static struct array *get_dnsserversearchorder( IP_ADAPTER_DNS_SERVER_ADDRESS *li
}
if ((p = wcsrchr( ptr[i - 1], ':' ))) *p = 0;
}
- ret->count = count;
- ret->ptr = ptr;
+ ret->elem_size = sizeof(*ptr);
+ ret->count = count;
+ ret->ptr = ptr;
return ret;
}
static struct array *get_ipaddress( IP_ADAPTER_UNICAST_ADDRESS_LH *list )
@@ -2549,8 +2552,9 @@ static struct array *get_ipaddress( IP_ADAPTER_UNICAST_ADDRESS_LH *list )
return NULL;
}
}
- ret->count = count;
- ret->ptr = ptr;
+ ret->elem_size = sizeof(*ptr);
+ ret->count = count;
+ ret->ptr = ptr;
return ret;
}
static struct array *get_ipsubnet( IP_ADAPTER_UNICAST_ADDRESS_LH *list )
@@ -2601,8 +2605,9 @@ static struct array *get_ipsubnet( IP_ADAPTER_UNICAST_ADDRESS_LH *list )
return NULL;
}
}
- ret->count = count;
- ret->ptr = ptr;
+ ret->elem_size = sizeof(*ptr);
+ ret->count = count;
+ ret->ptr = ptr;
return ret;
}
static WCHAR *get_settingid( UINT32 index )
@@ -3458,20 +3463,20 @@ static WCHAR *get_accountname( LSA_TRANSLATED_NAME *name )
}
static struct array *get_binaryrepresentation( PSID sid, UINT len )
{
- struct array *array = heap_alloc( sizeof(struct array) );
- if (array)
+ struct array *ret;
+ UINT8 *ptr;
+
+ if (!(ret = heap_alloc( sizeof(*ret) ))) return NULL;
+ if (!(ptr = heap_alloc( len )))
{
- UINT8 *ret = heap_alloc( len );
- if (ret)
- {
- memcpy( ret, sid, len );
- array->count = len;
- array->ptr = ret;
- return array;
- }
- heap_free( array );
+ heap_free( ret );
+ return NULL;
}
- return NULL;
+ memcpy( ptr, sid, len );
+ ret->elem_size = sizeof(*ptr);
+ ret->count = len;
+ ret->ptr = ptr;
+ return ret;
}
static WCHAR *get_referenceddomainname( LSA_REFERENCED_DOMAIN_LIST *domain )
{
diff --git a/dlls/wbemprox/class.c b/dlls/wbemprox/class.c
index 042ebebdcd..943d5fed61 100644
--- a/dlls/wbemprox/class.c
+++ b/dlls/wbemprox/class.c
@@ -235,13 +235,11 @@ static struct record *create_record( struct table *table )
void destroy_array( struct array *array, CIMTYPE type )
{
- UINT i, size;
-
+ UINT i;
if (!array) return;
if (type == CIM_STRING || type == CIM_DATETIME || type == CIM_REFERENCE)
{
- size = get_type_size( type );
- for (i = 0; i < array->count; i++) heap_free( *(WCHAR **)((char *)array->ptr + i * size) );
+ for (i = 0; i < array->count; i++) heap_free( *(WCHAR **)((char *)array->ptr + i * array->elem_size) );
}
heap_free( array->ptr );
heap_free( array );
diff --git a/dlls/wbemprox/query.c b/dlls/wbemprox/query.c
index 080329c14a..0165d2301b 100644
--- a/dlls/wbemprox/query.c
+++ b/dlls/wbemprox/query.c
@@ -765,7 +765,6 @@ VARTYPE to_vartype( CIMTYPE type )
SAFEARRAY *to_safearray( const struct array *array, CIMTYPE type )
{
SAFEARRAY *ret;
- UINT size = get_type_size( type );
VARTYPE vartype = to_vartype( type );
LONG i;
@@ -773,7 +772,7 @@ SAFEARRAY *to_safearray( const struct array *array, CIMTYPE type )
for (i = 0; i < array->count; i++)
{
- void *ptr = (char *)array->ptr + i * size;
+ void *ptr = (char *)array->ptr + i * array->elem_size;
if (vartype == VT_BSTR)
{
BSTR str = SysAllocString( *(const WCHAR **)ptr );
@@ -951,23 +950,22 @@ static struct array *to_array( VARIANT *var, CIMTYPE *type )
LONG bound, i;
VARTYPE vartype;
CIMTYPE basetype;
- UINT size;
if (SafeArrayGetVartype( V_ARRAY( var ), &vartype ) != S_OK) return NULL;
if (!(basetype = to_cimtype( vartype ))) return NULL;
if (SafeArrayGetUBound( V_ARRAY( var ), 1, &bound ) != S_OK) return NULL;
if (!(ret = heap_alloc( sizeof(struct array) ))) return NULL;
- ret->count = bound + 1;
- size = get_type_size( basetype );
- if (!(ret->ptr = heap_alloc_zero( ret->count * size )))
+ ret->count = bound + 1;
+ ret->elem_size = get_type_size( basetype );
+ if (!(ret->ptr = heap_alloc_zero( ret->count * ret->elem_size )))
{
heap_free( ret );
return NULL;
}
for (i = 0; i < ret->count; i++)
{
- void *ptr = (char *)ret->ptr + i * size;
+ void *ptr = (char *)ret->ptr + i * ret->elem_size;
if (vartype == VT_BSTR)
{
BSTR str;
diff --git a/dlls/wbemprox/wbemprox_private.h b/dlls/wbemprox/wbemprox_private.h
index cbf4c894f1..799bc80050 100644
--- a/dlls/wbemprox/wbemprox_private.h
+++ b/dlls/wbemprox/wbemprox_private.h
@@ -124,6 +124,7 @@ struct property
struct array
{
+ UINT elem_size;
UINT count;
void *ptr;
};
--
2.20.1
More information about the wine-devel
mailing list