]> git.sur5r.net Git - openldap/blobdiff - libraries/libldap/options.c
Fix NULL pointer deref bugs
[openldap] / libraries / libldap / options.c
index 0d978e3274448773bd443a692a5e53c8a9156c80..fcf7cc7ca5da4d2b9e358dea15c576f1a2023f50 100644 (file)
@@ -1,3 +1,4 @@
+/* $OpenLDAP$ */
 /*
  * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved.
  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
@@ -79,11 +80,11 @@ static const LDAPAPIFeatureInfo features[] = {
 
 int
 ldap_get_option(
-       LDAP_CONST LDAP *ld,
+       LDAP    *ld,
        int             option,
        void    *outvalue)
 {
-       LDAP_CONST struct ldapoptions *lo;
+       const struct ldapoptions *lo;
 
        if( ldap_int_global_options.ldo_valid != LDAP_INITIALIZED ) {
                ldap_int_initialize();
@@ -197,11 +198,7 @@ ldap_get_option(
                return LDAP_OPT_SUCCESS;
 
        case LDAP_OPT_PROTOCOL_VERSION:
-               if ((ld != NULL) && ld->ld_version) {
-                       * (int *) outvalue = ld->ld_version;
-               } else { 
-                       * (int *) outvalue = lo->ldo_version;
-               }
+               * (int *) outvalue = lo->ldo_version;
                return LDAP_OPT_SUCCESS;
 
        case LDAP_OPT_SERVER_CONTROLS:
@@ -217,7 +214,11 @@ ldap_get_option(
                return LDAP_OPT_SUCCESS;
 
        case LDAP_OPT_HOST_NAME:
-               * (char **) outvalue = LDAP_STRDUP(lo->ldo_defhost);
+               * (char **) outvalue = ldap_url_list2hosts(lo->ldo_defludp);
+               return LDAP_OPT_SUCCESS;
+
+       case LDAP_OPT_URI:
+               * (char **) outvalue = ldap_url_list2urls(lo->ldo_defludp);
                return LDAP_OPT_SUCCESS;
 
        case LDAP_OPT_ERROR_NUMBER:
@@ -286,7 +287,11 @@ ldap_get_option(
 
        default:
 #ifdef HAVE_TLS
-               if ( ldap_pvt_tls_get_option(lo, option, outvalue ) == 0 )
+               if ( ldap_pvt_tls_get_option((struct ldapoptions *)lo, option, outvalue ) == 0 )
+                       return LDAP_OPT_SUCCESS;
+#endif
+#ifdef HAVE_CYRUS_SASL
+               if ( ldap_pvt_sasl_get_option(ld, option, outvalue ) == 0 )
                        return LDAP_OPT_SUCCESS;
 #endif
                /* bad param */
@@ -439,39 +444,77 @@ ldap_set_option(
                                /* not supported */
                                break;
                        }
-                       ld->ld_version = vers;
+                       lo->ldo_version = vers;
                } return LDAP_OPT_SUCCESS;
 
 
        case LDAP_OPT_HOST_NAME: {
                        const char *host = (const char *) invalue;
+                       LDAPURLDesc *ludlist = NULL;
+                       int rc = LDAP_OPT_SUCCESS;
+
+                       if(host != NULL) {
+                               rc = ldap_url_parsehosts(&ludlist, host);
 
-                       if(lo->ldo_defhost != NULL) {
-                               LDAP_FREE(lo->ldo_defhost);
-                               lo->ldo_defhost = NULL;
+                       } else if(ld == NULL) {
+                               /*
+                                * must want global default returned
+                                * to initial condition.
+                                */
+                               rc = ldap_url_parselist(&ludlist, "ldap://localhost/");
+
+                       } else {
+                               /*
+                                * must want the session default
+                                *   updated to the current global default
+                                */
+                               ludlist = ldap_url_duplist(
+                                       ldap_int_global_options.ldo_defludp);
+                               if (ludlist == NULL)
+                                       rc = LDAP_NO_MEMORY;
                        }
 
-                       if(host != NULL) {
-                               lo->ldo_defhost = LDAP_STRDUP(host);
-                               return LDAP_OPT_SUCCESS;
+                       if (rc == LDAP_OPT_SUCCESS) {
+                               if (lo->ldo_defludp != NULL)
+                                       ldap_free_urllist(lo->ldo_defludp);
+                               lo->ldo_defludp = ludlist;
                        }
+                       return rc;
+               }
 
-                       if(ld == NULL) {
+       case LDAP_OPT_URI: {
+                       const char *urls = (const char *) invalue;
+                       LDAPURLDesc *ludlist = NULL;
+                       int rc = LDAP_OPT_SUCCESS;
+
+                       if(urls != NULL) {
+                               rc = ldap_url_parselist(&ludlist, urls);
+
+                       } else if(ld == NULL) {
                                /*
                                 * must want global default returned
                                 * to initial condition.
                                 */
-                               lo->ldo_defhost = LDAP_STRDUP("localhost");
+                               rc = ldap_url_parselist(&ludlist, "ldap://localhost/");
 
                        } else {
                                /*
                                 * must want the session default
                                 *   updated to the current global default
                                 */
-                               lo->ldo_defhost = LDAP_STRDUP(
-                                       ldap_int_global_options.ldo_defhost);
+                               ludlist = ldap_url_duplist(
+                                       ldap_int_global_options.ldo_defludp);
+                               if (ludlist == NULL)
+                                       rc = LDAP_NO_MEMORY;
                        }
-               } return LDAP_OPT_SUCCESS;
+
+                       if (rc == LDAP_OPT_SUCCESS) {
+                               if (lo->ldo_defludp != NULL)
+                                       ldap_free_urllist(lo->ldo_defludp);
+                               lo->ldo_defludp = ludlist;
+                       }
+                       return rc;
+               }
 
        case LDAP_OPT_ERROR_NUMBER: {
                        int err = * (const int *) invalue;
@@ -524,8 +567,12 @@ ldap_set_option(
 
        default:
 #ifdef HAVE_TLS
-               if ( ldap_pvt_tls_set_option( lo, option, invalue ) == 0 )
+               if ( ldap_pvt_tls_set_option( lo, option, (void *)invalue ) == 0 )
                        return LDAP_OPT_SUCCESS;
+#endif
+#ifdef HAVE_CYRUS_SASL
+               if ( ldap_pvt_sasl_set_option( ld, option, (void *)invalue ) == 0 )
+                       return LDAP_OPT_SUCCESS;
 #endif
                /* bad param */
                break;