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)

@@ -1,7 +1,6 @@
 /*
- * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
  * Copyright (c) 2000, Boris Popov
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions

@@ -31,10 +30,14 @@
  * SUCH DAMAGE.
  *
  * $Id: print.c,v 1.1.1.3 2001/07/06 22:38:43 conrad Exp $
  */
 
+/*
+ * Copyright 2018 Nexenta Systems, Inc.  All rights reserved.
+ */
+
 #include <sys/param.h>
 #include <sys/ioctl.h>
 #include <sys/time.h>
 #include <sys/mount.h>
 #include <fcntl.h>

@@ -52,16 +55,28 @@
 #include <netsmb/smb.h>
 #include <netsmb/smb_lib.h>
 
 #include "private.h"
 
+/*
+ * Replacing invalid characters in print job titles:
+ *
+ * The spec. is unclear about what characters are allowed in a
+ * print job title (used with NtCreate) so out of caution this
+ * makes sure the title contains none of the characters that
+ * are known to be illegal in a file name component.
+ */
+static const char invalid_chars[] = SMB_FILENAME_INVALID_CHARS;
+
 int
 smb_open_printer(struct smb_ctx *ctx, const char *title,
         int setuplen, int mode)
 {
         smbioc_printjob_t ioc;
-        int err, tlen, new_fd;
+        char *p;
+        int err, tlen;
+        int new_fd = -1;
         int32_t from_fd;
 
         tlen = strlen(title);
         if (tlen >= SMBIOC_MAX_NAME)
                 return (EINVAL);

@@ -73,11 +88,11 @@
          */
         new_fd = smb_open_driver();
         if (new_fd < 0)
                 return (errno);
         from_fd = ctx->ct_dev_fd;
-        if (ioctl(new_fd, SMBIOC_DUP_DEV, &from_fd) == -1) {
+        if (nsmb_ioctl(new_fd, SMBIOC_DUP_DEV, &from_fd) == -1) {
                 err = errno;
                 goto errout;
         }
 
         /*

@@ -86,17 +101,25 @@
         bzero(&ioc, sizeof (ioc));
         ioc.ioc_setuplen = setuplen;
         ioc.ioc_prmode = mode;
         strlcpy(ioc.ioc_title, title, SMBIOC_MAX_NAME);
 
-        if (ioctl(new_fd, SMBIOC_PRINTJOB, &ioc) == -1) {
+        /*
+         * The title is used in NtCreate so sanitize by
+         * replacing any illegal chars with spaces.
+         */
+        for (p = ioc.ioc_title; *p != '\0'; p++)
+                if (strchr(invalid_chars, *p) != NULL)
+                        *p = ' ';
+
+        if (nsmb_ioctl(new_fd, SMBIOC_PRINTJOB, &ioc) == -1) {
                 err = errno;
                 goto errout;
         }
 
         return (new_fd);
 
 errout:
-        close(new_fd);
+        nsmb_close(new_fd);
         errno = err;
         return (-1);
 }