pastebin - collaborative debugging tool
nrubsig.kpaste.net RSS


patch for exefilecreatemode mount option
Posted by Anonymous on Sat 15th Mar 2025 10:59
raw | new post

  1. # patch for exefilecreatemode mount option
  2. # originally thought to help with installers if they create files, but do not set a EXEC flag via ACLs
  3. # however, this does not work, because many installers unpack files as foo1245.tmp, and then do a rename
  4. # to "foo.exe" - so there is no way to do this at file creation
  5. diff --git a/mount/mount.c b/mount/mount.c
  6. index c3d0487..250724c 100644
  7. --- a/mount/mount.c
  8. +++ b/mount/mount.c
  9. @@ -147,8 +147,10 @@ void PrintMountUsage(LPWSTR pProcess)
  10.              "\t\tArgument is an octal value prefixed with '0' or '0o',\n"
  11.              "\t\tif this value is prefixed with 'nfsv3attrmode+'\n"
  12.              "\t\tthe mode value from a \"NfsV3Attributes\" EA will be used\n"
  13. -            "\t\t(defaults \"nfsv3attrmode+0%o\" for dirs and \n"
  14. -            "\t\t\"nfsv3attrmode+0%o\" for files).\n"
  15. +            "\t\t(defaults \"nfsv3attrmode+0%o\" for dirs, \n"
  16. +            "\t\t\"nfsv3attrmode+0%o\" for files and\n"
  17. +            "\t\t\"nfsv3attrmode+0%o\" for files matching\n"
  18. +            "\t\t""\"\\.(exe|dll|com|sys)$\").\n"
  19.          "\tdircreatemode=\tspecify default POSIX permission mode\n"
  20.              "\t\tfor new directories created on the NFS share.\n"
  21.              "\t\tArgument is an octal value prefixed with '0' or '0o',\n"
  22. @@ -161,6 +163,14 @@ void PrintMountUsage(LPWSTR pProcess)
  23.              "\t\tif this value is prefixed with 'nfsv3attrmode+'\n"
  24.              "\t\tthe mode value from a \"NfsV3Attributes\" EA will be used\n"
  25.              "\t\t(defaults \"nfsv3attrmode+0%o\").\n"
  26. +        "\texefilecreatemode=\tspecify default POSIX permission mode\n"
  27. +            "\t\tfor new files matching the extended regular\n"
  28. +            "\t\texpression \"\\.(exe|dll|com|sys)$\" created on the\n"
  29. +            "\t\tNFS share.\n"
  30. +            "\t\tArgument is an octal value prefixed with '0' or '0o',\n"
  31. +            "\t\tif this value is prefixed with 'nfsv3attrmode+'\n"
  32. +            "\t\tthe mode value from a \"NfsV3Attributes\" EA will be used\n"
  33. +            "\t\t(defaults \"nfsv3attrmode+0%o\").\n"
  34.  
  35.          "* URL parameters:\n"
  36.          "\tro=1\tmount as read-only\n"
  37. @@ -193,8 +203,10 @@ void PrintMountUsage(LPWSTR pProcess)
  38.          pProcess, pProcess, pProcess, pProcess,
  39.          (int)NFS41_DRIVER_DEFAULT_DIR_CREATE_MODE,
  40.          (int)NFS41_DRIVER_DEFAULT_FILE_CREATE_MODE,
  41. +        (int)NFS41_DRIVER_DEFAULT_EXEFILE_CREATE_MODE,
  42.          (int)NFS41_DRIVER_DEFAULT_DIR_CREATE_MODE,
  43. -        (int)NFS41_DRIVER_DEFAULT_FILE_CREATE_MODE);
  44. +        (int)NFS41_DRIVER_DEFAULT_FILE_CREATE_MODE,
  45. +        (int)NFS41_DRIVER_DEFAULT_EXEFILE_CREATE_MODE);
  46.  }
  47.  
  48.  
  49. diff --git a/nfs41_build_features.h b/nfs41_build_features.h
  50. index d2fd138..ddad42f 100644
  51. --- a/nfs41_build_features.h
  52. +++ b/nfs41_build_features.h
  53. @@ -131,6 +131,7 @@
  54.   */
  55.  #define NFS41_DRIVER_DEFAULT_DIR_CREATE_MODE (0755)
  56.  #define NFS41_DRIVER_DEFAULT_FILE_CREATE_MODE (0644)
  57. +#define NFS41_DRIVER_DEFAULT_EXEFILE_CREATE_MODE (0755)
  58.  
  59.  /*
  60.   * NFS41_DRIVER_DEBUG_FS_NAME - define which filesystem name should
  61. diff --git a/sys/nfs41sys_driver.h b/sys/nfs41sys_driver.h
  62. index 496387c..126c1cc 100644
  63. --- a/sys/nfs41sys_driver.h
  64. +++ b/sys/nfs41sys_driver.h
  65. @@ -323,6 +323,7 @@ typedef struct _NFS41_MOUNT_CONFIG {
  66.      DWORD timeout;
  67.      NFS41_MOUNT_CREATEMODE dir_createmode;
  68.      NFS41_MOUNT_CREATEMODE file_createmode;
  69. +    NFS41_MOUNT_CREATEMODE exefile_createmode;
  70.  } NFS41_MOUNT_CONFIG, *PNFS41_MOUNT_CONFIG;
  71.  
  72.  typedef struct _nfs41_mount_entry {
  73. @@ -414,6 +415,7 @@ typedef struct _NFS41_V_NET_ROOT_EXTENSION {
  74.      DWORD                   timeout;
  75.      NFS41_MOUNT_CREATEMODE  dir_createmode;
  76.      NFS41_MOUNT_CREATEMODE  file_createmode;
  77. +    NFS41_MOUNT_CREATEMODE  exefile_createmode;
  78.      USHORT                  MountPathLen;
  79.      DWORD                   nfsvers;
  80.      BOOLEAN                 read_only;
  81. diff --git a/sys/nfs41sys_mount.c b/sys/nfs41sys_mount.c
  82. index 93a6d34..61033a5 100644
  83. --- a/sys/nfs41sys_mount.c
  84. +++ b/sys/nfs41sys_mount.c
  85. @@ -323,6 +323,10 @@ void nfs41_MountConfig_InitDefaults(
  86.      Config->file_createmode.use_nfsv3attrsea_mode = TRUE;
  87.      Config->file_createmode.mode =
  88.          NFS41_DRIVER_DEFAULT_FILE_CREATE_MODE;
  89. +    Config->exefile_createmode.use_nfsv3attrsea_mode = TRUE;
  90. +    Config->exefile_createmode.mode =
  91. +        NFS41_DRIVER_DEFAULT_EXEFILE_CREATE_MODE;
  92. +
  93.  }
  94.  
  95.  static
  96. @@ -530,17 +534,20 @@ NTSTATUS nfs41_MountConfig_ParseOptions(
  97.          }
  98.          else if ((wcsncmp(L"createmode", Name, NameLen) == 0) ||
  99.              (wcsncmp(L"dircreatemode", Name, NameLen) == 0) ||
  100. -            (wcsncmp(L"filecreatemode", Name, NameLen) == 0)) {
  101. +            (wcsncmp(L"filecreatemode", Name, NameLen) == 0) ||
  102. +            (wcsncmp(L"execreatemode", Name, NameLen) == 0)) {
  103.  #define NFSV3ATTRMODE_WSTR L"nfsv3attrmode+"
  104.  #define NFSV3ATTRMODE_WCSLEN (14)
  105.  #define NFSV3ATTRMODE_BYTELEN (NFSV3ATTRMODE_WCSLEN*sizeof(WCHAR))
  106.              bool set_dirmode = false;
  107.              bool set_filemode = false;
  108. +            bool set_exefilemode = false;
  109.  
  110.              switch(Name[0]) {
  111.                  case L'c':
  112.                      set_dirmode = true;
  113.                      set_filemode = true;
  114. +                    set_exefilemode = true;
  115.                      break;
  116.                  case L'd':
  117.                      set_dirmode = true;
  118. @@ -548,6 +555,9 @@ NTSTATUS nfs41_MountConfig_ParseOptions(
  119.                  case L'f':
  120.                      set_filemode = true;
  121.                      break;
  122. +                case L'e':
  123. +                    set_exefilemode = true;
  124. +                    break;
  125.                  default:
  126.                      print_error("nfs41_MountConfig_ParseOptions: "
  127.                          "invalid createmode name\n");
  128. @@ -576,9 +586,14 @@ NTSTATUS nfs41_MountConfig_ParseOptions(
  129.                      &usValue, (long)usValue.Length);
  130.  #endif /* DEBUG_MOUNTCONFIG */
  131.                  if (set_dirmode)
  132. -                    Config->dir_createmode.use_nfsv3attrsea_mode = TRUE;
  133. +                    Config->dir_createmode.
  134. +                        use_nfsv3attrsea_mode = TRUE;
  135.                  if (set_filemode)
  136. -                    Config->file_createmode.use_nfsv3attrsea_mode = TRUE;
  137. +                    Config->file_createmode.
  138. +                        use_nfsv3attrsea_mode = TRUE;
  139. +                if (set_exefilemode)
  140. +                    Config->exefile_createmode.
  141. +                        use_nfsv3attrsea_mode = TRUE;
  142.              }
  143.              else {
  144.  #ifdef DEBUG_MOUNTCONFIG
  145. @@ -587,9 +602,14 @@ NTSTATUS nfs41_MountConfig_ParseOptions(
  146.                      &usValue, (long)usValue.Length);
  147.  #endif /* DEBUG_MOUNTCONFIG */
  148.                  if (set_dirmode)
  149. -                    Config->dir_createmode.use_nfsv3attrsea_mode  = FALSE;
  150. +                    Config->dir_createmode.
  151. +                        use_nfsv3attrsea_mode  = FALSE;
  152.                  if (set_filemode)
  153. -                    Config->file_createmode.use_nfsv3attrsea_mode = FALSE;
  154. +                    Config->file_createmode.
  155. +                        use_nfsv3attrsea_mode = FALSE;
  156. +                if (set_exefilemode)
  157. +                    Config->exefile_createmode.
  158. +                        use_nfsv3attrsea_mode = FALSE;
  159.              }
  160.  
  161.              if (usValue.Length >= (2*sizeof(WCHAR))) {
  162. @@ -631,6 +651,8 @@ NTSTATUS nfs41_MountConfig_ParseOptions(
  163.                              Config->dir_createmode.mode  = cmode;
  164.                          if (set_filemode)
  165.                              Config->file_createmode.mode = cmode;
  166. +                        if (set_exefilemode)
  167. +                            Config->exefile_createmode.mode = cmode;
  168.                      }
  169.                  }
  170.              }
  171. @@ -643,12 +665,15 @@ NTSTATUS nfs41_MountConfig_ParseOptions(
  172.              DbgP("nfs41_MountConfig_ParseOptions: createmode: "
  173.                  "status=0x%lx, "
  174.                  "dir_createmode=(use_nfsv3attrsea_mode=%d mode=0%o) "
  175. -                "file_createmode=(use_nfsv3attrsea_mode=%d mode=0%o)\n",
  176. +                "file_createmode=(use_nfsv3attrsea_mode=%d mode=0%o) "
  177. +                "exefile_createmode=(use_nfsv3attrsea_mode=%d mode=0%o)\n",
  178.                  (long)status,
  179.                  (int)Config->dir_createmode.use_nfsv3attrsea_mode,
  180.                  (int)Config->dir_createmode.mode,
  181.                  (int)Config->file_createmode.use_nfsv3attrsea_mode,
  182. -                (int)Config->file_createmode.mode);
  183. +                (int)Config->file_createmode.mode,
  184. +                (int)Config->exefile_createmode.use_nfsv3attrsea_mode,
  185. +                (int)Config->exefile_createmode.mode);
  186.          }
  187.          else {
  188.              status = STATUS_INVALID_PARAMETER;
  189. @@ -1036,6 +1061,7 @@ NTSTATUS nfs41_CreateVNetRoot(
  190.          "timeout=%d "
  191.          "dir_cmode=(usenfsv3attrs=%d mode=0%o) "
  192.          "file_cmode=(usenfsv3attrs=%d mode=0%o) "
  193. +        "exefile_cmode=(usenfsv3attrs=%d mode=0%o) "
  194.          "}\n",
  195.          &Config->MntPt,
  196.          &Config->SrvName,
  197. @@ -1049,7 +1075,9 @@ NTSTATUS nfs41_CreateVNetRoot(
  198.          Config->dir_createmode.use_nfsv3attrsea_mode?1:0,
  199.          Config->dir_createmode.mode,
  200.          Config->file_createmode.use_nfsv3attrsea_mode?1:0,
  201. -        Config->file_createmode.mode);
  202. +        Config->file_createmode.mode,
  203. +        Config->exefile_createmode.use_nfsv3attrsea_mode?1:0,
  204. +        Config->exefile_createmode.mode);
  205.  
  206.      pVNetRootContext->MountPathLen = Config->MntPt.Length;
  207.      pVNetRootContext->timeout = Config->timeout;
  208. @@ -1061,6 +1089,10 @@ NTSTATUS nfs41_CreateVNetRoot(
  209.          Config->file_createmode.use_nfsv3attrsea_mode;
  210.      pVNetRootContext->file_createmode.mode =
  211.          Config->file_createmode.mode;
  212. +    pVNetRootContext->exefile_createmode.use_nfsv3attrsea_mode =
  213. +        Config->exefile_createmode.use_nfsv3attrsea_mode;
  214. +    pVNetRootContext->exefile_createmode.mode =
  215. +        Config->exefile_createmode.mode;
  216.  
  217.      status = map_sec_flavor(&Config->SecFlavor, &pVNetRootContext->sec_flavor);
  218.      if (status != STATUS_SUCCESS) {
  219. diff --git a/sys/nfs41sys_openclose.c b/sys/nfs41sys_openclose.c
  220. index 4d61e42..88c027d 100644
  221. --- a/sys/nfs41sys_openclose.c
  222. +++ b/sys/nfs41sys_openclose.c
  223. @@ -638,23 +638,50 @@ NTSTATUS nfs41_Create(
  224.      // if we are creating a file check if nfsv3attributes were passed in
  225.      if (params->Disposition != FILE_OPEN && params->Disposition != FILE_OVERWRITE) {
  226.          bool is_dir;
  227. +        bool is_exe = false;
  228. +        /* use_nfsv3attrsea_mode - Prefer mode from NfsV3Attributes ? */
  229.          bool use_nfsv3attrsea_mode;
  230.  
  231.          is_dir = (params->CreateOptions & FILE_DIRECTORY_FILE)?true:false;
  232.  
  233. +        if (!is_dir) {
  234. +            PUNICODE_STRING fn = entry->filename;
  235. +            size_t wlen = fn->Length / sizeof(wchar_t);
  236. +            /*
  237. +             * |fn| must be at least 4 |wchar_t| long to match eiter
  238. +             * ".exe", ".dll", ".com" or ".sys"
  239. +             */
  240. +            if (wlen > 4) {
  241. +                wchar_t *fn4pos = fn->Buffer + wlen-4;
  242. +                if ((_wcsnicmp(fn4pos, L".exe", 4) == 0) ||
  243. +                    (_wcsnicmp(fn4pos, L".dll", 4) == 0) ||
  244. +                    (_wcsnicmp(fn4pos, L".com", 4) == 0) ||
  245. +                    (_wcsnicmp(fn4pos, L".sys", 4) == 0)) {
  246. +                    is_exe = true;
  247. +
  248. +                    DbgP("nfs41_Create: "
  249. +                        "FileName '%wZ' is a *.(exe|dll|com|sys)\n",
  250. +                        fn);
  251. +                }
  252. +            }
  253. +        }
  254. +
  255.          /* Get default mode */
  256.          if (is_dir) {
  257.              entry->u.Open.mode = pVNetRootContext->dir_createmode.mode;
  258. +            use_nfsv3attrsea_mode = pVNetRootContext->dir_createmode.use_nfsv3attrsea_mode;
  259.          }
  260.          else {
  261. -            entry->u.Open.mode = pVNetRootContext->file_createmode.mode;
  262. +            if (is_exe) {
  263. +                entry->u.Open.mode = pVNetRootContext->exefile_createmode.mode;
  264. +                use_nfsv3attrsea_mode = pVNetRootContext->exefile_createmode.use_nfsv3attrsea_mode;
  265. +            }
  266. +            else {
  267. +                entry->u.Open.mode = pVNetRootContext->file_createmode.mode;
  268. +                use_nfsv3attrsea_mode = pVNetRootContext->file_createmode.use_nfsv3attrsea_mode;
  269. +            }
  270.          }
  271.  
  272. -        /* Prefer mode from NfsV3Attributes ? */
  273. -        use_nfsv3attrsea_mode = (is_dir?
  274. -            pVNetRootContext->dir_createmode.use_nfsv3attrsea_mode:
  275. -            pVNetRootContext->file_createmode.use_nfsv3attrsea_mode);
  276. -
  277.          /* Use mode from NfsV3Attributes */
  278.          if (use_nfsv3attrsea_mode &&
  279.              ea && AnsiStrEq(&NfsV3Attributes,

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