Print this page
13026 SMB and NFS use the global zone's IDMAP when they shouldn't
Change-Id: I3b5f7bc68bb77764aa7cb59a48dd1740a8387ccf

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/fs/smbsrv/smb_idmap.c
          +++ new/usr/src/uts/common/fs/smbsrv/smb_idmap.c
↓ open down ↓ 12 lines elided ↑ open up ↑
  13   13   * When distributing Covered Code, include this CDDL HEADER in each
  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   * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
  23      - * Copyright 2018 Nexenta Systems, Inc.  All rights reserved.
       23 + * Copyright 2020 Nexenta by DDN, Inc. All rights reserved.
  24   24   */
  25   25  
  26   26  /*
  27   27   * SMB server interface to idmap
  28   28   * (smb_idmap_get..., smb_idmap_batch_...)
  29   29   *
  30   30   * There are three implementations of this interface.
  31   31   * This is the kernel version of these routines.  See also:
  32   32   * $SRC/lib/smbsrv/libfksmbsrv/common/fksmb_idmap.c
  33   33   * $SRC/lib/smbsrv/libsmb/common/smb_idmap.c
↓ open down ↓ 42 lines elided ↑ open up ↑
  76   76   * Maps the given Solaris ID to a Windows SID using the
  77   77   * simple mapping API.
  78   78   */
  79   79  idmap_stat
  80   80  smb_idmap_getsid(uid_t id, int idtype, smb_sid_t **sid)
  81   81  {
  82   82          smb_idmap_t sim;
  83   83  
  84   84          switch (idtype) {
  85   85          case SMB_IDMAP_USER:
  86      -                sim.sim_stat = kidmap_getsidbyuid(global_zone, id,
       86 +                sim.sim_stat = kidmap_getsidbyuid(curzone, id,
  87   87                      (const char **)&sim.sim_domsid, &sim.sim_rid);
  88   88                  break;
  89   89  
  90   90          case SMB_IDMAP_GROUP:
  91      -                sim.sim_stat = kidmap_getsidbygid(global_zone, id,
       91 +                sim.sim_stat = kidmap_getsidbygid(curzone, id,
  92   92                      (const char **)&sim.sim_domsid, &sim.sim_rid);
  93   93                  break;
  94   94  
  95   95          case SMB_IDMAP_EVERYONE:
  96   96                  /* Everyone S-1-1-0 */
  97   97                  sim.sim_domsid = "S-1-1";
  98   98                  sim.sim_rid = 0;
  99   99                  sim.sim_stat = IDMAP_SUCCESS;
 100  100                  break;
 101  101  
↓ open down ↓ 41 lines elided ↑ open up ↑
 143  143          char sidstr[SMB_SID_STRSZ];
 144  144  
 145  145          smb_sid_tostr(sid, sidstr);
 146  146          if (smb_sid_splitstr(sidstr, &sim.sim_rid) != 0)
 147  147                  return (IDMAP_ERR_SID);
 148  148          sim.sim_domsid = sidstr;
 149  149          sim.sim_id = id;
 150  150  
 151  151          switch (*idtype) {
 152  152          case SMB_IDMAP_USER:
 153      -                sim.sim_stat = kidmap_getuidbysid(global_zone, sim.sim_domsid,
      153 +                sim.sim_stat = kidmap_getuidbysid(curzone, sim.sim_domsid,
 154  154                      sim.sim_rid, sim.sim_id);
 155  155                  break;
 156  156  
 157  157          case SMB_IDMAP_GROUP:
 158      -                sim.sim_stat = kidmap_getgidbysid(global_zone, sim.sim_domsid,
      158 +                sim.sim_stat = kidmap_getgidbysid(curzone, sim.sim_domsid,
 159  159                      sim.sim_rid, sim.sim_id);
 160  160                  break;
 161  161  
 162  162          case SMB_IDMAP_UNKNOWN:
 163      -                sim.sim_stat = kidmap_getpidbysid(global_zone, sim.sim_domsid,
      163 +                sim.sim_stat = kidmap_getpidbysid(curzone, sim.sim_domsid,
 164  164                      sim.sim_rid, sim.sim_id, &sim.sim_idtype);
 165  165                  break;
 166  166  
 167  167          default:
 168  168                  ASSERT(0);
 169  169                  return (IDMAP_ERR_ARG);
 170  170          }
 171  171  
 172  172          *idtype = sim.sim_idtype;
 173  173  
↓ open down ↓ 5 lines elided ↑ open up ↑
 179  179   *
 180  180   * Creates and initializes the context for batch ID mapping.
 181  181   */
 182  182  idmap_stat
 183  183  smb_idmap_batch_create(smb_idmap_batch_t *sib, uint16_t nmap, int flags)
 184  184  {
 185  185          ASSERT(sib != NULL);
 186  186  
 187  187          bzero(sib, sizeof (smb_idmap_batch_t));
 188  188  
 189      -        sib->sib_idmaph = kidmap_get_create(global_zone);
      189 +        sib->sib_idmaph = kidmap_get_create(curzone);
 190  190  
 191  191          sib->sib_flags = flags;
 192  192          sib->sib_nmap = nmap;
 193  193          sib->sib_size = nmap * sizeof (smb_idmap_t);
 194  194          sib->sib_maps = kmem_zalloc(sib->sib_size, KM_SLEEP);
 195  195  
 196  196          return (IDMAP_SUCCESS);
 197  197  }
 198  198  
 199  199  /*
↓ open down ↓ 255 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX