Print this page
NEX-2842 SMB client authentication fails in adt_set_user() with IDMU enabled

Split Close
Expand all
Collapse all
          --- old/usr/src/lib/libbsm/common/adt.c
          +++ new/usr/src/lib/libbsm/common/adt.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) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
       24 + * Copyright 2014 Nexenta Systems, Inc.  All rights reserved.
  24   25   * Copyright 2017 OmniOS Community Edition (OmniOSce) Association.
  25   26   */
  26   27  
  27   28  #include <bsm/adt.h>
  28   29  #include <bsm/adt_event.h>
  29   30  #include <assert.h>
  30   31  #include <bsm/audit.h>
  31   32  #include <bsm/audit_record.h>
  32   33  #include <bsm/libbsm.h>
  33   34  #include <door.h>
↓ open down ↓ 150 lines elided ↑ open up ↑
 184  185  {
 185  186          struct passwd   pwd;
 186  187          long            buff_sz;
 187  188          char            *pwd_buff;
 188  189  
 189  190  
 190  191          if (auditstate & AUC_DISABLED) {
 191  192                  /* c2audit excluded */
 192  193                  mask->am_success = 0;
 193  194                  mask->am_failure = 0;
 194      -        } else if (uid <= MAXUID) {
      195 +                return (0);
      196 +        }
      197 +
      198 +        if (uid <= MAXUID) {
 195  199                  if ((buff_sz = sysconf(_SC_GETPW_R_SIZE_MAX)) == -1) {
 196  200                          adt_write_syslog("couldn't determine maximum size of "
 197  201                              "password buffer", errno);
 198  202                          return (-1);
 199  203                  }
 200  204                  if ((pwd_buff = calloc(1, (size_t)++buff_sz)) == NULL) {
 201  205                          return (-1);
 202  206                  }
 203      -                if (getpwuid_r(uid, &pwd, pwd_buff, (int)buff_sz) == NULL) {
 204      -                        errno = EINVAL; /* user doesn't exist */
      207 +                /*
      208 +                 * Ephemeral id's and id's that exist in a name service we
      209 +                 * don't have configured (LDAP, NIS) can't be looked up,
      210 +                 * but either way it's not an error.
      211 +                 */
      212 +                if (getpwuid_r(uid, &pwd, pwd_buff, (int)buff_sz) != NULL) {
      213 +                        if (au_user_mask(pwd.pw_name, mask)) {
      214 +                                free(pwd_buff);
      215 +                                errno = EFAULT; /* undetermined failure */
      216 +                                return (-1);
      217 +                        }
 205  218                          free(pwd_buff);
 206      -                        return (-1);
      219 +                        return (0);
 207  220                  }
 208      -                if (au_user_mask(pwd.pw_name, mask)) {
 209      -                        free(pwd_buff);
 210      -                        errno = EFAULT; /* undetermined failure */
 211      -                        return (-1);
 212      -                }
 213  221                  free(pwd_buff);
 214      -        } else if (auditon(A_GETKMASK, (caddr_t)mask, sizeof (*mask)) == -1) {
      222 +        }
      223 +
      224 +        if (auditon(A_GETKMASK, (caddr_t)mask, sizeof (*mask)) == -1) {
 215  225                          return (-1);
 216  226          }
 217  227  
 218  228          return (0);
 219  229  }
 220  230  
 221  231  /*
 222  232   * adt_get_unique_id -- generate a hopefully unique 32 bit value
 223  233   *
 224  234   * there will be a follow up to replace this with the use of /dev/random
↓ open down ↓ 1949 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX