Print this page
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)
NEX-4538 SMB1 create file should support extended_response format (2)
NEX-6116 Failures in smbtorture raw.open
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Kevin Crowe <kevin.crowe@nexenta.com>
Reviewed by: Matt Barden <matt.barden@nexenta.com>
Include this commit if upstreaming/backporting any of:
NEX-4540 SMB server declines EA support incorrectly
NEX-4239 smbtorture create failures re. allocation size
(illumos) 6398 SMB should support path names longer than 1024
NEX-3776 SMB should handle PreviousSessionID
Reviewed by: Gordon Ross <gwr@nexenta.com>
NEX-3620 need upstream cleanups for smbsrv
Reviewed by: Hans Rosenfeld <hans.rosenfeld@nexenta.com>
SMB-50 User-mode SMB server
 Includes work by these authors:
 Thomas Keiser <thomas.keiser@nexenta.com>
 Albert Lee <trisk@nexenta.com>

@@ -8,32 +8,54 @@
  * source.  A copy of the CDDL is also available via the Internet at
  * http://www.illumos.org/license/CDDL.
  */
 
 /*
- * Copyright 2013 Nexenta Systems, Inc.  All rights reserved.
+ * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  * Copyright 2017 RackTop Systems.
  */
 
-
 #include <sys/types.h>
 #include <sys/time.h>
 #include <sys/thread.h>
 #include <sys/cred.h>
+#include <sys/sid.h>
+#include <strings.h>
 
+/*
+ * This library does not implement real credentials. All contexts
+ * use an opaque cred_t object, and all activity happens in the
+ * context of the user who runs the program.
+ */
+
+extern struct zone zone0;
+
 struct cred {
+        uid_t           cr_uid;
+        ksid_t          *cr_ksid;
         uint32_t        pad[100];
 };
 
 cred_t cred0;
 cred_t *kcred = &cred0;
 
+/*
+ * Note that fksmbd uses CRED() for SMB user logons, but uses
+ * zone_kcred() for operations done internally by the server.
+ * Let CRED() (_curcred()) return &cred1, so it's different from
+ * kcred, otherwise tests like: (cred == kcred) are always true.
+ * Also, only cred1 will have a ksid (not kcred).
+ * The UID and SID are both "nobody".
+ */
+ksiddomain_t ksdom1 = {1, 5, "S-1-0", {0}};
+ksid_t ksid1 = { 60001, 0, 0, &ksdom1};
+cred_t cred1 = { 60001, &ksid1 };
+
 cred_t *
 _curcred(void)
 {
-        /* Thread-specific data? */
-        return (&cred0);
+        return (&cred1);
 }
 
 /*ARGSUSED*/
 void
 crfree(cred_t *cr)

@@ -48,18 +70,18 @@
 
 /*ARGSUSED*/
 uid_t
 crgetuid(const cred_t *cr)
 {
-        return (0);
+        return (cr->cr_uid);
 }
 
 /*ARGSUSED*/
 uid_t
 crgetruid(const cred_t *cr)
 {
-        return (0);
+        return (cr->cr_uid);
 }
 
 /*ARGSUSED*/
 uid_t
 crgetgid(const cred_t *cr)

@@ -79,10 +101,37 @@
 crgetgroups(const cred_t *cr)
 {
         return (NULL);
 }
 
+/*ARGSUSED*/
+zoneid_t
+crgetzoneid(const cred_t *cr)
+{
+        return (GLOBAL_ZONEID);
+}
+
+/*ARGSUSED*/
+struct zone *
+crgetzone(const cred_t *cr)
+{
+        return (&zone0);
+}
+
 cred_t *
 zone_kcred(void)
 {
         return (kcred);
+}
+
+/*ARGSUSED*/
+ksid_t *
+crgetsid(const cred_t *cr, int i)
+{
+        return (cr->cr_ksid);
+}
+
+cred_t *
+ddi_get_cred(void)
+{
+        return (_curcred());
 }