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