pastebin - collaborative debugging tool
nrubsig.kpaste.net RSS

Difference between
modified post 4a7fd by Anonymous on Thu 30th Nov 2023 05:57
original post 4ceb32ca by Anonymous on Thu 30th Nov 2023 02:57
Download diff
Show old version | new version | both versions

    
11
diff --git a/daemon/getattr.c b/daemon/getattr.c
22
index 7c5f241..7621dba 100644
33
--- a/daemon/getattr.c
44
+++ b/daemon/getattr.c
55
@@ -59,8 +59,19 @@ int nfs41_cached_getattr(
66
 static int parse_getattr(unsigned char *buffer, uint32_t length, nfs41_upcall *upcall)
77
 {
88
     int status;
99
+#if 1
1010
+    EASSERT(length > 4);
1111
+    if (length <= 4) {
1212
+        status = ERROR_INVALID_PARAMETER;
1313
+        goto out;
1414
+    }
1515
+    EASSERT(upcall->state_ref != NULL);
1616
+    if (upcall->state_ref == NULL) {
1717
+        status = ERROR_INVALID_PARAMETER;
1818
+        goto out;
1919
+    }
2020
+#endif
2121
     getattr_upcall_args *args = &upcall->args.getattr;
2222
-
2323
     status = safe_read(&buffer, &length, &args->query_class, sizeof(args->query_class));
2424
     if (status) goto out;
2525
     status = safe_read(&buffer, &length, &args->buf_len, sizeof(args->buf_len));
2626
@@ -80,6 +91,21 @@ static int handle_getattr(void *daemon_context, nfs41_upcall *upcall)
2727
     nfs41_open_state *state = upcall->state_ref;
2828
     nfs41_file_info info = { 0 };
2929
3030
+#if 1
3131
+    if (((char *)state->session) == ((char *)0xdddddddddddddddd)) {
3232
+        eprintf("handle_getattr: Invalid session pointer 0xdddddddddddddddd\n");
3333
+        status = ERROR_INVALID_PARAMETER;
3434
+        goto out;
3535
+    }
3636
+
3737
+    EASSERT(state->file.fh.superblock != NULL);
3838
+    if (state->file.fh.superblock == NULL) {
3939
+        /* gisburn: fixme: maybe this should be |ERROR_INTERNAL_ERROR| ? */
4040
+        status = ERROR_INVALID_PARAMETER;
4141
+        goto out;
4242
+    }
4343
+#endif
4444
+
4545
     status = nfs41_cached_getattr(state->session, &state->file, &info);
4646
     if (status) {
4747
         eprintf("nfs41_cached_getattr() failed with %d\n", status);
4848
diff --git a/daemon/nfs41_ops.c b/daemon/nfs41_ops.c
4949
index bcca070..f2a4f22 100644
5050
--- a/daemon/nfs41_ops.c
5151
+++ b/daemon/nfs41_ops.c
5252
@@ -400,6 +400,9 @@ int nfs41_open(
5353
     bool_t already_delegated = delegation->type == OPEN_DELEGATE_READ
5454
         || delegation->type == OPEN_DELEGATE_WRITE;
5555
5656
+    EASSERT(parent);
5757
+    EASSERT(parent->fh.superblock);
5858
+
5959
     /* depending on the claim type, OPEN expects CURRENT_FH set
6060
      * to either the parent directory, or to the file itself */
6161
     switch (claim->claim) {
6262
diff --git a/daemon/open.c b/daemon/open.c
6363
index 4b2a335..487c341 100644
6464
--- a/daemon/open.c
6565
+++ b/daemon/open.c
6666
@@ -99,6 +99,24 @@ static void open_state_free(
6767
 void nfs41_open_state_ref(
6868
     IN nfs41_open_state *state)
6969
 {
7070
+#if 1
7171
+    /*
7272
+     * gisburn: fixme: sometimes this happens under high parallel
7373
+     * usage with multiple mounts - but why ?
7474
+     * 0:038> kp
7575
+     * Child-SP          RetAddr           Call Site
7676
+     * 0000006d`431fde10 00007ff7`32f7d905 nfsd!nfs41_open_state_ref(struct __nfs41_open_state * state = 0x00000000`00000000)+0x31
7777
+     * 0000006d`431fdf30 00007ff7`32f4d284 nfsd!upcall_parse(unsigned char * buffer = 0x0000006d`431fe180 "???", unsigned int length = 8, struct __nfs41_upcall * upcall = 0x0000006d`431ff1e0)+0x2e5
7878
+     * 0000006d`431fe0b0 00007ffc`1ca24c7c nfsd!thread_main(void * args = 0x00007ff7`32fb6080)+0x144
7979
+     * 0000006d`431ffe00 00007ffc`4d4b7344 ucrtbased!thread_start<unsigned int (void * parameter = 0x0000025d`a9c6def0)+0x9c
8080
+     * 0000006d`431ffe60 00007ffc`4efc26b1 KERNEL32!BaseThreadInitThunk+0x14
8181
+     * 0000006d`431ffe90 00000000`00000000 ntdll!RtlUserThreadStart+0x21
8282
+     */
8383
+    EASSERT(state != NULL);
8484
+    if (state == NULL)
8585
+        return;
8686
+#endif
8787
+
8888
     const LONG count = InterlockedIncrement(&state->ref_count);
8989
9090
     dprintf(2, "nfs41_open_state_ref(%s) count %d\n", state->path.path, count);
9191
diff --git a/daemon/upcall.c b/daemon/upcall.c
9292
index bd13c61..7778429 100644
9393
--- a/daemon/upcall.c
9494
+++ b/daemon/upcall.c
9595
@@ -121,6 +121,7 @@ int upcall_parse(
9696
     /* parse the operation's arguments */
9797
     op = g_upcall_op_table[upcall->opcode];
9898
     if (op && op->parse) {
9999
+        EASSERT(length > 0);
100100
         status = op->parse(buffer, length, upcall);
101101
         if (status) {
102102
             eprintf("parsing of upcall '%s' failed with %d.\n",
103103
diff --git a/dll/nfs41_np.c b/dll/nfs41_np.c
104104
index 8b259bb..6d3429f 100644
105105
--- a/dll/nfs41_np.c
106106
+++ b/dll/nfs41_np.c
107107
@@ -28,6 +28,8 @@
108108
 #include "nfs41_np.h"
109109
 #include "options.h"
110110
111111
+#define DBG 1
112112
+
113113
 #ifdef DBG
114114
 #define DbgP(_x_) NFS41DbgPrint _x_
115115
 #else
116116
diff --git a/sys/nfs41_build_features.h b/sys/nfs41_build_features.h
117117
index 93ee7a9..d43334a 100644
118118
--- a/sys/nfs41_build_features.h
119119
+++ b/sys/nfs41_build_features.h
120120
@@ -32,19 +32,19 @@
121121
 /*
122122
  * NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES - return local uid/gid values
123123
  */
124124
-// #define NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES 1
125125
+#define NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES 1
126126
127127
 /*
128128
  * NFS41_DRIVER_FEATURE_MAP_UNMAPPED_USER_TO_UNIXUSER_SID - give NFS
129129
  * files which do not map to a local account a SID in the
130130
  * Unix_User+x/Unix_Group+x range
131131
  */
132132
-// #define NFS41_DRIVER_FEATURE_MAP_UNMAPPED_USER_TO_UNIXUSER_SID 1
133133
+#define NFS41_DRIVER_FEATURE_MAP_UNMAPPED_USER_TO_UNIXUSER_SID 1
134134
135135
 /*
136136
  * NFS41_DRIVER_FEATURE_NAMESERVICE_CYGWIN - use Cygwin /usr/bin/getent
137137
  * as "name service"
138138
  */
139139
-// #define NFS41_DRIVER_FEATURE_NAMESERVICE_CYGWIN 1
140140
+#define NFS41_DRIVER_FEATURE_NAMESERVICE_CYGWIN 1
141141
142142
 #endif /* !_NFS41_DRIVER_BUILDFEATURES_ */
143143
diff --git a/sys/nfs41_driver.c b/sys/nfs41_driver.c
144-
index 526b064..db62b56 100644
144+
index 526b064..db4ed28 100644
145145
--- a/sys/nfs41_driver.c
146146
+++ b/sys/nfs41_driver.c
147147
@@ -54,7 +54,7 @@
148148
 //#define DEBUG_LOCK
149149
 //#define DEBUG_MISC
150150
 #define DEBUG_TIME_BASED_COHERENCY
151151
-//#define DEBUG_MOUNT
152152
+#define DEBUG_MOUNT
153153
 //#define DEBUG_VOLUME_QUERY
154154
155155
 //#define ENABLE_TIMINGS
156156
@@ -260,6 +260,40 @@ typedef struct _updowncall_list {
157157
 } nfs41_updowncall_list;
158158
 nfs41_updowncall_list upcall, downcall;
159159
160160
+
161161
+
162162
+/* In order to cooperate with other network providers,
163163
+ * we only claim paths of the format '\\server\nfs4\path' */
164164
+DECLARE_CONST_UNICODE_STRING(NfsPrefix, L"\\nfs4");
165165
+DECLARE_CONST_UNICODE_STRING(AUTH_SYS_NAME, L"sys");
166166
+DECLARE_CONST_UNICODE_STRING(AUTHGSS_KRB5_NAME, L"krb5");
167167
+DECLARE_CONST_UNICODE_STRING(AUTHGSS_KRB5I_NAME, L"krb5i");
168168
+DECLARE_CONST_UNICODE_STRING(AUTHGSS_KRB5P_NAME, L"krb5p");
169169
+DECLARE_CONST_UNICODE_STRING(SLASH, L"\\");
170170
+DECLARE_CONST_UNICODE_STRING(EMPTY_STRING, L"");
171171
+
172172
+#define SERVER_NAME_BUFFER_SIZE         1024
173173
+#define MOUNT_CONFIG_RW_SIZE_MIN        1024
174174
+#define MOUNT_CONFIG_RW_SIZE_DEFAULT    1048576
175175
+#define MOUNT_CONFIG_RW_SIZE_MAX        1048576
176176
+#define MAX_SEC_FLAVOR_LEN              12
177177
+#define UPCALL_TIMEOUT_DEFAULT          50  /* in seconds */
178178
+
179179
+typedef struct _NFS41_MOUNT_CONFIG {
180180
+    DWORD ReadSize;
181181
+    DWORD WriteSize;
182182
+    BOOLEAN ReadOnly;
183183
+    BOOLEAN write_thru;
184184
+    BOOLEAN nocache;
185185
+    WCHAR srv_buffer[SERVER_NAME_BUFFER_SIZE];
186186
+    UNICODE_STRING SrvName; /* hostname, or hostname@port */
187187
+    WCHAR mntpt_buffer[MAX_PATH];
188188
+    UNICODE_STRING MntPt;
189189
+    WCHAR sec_flavor[MAX_SEC_FLAVOR_LEN];
190190
+    UNICODE_STRING SecFlavor;
191191
+    DWORD timeout;
192192
+} NFS41_MOUNT_CONFIG, *PNFS41_MOUNT_CONFIG;
193193
+
194194
 typedef struct _nfs41_mount_entry {
195195
     LIST_ENTRY next;
196196
     LUID login_id;
197197
@@ -267,6 +301,7 @@ typedef struct _nfs41_mount_entry {
198198
     HANDLE gss_session;
199199
     HANDLE gssi_session;
200200
     HANDLE gssp_session;
201201
+    NFS41_MOUNT_CONFIG Config;
202202
 } nfs41_mount_entry;
203203
204204
 typedef struct _nfs41_mount_list {
205205
@@ -310,37 +345,6 @@ typedef struct _nfs41_mount_list {
206206
                                   next)));                  \
207207
             ExReleaseFastMutex(&lock);
208208
209209
-/* In order to cooperate with other network providers,
210210
- * we only claim paths of the format '\\server\nfs4\path' */
211211
-DECLARE_CONST_UNICODE_STRING(NfsPrefix, L"\\nfs4");
212212
-DECLARE_CONST_UNICODE_STRING(AUTH_SYS_NAME, L"sys");
213213
-DECLARE_CONST_UNICODE_STRING(AUTHGSS_KRB5_NAME, L"krb5");
214214
-DECLARE_CONST_UNICODE_STRING(AUTHGSS_KRB5I_NAME, L"krb5i");
215215
-DECLARE_CONST_UNICODE_STRING(AUTHGSS_KRB5P_NAME, L"krb5p");
216216
-DECLARE_CONST_UNICODE_STRING(SLASH, L"\\");
217217
-DECLARE_CONST_UNICODE_STRING(EMPTY_STRING, L"");
218218
-
219219
-#define SERVER_NAME_BUFFER_SIZE         1024
220220
-#define MOUNT_CONFIG_RW_SIZE_MIN        1024
221221
-#define MOUNT_CONFIG_RW_SIZE_DEFAULT    1048576
222222
-#define MOUNT_CONFIG_RW_SIZE_MAX        1048576
223223
-#define MAX_SEC_FLAVOR_LEN              12
224224
-#define UPCALL_TIMEOUT_DEFAULT          50  /* in seconds */
225225
-
226226
-typedef struct _NFS41_MOUNT_CONFIG {
227227
-    DWORD ReadSize;
228228
-    DWORD WriteSize;
229229
-    BOOLEAN ReadOnly;
230230
-    BOOLEAN write_thru;
231231
-    BOOLEAN nocache;
232232
-    WCHAR srv_buffer[SERVER_NAME_BUFFER_SIZE];
233233
-    UNICODE_STRING SrvName; /* hostname, or hostname@port */
234234
-    WCHAR mntpt_buffer[MAX_PATH];
235235
-    UNICODE_STRING MntPt;
236236
-    WCHAR sec_flavor[MAX_SEC_FLAVOR_LEN];
237237
-    UNICODE_STRING SecFlavor;
238238
-    DWORD timeout;
239239
-} NFS41_MOUNT_CONFIG, *PNFS41_MOUNT_CONFIG;
240240
241241
 typedef struct _NFS41_NETROOT_EXTENSION {
242242
     NODE_TYPE_CODE          NodeTypeCode;
243243
@@ -475,6 +479,14 @@ nfs41_start_driver_state nfs41_start_state = NFS41_START_DRIVER_STARTABLE;
244244
245245
 NTSTATUS map_readwrite_errors(DWORD status);
246246
247247
+
248248
+void copy_nfs41_mount_config(NFS41_MOUNT_CONFIG *dest, NFS41_MOUNT_CONFIG *src)
249249
+{
250250
+    RtlCopyMemory(dest, src, sizeof(NFS41_MOUNT_CONFIG));
251251
+    dest->SrvName.Buffer = dest->srv_buffer;
252252
+    dest->MntPt.Buffer = dest->mntpt_buffer;
253253
+}
254254
+
255255
 void print_debug_header(
256256
     PRX_CONTEXT RxContext)
257257
 {
258-
@@ -2739,6 +2751,10 @@ NTSTATUS nfs41_MountConfig_ParseOptions(
258+
@@ -2739,6 +2751,9 @@ NTSTATUS nfs41_MountConfig_ParseOptions(
259259
     IN ULONG EaLength,
260260
     IN OUT PNFS41_MOUNT_CONFIG Config)
261261
 {
262262
+    DbgP("----> nfs41_MountConfig_ParseOptions(EaBuffer=%p,EaLength=%ld)\n",
263263
+        (void *)EaBuffer,
264264
+        (long)EaLength);
266265
     NTSTATUS  status = STATUS_SUCCESS;
267266
     PFILE_FULL_EA_INFORMATION Option;
268267
     LPWSTR Name;
269-
@@ -2746,13 +2762,20 @@ NTSTATUS nfs41_MountConfig_ParseOptions(
268+
@@ -2746,13 +2761,20 @@ NTSTATUS nfs41_MountConfig_ParseOptions(
270269
     UNICODE_STRING  usValue;
271270
     Option = EaBuffer;
272271
     while (status == STATUS_SUCCESS) {
273272
+        DbgP("Option=%p\n", (void *)Option);
274273
         Name = (LPWSTR)Option->EaName;
275274
         NameLen = Option->EaNameLength/sizeof(WCHAR);
276275
277276
+        DbgP("nfs41_MountConfig_ParseOptions: Name='%*S'/NameLen=%d\n",
278277
+            (int)NameLen, Name, (int)NameLen);
279278
+
280279
         usValue.Length = usValue.MaximumLength = Option->EaValueLength;
281280
         usValue.Buffer = (PWCH)(Option->EaName +
282281
             Option->EaNameLength + sizeof(WCHAR));
283282
284283
+        DbgP("nfs41_MountConfig_ParseOptions: option/usValue='%wZ'/%ld\n",
285284
+            &usValue, (long)usValue.Length);
286285
+
287286
         if (wcsncmp(L"ro", Name, NameLen) == 0) {
288287
             status = nfs41_MountConfig_ParseBoolean(Option, &usValue,
289288
                 FALSE, &Config->ReadOnly);
290-
@@ -2834,6 +2857,7 @@ NTSTATUS nfs41_MountConfig_ParseOptions(
289+
@@ -2834,6 +2856,7 @@ NTSTATUS nfs41_MountConfig_ParseOptions(
291290
             ((PBYTE)Option + Option->NextEntryOffset);
292291
     }
293292
294293
+    DbgP("<---- nfs41_MountConfig_ParseOptions, status=%ld\n", (long)status);
295294
     return status;
296295
 }
297296
298-
@@ -2996,6 +3020,9 @@ NTSTATUS nfs41_CreateVNetRoot(
297+
@@ -2996,27 +3019,81 @@ NTSTATUS nfs41_CreateVNetRoot(
299298
300299
     if (pCreateNetRootContext->RxContext->Create.EaLength) {
301300
         /* Codepath for nfs_mount.exe */
302-
+        DbgP("Codepath for nfs_mount.exe, %p/%ld\n",
301+
+        DbgP("Codepath for nfs_mount.exe, Create->{ EaBuffer=%p, EaLength=%ld }\n",
303302
+            pCreateNetRootContext->RxContext->Create.EaBuffer,
304303
+            (long)pCreateNetRootContext->RxContext->Create.EaLength);
305304
306305
         /* parse the extended attributes for mount options */
307306
         status = nfs41_MountConfig_ParseOptions(
308-
@@ -3009,6 +3036,7 @@ NTSTATUS nfs41_CreateVNetRoot(
307+
             pCreateNetRootContext->RxContext->Create.EaBuffer,
308+
             pCreateNetRootContext->RxContext->Create.EaLength,
309317
         pVNetRootContext->nocache = Config->nocache;
310318
     } else {
311-
         /* Codepath for \\server:port\nfs4\path */
319+
-        /* Codepath for \\server:port\nfs4\path */
312-
+        DbgP("Codepath for \\\\server:port\\nfs4\\path\n");
320+
+        /* Codepath for \\server@port\nfs4\path */
321+
+        DbgP("Codepath for \\\\server@port\\nfs4\\path\n");
313322
323+
+#if 0
314324
         /* use the SRV_CALL name (without leading \) as the hostname */
315325
         Config->SrvName.Buffer = pSrvCall->pSrvCallName->Buffer + 1;
316-
@@ -3016,16 +3044,73 @@ NTSTATUS nfs41_CreateVNetRoot(
326+
         Config->SrvName.Length =
317327
             pSrvCall->pSrvCallName->Length - sizeof(WCHAR);
318328
         Config->SrvName.MaximumLength =
319329
             pSrvCall->pSrvCallName->MaximumLength - sizeof(WCHAR);
320-
+#define MNTXXX 1
330+
+#endif
331+
+
322332
+        status = nfs41_GetLUID(&luid);
323333
+        if (status)
324334
+            goto out_free;
325335
+
326336
+        PLIST_ENTRY pEntry;
327337
+
338+
+        status = STATUS_OBJECT_NAME_NOT_FOUND;
328340
+        ExAcquireFastMutex(&pNetRootContext->mountLock);
329341
+        pEntry = &pNetRootContext->mounts.head;
330342
+        pEntry = pEntry->Flink;
331343
+        while (pEntry != NULL) {
332344
+            existing_mount = (nfs41_mount_entry *)CONTAINING_RECORD(pEntry,
333345
+                    nfs41_mount_entry, next);
334346
+
335347
+            if (RtlEqualLuid(&luid, &existing_mount->login_id)) {
336-
+                DbgP("MNTXXX: Found a matching LUID entry\n");
337-
+
338348
+                /* found existing mount */
339349
+                copy_nfs41_mount_config(Config, &existing_mount->Config);
340-
+#if 0
350+
+                DbgP("Found existing mount: Entry Config->MntPt='%wZ'\n",
341-
+                RtlCopyMemory(Config->mntpt_buffer, existing_mount->mntpt_buffer, sizeof(Config->mntpt_buffer));
351+
+                    &Config->MntPt);
349352
+                status = STATUS_SUCCESS;
350353
+                break;
351-
+            }
354+
             }
352355
+            if (pEntry->Flink == &pNetRootContext->mounts.head)
353356
+                break;
354357
+            pEntry = pEntry->Flink;
355358
+        }
356359
+        ExReleaseFastMutex(&pNetRootContext->mountLock);
357360
+
358-
+        DbgP("MNTXXX: mark #1\n");
361+
+        if (status != STATUS_SUCCESS) {
362+
+            DbgP("No existing mount found\n");
361363
+            goto out_free;
364+
+        }
362366
+        pVNetRootContext->read_only = Config->ReadOnly;
363367
+        pVNetRootContext->write_thru = Config->write_thru;
364368
+        pVNetRootContext->nocache = Config->nocache;
369+
+    }
365370
+
366-
+        DbgP("MNTXXX: mark #2\n");
371+
+    DbgP("Config->{ MntPt='%wZ', SrvName='%wZ', ReadOnly=%d, write_thru=%d, nocache=%d }\n",
367-
+        DbgP("Codepath for \\\\server:port\\nfs4\\path: Config->MntPt='%wZ'\n",
372+
+        &Config->MntPt,
368-
+            &Config->MntPt);
373+
+        &Config->SrvName,
374+
+        Config->ReadOnly?1:0,
369377
+
375378
     pVNetRootContext->MountPathLen = Config->MntPt.Length;
376379
     pVNetRootContext->timeout = Config->timeout;
377380
378-
     status = map_sec_flavor(&Config->SecFlavor, &pVNetRootContext->sec_flavor);
381+
@@ -3127,6 +3204,7 @@ NTSTATUS nfs41_CreateVNetRoot(
379-
     if (status != STATUS_SUCCESS) {
382+
             entry->gssp_session = pVNetRootContext->session; break;
383383
     }
384+
         RtlCopyLuid(&entry->login_id, &luid);
384392
385-
+DbgP("MNTXXX: mark #4\n");
393+
386-
+
394+
387-
     status = nfs41_GetLUID(&luid);
395+
388-
     if (status)
396+
389-
         goto out_free;
397+
390-
@@ -3090,10 +3175,12 @@ NTSTATUS nfs41_CreateVNetRoot(
398+
391-
 #endif
399+
392-
     }
400+
393401
394-
+DbgP("MNTXXX: mark #5\n");
402+
395-
     /* send the mount upcall */
403+
396-
     status = nfs41_mount(Config, pVNetRootContext->sec_flavor,
404+
397-
         &pVNetRootContext->session, &nfs41d_version,
405+
398-
         &pVNetRootContext->FsAttrs);
406+
399-
+DbgP("status(=%ld) = nfs41_mount()\n", (long)status);
407+
400-
     if (status != STATUS_SUCCESS) {
408+
401-
         BOOLEAN MountsEmpty;
409+
402-
         nfs41_IsListEmpty(pNetRootContext->mountLock,
410+
403-
@@ -3127,6 +3214,12 @@ NTSTATUS nfs41_CreateVNetRoot(
411+
404-
             entry->gssp_session = pVNetRootContext->session; break;
412+
405-
         }
413+
406-
         RtlCopyLuid(&entry->login_id, &luid);
414+
407-
+        copy_nfs41_mount_config(&entry->Config, Config);
415+
408-
+#if 0
416+
409-
+        RtlCopyMemory(entry->mntpt_buffer, Config->mntpt_buffer, sizeof(entry->mntpt_buffer));
417+
410-
+        entry->mntpt_buffer[Config->MntPt.Length] = L'\0';
418+
411-
+#endif
419+
412-
+        DbgP("NEW MOUNT '%wZ'\n", &entry->Config.MntPt);
420+
413-
         nfs41_AddEntry(pNetRootContext->mountLock,
421+
414-
             pNetRootContext->mounts, entry);
422+
415-
     } else if (!found_matching_flavor) {
423+
416-
diff --git a/tests/winlocktest1/winlocktest1.ksh b/tests/winlocktest1/winlocktest1.ksh
424+
417-
old mode 100644
425+
418-
new mode 100755
426+
419427

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