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)
NEX-16818 Add fksmbcl development tool
NEX-17264 SMB client test tp_smbutil_013 fails after NEX-14666
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Matt Barden <matt.barden@nexenta.com>
and: (fix ref leaks)

Split Close
Expand all
Collapse all
          --- old/usr/src/lib/libsmbfs/smb/print.c
          +++ new/usr/src/lib/libsmbfs/smb/print.c
   1    1  /*
   2      - * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
   3    2   * Copyright (c) 2000, Boris Popov
   4    3   * All rights reserved.
   5    4   *
   6    5   * Redistribution and use in source and binary forms, with or without
   7    6   * modification, are permitted provided that the following conditions
   8    7   * are met:
   9    8   * 1. Redistributions of source code must retain the above copyright
  10    9   *    notice, this list of conditions and the following disclaimer.
  11   10   * 2. Redistributions in binary form must reproduce the above copyright
  12   11   *    notice, this list of conditions and the following disclaimer in the
↓ open down ↓ 13 lines elided ↑ open up ↑
  26   25   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27   26   * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28   27   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29   28   * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30   29   * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31   30   * SUCH DAMAGE.
  32   31   *
  33   32   * $Id: print.c,v 1.1.1.3 2001/07/06 22:38:43 conrad Exp $
  34   33   */
  35   34  
       35 +/*
       36 + * Copyright 2018 Nexenta Systems, Inc.  All rights reserved.
       37 + */
       38 +
  36   39  #include <sys/param.h>
  37   40  #include <sys/ioctl.h>
  38   41  #include <sys/time.h>
  39   42  #include <sys/mount.h>
  40   43  #include <fcntl.h>
  41   44  #include <ctype.h>
  42   45  #include <errno.h>
  43   46  #include <stdio.h>
  44   47  #include <string.h>
  45   48  #include <strings.h>
↓ open down ↓ 1 lines elided ↑ open up ↑
  47   50  #include <pwd.h>
  48   51  #include <grp.h>
  49   52  #include <unistd.h>
  50   53  #include <libintl.h>
  51   54  
  52   55  #include <netsmb/smb.h>
  53   56  #include <netsmb/smb_lib.h>
  54   57  
  55   58  #include "private.h"
  56   59  
       60 +/*
       61 + * Replacing invalid characters in print job titles:
       62 + *
       63 + * The spec. is unclear about what characters are allowed in a
       64 + * print job title (used with NtCreate) so out of caution this
       65 + * makes sure the title contains none of the characters that
       66 + * are known to be illegal in a file name component.
       67 + */
       68 +static const char invalid_chars[] = SMB_FILENAME_INVALID_CHARS;
       69 +
  57   70  int
  58   71  smb_open_printer(struct smb_ctx *ctx, const char *title,
  59   72          int setuplen, int mode)
  60   73  {
  61   74          smbioc_printjob_t ioc;
  62      -        int err, tlen, new_fd;
       75 +        char *p;
       76 +        int err, tlen;
       77 +        int new_fd = -1;
  63   78          int32_t from_fd;
  64   79  
  65   80          tlen = strlen(title);
  66   81          if (tlen >= SMBIOC_MAX_NAME)
  67   82                  return (EINVAL);
  68   83  
  69   84          /*
  70   85           * Will represent this SMB-level open as a new
  71   86           * open device handle.  Get one, then duplicate
  72   87           * the driver session and tree bindings.
  73   88           */
  74   89          new_fd = smb_open_driver();
  75   90          if (new_fd < 0)
  76   91                  return (errno);
  77   92          from_fd = ctx->ct_dev_fd;
  78      -        if (ioctl(new_fd, SMBIOC_DUP_DEV, &from_fd) == -1) {
       93 +        if (nsmb_ioctl(new_fd, SMBIOC_DUP_DEV, &from_fd) == -1) {
  79   94                  err = errno;
  80   95                  goto errout;
  81   96          }
  82   97  
  83   98          /*
  84   99           * Do the SMB-level open with the new dev handle.
  85  100           */
  86  101          bzero(&ioc, sizeof (ioc));
  87  102          ioc.ioc_setuplen = setuplen;
  88  103          ioc.ioc_prmode = mode;
  89  104          strlcpy(ioc.ioc_title, title, SMBIOC_MAX_NAME);
  90  105  
  91      -        if (ioctl(new_fd, SMBIOC_PRINTJOB, &ioc) == -1) {
      106 +        /*
      107 +         * The title is used in NtCreate so sanitize by
      108 +         * replacing any illegal chars with spaces.
      109 +         */
      110 +        for (p = ioc.ioc_title; *p != '\0'; p++)
      111 +                if (strchr(invalid_chars, *p) != NULL)
      112 +                        *p = ' ';
      113 +
      114 +        if (nsmb_ioctl(new_fd, SMBIOC_PRINTJOB, &ioc) == -1) {
  92  115                  err = errno;
  93  116                  goto errout;
  94  117          }
  95  118  
  96  119          return (new_fd);
  97  120  
  98  121  errout:
  99      -        close(new_fd);
      122 +        nsmb_close(new_fd);
 100  123          errno = err;
 101  124          return (-1);
 102  125  }
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX