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 ****
/*
- * 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
--- 1,6 ----
*** 31,40 ****
--- 30,43 ----
* 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,67 ****
#include <netsmb/smb.h>
#include <netsmb/smb_lib.h>
#include "private.h"
int
smb_open_printer(struct smb_ctx *ctx, const char *title,
int setuplen, int mode)
{
smbioc_printjob_t ioc;
! int err, tlen, new_fd;
int32_t from_fd;
tlen = strlen(title);
if (tlen >= SMBIOC_MAX_NAME)
return (EINVAL);
--- 55,82 ----
#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;
! char *p;
! int err, tlen;
! int new_fd = -1;
int32_t from_fd;
tlen = strlen(title);
if (tlen >= SMBIOC_MAX_NAME)
return (EINVAL);
*** 73,83 ****
*/
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) {
err = errno;
goto errout;
}
/*
--- 88,98 ----
*/
new_fd = smb_open_driver();
if (new_fd < 0)
return (errno);
from_fd = ctx->ct_dev_fd;
! if (nsmb_ioctl(new_fd, SMBIOC_DUP_DEV, &from_fd) == -1) {
err = errno;
goto errout;
}
/*
*** 86,102 ****
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) {
err = errno;
goto errout;
}
return (new_fd);
errout:
! close(new_fd);
errno = err;
return (-1);
}
--- 101,125 ----
bzero(&ioc, sizeof (ioc));
ioc.ioc_setuplen = setuplen;
ioc.ioc_prmode = mode;
strlcpy(ioc.ioc_title, title, SMBIOC_MAX_NAME);
! /*
! * 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:
! nsmb_close(new_fd);
errno = err;
return (-1);
}