Print this page
NEX-14666 Need to provide SMB 2.1 Client
NEX-17187 panic in smbfs_acl_store
NEX-17231 smbfs create xattr files finds wrong file
NEX-17224 smbfs lookup EINVAL should be ENOENT
NEX-17260 SMB1 client fails to list directory after NEX-14666
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Matt Barden <matt.barden@nexenta.com>
Reviewed by: Rick McNeal <rick.mcneal@nexenta.com>
Reviewed by: Saso Kiselkov <saso.kiselkov@nexenta.com>
Reviewed by: Joyce McIntosh <joyce.mcintosh@nexenta.com>
and: (cleanup)

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/fs/smbclnt/smbfs/smbfs_acl.c
          +++ new/usr/src/uts/common/fs/smbclnt/smbfs/smbfs_acl.c
↓ open down ↓ 14 lines elided ↑ open up ↑
  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 2010 Sun Microsystems, Inc.  All rights reserved.
  24   24   * Use is subject to license terms.
       25 + *
       26 + * Copyright 2018 Nexenta Systems, Inc.  All rights reserved.
  25   27   */
  26   28  
  27   29  /*
  28   30   * ACL support for smbfs
  29   31   */
  30   32  
  31   33  #include <sys/systm.h>  /* bcopy, ... */
  32   34  #include <sys/errno.h>
  33   35  #include <sys/cred.h>
  34   36  #include <sys/cmn_err.h>
