Skip to content

Commit 5fcebc8

Browse files
committed
nfsv3: handle cases when create/mkdir operation doesn't specify mode
As file/directory more is an optional attribute on create/mkdir the server must check their existence before accessing. Fixes: #170 Acked-by:
1 parent 5fdb0fe commit 5fcebc8

File tree

1 file changed

+10
-6
lines changed

1 file changed

+10
-6
lines changed

core/src/main/java/org/dcache/nfs/v3/NfsServerV3.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2009 - 2022 Deutsches Elektronen-Synchroton,
2+
* Copyright (c) 2009 - 2026 Deutsches Elektronen-Synchroton,
33
* Member of the Helmholtz Association, (DESY), HAMBURG, GERMANY
44
*
55
* This library is free software; you can redistribute it and/or modify
@@ -305,15 +305,17 @@ public CREATE3res NFSPROC3_CREATE_3(RpcCall call$, CREATE3args arg1) {
305305

306306
parentStat = fs.getattr(parent);
307307

308-
int fmode = 0644 | Stat.S_IFREG;
308+
int fmode = 0644;
309309
Subject actualSubject = null;
310310
if (newAttr != null) {
311-
fmode = newAttr.mode.mode.value.value | Stat.S_IFREG;
311+
if (newAttr.mode.set_it) {
312+
fmode = newAttr.mode.mode.value.value;
313+
}
312314
if (newAttr.uid.set_it || newAttr.gid.set_it) {
313315
actualSubject = UnixSubjects.toSubject(newAttr.uid.uid.value, newAttr.gid.gid.value);
314316
}
315317
}
316-
inode = fs.create(parent, Stat.Type.REGULAR, path, actualSubject, fmode);
318+
inode = fs.create(parent, Stat.Type.REGULAR, path, actualSubject, fmode | Stat.S_IFREG);
317319
Stat inodeStat = fs.getattr(inode);
318320

319321
res.status = nfsstat.NFS_OK;
@@ -607,13 +609,15 @@ public MKDIR3res NFSPROC3_MKDIR_3(RpcCall call$, MKDIR3args arg1) {
607609
int mode = 0777;
608610
Subject actualSubject = null;
609611
if (attr != null) {
610-
mode = attr.mode.mode.value.value | Stat.S_IFDIR;
612+
if (attr.mode.set_it) {
613+
mode = attr.mode.mode.value.value;
614+
}
611615
if (attr.uid.set_it || attr.gid.set_it) {
612616
actualSubject = UnixSubjects.toSubject(attr.uid.uid.value, attr.gid.gid.value);
613617
}
614618
}
615619

616-
Inode inode = fs.mkdir(parent, name, actualSubject, mode);
620+
Inode inode = fs.mkdir(parent, name, actualSubject, mode | Stat.S_IFDIR);
617621

618622
res.resok = new MKDIR3resok();
619623
res.resok.obj = new post_op_fh3();

0 commit comments

Comments
 (0)