- # patch for exefilecreatemode mount option
- # originally thought to help with installers if they create files, but do not set a EXEC flag via ACLs
- # however, this does not work, because many installers unpack files as foo1245.tmp, and then do a rename
- # to "foo.exe" - so there is no way to do this at file creation
- diff --git a/mount/mount.c b/mount/mount.c
- index c3d0487..250724c 100644
- --- a/mount/mount.c
- +++ b/mount/mount.c
- @@ -147,8 +147,10 @@ void PrintMountUsage(LPWSTR pProcess)
- "\t\tArgument is an octal value prefixed with '0' or '0o',\n"
- "\t\tif this value is prefixed with 'nfsv3attrmode+'\n"
- "\t\tthe mode value from a \"NfsV3Attributes\" EA will be used\n"
- - "\t\t(defaults \"nfsv3attrmode+0%o\" for dirs and \n"
- - "\t\t\"nfsv3attrmode+0%o\" for files).\n"
- + "\t\t(defaults \"nfsv3attrmode+0%o\" for dirs, \n"
- + "\t\t\"nfsv3attrmode+0%o\" for files and\n"
- + "\t\t\"nfsv3attrmode+0%o\" for files matching\n"
- + "\t\t""\"\\.(exe|dll|com|sys)$\").\n"
- "\tdircreatemode=\tspecify default POSIX permission mode\n"
- "\t\tfor new directories created on the NFS share.\n"
- "\t\tArgument is an octal value prefixed with '0' or '0o',\n"
- @@ -161,6 +163,14 @@ void PrintMountUsage(LPWSTR pProcess)
- "\t\tif this value is prefixed with 'nfsv3attrmode+'\n"
- "\t\tthe mode value from a \"NfsV3Attributes\" EA will be used\n"
- "\t\t(defaults \"nfsv3attrmode+0%o\").\n"
- + "\texefilecreatemode=\tspecify default POSIX permission mode\n"
- + "\t\tfor new files matching the extended regular\n"
- + "\t\texpression \"\\.(exe|dll|com|sys)$\" created on the\n"
- + "\t\tNFS share.\n"
- + "\t\tArgument is an octal value prefixed with '0' or '0o',\n"
- + "\t\tif this value is prefixed with 'nfsv3attrmode+'\n"
- + "\t\tthe mode value from a \"NfsV3Attributes\" EA will be used\n"
- + "\t\t(defaults \"nfsv3attrmode+0%o\").\n"
- "* URL parameters:\n"
- "\tro=1\tmount as read-only\n"
- @@ -193,8 +203,10 @@ void PrintMountUsage(LPWSTR pProcess)
- pProcess, pProcess, pProcess, pProcess,
- (int)NFS41_DRIVER_DEFAULT_DIR_CREATE_MODE,
- (int)NFS41_DRIVER_DEFAULT_FILE_CREATE_MODE,
- + (int)NFS41_DRIVER_DEFAULT_EXEFILE_CREATE_MODE,
- (int)NFS41_DRIVER_DEFAULT_DIR_CREATE_MODE,
- - (int)NFS41_DRIVER_DEFAULT_FILE_CREATE_MODE);
- + (int)NFS41_DRIVER_DEFAULT_FILE_CREATE_MODE,
- + (int)NFS41_DRIVER_DEFAULT_EXEFILE_CREATE_MODE);
- }
- diff --git a/nfs41_build_features.h b/nfs41_build_features.h
- index d2fd138..ddad42f 100644
- --- a/nfs41_build_features.h
- +++ b/nfs41_build_features.h
- @@ -131,6 +131,7 @@
- */
- #define NFS41_DRIVER_DEFAULT_DIR_CREATE_MODE (0755)
- #define NFS41_DRIVER_DEFAULT_FILE_CREATE_MODE (0644)
- +#define NFS41_DRIVER_DEFAULT_EXEFILE_CREATE_MODE (0755)
- /*
- * NFS41_DRIVER_DEBUG_FS_NAME - define which filesystem name should
- diff --git a/sys/nfs41sys_driver.h b/sys/nfs41sys_driver.h
- index 496387c..126c1cc 100644
- --- a/sys/nfs41sys_driver.h
- +++ b/sys/nfs41sys_driver.h
- @@ -323,6 +323,7 @@ typedef struct _NFS41_MOUNT_CONFIG {
- DWORD timeout;
- NFS41_MOUNT_CREATEMODE dir_createmode;
- NFS41_MOUNT_CREATEMODE file_createmode;
- + NFS41_MOUNT_CREATEMODE exefile_createmode;
- } NFS41_MOUNT_CONFIG, *PNFS41_MOUNT_CONFIG;
- typedef struct _nfs41_mount_entry {
- @@ -414,6 +415,7 @@ typedef struct _NFS41_V_NET_ROOT_EXTENSION {
- DWORD timeout;
- NFS41_MOUNT_CREATEMODE dir_createmode;
- NFS41_MOUNT_CREATEMODE file_createmode;
- + NFS41_MOUNT_CREATEMODE exefile_createmode;
- USHORT MountPathLen;
- DWORD nfsvers;
- BOOLEAN read_only;
- diff --git a/sys/nfs41sys_mount.c b/sys/nfs41sys_mount.c
- index 93a6d34..61033a5 100644
- --- a/sys/nfs41sys_mount.c
- +++ b/sys/nfs41sys_mount.c
- @@ -323,6 +323,10 @@ void nfs41_MountConfig_InitDefaults(
- Config->file_createmode.use_nfsv3attrsea_mode = TRUE;
- Config->file_createmode.mode =
- NFS41_DRIVER_DEFAULT_FILE_CREATE_MODE;
- + Config->exefile_createmode.use_nfsv3attrsea_mode = TRUE;
- + Config->exefile_createmode.mode =
- + NFS41_DRIVER_DEFAULT_EXEFILE_CREATE_MODE;
- +
- }
- static
- @@ -530,17 +534,20 @@ NTSTATUS nfs41_MountConfig_ParseOptions(
- }
- else if ((wcsncmp(L"createmode", Name, NameLen) == 0) ||
- (wcsncmp(L"dircreatemode", Name, NameLen) == 0) ||
- - (wcsncmp(L"filecreatemode", Name, NameLen) == 0)) {
- + (wcsncmp(L"filecreatemode", Name, NameLen) == 0) ||
- + (wcsncmp(L"execreatemode", Name, NameLen) == 0)) {
- #define NFSV3ATTRMODE_WSTR L"nfsv3attrmode+"
- #define NFSV3ATTRMODE_WCSLEN (14)
- #define NFSV3ATTRMODE_BYTELEN (NFSV3ATTRMODE_WCSLEN*sizeof(WCHAR))
- bool set_dirmode = false;
- bool set_filemode = false;
- + bool set_exefilemode = false;
- switch(Name[0]) {
- case L'c':
- set_dirmode = true;
- set_filemode = true;
- + set_exefilemode = true;
- break;
- case L'd':
- set_dirmode = true;
- @@ -548,6 +555,9 @@ NTSTATUS nfs41_MountConfig_ParseOptions(
- case L'f':
- set_filemode = true;
- break;
- + case L'e':
- + set_exefilemode = true;
- + break;
- default:
- print_error("nfs41_MountConfig_ParseOptions: "
- "invalid createmode name\n");
- @@ -576,9 +586,14 @@ NTSTATUS nfs41_MountConfig_ParseOptions(
- &usValue, (long)usValue.Length);
- #endif /* DEBUG_MOUNTCONFIG */
- if (set_dirmode)
- - Config->dir_createmode.use_nfsv3attrsea_mode = TRUE;
- + Config->dir_createmode.
- + use_nfsv3attrsea_mode = TRUE;
- if (set_filemode)
- - Config->file_createmode.use_nfsv3attrsea_mode = TRUE;
- + Config->file_createmode.
- + use_nfsv3attrsea_mode = TRUE;
- + if (set_exefilemode)
- + Config->exefile_createmode.
- + use_nfsv3attrsea_mode = TRUE;
- }
- else {
- #ifdef DEBUG_MOUNTCONFIG
- @@ -587,9 +602,14 @@ NTSTATUS nfs41_MountConfig_ParseOptions(
- &usValue, (long)usValue.Length);
- #endif /* DEBUG_MOUNTCONFIG */
- if (set_dirmode)
- - Config->dir_createmode.use_nfsv3attrsea_mode = FALSE;
- + Config->dir_createmode.
- + use_nfsv3attrsea_mode = FALSE;
- if (set_filemode)
- - Config->file_createmode.use_nfsv3attrsea_mode = FALSE;
- + Config->file_createmode.
- + use_nfsv3attrsea_mode = FALSE;
- + if (set_exefilemode)
- + Config->exefile_createmode.
- + use_nfsv3attrsea_mode = FALSE;
- }
- if (usValue.Length >= (2*sizeof(WCHAR))) {
- @@ -631,6 +651,8 @@ NTSTATUS nfs41_MountConfig_ParseOptions(
- Config->dir_createmode.mode = cmode;
- if (set_filemode)
- Config->file_createmode.mode = cmode;
- + if (set_exefilemode)
- + Config->exefile_createmode.mode = cmode;
- }
- }
- }
- @@ -643,12 +665,15 @@ NTSTATUS nfs41_MountConfig_ParseOptions(
- DbgP("nfs41_MountConfig_ParseOptions: createmode: "
- "status=0x%lx, "
- "dir_createmode=(use_nfsv3attrsea_mode=%d mode=0%o) "
- - "file_createmode=(use_nfsv3attrsea_mode=%d mode=0%o)\n",
- + "file_createmode=(use_nfsv3attrsea_mode=%d mode=0%o) "
- + "exefile_createmode=(use_nfsv3attrsea_mode=%d mode=0%o)\n",
- (long)status,
- (int)Config->dir_createmode.use_nfsv3attrsea_mode,
- (int)Config->dir_createmode.mode,
- (int)Config->file_createmode.use_nfsv3attrsea_mode,
- - (int)Config->file_createmode.mode);
- + (int)Config->file_createmode.mode,
- + (int)Config->exefile_createmode.use_nfsv3attrsea_mode,
- + (int)Config->exefile_createmode.mode);
- }
- else {
- status = STATUS_INVALID_PARAMETER;
- @@ -1036,6 +1061,7 @@ NTSTATUS nfs41_CreateVNetRoot(
- "timeout=%d "
- "dir_cmode=(usenfsv3attrs=%d mode=0%o) "
- "file_cmode=(usenfsv3attrs=%d mode=0%o) "
- + "exefile_cmode=(usenfsv3attrs=%d mode=0%o) "
- "}\n",
- &Config->MntPt,
- &Config->SrvName,
- @@ -1049,7 +1075,9 @@ NTSTATUS nfs41_CreateVNetRoot(
- Config->dir_createmode.use_nfsv3attrsea_mode?1:0,
- Config->dir_createmode.mode,
- Config->file_createmode.use_nfsv3attrsea_mode?1:0,
- - Config->file_createmode.mode);
- + Config->file_createmode.mode,
- + Config->exefile_createmode.use_nfsv3attrsea_mode?1:0,
- + Config->exefile_createmode.mode);
- pVNetRootContext->MountPathLen = Config->MntPt.Length;
- pVNetRootContext->timeout = Config->timeout;
- @@ -1061,6 +1089,10 @@ NTSTATUS nfs41_CreateVNetRoot(
- Config->file_createmode.use_nfsv3attrsea_mode;
- pVNetRootContext->file_createmode.mode =
- Config->file_createmode.mode;
- + pVNetRootContext->exefile_createmode.use_nfsv3attrsea_mode =
- + Config->exefile_createmode.use_nfsv3attrsea_mode;
- + pVNetRootContext->exefile_createmode.mode =
- + Config->exefile_createmode.mode;
- status = map_sec_flavor(&Config->SecFlavor, &pVNetRootContext->sec_flavor);
- if (status != STATUS_SUCCESS) {
- diff --git a/sys/nfs41sys_openclose.c b/sys/nfs41sys_openclose.c
- index 4d61e42..88c027d 100644
- --- a/sys/nfs41sys_openclose.c
- +++ b/sys/nfs41sys_openclose.c
- @@ -638,23 +638,50 @@ NTSTATUS nfs41_Create(
- // if we are creating a file check if nfsv3attributes were passed in
- if (params->Disposition != FILE_OPEN && params->Disposition != FILE_OVERWRITE) {
- bool is_dir;
- + bool is_exe = false;
- + /* use_nfsv3attrsea_mode - Prefer mode from NfsV3Attributes ? */
- bool use_nfsv3attrsea_mode;
- is_dir = (params->CreateOptions & FILE_DIRECTORY_FILE)?true:false;
- + if (!is_dir) {
- + PUNICODE_STRING fn = entry->filename;
- + size_t wlen = fn->Length / sizeof(wchar_t);
- + /*
- + * |fn| must be at least 4 |wchar_t| long to match eiter
- + * ".exe", ".dll", ".com" or ".sys"
- + */
- + if (wlen > 4) {
- + wchar_t *fn4pos = fn->Buffer + wlen-4;
- + if ((_wcsnicmp(fn4pos, L".exe", 4) == 0) ||
- + (_wcsnicmp(fn4pos, L".dll", 4) == 0) ||
- + (_wcsnicmp(fn4pos, L".com", 4) == 0) ||
- + (_wcsnicmp(fn4pos, L".sys", 4) == 0)) {
- + is_exe = true;
- +
- + DbgP("nfs41_Create: "
- + "FileName '%wZ' is a *.(exe|dll|com|sys)\n",
- + fn);
- + }
- + }
- + }
- +
- /* Get default mode */
- if (is_dir) {
- entry->u.Open.mode = pVNetRootContext->dir_createmode.mode;
- + use_nfsv3attrsea_mode = pVNetRootContext->dir_createmode.use_nfsv3attrsea_mode;
- }
- else {
- - entry->u.Open.mode = pVNetRootContext->file_createmode.mode;
- + if (is_exe) {
- + entry->u.Open.mode = pVNetRootContext->exefile_createmode.mode;
- + use_nfsv3attrsea_mode = pVNetRootContext->exefile_createmode.use_nfsv3attrsea_mode;
- + }
- + else {
- + entry->u.Open.mode = pVNetRootContext->file_createmode.mode;
- + use_nfsv3attrsea_mode = pVNetRootContext->file_createmode.use_nfsv3attrsea_mode;
- + }
- }
- - /* Prefer mode from NfsV3Attributes ? */
- - use_nfsv3attrsea_mode = (is_dir?
- - pVNetRootContext->dir_createmode.use_nfsv3attrsea_mode:
- - pVNetRootContext->file_createmode.use_nfsv3attrsea_mode);
- -
- /* Use mode from NfsV3Attributes */
- if (use_nfsv3attrsea_mode &&
- ea && AnsiStrEq(&NfsV3Attributes,
patch for exefilecreatemode mount option
Posted by Anonymous on Sat 15th Mar 2025 10:59
raw | new post
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.