Hans Leidekker : wldap32: Copy embedded berval structures too.
Alexandre Julliard
julliard at wine.codeweavers.com
Sat Dec 31 08:20:31 CST 2005
Module: wine
Branch: refs/heads/master
Commit: ef387ae87cffa4a12d98fff2649fc8134af220ad
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=ef387ae87cffa4a12d98fff2649fc8134af220ad
Author: Hans Leidekker <hans at it.vu.nl>
Date: Sat Dec 31 13:13:05 2005 +0100
wldap32: Copy embedded berval structures too.
---
dlls/wldap32/wldap32.h | 154 +++++++++++++++++++++++++++++++++++++++++++-----
1 files changed, 137 insertions(+), 17 deletions(-)
diff --git a/dlls/wldap32/wldap32.h b/dlls/wldap32/wldap32.h
index 753a168..cae3138 100644
--- a/dlls/wldap32/wldap32.h
+++ b/dlls/wldap32/wldap32.h
@@ -237,6 +237,59 @@ static inline void strarrayfreeU( char *
#ifdef HAVE_LDAP
+static inline struct berval *bvdup( struct berval *bv )
+{
+ struct berval *berval;
+ DWORD size = sizeof(struct berval) + bv->bv_len;
+
+ berval = HeapAlloc( GetProcessHeap(), 0, size );
+ if (berval)
+ {
+ char *val = (char *)berval + sizeof(struct berval);
+
+ berval->bv_len = bv->bv_len;
+ berval->bv_val = val;
+ memcpy( val, bv->bv_val, bv->bv_len );
+ }
+ return berval;
+}
+
+static inline DWORD bvarraylen( struct berval **bv )
+{
+ struct berval **p = bv;
+ while (*p) p++;
+ return p - bv;
+}
+
+static inline struct berval **bvarraydup( struct berval **bv )
+{
+ struct berval **berval = NULL;
+ DWORD size;
+
+ if (bv)
+ {
+ size = sizeof(struct berval *) * (bvarraylen( bv ) + 1);
+ berval = HeapAlloc( GetProcessHeap(), 0, size );
+
+ if (berval)
+ {
+ struct berval **p = bv;
+ struct berval **q = berval;
+
+ while (*p) *q++ = bvdup( *p++ );
+ *q = NULL;
+ }
+ }
+ return berval;
+}
+
+static inline void bvarrayfree( struct berval **bv )
+{
+ struct berval **p = bv;
+ while (*p) HeapFree( GetProcessHeap(), 0, *p++ );
+ HeapFree( GetProcessHeap(), 0, bv );
+}
+
static inline LDAPModW *modAtoW( LDAPModA *mod )
{
LDAPModW *modW;
@@ -248,7 +301,7 @@ static inline LDAPModW *modAtoW( LDAPMod
modW->mod_type = strAtoW( mod->mod_type );
if (mod->mod_op & LDAP_MOD_BVALUES)
- modW->mod_vals.modv_bvals = mod->mod_vals.modv_bvals;
+ modW->mod_vals.modv_bvals = bvarraydup( mod->mod_vals.modv_bvals );
else
modW->mod_vals.modv_strvals = strarrayAtoW( mod->mod_vals.modv_strvals );
}
@@ -266,7 +319,7 @@ static inline LDAPMod *modWtoU( LDAPModW
modU->mod_type = strWtoU( mod->mod_type );
if (mod->mod_op & LDAP_MOD_BVALUES)
- modU->mod_vals.modv_bvals = mod->mod_vals.modv_bvals;
+ modU->mod_vals.modv_bvals = bvarraydup( mod->mod_vals.modv_bvals );
else
modU->mod_vals.modv_strvals = strarrayWtoU( mod->mod_vals.modv_strvals );
}
@@ -275,14 +328,18 @@ static inline LDAPMod *modWtoU( LDAPModW
static inline void modfreeW( LDAPModW *mod )
{
- if (!(mod->mod_op & LDAP_MOD_BVALUES))
+ if (mod->mod_op & LDAP_MOD_BVALUES)
+ bvarrayfree( mod->mod_vals.modv_bvals );
+ else
strarrayfreeW( mod->mod_vals.modv_strvals );
HeapFree( GetProcessHeap(), 0, mod );
}
static inline void modfreeU( LDAPMod *mod )
{
- if (!(mod->mod_op & LDAP_MOD_BVALUES))
+ if (mod->mod_op & LDAP_MOD_BVALUES)
+ bvarrayfree( mod->mod_vals.modv_bvals );
+ else
strarrayfreeU( mod->mod_vals.modv_strvals );
HeapFree( GetProcessHeap(), 0, mod );
}
@@ -368,52 +425,112 @@ static inline void modarrayfreeU( LDAPMo
static inline LDAPControlW *controlAtoW( LDAPControlA *control )
{
LDAPControlW *controlW;
+ DWORD len = control->ldctl_value.bv_len;
+ char *val = NULL;
+
+ if (control->ldctl_value.bv_val)
+ {
+ val = HeapAlloc( GetProcessHeap(), 0, len );
+ if (!val) return NULL;
+ memcpy( val, control->ldctl_value.bv_val, len );
+ }
controlW = HeapAlloc( GetProcessHeap(), 0, sizeof(LDAPControlW) );
- if (controlW)
+ if (!controlW)
{
- memcpy( controlW, control, sizeof(LDAPControlW) );
- controlW->ldctl_oid = strAtoW( control->ldctl_oid );
+ HeapFree( GetProcessHeap(), 0, val );
+ return NULL;
}
+
+ controlW->ldctl_oid = strAtoW( control->ldctl_oid );
+ controlW->ldctl_value.bv_len = len;
+ controlW->ldctl_value.bv_val = val;
+ controlW->ldctl_iscritical = control->ldctl_iscritical;
+
return controlW;
}
static inline LDAPControlA *controlWtoA( LDAPControlW *control )
{
LDAPControlA *controlA;
+ DWORD len = control->ldctl_value.bv_len;
+ char *val = NULL;
+
+ if (control->ldctl_value.bv_val)
+ {
+ val = HeapAlloc( GetProcessHeap(), 0, len );
+ if (!val) return NULL;
+ memcpy( val, control->ldctl_value.bv_val, len );
+ }
- controlA = HeapAlloc( GetProcessHeap(), 0, sizeof(LDAPControl) );
- if (controlA)
+ controlA = HeapAlloc( GetProcessHeap(), 0, sizeof(LDAPControlA) );
+ if (!controlA)
{
- memcpy( controlA, control, sizeof(LDAPControlA) );
- controlA->ldctl_oid = strWtoA( control->ldctl_oid );
+ HeapFree( GetProcessHeap(), 0, val );
+ return NULL;
}
+
+ controlA->ldctl_oid = strWtoA( control->ldctl_oid );
+ controlA->ldctl_value.bv_len = len;
+ controlA->ldctl_value.bv_val = val;
+ controlA->ldctl_iscritical = control->ldctl_iscritical;
+
return controlA;
}
static inline LDAPControl *controlWtoU( LDAPControlW *control )
{
LDAPControl *controlU;
+ DWORD len = control->ldctl_value.bv_len;
+ char *val = NULL;
+
+ if (control->ldctl_value.bv_val)
+ {
+ val = HeapAlloc( GetProcessHeap(), 0, len );
+ if (!val) return NULL;
+ memcpy( val, control->ldctl_value.bv_val, len );
+ }
controlU = HeapAlloc( GetProcessHeap(), 0, sizeof(LDAPControl) );
- if (controlU)
+ if (!controlU)
{
- memcpy( controlU, control, sizeof(LDAPControl) );
- controlU->ldctl_oid = strWtoU( control->ldctl_oid );
+ HeapFree( GetProcessHeap(), 0, val );
+ return NULL;
}
+
+ controlU->ldctl_oid = strWtoU( control->ldctl_oid );
+ controlU->ldctl_value.bv_len = len;
+ controlU->ldctl_value.bv_val = val;
+ controlU->ldctl_iscritical = control->ldctl_iscritical;
+
return controlU;
}
static inline LDAPControlW *controlUtoW( LDAPControl *control )
{
LDAPControlW *controlW;
+ DWORD len = control->ldctl_value.bv_len;
+ char *val = NULL;
+
+ if (control->ldctl_value.bv_val)
+ {
+ val = HeapAlloc( GetProcessHeap(), 0, len );
+ if (!val) return NULL;
+ memcpy( val, control->ldctl_value.bv_val, len );
+ }
controlW = HeapAlloc( GetProcessHeap(), 0, sizeof(LDAPControlW) );
- if (controlW)
+ if (!controlW)
{
- memcpy( controlW, control, sizeof(LDAPControlW) );
- controlW->ldctl_oid = strUtoW( control->ldctl_oid );
+ HeapFree( GetProcessHeap(), 0, val );
+ return NULL;
}
+
+ controlW->ldctl_oid = strUtoW( control->ldctl_oid );
+ controlW->ldctl_value.bv_len = len;
+ controlW->ldctl_value.bv_val = val;
+ controlW->ldctl_iscritical = control->ldctl_iscritical;
+
return controlW;
}
@@ -422,6 +539,7 @@ static inline void controlfreeA( LDAPCon
if (control)
{
strfreeA( control->ldctl_oid );
+ HeapFree( GetProcessHeap(), 0, control->ldctl_value.bv_val );
HeapFree( GetProcessHeap(), 0, control );
}
}
@@ -431,6 +549,7 @@ static inline void controlfreeW( LDAPCon
if (control)
{
strfreeW( control->ldctl_oid );
+ HeapFree( GetProcessHeap(), 0, control->ldctl_value.bv_val );
HeapFree( GetProcessHeap(), 0, control );
}
}
@@ -440,6 +559,7 @@ static inline void controlfreeU( LDAPCon
if (control)
{
strfreeU( control->ldctl_oid );
+ HeapFree( GetProcessHeap(), 0, control->ldctl_value.bv_val );
HeapFree( GetProcessHeap(), 0, control );
}
}
More information about the wine-cvs
mailing list