Print this page
1668 CVE 2011-3508 (ldap format string issues)

Split Close
Expand all
Collapse all
          --- old/usr/src/lib/nsswitch/ldap/common/ldap_utils.c
          +++ new/usr/src/lib/nsswitch/ldap/common/ldap_utils.c
↓ open down ↓ 14 lines elided ↑ open up ↑
  15   15   * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  16   16   * If applicable, add the following below this CDDL HEADER, with the
  17   17   * fields enclosed by brackets "[]" replaced with your own identifying
  18   18   * information: Portions Copyright [yyyy] [name of copyright owner]
  19   19   *
  20   20   * CDDL HEADER END
  21   21   */
  22   22  /*
  23   23   * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
  24   24   * Use is subject to license terms.
       25 + * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
  25   26   */
  26   27  
  27      -#pragma ident   "%Z%%M% %I%     %E% SMI"
  28      -
  29   28  #include <sys/systeminfo.h>
  30   29  #include "ldap_common.h"
  31   30  
  32   31  
  33   32  #ifdef DEBUG
  34   33  /*
  35   34   * Debugging routine for printing the value of a result
  36   35   * structure
  37   36   */
  38   37  int
↓ open down ↓ 169 lines elided ↑ open up ↑
 208  207   * userdata, this routine will in turn gets call to produce
 209  208   * "(&(department=sds)(cn=sys1))" as the real search
 210  209   * filter, if the input SSD contains a filter "department=sds".
 211  210   */
 212  211  int
 213  212  _merge_SSD_filter(const ns_ldap_search_desc_t *desc,
 214  213                          char **realfilter,
 215  214                          const void *userdata)
 216  215  {
 217  216          int     len;
      217 +        char *checker;
 218  218  
 219  219  #ifdef DEBUG
 220  220          (void) fprintf(stdout, "\n[ldap_utils.c: _merge_SSD_filter]\n");
 221  221  #endif /* DEBUG */
 222  222  
 223  223          /* sanity check */
 224  224          if (realfilter == NULL)
 225  225                  return (NS_LDAP_INVALID_PARAM);
 226  226          *realfilter = NULL;
 227  227  
 228      -        if (desc == NULL || desc->filter == NULL ||
 229      -                        userdata == NULL)
      228 +        if (desc == NULL || desc->filter == NULL || userdata == NULL)
 230  229                  return (NS_LDAP_INVALID_PARAM);
 231  230  
      231 +        /* Parameter check.  We only want one %s here, otherwise bail. */
      232 +        len = 0;        /* Reuse 'len' as "Number of %s hits"... */
      233 +        checker = (char *)userdata;
      234 +        do {
      235 +                checker = strchr(checker, '%');
      236 +                if (checker != NULL) {
      237 +                        if (len > 0 || *(checker + 1) != 's')
      238 +                                return (NS_LDAP_INVALID_PARAM);
      239 +                        len++;  /* Got our %s. */
      240 +                        checker += 2;
      241 +                } else if (len != 1)
      242 +                        return (NS_LDAP_INVALID_PARAM);
      243 +        } while (checker != NULL);
      244 +
 232  245  #ifdef DEBUG
 233  246          (void) fprintf(stdout, "\n[userdata: %s]\n", (char *)userdata);
 234  247          (void) fprintf(stdout, "\n[SSD filter: %s]\n", desc->filter);
 235  248  #endif /* DEBUG */
 236  249  
 237  250          len = strlen(userdata) + strlen(desc->filter) + 1;
 238  251  
 239  252          *realfilter = (char *)malloc(len);
 240  253          if (*realfilter == NULL)
 241  254                  return (NS_LDAP_MEMORY);
 242  255  
 243      -        (void) sprintf(*realfilter, (char *)userdata,
 244      -                        desc->filter);
      256 +        (void) sprintf(*realfilter, (char *)userdata, desc->filter);
 245  257  
 246  258  #ifdef DEBUG
 247  259          (void) fprintf(stdout, "\n[new filter: %s]\n", *realfilter);
 248  260  #endif /* DEBUG */
 249  261  
 250  262          return (NS_LDAP_SUCCESS);
 251  263  }
 252  264  
 253  265  static char
 254  266  hex_char(int n)
↓ open down ↓ 35 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX