[evolution-data-server] LDAP: Change how LDAP query is constructed



commit c80d050e840580edd57a6a128812c501a89f17ee
Author: Milan Crha <mcrha redhat com>
Date:   Mon Nov 11 15:29:50 2019 +0100

    LDAP: Change how LDAP query is constructed
    
    There could still happen a double-free due to the way the LDAP query
    is constructed, which was also highly ineffective.
    
    Related to https://gitlab.gnome.org/GNOME/evolution/issues/635

 src/addressbook/backends/ldap/e-book-backend-ldap.c | 21 +++++----------------
 1 file changed, 5 insertions(+), 16 deletions(-)
---
diff --git a/src/addressbook/backends/ldap/e-book-backend-ldap.c 
b/src/addressbook/backends/ldap/e-book-backend-ldap.c
index da2fd009e..a6dd8a065 100644
--- a/src/addressbook/backends/ldap/e-book-backend-ldap.c
+++ b/src/addressbook/backends/ldap/e-book-backend-ldap.c
@@ -3958,7 +3958,6 @@ e_book_backend_ldap_build_query (EBookBackendLDAP *bl,
        gchar *retval;
        EBookBackendLDAPSExpData data;
        gint i;
-       gchar **strings;
 
        data.list = NULL;
        data.bl = bl;
@@ -3993,21 +3992,11 @@ e_book_backend_ldap_build_query (EBookBackendLDAP *bl,
                if (data.list->next) {
                        g_warning ("LDAP: conversion of '%s' to ldap query string failed", query);
                        retval = NULL;
-               }
-               else {
-                       if (bl->priv->ldap_search_filter && *bl->priv->ldap_search_filter
-                               && g_ascii_strcasecmp (bl->priv->ldap_search_filter, "(objectClass=*)") != 0) 
{
-                               strings = g_new0 (gchar *, 5);
-                               strings[0] = g_strdup ("(&");
-                               strings[1] = g_strdup_printf ("%s", bl->priv->ldap_search_filter);
-                               strings[2] = data.list->data;
-                               strings[3] = g_strdup (")");
-                               retval = g_strjoinv (" ", strings);
-                               for (i = 0; i < 4; i++)
-                                       g_free (strings[i]);
-                               g_free (strings);
-                       }
-                       else {
+               } else {
+                       if (bl->priv->ldap_search_filter && *bl->priv->ldap_search_filter &&
+                           g_ascii_strcasecmp (bl->priv->ldap_search_filter, "(objectClass=*)") != 0) {
+                               retval = g_strdup_printf ("(& %s %s)", bl->priv->ldap_search_filter, (const 
gchar *) data.list->data);
+                       } else {
                                retval = g_strdup (data.list->data);
                        }
                }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]