↓ open down ↓ 27 lines elided ↑ open up ↑
  62   64   * smbfs_ioctl SMBFSIO_GETSD and VOP_GETSECATTR.
  63   65   * Handles required rights, tmpopen/tmpclose.
  64   66   *
  65   67   * Note: smbfs_getsd allocates and returns an mblk chain,
  66   68   * which the caller must free.
  67   69   */
  68   70  static int
  69   71  smbfs_getsd(vnode_t *vp, uint32_t selector, mblk_t **mp, cred_t *cr)
  70   72  {
  71   73          struct smb_cred scred;
  72      -        int error, cerror;
  73   74          smbmntinfo_t *smi;
  74   75          smbnode_t       *np;
  75      -        u_int16_t       fid = SMB_FID_UNUSED;
       76 +        smb_fh_t        *fid = NULL;
  76   77          uint32_t        sdlen = SMALL_SD_SIZE;
  77   78          uint32_t        rights = STD_RIGHT_READ_CONTROL_ACCESS;
       79 +        int error;
  78   80  
  79   81          if (selector & SACL_SECURITY_INFORMATION)
  80   82                  rights |= SEC_RIGHT_SYSTEM_SECURITY;
  81   83  
  82   84          np = VTOSMB(vp);
  83   85          smi = VTOSMI(vp);
  84   86  
  85      -        /* Shared lock for (possible) n_fid use. */
  86      -        if (smbfs_rw_enter_sig(&np->r_lkserlock, RW_READER, SMBINTR(vp)))
  87      -                return (EINTR);
  88   87          smb_credinit(&scred, cr);
  89   88  
  90   89          error = smbfs_smb_tmpopen(np, rights, &scred, &fid);
  91   90          if (error)
  92   91                  goto out;
  93   92  
  94   93  again:
  95   94          /*
  96   95           * This does the OTW Get
  97   96           */
  98      -        error = smbfs_smb_getsec_m(smi->smi_share, fid,
  99      -            &scred, selector, mp, &sdlen);
       97 +        error = smbfs_smb_getsec(smi->smi_share, fid,
       98 +            selector, mp, &sdlen, &scred);
 100   99          /*
 101  100           * Server may give us an error indicating that we
 102  101           * need a larger data buffer to receive the SD,
 103  102           * and the size we'll need.  Use the given size,
 104  103           * but only after a sanity check.
 105  104           *
 106  105           * Let's check for specific error values here.
 107  106           * The NT error is: STATUS_BUFFER_TOO_SMALL,
 108  107           * or with old error codes, one of these:
 109  108           * ERRSRV/ERRnoroom, ERRDOS/122, ERRDOS/111
 110  109           * Those are mapped to: EMOREDATA, which is
 111  110           * later converted to E2BIG.
 112  111           */
 113  112          if (error == E2BIG &&
 114  113              sdlen > SMALL_SD_SIZE &&
 115  114              sdlen <= MAX_RAW_SD_SIZE)
 116  115                  goto again;
 117  116  
 118      -        cerror = smbfs_smb_tmpclose(np, fid, &scred);
 119      -        if (cerror)
 120      -                SMBVDEBUG("error %d closing file %s\n",
 121      -                    cerror, np->n_rpath);
      117 +        smbfs_smb_tmpclose(np, fid);
 122  118  
 123  119  out:
 124  120          smb_credrele(&scred);
 125      -        smbfs_rw_exit(&np->r_lkserlock);
 126  121  
 127  122          return (error);
 128  123  }
 129  124  
 130  125  /*
 131  126   * smbfs_setsd() is a common function used by both
 132  127   * smbfs_ioctl SMBFSIO_SETSD and VOP_SETSECATTR.
 133  128   * Handles required rights, tmpopen/tmpclose.
 134  129   *
 135  130   * Note: smbfs_setsd _consumes_ the passed *mp and
 136  131   * clears the pointer (so the caller won't free it)
 137  132   */
 138  133  static int
 139  134  smbfs_setsd(vnode_t *vp, uint32_t selector, mblk_t **mp, cred_t *cr)
 140  135  {
 141  136          struct smb_cred scred;
 142      -        int error, cerror;
 143  137          smbmntinfo_t *smi;
 144  138          smbnode_t       *np;
 145  139          uint32_t        rights;
 146      -        u_int16_t       fid = SMB_FID_UNUSED;
      140 +        smb_fh_t        *fid = NULL;
      141 +        int error;
 147  142  
 148  143          np = VTOSMB(vp);
 149  144          smi = VTOSMI(vp);
 150  145  
 151  146          /*
 152  147           * Which parts of the SD are we setting?
 153  148           * What rights do we need for that?
 154  149           */
 155  150          if (selector == 0)
 156  151                  return (0);
 157  152  
 158  153          rights = 0;
 159  154          if (selector & (OWNER_SECURITY_INFORMATION |
 160  155              GROUP_SECURITY_INFORMATION))
 161  156                  rights |= STD_RIGHT_WRITE_OWNER_ACCESS;
 162  157          if (selector & DACL_SECURITY_INFORMATION)
 163  158                  rights |= STD_RIGHT_WRITE_DAC_ACCESS;
 164  159          if (selector & SACL_SECURITY_INFORMATION)
 165  160                  rights |= SEC_RIGHT_SYSTEM_SECURITY;
 166  161  
 167      -        /* Shared lock for (possible) n_fid use. */
 168      -        if (smbfs_rw_enter_sig(&np->r_lkserlock, RW_READER, SMBINTR(vp)))
 169      -                return (EINTR);
 170  162          smb_credinit(&scred, cr);
 171  163  
 172  164          error = smbfs_smb_tmpopen(np, rights, &scred, &fid);
 173  165          if (error)
 174  166                  goto out;
 175  167  
 176  168          /*
 177  169           * We're setting the remote ACL now, so
 178  170           * invalidate our cached ACL just in case
 179  171           * the server doesn't do exactly as we ask.
 180  172           */
 181  173          mutex_enter(&np->r_statelock);
 182  174          np->r_sectime = gethrtime();
 183  175          mutex_exit(&np->r_statelock);
 184  176  
 185  177          /*
 186  178           * This does the OTW Set
 187  179           */
 188      -        error = smbfs_smb_setsec_m(smi->smi_share, fid,
 189      -            &scred, selector, mp);
      180 +        error = smbfs_smb_setsec(smi->smi_share, fid,
      181 +            selector, mp, &scred);
 190  182  
 191      -        cerror = smbfs_smb_tmpclose(np, fid, &scred);
 192      -        if (cerror)
 193      -                SMBVDEBUG("error %d closing file %s\n",
 194      -                    cerror, np->n_rpath);
      183 +        smbfs_smb_tmpclose(np, fid);
 195  184  
 196  185  out:
 197  186          smb_credrele(&scred);
 198      -        smbfs_rw_exit(&np->r_lkserlock);
 199  187  
 200  188          return (error);
 201  189  }
 202  190  
 203  191  /*
 204  192   * Helper for VOP_IOCTL: SMBFSIO_GETSD
 205  193   */
 206  194  int
 207  195  smbfs_acl_iocget(vnode_t *vp, intptr_t arg, int flag, cred_t *cr)
 208  196  {
↓ open down ↓ 387 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX