patrickallaert          Mon Jun 15 15:18:31 2009 UTC

  Added files:                 (Branch: PHP_5_3)
    /php-src/ext/ldap/tests     connect.inc skipifbindfailure.inc 
                                bug48441.phpt 

  Modified files:              
    /php-src/ext/ldap   ldap.c 
  Log:
  MFH: Fixing #48441 (ldap_search() with sizelimit/timelimit/deref options 
makes those options persistent)
  
http://cvs.php.net/viewvc.cgi/php-src/ext/ldap/ldap.c?r1=1.161.2.3.2.11.2.28&r2=1.161.2.3.2.11.2.29&diff_format=u
Index: php-src/ext/ldap/ldap.c
diff -u php-src/ext/ldap/ldap.c:1.161.2.3.2.11.2.28 
php-src/ext/ldap/ldap.c:1.161.2.3.2.11.2.29
--- php-src/ext/ldap/ldap.c:1.161.2.3.2.11.2.28 Mon Jun 15 15:04:11 2009
+++ php-src/ext/ldap/ldap.c     Mon Jun 15 15:18:31 2009
@@ -23,7 +23,7 @@
    +----------------------------------------------------------------------+
  */
  
-/* $Id: ldap.c,v 1.161.2.3.2.11.2.28 2009/06/15 15:04:11 patrickallaert Exp $ 
*/
+/* $Id: ldap.c,v 1.161.2.3.2.11.2.29 2009/06/15 15:18:31 patrickallaert Exp $ 
*/
 #define IS_EXT_MODULE
 
 #ifdef HAVE_CONFIG_H
@@ -224,7 +224,7 @@
 
        php_info_print_table_start();
        php_info_print_table_row(2, "LDAP Support", "enabled");
