Print this page
NEX-16159 Time spent sharing SMB filesystems could be reduced by optimizing smb_getdataset for default mount points
Reviewed by: Sanjay Nadkarni <sanjay.nadkarni@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Reviewed by: Matt Barden <matt.barden@nexenta.com>
NEX-3981 bad pointer free causes crash in fksmbd
Reviewed by: Gordon Ross <gordon.ross@nexenta.com>
Reviewed by: Kevin Crowe <kevin.crowe@nexenta.com>
Reviewed by: Alek Pinchuk <alek@nexenta.com>
NEX-1456 Cannot receive incremental stream for dataset shared via SMB: destination dataset has been modified. part 1
SMB-153 Quota tab for the Share does not work

@@ -19,11 +19,11 @@
  * CDDL HEADER END
  */
 
 /*
  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright 2014 Nexenta Systems, Inc.  All rights reserved.
+ * Copyright 2018 Nexenta Systems, Inc.  All rights reserved.
  */
 
 #include <stdio.h>
 #include <stdlib.h>
 #include <fcntl.h>

@@ -1081,16 +1081,18 @@
 static uint32_t
 smb_quota_zfs_init(const char *path, smb_quota_zfs_handle_t *zfs_hdl)
 {
         char dataset[MAXPATHLEN];
 
-        if (smb_getdataset(path, dataset, MAXPATHLEN) != 0)
-                return (NT_STATUS_INVALID_PARAMETER);
-
         if ((zfs_hdl->z_lib = libzfs_init()) == NULL)
                 return (NT_STATUS_INTERNAL_ERROR);
 
+        if (smb_getdataset(zfs_hdl->z_lib, path, dataset, MAXPATHLEN) != 0) {
+                libzfs_fini(zfs_hdl->z_lib);
+                return (NT_STATUS_INVALID_PARAMETER);
+        }
+
         zfs_hdl->z_fs = zfs_open(zfs_hdl->z_lib, dataset, ZFS_TYPE_DATASET);
         if (zfs_hdl->z_fs == NULL) {
                 libzfs_fini(zfs_hdl->z_lib);
                 return (NT_STATUS_ACCESS_DENIED);
         }

@@ -1213,17 +1215,18 @@
                         (void) remove(dir);
                 return;
         }
 
         acl_text = acl_totext(existing_aclp, ACL_COMPACT_FMT);
-        acl_free(existing_aclp);
         if (acl_text == NULL) {
+                acl_free(existing_aclp);
                 (void) unlink(file);
                 if (qdir_created)
                         (void) remove(dir);
                 return;
         }
+        acl_free(existing_aclp);
 
         aclp = NULL;
         if (strcmp(acl_text, SMB_QUOTA_CNTRL_PERM) != 0) {
                 if (acl_fromtext(SMB_QUOTA_CNTRL_PERM, &aclp) != 0) {
                         free(acl_text);