pastebin - collaborative debugging tool
rovema.kpaste.net RSS

Difference between
modified post ce1825370 by Anonymous on Mon 9th Oct 2023 17:45
original post 7760a1427 by Anonymous on Mon 9th Oct 2023 08:17
Download diff
Show old version | new version | both versions

    
1-
diff --git a/daemon/open.c b/daemon/open.c
1+
From fc428284ffc8e6e74946641facf6c828878e8c59 Mon Sep 17 00:00:00 2001
2-
index c7bd412..aee931c 100644
2+
From: Roland Mainz <roland.mainz@nrubsig.org>
3-
--- a/daemon/open.c
3+
Date: Mon, 9 Oct 2023 17:42:23 +0200
4-
+++ b/daemon/open.c
4+
Subject: [PATCH 1/2] Add infrastructure so Cygwin |stat()| can return local
5-
@@ -295,6 +295,12 @@ static int parse_open(unsigned char *buffer, uint32_t length, nfs41_upcall *upca
5+
 uid/gid
6-
     if (status) goto out;
6+
7-
     status = safe_read(&buffer, &length, &args->mode, sizeof(DWORD));
7+
Add infrastructure so Cygwin |stat()| can return local uid/gid via
8-
     if (status) goto out;
8+
the private "NfsV3Attributes" API (originally added by Microsoft
9-
+#if 1
9+
for their NFSv3 client).
10-
+    status = safe_read(&buffer, &length, &args->owner_cygwin_uid, sizeof(DWORD));
10+
11-
+    if (status) goto out;
11+
The code is currently disabled (set
12-
+    status = safe_read(&buffer, &length, &args->owner_group_cygwin_gid, sizeof(DWORD));
12+
|NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES| to |1| in
13-
+    if (status) goto out;
13+
sys/nfs41_build_features.h to enable it), until we wire it into
14-
+#endif
14+
the idmap code.
15-
     status = safe_read(&buffer, &length, &args->srv_open, sizeof(HANDLE));
15+
16-
     if (status) goto out;
16+
Additionally we add sys/nfs41_build_features.h to enable/disable
17-
     status = parse_abs_path(&buffer, &length, &args->symlink);
17+
features during build time.
18-
@@ -305,9 +311,16 @@ static int parse_open(unsigned char *buffer, uint32_t length, nfs41_upcall *upca
18+
19-
     dprintf(1, "parsing NFS41_OPEN: filename='%s' access mask=%d "
19+
Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
20-
         "access mode=%d\n\tfile attrs=0x%x create attrs=0x%x "
20+
---
21-
         "(kernel) disposition=%d\n\topen_owner_id=%d mode=%o "
21+
 daemon/open.c              | 135 ++++++++++++++++++++++++++++++++++++-
22-
+#if 1
22+
 daemon/upcall.h            |   5 ++
23-
+        "owner_cygwin_uid=%lu owner_group_cygwin_gid=%lu "
23+
 sys/nfs41_build_features.h |  38 +++++++++++
24-
+#endif
24+
 sys/nfs41_driver.c         | 122 +++++++++++++++++++++++----------
25-
         "srv_open=%p symlink=%s ea=%p\n", args->path, args->access_mask,
25+
 4 files changed, 261 insertions(+), 39 deletions(-)
26-
         args->access_mode, args->file_attrs, args->create_opts,
26+
 create mode 100644 sys/nfs41_build_features.h
27-
-        args->disposition, args->open_owner_id, args->mode, args->srv_open,
27+
28-
+        args->disposition, args->open_owner_id, args->mode,
28+
diff --git a/daemon/open.c b/daemon/open.c
29-
+#if 1
29+
index c7bd412..9d564d6 100644
30-
+        (unsigned long)args->owner_cygwin_uid, (unsigned long)args->owner_group_cygwin_gid,
30+
--- a/daemon/open.c
31-
+#endif
31+
+++ b/daemon/open.c
32-
+        args->srv_open,
32+
@@ -21,16 +21,17 @@
33-
         args->symlink.path, args->ea);
33+
34-
     print_disposition(2, args->disposition);
34+
 #include <Windows.h>
35-
     print_access_mask(2, args->access_mask);
35+
 #include <stdio.h>
36-
@@ -644,6 +657,31 @@ static int handle_open(nfs41_upcall *upcall)
36+
+#include <ctype.h>
37-
         nfs_to_standard_info(&info, &args->std_info);
37+
 #include <strsafe.h>
38-
         args->mode = info.mode;
38+
39-
         args->changeattr = info.change;
39+
 #include "nfs41_ops.h"
40-
+
40+
+#include "nfs41_build_features.h"
41-
+#if 1
41+
 #include "delegation.h"
42-
+        bitmap4 og_attr_request = { 0 };
42+
 #include "from_kernel.h"
43-
+        nfs41_file_info og_info = { 0 };
43+
 #include "daemon_debug.h"
44-
+        char owner[NFS4_OPAQUE_LIMIT], group[NFS4_OPAQUE_LIMIT];
44+
 #include "upcall.h"
45-
+        nfsacl41 acl = { 0 };
45+
 #include "util.h"
46-
+
46+
47-
+        /* gisburn: need to cache owner/group information */
47+
-
48-
+        og_attr_request.count = 2;
48+
 static int create_open_state(
49-
+        og_attr_request.arr[1] = FATTR4_WORD1_OWNER | FATTR4_WORD1_OWNER_GROUP;
49+
     IN const char *path,
50-
+        og_info.owner = owner;
50+
     IN uint32_t open_owner_id,
51-
+        og_info.owner_group = group;
51+
@@ -295,6 +296,12 @@ static int parse_open(unsigned char *buffer, uint32_t length, nfs41_upcall *upca
52-
+        status = nfs41_getattr(state->session, &state->file, &og_attr_request, &og_info);
52+
     if (status) goto out;
53-
+        if (status) {
53+
     status = safe_read(&buffer, &length, &args->mode, sizeof(DWORD));
54-
+            eprintf("get_stat_data: nfs41_cached_getattr() failed with %d\n",
54+
     if (status) goto out;
55-
+            status);
55+
+#ifdef NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES
56-
+        }
56+
+    status = safe_read(&buffer, &length, &args->owner_local_uid, sizeof(DWORD));
57-
+
57+
+    if (status) goto out;
58-
+        args->owner_cygwin_uid = atol(og_info.owner);
58+
+    status = safe_read(&buffer, &length, &args->owner_group_local_gid, sizeof(DWORD));
59-
+        args->owner_group_cygwin_gid = atol(og_info.owner_group);
59+
+    if (status) goto out;
60-
+
60+
+#endif /* NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES */
61-
+	dprintf(1, "/usr/bin/stat: owner=%lu/'%s', owner_group=%lu/'%s'\n",
61+
     status = safe_read(&buffer, &length, &args->srv_open, sizeof(HANDLE));
6962
     if (status) goto out;
70-
     status = safe_write(&buffer, length, &args->mode, sizeof(args->mode));
63+
     status = parse_abs_path(&buffer, &length, &args->symlink);
71-
     if (status) goto out;
64+
@@ -305,9 +312,16 @@ static int parse_open(unsigned char *buffer, uint32_t length, nfs41_upcall *upca
72-
+#if 1
65+
     dprintf(1, "parsing NFS41_OPEN: filename='%s' access mask=%d "
73-
+    status = safe_write(&buffer, length, &args->owner_cygwin_uid, sizeof(args->owner_cygwin_uid));
66+
         "access mode=%d\n\tfile attrs=0x%x create attrs=0x%x "
74-
+    if (status) goto out;
67+
         "(kernel) disposition=%d\n\topen_owner_id=%d mode=%o "
75-
+    status = safe_write(&buffer, length, &args->owner_group_cygwin_gid, sizeof(args->owner_group_cygwin_gid));
68+
+#ifdef NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES
76-
+    if (status) goto out;
69+
+        "owner_local_uid=%u owner_group_local_gid=%u "
77-
+#endif
70+
+#endif /* NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES */
78-
     status = safe_write(&buffer, length, &args->changeattr, sizeof(args->changeattr));
71+
         "srv_open=%p symlink=%s ea=%p\n", args->path, args->access_mask,
79-
     if (status) goto out;
72+
         args->access_mode, args->file_attrs, args->create_opts,
80-
     status = safe_write(&buffer, length, &args->deleg_type, sizeof(args->deleg_type));
73+
-        args->disposition, args->open_owner_id, args->mode, args->srv_open,
81-
diff --git a/daemon/upcall.h b/daemon/upcall.h
74+
+        args->disposition, args->open_owner_id, args->mode,
82-
index d224a6d..99149be 100644
75+
+#ifdef NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES
83-
--- a/daemon/upcall.h
76+
+        (unsigned int)args->owner_local_uid, (unsigned int)args->owner_group_local_gid,
84-
+++ b/daemon/upcall.h
77+
+#endif /* NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES */
85-
@@ -50,6 +50,8 @@ typedef struct __open_upcall_args {
78+
+        args->srv_open,
86-
     ULONG create_opts;
79+
         args->symlink.path, args->ea);
87-
     LONG open_owner_id;
80+
     print_disposition(2, args->disposition);
88-
     DWORD mode;
81+
     print_access_mask(2, args->access_mask);
89-
+    DWORD owner_cygwin_uid;         /* owner mapped into local uid */
82+
@@ -644,6 +658,117 @@ static int handle_open(nfs41_upcall *upcall)
90-
+    DWORD owner_group_cygwin_gid;   /* owner group mapped into local gid */
83+
         nfs_to_standard_info(&info, &args->std_info);
91-
     ULONGLONG changeattr;
84+
         args->mode = info.mode;
92-
     HANDLE srv_open;
85+
         args->changeattr = info.change;
93-
     DWORD deleg_type;
86+
+
94-
diff --git a/sys/nfs41_driver.c b/sys/nfs41_driver.c
87+
+#ifdef NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES
95-
index 6a8061d..7deb9ec 100644
88+
+        bitmap4 og_attr_request = { 0 };
96-
--- a/sys/nfs41_driver.c
89+
+        nfs41_file_info og_info = { 0 };
97-
+++ b/sys/nfs41_driver.c
90+
+        char owner[NFS4_OPAQUE_LIMIT], group[NFS4_OPAQUE_LIMIT];
98-
@@ -200,6 +200,8 @@ typedef struct _updowncall_entry {
91+
+        nfsacl41 acl = { 0 };
99-
             ULONG cattrs;
92+
+
100-
             LONG open_owner_id;
93+
+        /*
101-
             DWORD mode;
94+
+         * gisburn:
102-
+	    DWORD owner_cygwin_uid;
95+
+         * 1. We should cache owner/group information
103-
+	    DWORD owner_group_cygwin_gid;
96+
+         * 2. We should always ask for
104-
             HANDLE srv_open;
97+
+         * FATTR4_WORD1_OWNER | FATTR4_WORD1_OWNER_GROUP with the other
105-
             DWORD deleg_type;
98+
+         * attributes
106-
             BOOLEAN symlink_embedded;
99+
+         */
107-
@@ -385,6 +387,8 @@ typedef struct _NFS41_FCB {
100+
+        og_attr_request.count = 2;
108-
     BOOLEAN                 Renamed;
101+
+        og_attr_request.arr[1] = FATTR4_WORD1_OWNER | FATTR4_WORD1_OWNER_GROUP;
109-
     BOOLEAN                 DeletePending;
102+
+        og_info.owner = owner;
110-
     DWORD                   mode;
103+
+        og_info.owner_group = group;
111-
+    DWORD                   owner_cygwin_uid;       /* owner mapped into local uid */
104+
+        status = nfs41_getattr(state->session, &state->file, &og_attr_request, &og_info);
112-
+    DWORD                   owner_group_cygwin_gid; /* owner group mapped into local gid */
105+
+        if (status) {
113-
     ULONGLONG               changeattr;
106+
+            eprintf("get_stat_data: nfs41_cached_getattr() failed with %d\n",
114-
 } NFS41_FCB, *PNFS41_FCB;
107+
+            status);
115-
 #define NFS41GetFcbExtension(pFcb)      \
108+
+        }
116-
@@ -667,7 +671,11 @@ NTSTATUS marshal_nfs41_open(
109+
+
117-
     else tmp += *len;
110+
+#ifdef NFS41_DRIVER_FEATURE_LOCAL_UIDGID_TESTMAPPING
118-
111+
+        /*
119-
     header_len = *len + length_as_utf8(entry->filename) +
112+
+         * Map owner to local uid
120-
-        7 * sizeof(ULONG) + 2 * sizeof(HANDLE) +
113+
+         *
121-
+        7 * sizeof(ULONG) +
114+
+         * |owner| can be numeric string ("1616"), plain username
122-
+#if 1
115+
+         *  ("gisburn") or username@domain ("gisburn@sun.com")
123-
+        2 * sizeof(DWORD) +
116+
+         */
124-
+#endif
117+
+        /* stomp over '@' */
125-
+        2 * sizeof(HANDLE) +
118+
+        char *at_ch; /* pointer to '@' */
126-
         length_as_utf8(&entry->u.Open.symlink);
119+
+        if (at_ch = strchr(og_info.owner, '@'))
127-
     if (header_len > buf_len) {
120+
+            *at_ch = '\0';
128-
         status = STATUS_INSUFFICIENT_RESOURCES;
121+
+
129-
@@ -692,6 +700,12 @@ NTSTATUS marshal_nfs41_open(
122+
+        if (isdigit(og_info.owner[0])) {
130-
     tmp += sizeof(entry->u.Open.open_owner_id);
123+
+            args->owner_local_uid = atol(og_info.owner);
131-
     RtlCopyMemory(tmp, &entry->u.Open.mode, sizeof(DWORD));
124+
+        }
132-
     tmp += sizeof(DWORD);
125+
+        else if(!strcmp(og_info.owner, "nobody")) {
133-
+#if 1
126+
+            args->owner_local_uid = 65534;
134-
+    RtlCopyMemory(tmp, &entry->u.Open.owner_cygwin_uid, sizeof(DWORD));
127+
+        }
135-
+    tmp += sizeof(DWORD);
128+
+        else if(!strcmp(og_info.owner, "root")) {
136-
+    RtlCopyMemory(tmp, &entry->u.Open.owner_group_cygwin_gid, sizeof(DWORD));
129+
+            args->owner_local_uid = 0;
137-
+    tmp += sizeof(DWORD);
130+
+        }
138-
+#endif
131+
+        else if(!strcmp(og_info.owner, "rmainz")) {
139-
     RtlCopyMemory(tmp, &entry->u.Open.srv_open, sizeof(HANDLE));
132+
+            args->owner_local_uid = 1616;
140-
     tmp += sizeof(HANDLE);
133+
+        }
141-
     status = marshall_unicode_as_utf8(&tmp, &entry->u.Open.symlink);
134+
+        else if(!strcmp(og_info.owner, "roland_mainz")) {
142-
@@ -718,10 +732,17 @@ NTSTATUS marshal_nfs41_open(
135+
+            args->owner_local_uid = 197608;
143-
136+
+        }
144-
 #ifdef DEBUG_MARSHAL_DETAIL
137+
+        else if(!strcmp(og_info.owner, "swulsch")) {
145-
     DbgP("marshal_nfs41_open: name=%wZ mask=0x%x access=0x%x attrs=0x%x "
138+
+            args->owner_local_uid = 1818;
146-
-         "opts=0x%x dispo=0x%x open_owner_id=0x%x mode=%o srv_open=%p ea=%p\n",
139+
+        }
147-
+         "opts=0x%x dispo=0x%x open_owner_id=0x%x mode=%o "
140+
+        else if(!strcmp(og_info.owner, "iam")) {
148-
+#if 1
141+
+            args->owner_local_uid = 2010;
149-
+	 "owner_cygwin_uid=%lu owner_group_cygwin_gid=%lu "
142+
+        }
150-
+#endif
143+
+        else if(!strcmp(og_info.owner, "mwenzel")) {
151-
+	 "srv_open=%p ea=%p\n",
144+
+            args->owner_local_uid = 8239;
152-
          entry->filename, entry->u.Open.access_mask,
145+
+        }
153-
          entry->u.Open.access_mode, entry->u.Open.attrs, entry->u.Open.copts,
146+
+        else if(!strcmp(og_info.owner, "test001")) {
154-
          entry->u.Open.disp, entry->u.Open.open_owner_id, entry->u.Open.mode,
147+
+            args->owner_local_uid = 1000;
155-
+#if 1
148+
+        }
156-
+	 entry->u.Open.owner_cygwin_uid,entry->u.Open.owner_group_cygwin_gid,
149+
+        else {
157-
+#endif
150+
+            args->owner_local_uid = 666; /* debug: number of the beast */
158-
          entry->u.Open.srv_open, entry->u.Open.EaBuffer);
151+
+        }
159-
 #endif
152+
+
160-
 out:
153+
+        /*
161-
@@ -1647,6 +1668,12 @@ NTSTATUS unmarshal_nfs41_open(
154+
+         * Map owner_group to local gid
162-
     *buf += sizeof(HANDLE);
155+
+         *
163-
     RtlCopyMemory(&cur->u.Open.mode, *buf, sizeof(DWORD));
156+
+         * |owner_group| can be numeric string ("1616"), plain username
164-
     *buf += sizeof(DWORD);
157+
+         * ("gisgrp") or username@domain ("gisgrp@sun.com")
165-
+#if 1
158+
+         */
166-
+    RtlCopyMemory(&cur->u.Open.owner_cygwin_uid, *buf, sizeof(DWORD));
159+
+        if (at_ch = strchr(og_info.owner_group, '@'))
167-
+    *buf += sizeof(DWORD);
160+
+            *at_ch = '\0';
168-
+    RtlCopyMemory(&cur->u.Open.owner_group_cygwin_gid, *buf, sizeof(DWORD));
161+
+        if (isdigit(og_info.owner_group[0])) {
169-
+    *buf += sizeof(DWORD);
162+
+            args->owner_group_local_gid = atol(og_info.owner_group);
170-
+#endif
163+
+        }
171-
     RtlCopyMemory(&cur->ChangeTime, *buf, sizeof(ULONGLONG));
164+
+        else if(!strcmp(og_info.owner_group, "nogroup")) {
172-
     *buf += sizeof(ULONGLONG);
165+
+            args->owner_group_local_gid = 65534;
173-
     RtlCopyMemory(&cur->u.Open.deleg_type, *buf, sizeof(DWORD));
166+
+        }
174-
@@ -1673,8 +1700,15 @@ NTSTATUS unmarshal_nfs41_open(
167+
+        else if(!strcmp(og_info.owner_group, "root")) {
175-
 #endif
168+
+            args->owner_group_local_gid = 0;
176-
     }
169+
+        }
177-
 #ifdef DEBUG_MARSHAL_DETAIL
170+
+        else if(!strcmp(og_info.owner_group, "Kein")) {
178-
-    DbgP("unmarshal_nfs41_open: open_state 0x%x mode %o changeattr %llu "
171+
+            args->owner_group_local_gid = 197121;
179-
+    DbgP("unmarshal_nfs41_open: open_state 0x%x mode %o "
172+
+        }
180-
+#if 1
173+
+        else if(!strcmp(og_info.owner_group, "rmainz")) {
181-
+        "owner_cygwin_uid %u owner_group_cygwin_gid %u "
174+
+            args->owner_group_local_gid = 1616;
182-
+#endif
175+
+        }
183-
+        "changeattr %llu "
176+
+        else if(!strcmp(og_info.owner, "iam")) {
184-
         "deleg_type %d\n", cur->open_state, cur->u.Open.mode,
177+
+            args->owner_group_local_gid = 2010;
185-
+#if 1
178+
+        }
186-
+        cur->u.Open.owner_cygwin_uid, cur->u.Open.owner_group_cygwin_gid,
179+
+        else if(!strcmp(og_info.owner_group, "swulsch")) {
187-
+#endif
180+
+            args->owner_group_local_gid = 1818;
188-
         cur->ChangeTime, cur->u.Open.deleg_type);
181+
+        }
189-
 #endif
182+
+        else if(!strcmp(og_info.owner_group, "mwenzel")) {
190-
 out:
183+
+            args->owner_group_local_gid = 8239;
191-
@@ -3754,6 +3788,10 @@ retry_on_link:
184+
+        }
192-
         RtlCopyMemory(&nfs41_fcb->StandardInfo, &entry->u.Open.sinfo,
185+
+        else if(!strcmp(og_info.owner_group, "test001")) {
193-
             sizeof(entry->u.Open.sinfo));
186+
+            args->owner_group_local_gid = 1000;
194-
         nfs41_fcb->mode = entry->u.Open.mode;
187+
+        }
195-
+#if 1
188+
+        else {
196-
+	nfs41_fcb->owner_cygwin_uid = entry->u.Open.owner_cygwin_uid;
189+
+            args->owner_group_local_gid = 666; /* debug: number of the beast */
197-
+	nfs41_fcb->owner_group_cygwin_gid = entry->u.Open.owner_group_cygwin_gid;
190+
+        }
198-
+#endif
191+
+#endif /* NFS41_DRIVER_FEATURE_LOCAL_UIDGID_TESTMAPPING */
199-
         nfs41_fcb->changeattr = entry->ChangeTime;
192+
+
200-
         if (((params->CreateOptions & FILE_DELETE_ON_CLOSE) &&
193+
+        dprintf(1, "handle_open: stat: owner=%u/'%s', owner_group=%u/'%s'\n",
201-
                 !pVNetRootContext->read_only) || oldDeletePending)
194+
+            (unsigned int)args->owner_local_uid, og_info.owner,
202-
@@ -4502,6 +4540,8 @@ void create_nfs3_attrs(
195+
+            (unsigned int)args->owner_group_local_gid, og_info.owner_group);
203-
     else
196+
+#endif /* NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES */
204-
         attrs->type = NF3REG;
197+
     } else {
205-
     attrs->mode = nfs41_fcb->mode;
198+
         nfs41_file_info createattrs = { 0 };
206-
+    attrs->uid = nfs41_fcb->owner_cygwin_uid;
199+
         uint32_t create = 0, createhowmode = 0, lookup_status = status;
207-
+    attrs->gid = nfs41_fcb->owner_group_cygwin_gid;
200+
@@ -753,6 +878,12 @@ static int marshall_open(unsigned char *buffer, uint32_t *length, nfs41_upcall *
208-
     attrs->nlink = nfs41_fcb->StandardInfo.NumberOfLinks;
201+
     if (status) goto out;
209-
     attrs->size.QuadPart = attrs->used.QuadPart =
202+
     status = safe_write(&buffer, length, &args->mode, sizeof(args->mode));
210-
         nfs41_fcb->StandardInfo.EndOfFile.QuadPart;
203+
     if (status) goto out;
211-
204+
+#ifdef NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES
212-
205+
+    status = safe_write(&buffer, length, &args->owner_local_uid, sizeof(args->owner_local_uid));
213-
206+
+    if (status) goto out;
214-
207+
+    status = safe_write(&buffer, length, &args->owner_group_local_gid, sizeof(args->owner_group_local_gid));
215-
208+
+    if (status) goto out;
216-
209+
+#endif /* NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES */
217-
210+
     status = safe_write(&buffer, length, &args->changeattr, sizeof(args->changeattr));
218-
211+
     if (status) goto out;
219-
212+
     status = safe_write(&buffer, length, &args->deleg_type, sizeof(args->deleg_type));
220-
213+
diff --git a/daemon/upcall.h b/daemon/upcall.h
221-
214+
index d224a6d..6dad62d 100644
222-
215+
--- a/daemon/upcall.h
223-
216+
+++ b/daemon/upcall.h
224-
217+
@@ -23,6 +23,7 @@
225-
218+
 #define __NFS41_DAEMON_UPCALL_H__
226219
227-
220+
 #include "nfs41_ops.h"
228-
221+
+#include "nfs41_build_features.h"
229-
222+
 #include "from_kernel.h"
230223
231-
224+
 #define NFSD_VERSION_MISMATCH 116
232-
225+
@@ -50,6 +51,10 @@ typedef struct __open_upcall_args {
233-
226+
     ULONG create_opts;
234-
227+
     LONG open_owner_id;
235-
228+
     DWORD mode;
236-
229+
+#ifdef NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES
237-
230+
+    DWORD owner_local_uid;         /* owner mapped into local uid */
238-
231+
+    DWORD owner_group_local_gid;   /* owner group mapped into local gid */
239-
232+
+#endif /* NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES */
240-
233+
     ULONGLONG changeattr;
241-
234+
     HANDLE srv_open;
242-
235+
     DWORD deleg_type;
243-
236+
diff --git a/sys/nfs41_build_features.h b/sys/nfs41_build_features.h
244-
237+
new file mode 100644
245-
238+
index 0000000..4ce5976
246-
239+
--- /dev/null
247-
240+
+++ b/sys/nfs41_build_features.h
248-
241+
@@ -0,0 +1,38 @@
249-
242+
+/* NFSv4.1 client for Windows
250-
243+
+ * Copyright © 2012 The Regents of the University of Michigan
251-
244+
+ *
252-
245+
+ * Olga Kornievskaia <aglo@umich.edu>
253-
246+
+ * Casey Bodley <cbodley@umich.edu>
254-
247+
+ * Roland Mainz <roland.mainz@nrubsig.org>
255-
248+
+ *
256-
249+
+ * This library is free software; you can redistribute it and/or modify it
257-
250+
+ * under the terms of the GNU Lesser General Public License as published by
258-
251+
+ * the Free Software Foundation; either version 2.1 of the License, or (at
259-
252+
+ * your option) any later version.
260-
253+
+ *
261-
254+
+ * This library is distributed in the hope that it will be useful, but
262-
255+
+ * without any warranty; without even the implied warranty of merchantability
263-
256+
+ * or fitness for a particular purpose.  See the GNU Lesser General Public
264-
257+
+ * License for more details.
265-
258+
+ *
266-
259+
+ * You should have received a copy of the GNU Lesser General Public License
267-
260+
+ * along with this library; if not, write to the Free Software Foundation,
268-
261+
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA
269-
262+
+ */
270-
263+
+
271-
264+
+#ifndef _NFS41_DRIVER_BUILDFEATURES_
272-
265+
+#define _NFS41_DRIVER_BUILDFEATURES_ 1
273-
266+
+
274-
267+
+/*
275-
268+
+ * NFS41_DRIVER_FEATURE_* - features for this build, we use this
276-
269+
+ * for development to add new features which are "off" by default
277-
270+
+ * until they are ready
278-
271+
+ */
279-
272+
+
280-
273+
+/*
281-
274+
+ * NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES - return local uid/gid values
282-
275+
+ */
283-
276+
+// #define NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES 1
284-
277+
+// #define NFS41_DRIVER_FEATURE_LOCAL_UIDGID_TESTMAPPING 1
285-
278+
+
286-
279+
+#endif /* !_NFS41_DRIVER_BUILDFEATURES_ */
287-
280+
diff --git a/sys/nfs41_driver.c b/sys/nfs41_driver.c
288-
281+
index 6a8061d..b52a151 100644
289-
282+
--- a/sys/nfs41_driver.c
290-
283+
+++ b/sys/nfs41_driver.c
291-
284+
@@ -29,6 +29,8 @@
292-
285+
 #include "nfs41_driver.h"
293-
286+
 #include "nfs41_np.h"
294-
287+
 #include "nfs41_debug.h"
295-
288+
+#include "nfs41_build_features.h"
296-
289+
+
297290
298-
291+
 #define USE_MOUNT_SEC_CONTEXT
299292
300-
293+
@@ -200,6 +202,10 @@ typedef struct _updowncall_entry {
301-
294+
             ULONG cattrs;
302-
295+
             LONG open_owner_id;
303-
296+
             DWORD mode;
304-
297+
+#ifdef NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES
305-
298+
+            DWORD owner_local_uid;
306-
299+
+            DWORD owner_group_local_gid;
307-
300+
+#endif /* NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES */
308-
301+
             HANDLE srv_open;
309-
302+
             DWORD deleg_type;
310-
303+
             BOOLEAN symlink_embedded;
311-
304+
@@ -385,6 +391,10 @@ typedef struct _NFS41_FCB {
312-
305+
     BOOLEAN                 Renamed;
313-
306+
     BOOLEAN                 DeletePending;
314-
307+
     DWORD                   mode;
315-
308+
+#ifdef NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES
316-
309+
+    DWORD                   owner_local_uid;       /* owner mapped into local uid */
317-
310+
+    DWORD                   owner_group_local_gid; /* owner group mapped into local gid */
318-
311+
+#endif /* NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES */
319-
312+
     ULONGLONG               changeattr;
320-
313+
 } NFS41_FCB, *PNFS41_FCB;
321-
314+
 #define NFS41GetFcbExtension(pFcb)      \
322-
315+
@@ -612,13 +622,13 @@ NTSTATUS marshal_nfs41_mount(
323-
316+
     if (!MmIsAddressValid(entry->u.Mount.srv_name) ||
324-
317+
             !MmIsAddressValid(entry->u.Mount.root)) {
325-
318+
         status = STATUS_INTERNAL_ERROR;
326-
319+
-        goto out;
327-
320+
-    }
328-
321+
-    header_len = *len + length_as_utf8(entry->u.Mount.srv_name) +
329-
322+
-        length_as_utf8(entry->u.Mount.root) + 3 * sizeof(DWORD);
330-
323+
-    if (header_len > buf_len) {
331-
324+
-        status = STATUS_INSUFFICIENT_RESOURCES;
332-
325+
-        goto out;
333-
326+
+        goto out;
334-
327+
+    }
335-
328+
+    header_len = *len + length_as_utf8(entry->u.Mount.srv_name) +
336-
329+
+        length_as_utf8(entry->u.Mount.root) + 3 * sizeof(DWORD);
337-
330+
+    if (header_len > buf_len) {
338-
331+
+        status = STATUS_INSUFFICIENT_RESOURCES;
339-
332+
+        goto out;
340-
333+
     }
341-
334+
     status = marshall_unicode_as_utf8(&tmp, entry->u.Mount.srv_name);
342-
335+
     if (status) goto out;
343-
336+
@@ -667,7 +677,11 @@ NTSTATUS marshal_nfs41_open(
344-
337+
     else tmp += *len;
345338
346-
339+
     header_len = *len + length_as_utf8(entry->filename) +
347-
340+
-        7 * sizeof(ULONG) + 2 * sizeof(HANDLE) +
348-
341+
+        7 * sizeof(ULONG) +
349-
342+
+#ifdef NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES
350-
343+
+        2 * sizeof(DWORD) +
351-
344+
+#endif /* NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES */
352-
345+
+        2 * sizeof(HANDLE) +
353-
346+
         length_as_utf8(&entry->u.Open.symlink);
354-
347+
     if (header_len > buf_len) {
355-
348+
         status = STATUS_INSUFFICIENT_RESOURCES;
356-
349+
@@ -692,6 +706,12 @@ NTSTATUS marshal_nfs41_open(
357-
350+
     tmp += sizeof(entry->u.Open.open_owner_id);
358-
351+
     RtlCopyMemory(tmp, &entry->u.Open.mode, sizeof(DWORD));
359-
352+
     tmp += sizeof(DWORD);
360-
353+
+#ifdef NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES
361-
354+
+    RtlCopyMemory(tmp, &entry->u.Open.owner_local_uid, sizeof(DWORD));
362-
355+
+    tmp += sizeof(DWORD);
363-
356+
+    RtlCopyMemory(tmp, &entry->u.Open.owner_group_local_gid, sizeof(DWORD));
364-
357+
+    tmp += sizeof(DWORD);
365-
358+
+#endif /* NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES */
366-
359+
     RtlCopyMemory(tmp, &entry->u.Open.srv_open, sizeof(HANDLE));
367-
360+
     tmp += sizeof(HANDLE);
368-
361+
     status = marshall_unicode_as_utf8(&tmp, &entry->u.Open.symlink);
369-
362+
@@ -718,10 +738,17 @@ NTSTATUS marshal_nfs41_open(
370363
371-
364+
 #ifdef DEBUG_MARSHAL_DETAIL
372-
365+
     DbgP("marshal_nfs41_open: name=%wZ mask=0x%x access=0x%x attrs=0x%x "
373-
366+
-         "opts=0x%x dispo=0x%x open_owner_id=0x%x mode=%o srv_open=%p ea=%p\n",
374-
367+
+         "opts=0x%x dispo=0x%x open_owner_id=0x%x mode=%o "
375-
368+
+#ifdef NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES
376-
369+
+         "owner_local_uid=%lu owner_group_local_gid=%lu "
377-
370+
+#endif /* NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES */
378-
371+
+         "srv_open=%p ea=%p\n",
379-
372+
          entry->filename, entry->u.Open.access_mask,
380-
373+
          entry->u.Open.access_mode, entry->u.Open.attrs, entry->u.Open.copts,
381-
374+
          entry->u.Open.disp, entry->u.Open.open_owner_id, entry->u.Open.mode,
382-
375+
+#ifdef NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES
383-
376+
+         entry->u.Open.owner_local_uid,entry->u.Open.owner_group_local_gid,
384-
377+
+#endif /* NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES */
385-
378+
          entry->u.Open.srv_open, entry->u.Open.EaBuffer);
386-
379+
 #endif
387-
380+
 out:
388-
381+
@@ -1647,6 +1674,12 @@ NTSTATUS unmarshal_nfs41_open(
389-
382+
     *buf += sizeof(HANDLE);
390-
383+
     RtlCopyMemory(&cur->u.Open.mode, *buf, sizeof(DWORD));
391-
384+
     *buf += sizeof(DWORD);
392-
385+
+#ifdef NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES
393-
386+
+    RtlCopyMemory(&cur->u.Open.owner_local_uid, *buf, sizeof(DWORD));
394-
387+
+    *buf += sizeof(DWORD);
395-
388+
+    RtlCopyMemory(&cur->u.Open.owner_group_local_gid, *buf, sizeof(DWORD));
396-
389+
+    *buf += sizeof(DWORD);
397-
390+
+#endif /* NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES */
398-
391+
     RtlCopyMemory(&cur->ChangeTime, *buf, sizeof(ULONGLONG));
399-
392+
     *buf += sizeof(ULONGLONG);
400-
393+
     RtlCopyMemory(&cur->u.Open.deleg_type, *buf, sizeof(DWORD));
401-
394+
@@ -1673,10 +1706,17 @@ NTSTATUS unmarshal_nfs41_open(
402-
395+
 #endif
403-
396+
     }
404-
397+
 #ifdef DEBUG_MARSHAL_DETAIL
405-
398+
-    DbgP("unmarshal_nfs41_open: open_state 0x%x mode %o changeattr %llu "
406-
399+
-        "deleg_type %d\n", cur->open_state, cur->u.Open.mode,
407-
400+
+    DbgP("unmarshal_nfs41_open: open_state 0x%x mode %o "
408-
401+
+#ifdef NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES
409-
402+
+        "owner_local_uid %u owner_group_local_gid %u "
410-
403+
+#endif /* NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES */
411-
404+
+        "changeattr %llu "
412-
405+
+        "deleg_type %d\n", cur->open_state, cur->u.Open.mode,
413-
406+
+#ifdef NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES
414-
407+
+        cur->u.Open.owner_local_uid, cur->u.Open.owner_group_local_gid,
415-
408+
+#endif /* NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES */
416-
409+
         cur->ChangeTime, cur->u.Open.deleg_type);
417-
410+
-#endif
418-
411+
+#endif /* DEBUG_MARSHAL_DETAIL */
419-
412+
 out:
420-
413+
     return status;
421-
414+
 }
422-
415+
@@ -3500,15 +3540,15 @@ NTSTATUS check_nfs41_create_args(
423-
416+
     }
424417
425-
418+
     /* rdbss seems miss this sharing_violation check */
426-
419+
-    if (Fcb->OpenCount && params->Disposition == FILE_SUPERSEDE) {
427-
420+
-        if ((!RxContext->CurrentIrpSp->FileObject->SharedRead &&
428-
421+
-                (params->DesiredAccess & FILE_READ_DATA)) ||
429-
422+
-            ((!RxContext->CurrentIrpSp->FileObject->SharedWrite &&
430-
423+
-                (params->DesiredAccess & (FILE_WRITE_DATA | FILE_APPEND_DATA |
431-
424+
-                    FILE_WRITE_ATTRIBUTES))) ||
432-
425+
-            (!RxContext->CurrentIrpSp->FileObject->SharedDelete &&
433-
426+
-                (params->DesiredAccess & DELETE)))) {
434-
427+
-            status = STATUS_SHARING_VIOLATION;
435-
428+
+    if (Fcb->OpenCount && params->Disposition == FILE_SUPERSEDE) {
436-
429+
+        if ((!RxContext->CurrentIrpSp->FileObject->SharedRead &&
437-
430+
+                (params->DesiredAccess & FILE_READ_DATA)) ||
438-
431+
+            ((!RxContext->CurrentIrpSp->FileObject->SharedWrite &&
439-
432+
+                (params->DesiredAccess & (FILE_WRITE_DATA | FILE_APPEND_DATA |
440-
433+
+                    FILE_WRITE_ATTRIBUTES))) ||
441-
434+
+            (!RxContext->CurrentIrpSp->FileObject->SharedDelete &&
442-
435+
+                (params->DesiredAccess & DELETE)))) {
443-
436+
+            status = STATUS_SHARING_VIOLATION;
444-
437+
             goto out;
445-
438+
         }
446-
439+
     }
447-
440+
@@ -3754,6 +3794,10 @@ retry_on_link:
448-
441+
         RtlCopyMemory(&nfs41_fcb->StandardInfo, &entry->u.Open.sinfo,
449-
442+
             sizeof(entry->u.Open.sinfo));
450-
443+
         nfs41_fcb->mode = entry->u.Open.mode;
451-
444+
+#ifdef NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES
452-
445+
+        nfs41_fcb->owner_local_uid = entry->u.Open.owner_local_uid;
453-
446+
+        nfs41_fcb->owner_group_local_gid = entry->u.Open.owner_group_local_gid;
454-
447+
+#endif /* NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES */
455-
448+
         nfs41_fcb->changeattr = entry->ChangeTime;
456-
449+
         if (((params->CreateOptions & FILE_DELETE_ON_CLOSE) &&
457-
450+
                 !pVNetRootContext->read_only) || oldDeletePending)
458-
451+
@@ -4311,14 +4355,14 @@ NTSTATUS nfs41_QueryVolumeInformation(
459-
452+
     print_queryvolume_args(RxContext);
460-
453+
 #endif
461454
462-
455+
-    status = check_nfs41_dirquery_args(RxContext);
463-
456+
-    if (status) goto out;
464-
457+
-
465-
458+
-    RtlZeroMemory(RxContext->Info.Buffer, RxContext->Info.LengthRemaining);
466-
459+
-
467-
460+
-    switch (InfoClass) {
468-
461+
-    case FileFsVolumeInformation:
469-
462+
-        if ((ULONG)RxContext->Info.LengthRemaining >= DevExt->VolAttrsLen) {
470-
463+
+    status = check_nfs41_dirquery_args(RxContext);
471-
464+
+    if (status) goto out;
472-
465+
+
473-
466+
+    RtlZeroMemory(RxContext->Info.Buffer, RxContext->Info.LengthRemaining);
474-
467+
+
475-
468+
+    switch (InfoClass) {
476-
469+
+    case FileFsVolumeInformation:
477-
470+
+        if ((ULONG)RxContext->Info.LengthRemaining >= DevExt->VolAttrsLen) {
478-
471+
             RtlCopyMemory(RxContext->Info.Buffer, DevExt->VolAttrs,
479-
472+
                 DevExt->VolAttrsLen);
480-
473+
             RxContext->Info.LengthRemaining -= DevExt->VolAttrsLen;
481-
474+
@@ -4502,6 +4546,10 @@ void create_nfs3_attrs(
482-
475+
     else
483-
476+
         attrs->type = NF3REG;
484-
477+
     attrs->mode = nfs41_fcb->mode;
485-
478+
+#ifdef NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES
486-
479+
+    attrs->uid = nfs41_fcb->owner_local_uid;
487-
480+
+    attrs->gid = nfs41_fcb->owner_group_local_gid;
488-
481+
+#endif /* NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES */
489-
482+
     attrs->nlink = nfs41_fcb->StandardInfo.NumberOfLinks;
490-
483+
     attrs->size.QuadPart = attrs->used.QuadPart =
491-
484+
         nfs41_fcb->StandardInfo.EndOfFile.QuadPart;
492-
485+
@@ -6085,14 +6133,14 @@ NTSTATUS nfs41_Lock(
493-
486+
     LARGE_INTEGER poll_delay = {0};
494-
487+
 #ifdef ENABLE_TIMINGS
495-
488+
     LARGE_INTEGER t1, t2;
496-
489+
-    t1 = KeQueryPerformanceCounter(NULL);
497-
490+
-#endif
498-
491+
-
499-
492+
-    poll_delay.QuadPart = 0;
500-
493+
-
501-
494+
-#ifdef DEBUG_LOCK
502-
495+
-    DbgEn();
503-
496+
-    print_lock_args(RxContext);
504-
497+
+    t1 = KeQueryPerformanceCounter(NULL);
505-
498+
+#endif
506-
499+
+
507-
500+
+    poll_delay.QuadPart = 0;
508-
501+
+
509-
502+
+#ifdef DEBUG_LOCK
510-
503+
+    DbgEn();
511-
504+
+    print_lock_args(RxContext);
512-
505+
 #endif
513506
514-
507+
 /*  RxReleaseFcbResourceForThreadInMRx(RxContext, RxContext->pFcb,
515-
508+
--
516-
509+
2.39.0
517510
518511

Submit a correction or amendment below (click here to make a fresh posting)
After submitting an amendment, you'll be able to view the differences between the old and new posts easily.

Syntax highlighting:

To highlight particular lines, prefix each line with {%HIGHLIGHT}




All content is user-submitted.
The administrators of this site (kpaste.net) are not responsible for their content.
Abuse reports should be emailed to us at