-       php_info_print_table_row(2, "RCS Version", "$Id: ldap.c,v 
1.161.2.3.2.11.2.28 2009/06/15 15:04:11 patrickallaert Exp $");
+       php_info_print_table_row(2, "RCS Version", "$Id: ldap.c,v 
1.161.2.3.2.11.2.29 2009/06/15 15:18:31 patrickallaert Exp $");
 
        if (LDAPG(max_links) == -1) {
                snprintf(tmp, 31, "%ld/unlimited", LDAPG(num_links));
@@ -544,13 +544,15 @@
 
 /* {{{ php_set_opts
  */
-static void php_set_opts(LDAP *ldap, int sizelimit, int timelimit, int deref)
+static void php_set_opts(LDAP *ldap, int sizelimit, int timelimit, int deref, 
int *old_sizelimit, int *old_timelimit, int *old_deref)
 {
        /* sizelimit */
        if (sizelimit > -1) {
 #if (LDAP_API_VERSION >= 2004) || HAVE_NSLDAP || HAVE_ORALDAP_10
+               ldap_get_option(ldap, LDAP_OPT_SIZELIMIT, old_sizelimit);
                ldap_set_option(ldap, LDAP_OPT_SIZELIMIT, &sizelimit);
 #else
+               *old_sizelimit = ldap->ld_sizelimit; 
                ldap->ld_sizelimit = sizelimit; 
 #endif
        }
@@ -558,8 +560,10 @@
        /* timelimit */
        if (timelimit > -1) {
 #if (LDAP_API_VERSION >= 2004) || HAVE_NSLDAP || HAVE_ORALDAP_10
+               ldap_get_option(ldap, LDAP_OPT_SIZELIMIT, old_timelimit);
                ldap_set_option(ldap, LDAP_OPT_TIMELIMIT, &timelimit);
 #else
+               *old_timelimit = ldap->ld_timelimit; 
                ldap->ld_timelimit = timelimit; 
 #endif
        }
@@ -567,8 +571,10 @@
        /* deref */
        if (deref > -1) {
 #if (LDAP_API_VERSION >= 2004) || HAVE_NSLDAP || HAVE_ORALDAP_10
+               ldap_get_option(ldap, LDAP_OPT_SIZELIMIT, old_deref);
                ldap_set_option(ldap, LDAP_OPT_DEREF, &deref);
 #else
+               *old_deref = ldap->ld_deref; 
                ldap->ld_deref = deref; 
 #endif
        }
@@ -589,6 +595,9 @@
        int ldap_sizelimit = -1; 
        int ldap_timelimit = -1; 
        int ldap_deref = -1;     
+       int old_ldap_sizelimit = -1; 
+       int old_ldap_timelimit = -1; 
+       int old_ldap_deref = -1;         
        int num_attribs = 0;
        int i, errno;
        int myargcount = ZEND_NUM_ARGS();
@@ -724,7 +733,7 @@
                                ldap_filter = Z_STRVAL_PP(entry);
                        }
 
-                       php_set_opts(ld->link, ldap_sizelimit, ldap_timelimit, 
ldap_deref);
+                       php_set_opts(ld->link, ldap_sizelimit, ldap_timelimit, 
ldap_deref, &old_ldap_sizelimit, &old_ldap_timelimit, &old_ldap_deref);
 
                        /* Run the actual search */     
                        rcs[i] = ldap_search(ld->link, ldap_base_dn, scope, 
ldap_filter, ldap_attrs, ldap_attrsonly);
@@ -766,7 +775,7 @@
                        goto cleanup;
                }
 
-               php_set_opts(ld->link, ldap_sizelimit, ldap_timelimit, 
ldap_deref);
+               php_set_opts(ld->link, ldap_sizelimit, ldap_timelimit, 
ldap_deref, &old_ldap_sizelimit, &old_ldap_timelimit, &old_ldap_deref);
 
                /* Run the actual search */     
                errno = ldap_search_s(ld->link, ldap_base_dn, scope, 
ldap_filter, ldap_attrs, ldap_attrsonly, &ldap_res);
@@ -797,6 +806,8 @@
        }
 
 cleanup:
+       // Restoring previous options
+       php_set_opts(ld->link, old_ldap_sizelimit, old_ldap_timelimit, 
old_ldap_deref, &ldap_sizelimit, &ldap_timelimit, &ldap_deref);
        if (ldap_attrs != NULL) {
                efree(ldap_attrs);
        }

http://cvs.php.net/viewvc.cgi/php-src/ext/ldap/tests/connect.inc?view=markup&rev=1.1
Index: php-src/ext/ldap/tests/connect.inc
+++ php-src/ext/ldap/tests/connect.inc
<?php

/*
Default values are "localhost", "root", database "test" and empty password.
Change the LDAP_TEST_* environment values if you want to use another 
configuration.
*/

$host                   = getenv("LDAP_TEST_HOST")      ? 
getenv("LDAP_TEST_HOST")      : "localhost";
$port                   = getenv("LDAP_TEST_PORT")      ? 
getenv("LDAP_TEST_PORT")      : 389;
$user                   = getenv("LDAP_TEST_USER")      ? 
getenv("LDAP_TEST_USER")      : "cn=Manager,dc=my-domain,dc=com";
$sasl_user              = getenv("LDAP_TEST_SASL_USER") ? 
getenv("LDAP_TEST_SASL_USER") : "Manager";
$passwd                 = getenv("LDAP_TEST_PASSWD")    ? 
getenv("LDAP_TEST_PASSWD")    : "secret";
$protocol_version       = getenv("LDAP_TEST_OPT_PROTOCOL_VERSION")      ? 
getenv("LDAP_TEST_OPT_PROTOCOL_VERSION")      : 3;
$skip_on_bind_failure   = getenv("LDAP_TEST_SKIP_BIND_FAILURE") ? 
getenv("LDAP_TEST_SKIP_BIND_FAILURE") : true;

function ldap_connect_and_bind($host, $port, $user, $passwd, $protocol_version) 
{
        $link = ldap_connect($host, $port);
        ldap_set_option($link, LDAP_OPT_PROTOCOL_VERSION, $protocol_version);
        ldap_bind($link, $user, $passwd);
        return $link;
}

function insert_dummy_data($link) {
        ldap_add($link, "dc=my-domain,dc=com", array(
                "objectClass"   => array(
                        "top",
                        "dcObject",
                        "organization"),
                "dc"                    => "my-domain",
                "o"                             => "my-domain",
        ));
        ldap_add($link, "cn=userA,dc=my-domain,dc=com", array(
                "objectclass" => "person",
                "cn" => "userA",
                "sn" => "testSN1",
                "userPassword" => "oops",
                "telephoneNumber" => "xx-xx-xx-xx-xx",
                "description" => "user A",
        ));
        ldap_add($link, "cn=userB,dc=my-domain,dc=com", array(
                "objectclass" => "person",
                "cn" => "userB",
                "sn" => "testSN2",
                "userPassword" => "oopsIDitItAgain",
                "description" => "user B",
        ));
        ldap_add($link, "cn=userC,cn=userB,dc=my-domain,dc=com", array(
                "objectclass" => "person",
                "cn" => "userC",
                "sn" => "testSN3",
                "userPassword" => "0r1g1na1 passw0rd",
        ));
}

function remove_dummy_data($link) {
        ldap_delete($link, "cn=userC,cn=userB,dc=my-domain,dc=com");
        ldap_delete($link, "cn=userA,dc=my-domain,dc=com");
        ldap_delete($link, "cn=userB,dc=my-domain,dc=com");
        ldap_delete($link, "dc=my-domain,dc=com");
}
?>

http://cvs.php.net/viewvc.cgi/php-src/ext/ldap/tests/skipifbindfailure.inc?view=markup&rev=1.1
Index: php-src/ext/ldap/tests/skipifbindfailure.inc
+++ php-src/ext/ldap/tests/skipifbindfailure.inc
<?php
require_once 'connect.inc';

if ($skip_on_bind_failure) {

        $link = ldap_connect($host, $port);
        ldap_set_option($link, LDAP_OPT_PROTOCOL_VERSION, $protocol_version);
        if (!...@ldap_bind($link, $user, $passwd))
                die(sprintf("skip Can't bind to LDAP Server - [%d] %s", 
ldap_errno($link), ldap_error($link)));

        ldap_unbind($link);
}
?>

http://cvs.php.net/viewvc.cgi/php-src/ext/ldap/tests/bug48441.phpt?view=markup&rev=1.1
Index: php-src/ext/ldap/tests/bug48441.phpt
+++ php-src/ext/ldap/tests/bug48441.phpt
--TEST--
ldap_search() bug 48441 - options persists after specifying them in ldap_search
--CREDITS--
Patrick Allaert <patrickalla...@php.net>
--SKIPIF--
<?php
require_once('skipif.inc');
require_once('skipifbindfailure.inc');
?>
--FILE--
<?php
include "connect.inc";

$link = ldap_connect_and_bind($host, $port, $user, $passwd, $protocol_version);
insert_dummy_data($link);

$dn = "dc=my-domain,dc=com";
$filter = "(objectclass=person)";

var_dump(
        $result = ldap_search($link, $dn, $filter, array('sn')),
        ldap_get_entries($link, $result)
);
var_dump(
        $result = ldap_search($link, $dn, $filter, array('sn'), 1, 1, 1, 
LDAP_DEREF_ALWAYS),
        ldap_get_entries($link, $result)
);
var_dump(
        $result = ldap_search($link, $dn, $filter, array('sn')),
        ldap_get_entries($link, $result)
);
?>
===DONE===
--CLEAN--
<?php
include "connect.inc";

$link = ldap_connect_and_bind($host, $port, $user, $passwd, $protocol_version);
remove_dummy_data($link);
?>
--XFAIL--
This test may still fail in PHP 6 as ext/ldap is still not ready
--EXPECTF--
resource(%d) of type (ldap result)
array(4) {
  ["count"]=>
  int(3)
  [0]=>
  array(4) {
    ["sn"]=>
    array(2) {
      ["count"]=>
      int(1)
      [0]=>
      string(7) "testSN1"
    }
    [0]=>
    string(2) "sn"
    ["count"]=>
    int(1)
    ["dn"]=>
    string(28) "cn=userA,dc=my-domain,dc=com"
  }
  [1]=>
  array(4) {
    ["sn"]=>
    array(2) {
      ["count"]=>
      int(1)
      [0]=>
      string(7) "testSN2"
    }
    [0]=>
    string(2) "sn"
    ["count"]=>
    int(1)
    ["dn"]=>
    string(28) "cn=userB,dc=my-domain,dc=com"
  }
  [2]=>
  array(4) {
    ["sn"]=>
    array(2) {
      ["count"]=>
      int(1)
      [0]=>
      string(7) "testSN3"
    }
    [0]=>
    string(2) "sn"
    ["count"]=>
    int(1)
    ["dn"]=>
    string(37) "cn=userC,cn=userB,dc=my-domain,dc=com"
  }
}

Warning: ldap_search(): Partial search results returned: Sizelimit exceeded in 
%s on line %d
resource(%d) of type (ldap result)
array(2) {
  ["count"]=>
  int(1)
  [0]=>
  array(4) {
    ["sn"]=>
    array(1) {
      ["count"]=>
      int(0)
    }
    [0]=>
    string(2) "sn"
    ["count"]=>
    int(1)
    ["dn"]=>
    string(28) "cn=userA,dc=my-domain,dc=com"
  }
}
resource(%d) of type (ldap result)
array(4) {
  ["count"]=>
  int(3)
  [0]=>
  array(4) {
    ["sn"]=>
    array(2) {
      ["count"]=>
      int(1)
      [0]=>
      string(7) "testSN1"
    }
    [0]=>
    string(2) "sn"
    ["count"]=>
    int(1)
    ["dn"]=>
    string(28) "cn=userA,dc=my-domain,dc=com"
  }
  [1]=>
  array(4) {
    ["sn"]=>
    array(2) {
      ["count"]=>
      int(1)
      [0]=>
      string(7) "testSN2"
    }
    [0]=>
    string(2) "sn"
    ["count"]=>
    int(1)
    ["dn"]=>
    string(28) "cn=userB,dc=my-domain,dc=com"
  }
  [2]=>
  array(4) {
    ["sn"]=>
    array(2) {
      ["count"]=>
      int(1)
      [0]=>
      string(7) "testSN3"
    }
    [0]=>
    string(2) "sn"
    ["count"]=>
    int(1)
    ["dn"]=>
    string(37) "cn=userC,cn=userB,dc=my-domain,dc=com"
  }
}
===DONE===

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to