[PATCH] wldap32: Properly implement ldap_encode_sort_control[A, W] (Coverity)

Nikolay Sivov nsivov at codeweavers.com
Sun Nov 22 06:31:03 CST 2015


Functions take LDAPControl[A,W] pointer, not pointer to pointer; we only need
to allocate ldctl_oid and ldctl_value.bv_val fields, that caller will free later
with ldap_memfree().

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/wldap32/control.c | 30 ++++++++++++++++++++++++++----
 dlls/wldap32/wldap32.h | 13 +++++++++++++
 2 files changed, 39 insertions(+), 4 deletions(-)

diff --git a/dlls/wldap32/control.c b/dlls/wldap32/control.c
index b0c9102..63b2e6e 100644
--- a/dlls/wldap32/control.c
+++ b/dlls/wldap32/control.c
@@ -280,9 +280,20 @@ INT CDECL ldap_create_vlv_controlW( WLDAP32_LDAP *ld, WLDAP32_LDAPVLVInfo *info,
  * See ldap_encode_sort_controlW.
  */
 ULONG CDECL ldap_encode_sort_controlA( WLDAP32_LDAP *ld, PLDAPSortKeyA *sortkeys,
-    PLDAPControlA control, BOOLEAN critical )
+    PLDAPControlA ret, BOOLEAN critical )
 {
-    return ldap_create_sort_controlA( ld, sortkeys, critical, &control );
+    LDAPControlA *control;
+    ULONG result;
+
+    if ((result = ldap_create_sort_controlA( ld, sortkeys, critical, &control )) == WLDAP32_LDAP_SUCCESS)
+    {
+        ret->ldctl_oid = strdupU(control->ldctl_oid);
+        ret->ldctl_value.bv_len = control->ldctl_value.bv_len;
+        ret->ldctl_value.bv_val = strdupU(control->ldctl_value.bv_val);
+        ret->ldctl_iscritical = control->ldctl_iscritical;
+        ldap_control_freeA( control );
+    }
+    return result;
 }
 
 /***********************************************************************
@@ -308,9 +319,20 @@ ULONG CDECL ldap_encode_sort_controlA( WLDAP32_LDAP *ld, PLDAPSortKeyA *sortkeys
  *  ldap_create_sort_control instead.
  */
 ULONG CDECL ldap_encode_sort_controlW( WLDAP32_LDAP *ld, PLDAPSortKeyW *sortkeys,
-    PLDAPControlW control, BOOLEAN critical )
+    PLDAPControlW ret, BOOLEAN critical )
 {
-    return ldap_create_sort_controlW( ld, sortkeys, critical, &control );
+    LDAPControlW *control;
+    ULONG result;
+
+    if ((result = ldap_create_sort_controlW( ld, sortkeys, critical, &control )) == WLDAP32_LDAP_SUCCESS)
+    {
+        ret->ldctl_oid = strdupW(control->ldctl_oid);
+        ret->ldctl_value.bv_len = control->ldctl_value.bv_len;
+        ret->ldctl_value.bv_val = strdupU(control->ldctl_value.bv_val);
+        ret->ldctl_iscritical = control->ldctl_iscritical;
+        ldap_control_freeW( control );
+    }
+    return result;
 }
 
 /***********************************************************************
diff --git a/dlls/wldap32/wldap32.h b/dlls/wldap32/wldap32.h
index 00a85a3..55852a6 100644
--- a/dlls/wldap32/wldap32.h
+++ b/dlls/wldap32/wldap32.h
@@ -18,6 +18,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
+#include "wine/unicode.h"
+
 extern HINSTANCE hwldap32 DECLSPEC_HIDDEN;
 
 ULONG map_error( int ) DECLSPEC_HIDDEN;
@@ -37,6 +39,17 @@ static inline char *strdupU( const char *src )
     return dst;
 }
 
+static inline WCHAR *strdupW( const WCHAR *src )
+{
+    WCHAR *dst;
+
+    if (!src) return NULL;
+    dst = HeapAlloc( GetProcessHeap(), 0, (strlenW( src ) + 1) * sizeof(WCHAR) );
+    if (dst)
+        strcpyW( dst, src );
+    return dst;
+}
+
 static inline LPWSTR strAtoW( LPCSTR str )
 {
     LPWSTR ret = NULL;
-- 
2.6.2




More information about the wine-patches mailing list