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

Split Close
Expand all
Collapse all
          --- old/usr/src/cmd/idmap/idmapd/nldaputils.c
          +++ new/usr/src/cmd/idmap/idmapd/nldaputils.c
↓ open down ↓ 13 lines elided ↑ open up ↑
  14   14   * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15   15   * If applicable, add the following below this CDDL HEADER, with the
  16   16   * fields enclosed by brackets "[]" replaced with your own identifying
  17   17   * information: Portions Copyright [yyyy] [name of copyright owner]
  18   18   *
  19   19   * CDDL HEADER END
  20   20   */
  21   21  
  22   22  /*
  23   23   * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
       24 + * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
  24   25   */
  25   26  
  26   27  /*
  27   28   * native LDAP related utility routines
  28   29   */
  29   30  
  30   31  #include "idmapd.h"
  31   32  #include "idmap_priv.h"
  32   33  #include "ns_sldap.h"
  33   34  #include "nldaputils.h"
↓ open down ↓ 106 lines elided ↑ open up ↑
 140  141   * i.e. (objectClass=posixAccount) by a site-specific filter
 141  142   * say (department=sds) then this routine when called will produce
 142  143   * "(&(department=sds)(uid=xy1234))" as the real search filter.
 143  144   */
 144  145  static
 145  146  int
 146  147  merge_SSD_filter(const ns_ldap_search_desc_t *desc,
 147  148          char **realfilter, const void *userdata)
 148  149  {
 149  150          int     len;
      151 +        char *checker;
      152 +
 150  153          if (realfilter == NULL)
 151  154                  return (NS_LDAP_INVALID_PARAM);
 152  155          *realfilter = NULL;
 153  156          if (desc == NULL || desc->filter == NULL || userdata == NULL)
 154  157                  return (NS_LDAP_INVALID_PARAM);
      158 +
      159 +        /* Parameter check.  We only want one %s here, otherwise bail. */
      160 +        len = 0;        /* Reuse 'len' as "Number of %s hits"... */
      161 +        checker = (char *)userdata;
      162 +        do {
      163 +                checker = strchr(checker, '%');
      164 +                if (checker != NULL) {
      165 +                        if (len > 0 || *(checker + 1) != 's')
      166 +                                return (NS_LDAP_INVALID_PARAM);
      167 +                        len++;  /* Got our %s. */
      168 +                        checker += 2;
      169 +                } else if (len != 1)
      170 +                        return (NS_LDAP_INVALID_PARAM);
      171 +        } while (checker != NULL);
      172 +
 155  173          len = strlen(userdata) + strlen(desc->filter) + 1;
 156  174          *realfilter = (char *)malloc(len);
 157  175          if (*realfilter == NULL)
 158  176                  return (NS_LDAP_MEMORY);
 159  177          (void) sprintf(*realfilter, (char *)userdata, desc->filter);
 160  178          return (NS_LDAP_SUCCESS);
 161  179  }
 162  180  
 163  181  static
 164  182  char
↓ open down ↓ 756 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX