pastebin - collaborative debugging tool
rovema.kpaste.net RSS


msnfs41client: Patchs for impersonation token refcounting, perf, 32bit fixes+misc, 2024-05-07
Posted by Anonymous on Tue 7th May 2024 16:49
raw | new post

  1. From 09f9cb7d2bb52fe20950c41497776a0f220ceac9 Mon Sep 17 00:00:00 2001
  2. From: Roland Mainz <roland.mainz@nrubsig.org>
  3. Date: Mon, 6 May 2024 10:34:42 +0200
  4. Subject: [PATCH 1/8] daemon:
  5.  |get_token_user_name()|+|get_token_primarygroup_name()| are too noisy
  6.  
  7. |get_token_user_name()| and |get_token_primarygroup_name()| are too
  8. noisy in debug level >= 2.
  9.  
  10. Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
  11. ---
  12. daemon/util.c | 4 ----
  13.  1 file changed, 4 deletions(-)
  14.  
  15. diff --git a/daemon/util.c b/daemon/util.c
  16. index b0f7608..9915b06 100644
  17. --- a/daemon/util.c
  18. +++ b/daemon/util.c
  19. @@ -757,7 +757,6 @@ bool get_token_user_name(HANDLE tok, char *out_buffer)
  20.  
  21.  #ifdef NFS41_DRIVER_SID_CACHE
  22.      if (sidcache_getcached_bysid(&user_sidcache, pusid, out_buffer)) {
  23. -        DPRINTF(2, ("get_token_user_name: cached '%s'\n", out_buffer));
  24.          return true;
  25.      }
  26.  #endif /* NFS41_DRIVER_SID_CACHE */
  27. @@ -771,7 +770,6 @@ bool get_token_user_name(HANDLE tok, char *out_buffer)
  28.      }
  29.  
  30.  #ifdef NFS41_DRIVER_SID_CACHE
  31. -    DPRINTF(2, ("get_token_user_name: NOT cached '%s'\n", out_buffer));
  32.      sidcache_add(&user_sidcache, out_buffer, pusid);
  33.  #endif /* NFS41_DRIVER_SID_CACHE */
  34.  
  35. @@ -803,7 +801,6 @@ bool get_token_primarygroup_name(HANDLE tok, char *out_buffer)
  36.  
  37.  #ifdef NFS41_DRIVER_SID_CACHE
  38.      if (sidcache_getcached_bysid(&group_sidcache, pgsid, out_buffer)) {
  39. -        DPRINTF(2, ("get_token_primarygroup_name: cached '%s'\n", out_buffer));
  40.          return true;
  41.      }
  42.  #endif /* NFS41_DRIVER_SID_CACHE */
  43. @@ -817,7 +814,6 @@ bool get_token_primarygroup_name(HANDLE tok, char *out_buffer)
  44.      }
  45.  
  46.  #ifdef NFS41_DRIVER_SID_CACHE
  47. -    DPRINTF(2, ("get_token_primarygroup_name: NOT cached '%s'\n", out_buffer));
  48.      sidcache_add(&group_sidcache, out_buffer, pgsid);
  49.  #endif /* NFS41_DRIVER_SID_CACHE */
  50.  
  51. --
  52. 2.43.0
  53.  
  54. From c170ced8da4e1436d5cb6a50cbb3cdae3de177b5 Mon Sep 17 00:00:00 2001
  55. From: Roland Mainz <roland.mainz@nrubsig.org>
  56. Date: Mon, 6 May 2024 10:37:13 +0200
  57. Subject: [PATCH 2/8] daemon: Implement |nfs41_idmap_name_to_uid()|
  58.  
  59. Implement |nfs41_idmap_name_to_uid()| as alternative to
  60. |nfs41_idmap_name_to_ids()| because we now support non-default
  61. primary groups in tokens (for newgrp(1)/|setgid()| support),
  62. so always getting the default gid for an user (with
  63. |nfs41_idmap_name_to_ids()|) is useless.
  64.  
  65. Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
  66. ---
  67. daemon/idmap.c        | 30 ++++++++++++++++++++++++++++++
  68.  daemon/idmap.h        |  4 ++++
  69.  daemon/nfs41_daemon.c | 18 ++++++++++--------
  70.  daemon/open.c         |  6 ++----
  71.  daemon/sid.c          | 11 +++++------
  72.  5 files changed, 51 insertions(+), 18 deletions(-)
  73.  
  74. diff --git a/daemon/idmap.c b/daemon/idmap.c
  75. index 77e2d3c..fa4ca95 100644
  76. --- a/daemon/idmap.c
  77. +++ b/daemon/idmap.c
  78. @@ -1004,6 +1004,36 @@ static int username_cmp(const struct list_entry *list, const void *value)
  79.      return strcmp(entry->username, username);
  80.  }
  81.  
  82. +
  83. +int nfs41_idmap_name_to_uid(
  84. +    struct idmap_context *context,
  85. +    const char *username,
  86. +    uid_t *uid_out)
  87. +{
  88. +    struct idmap_lookup lookup = { ATTR_USER_NAME,
  89. +        CLASS_USER, TYPE_STR, username_cmp };
  90. +    struct idmap_user user;
  91. +    int status;
  92. +
  93. +    DPRINTF(IDLVL, ("--> nfs41_idmap_name_to_uid('%s')\n", username));
  94. +
  95. +    lookup.value = username;
  96. +
  97. +    /* look up the user entry */
  98. +    status = idmap_lookup_user(context, &lookup, &user);
  99. +    if (status) {
  100. +        DPRINTF(IDLVL, ("<-- nfs41_idmap_name_to_uid('%s') "
  101. +            "failed with %d\n", username, status));
  102. +        goto out;
  103. +    }
  104. +
  105. +    *uid_out = user.uid;
  106. +    DPRINTF(IDLVL, ("<-- nfs41_idmap_name_to_uid('%s') "
  107. +        "returning uid=%u\n", username, user.uid));
  108. +out:
  109. +    return status;
  110. +}
  111. +
  112.  int nfs41_idmap_name_to_ids(
  113.      struct idmap_context *context,
  114.      const char *username,
  115. diff --git a/daemon/idmap.h b/daemon/idmap.h
  116. index 8ab7133..3660ad5 100644
  117. --- a/daemon/idmap.h
  118. +++ b/daemon/idmap.h
  119. @@ -36,6 +36,10 @@ void nfs41_idmap_free(
  120.      nfs41_idmapper *context);
  121.  
  122.  
  123. +int nfs41_idmap_name_to_uid(
  124. +    struct idmap_context *context,
  125. +    const char *username,
  126. +    uid_t *uid_out);
  127.  int nfs41_idmap_name_to_ids(
  128.      nfs41_idmapper *context,
  129.      const char *username,
  130. diff --git a/daemon/nfs41_daemon.c b/daemon/nfs41_daemon.c
  131. index bca8f0a..207fbdc 100644
  132. --- a/daemon/nfs41_daemon.c
  133. +++ b/daemon/nfs41_daemon.c
  134. @@ -73,33 +73,30 @@ static int map_current_user_to_ids(nfs41_idmapper *idmapper, uid_t *puid, gid_t
  135.      char pgroupname[GNLEN+1];
  136.      int status = NO_ERROR;
  137.      HANDLE impersonation_tok = GetCurrentThreadEffectiveToken();
  138. -    gid_t dummygid;
  139.  
  140.      if (!get_token_user_name(impersonation_tok, username)) {
  141.          status = GetLastError();
  142.          eprintf("map_current_user_to_ids: "
  143.              "get_token_user_name() failed with %d\n", status);
  144. -        goto out;
  145. +        goto out_map_default_ids;
  146.      }
  147.  
  148.      if (!get_token_primarygroup_name(impersonation_tok, pgroupname)) {
  149.          status = GetLastError();
  150.          eprintf("map_current_user_to_ids: "
  151.              "get_token_primarygroup_name() failed with %d\n", status);
  152. -        goto out;
  153. +        goto out_map_default_ids;
  154.      }
  155.  
  156. -    if (nfs41_idmap_name_to_ids(idmapper, username, puid, &dummygid)) {
  157. +    if (nfs41_idmap_name_to_uid(idmapper, username, puid)) {
  158.          /* instead of failing for auth_sys, fall back to 'nobody' uid/gid */
  159.          DPRINTF(1,
  160.              ("map_current_user_to_ids: "
  161. -                "nfs41_idmap_name_to_ids(username='%s') failed, "
  162. +                "nfs41_idmap_name_to_uid(username='%s') failed, "
  163.                  "returning nobody/nogroup defaults\n",
  164.                  username));
  165. -        *puid = nfs41_dg.default_uid;
  166. -        *pgid = nfs41_dg.default_gid;
  167.          status = NO_ERROR;
  168. -        goto out;
  169. +        goto out_map_default_ids;
  170.      }
  171.  
  172.      if (nfs41_idmap_group_to_gid(
  173. @@ -121,6 +118,11 @@ out:
  174.              username, (int)*puid,
  175.              pgroupname, (int)*pgid));
  176.      return status;
  177. +
  178. +out_map_default_ids:
  179. +    *puid = nfs41_dg.default_uid;
  180. +    *pgid = nfs41_dg.default_gid;
  181. +    goto out;
  182.  }
  183.  
  184.  static unsigned int nfsd_worker_thread_main(void *args)
  185. diff --git a/daemon/open.c b/daemon/open.c
  186. index fd30229..57dd53f 100644
  187. --- a/daemon/open.c
  188. +++ b/daemon/open.c
  189. @@ -776,7 +776,6 @@ static int handle_open(void *daemon_context, nfs41_upcall *upcall)
  190.  #ifdef NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES
  191.          char owner[NFS4_OPAQUE_LIMIT], owner_group[NFS4_OPAQUE_LIMIT];
  192.          uid_t map_uid = -1;
  193. -        gid_t gid_dummy = -1;
  194.          gid_t map_gid = -1;
  195.          char *at_ch; /* pointer to '@' */
  196.  
  197. @@ -835,11 +834,10 @@ static int handle_open(void *daemon_context, nfs41_upcall *upcall)
  198.          if (at_ch = strchr(owner, '@'))
  199.              *at_ch = '\0';
  200.  
  201. -        if (nfs41_idmap_name_to_ids(
  202. +        if (nfs41_idmap_name_to_uid(
  203.              nfs41dg->idmapper,
  204.              owner,
  205. -            &map_uid,
  206. -            &gid_dummy) == 0) {
  207. +            &map_uid) == 0) {
  208.               args->owner_local_uid = map_uid;
  209.          }
  210.          else {
  211. diff --git a/daemon/sid.c b/daemon/sid.c
  212. index ea75bba..20db96b 100644
  213. --- a/daemon/sid.c
  214. +++ b/daemon/sid.c
  215. @@ -476,15 +476,14 @@ int map_nfs4servername_2_sid(nfs41_daemon_globals *nfs41dg, int query, DWORD *si
  216.              uid_t map_uid = -1;
  217.              gid_t gid_dummy = -1;
  218.  
  219. -            if (nfs41_idmap_name_to_ids(
  220. -                nfs41dg->idmapper,
  221. -                nfsname,
  222. -                &map_uid,
  223. -                &gid_dummy) == 0) {
  224. +            if (nfs41_idmap_name_to_uid(nfs41dg->idmapper,
  225. +                nfsname, &map_uid) == 0) {
  226.                  user_uid = map_uid;
  227.              }
  228.              else {
  229. -                DPRINTF(1, ("map_nfs4servername_2_sid(query=%x,name='%s'): nfs41_idmap_name_to_ids() failed\n",
  230. +                DPRINTF(1,
  231. +                    ("map_nfs4servername_2_sid(query=%x,name='%s'): "
  232. +                    "nfs41_idmap_name_to_uid() failed\n",
  233.                      query, nfsname));
  234.                  /* fixme: try harder here, "1234" should to to |atol()| */
  235.              }
  236. --
  237. 2.43.0
  238.  
  239. From 26f1232eaaa669b04d505a7cb78b8dfbefe75211 Mon Sep 17 00:00:00 2001
  240. From: Dan Shelton <dan.f.shelton@gmail.com>
  241. Date: Mon, 6 May 2024 12:20:13 +0200
  242. Subject: [PATCH 3/8] mount: swprintf() counts in WCHAR_T, not char
  243.  
  244. swprintf() counts in WCHAR_T, not char, so pass the correct buffer
  245. size.
  246.  
  247. Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
  248. ---
  249. mount/mount.c | 8 +++++---
  250.  1 file changed, 5 insertions(+), 3 deletions(-)
  251.  
  252. diff --git a/mount/mount.c b/mount/mount.c
  253. index d480d05..3c07cd5 100644
  254. --- a/mount/mount.c
  255. +++ b/mount/mount.c
  256. @@ -347,7 +347,9 @@ static DWORD ParseRemoteName(
  257.      PFILE_FULL_EA_INFORMATION port_option_val;
  258.      wchar_t remotename[NFS41_SYS_MAX_PATH_LEN];
  259.      wchar_t *premotename = remotename;
  260. -    wchar_t srvname[NFS41_SYS_MAX_PATH_LEN+1+32]; /* sizeof(hostname+'@'+integer) */
  261. +/* sizeof(hostname+'@'+integer) */
  262. +#define SRVNAME_LEN (NFS41_SYS_MAX_PATH_LEN+1+32)
  263. +    wchar_t srvname[SRVNAME_LEN];
  264.      url_parser_context *uctx = NULL;
  265.  
  266.      result = StringCchCopy(premotename, NFS41_SYS_MAX_PATH_LEN, pRemoteName);
  267. @@ -534,12 +536,12 @@ static DWORD ParseRemoteName(
  268.          * 2. ALWAYS add port number to hostname, so UNC paths use it
  269.          *   too
  270.          */
  271. -        (void)swprintf(srvname, sizeof(srvname),
  272. +        (void)swprintf(srvname, SRVNAME_LEN,
  273.             TEXT("%s.ipv6-literal.net@%d"), premotename, port);
  274.      }
  275.      else {
  276.          /* ALWAYS add port number to hostname, so UNC paths use it too */
  277. -        (void)swprintf(srvname, sizeof(srvname), TEXT("%s@%d"),
  278. +        (void)swprintf(srvname, SRVNAME_LEN, TEXT("%s@%d"),
  279.             premotename, port);
  280.      }
  281.  
  282. --
  283. 2.43.0
  284.  
  285. From eaab8f311dfc2b5dd5ff636fcdbffe57436443da Mon Sep 17 00:00:00 2001
  286. From: Dan Shelton <dan.f.shelton@gmail.com>
  287. Date: Mon, 6 May 2024 12:22:00 +0200
  288. Subject: [PATCH 4/8] mount: Fix minimum buffer size in PrintMountLine()
  289.  
  290. Fix minimum buffer size in PrintMountLine()
  291.  
  292. Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
  293. ---
  294. mount/enum.c | 2 +-
  295.  1 file changed, 1 insertion(+), 1 deletion(-)
  296.  
  297. diff --git a/mount/enum.c b/mount/enum.c
  298. index 7f43cda..8ee59d1 100644
  299. --- a/mount/enum.c
  300. +++ b/mount/enum.c
  301. @@ -38,7 +38,7 @@ void PrintMountLine(
  302.      LPCTSTR remote)
  303.  {
  304.      TCHAR *cygwin_unc_buffer = alloca((_tcslen(remote)+32)*sizeof(TCHAR));
  305. -    char *cygwin_nfsurl_buffer = alloca(((_tcslen(remote)+32)*3));
  306. +    char *cygwin_nfsurl_buffer = alloca(((_tcslen(remote)+32)*3)+8);
  307.      TCHAR *b;
  308.      LPCTSTR s;
  309.      TCHAR sc;
  310. --
  311. 2.43.0
  312.  
  313. From a7c09e8da14bdc0a467b32367c64b79d34a18824 Mon Sep 17 00:00:00 2001
  314. From: Roland Mainz <roland.mainz@nrubsig.org>
  315. Date: Mon, 6 May 2024 13:20:18 +0200
  316. Subject: [PATCH 5/8] sys: Rename s/DEBUG_MISC/DEBUG_FSCTL/ and enable
  317.  DEBUG_FSCTL
  318.  
  319. Rename |DEBUG_MISC| to |DEBUG_FSCTL| and enable |DEBUG_FSCTL| by default.
  320.  
  321. Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
  322. ---
  323. sys/nfs41_driver.c | 12 ++++++------
  324.  1 file changed, 6 insertions(+), 6 deletions(-)
  325.  
  326. diff --git a/sys/nfs41_driver.c b/sys/nfs41_driver.c
  327. index cb563de..412e2d7 100644
  328. --- a/sys/nfs41_driver.c
  329. +++ b/sys/nfs41_driver.c
  330. @@ -69,7 +69,7 @@
  331.  //#define DEBUG_EA_QUERY
  332.  //#define DEBUG_EA_SET
  333.  //#define DEBUG_LOCK
  334. -//#define DEBUG_MISC
  335. +#define DEBUG_FSCTL
  336.  #define DEBUG_TIME_BASED_COHERENCY
  337.  //#define DEBUG_MOUNT
  338.  //#define DEBUG_VOLUME_QUERY
  339. @@ -6886,7 +6886,7 @@ NTSTATUS nfs41_FsCtl(
  340.      IN OUT PRX_CONTEXT RxContext)
  341.  {
  342.      NTSTATUS status = STATUS_INVALID_DEVICE_REQUEST;
  343. -#ifdef DEBUG_MISC
  344. +#ifdef DEBUG_FSCTL
  345.      DbgEn();
  346.      print_debug_header(RxContext);
  347.  #endif
  348. @@ -6898,13 +6898,13 @@ NTSTATUS nfs41_FsCtl(
  349.      case FSCTL_GET_REPARSE_POINT:
  350.          status = nfs41_GetReparsePoint(RxContext);
  351.          break;
  352. -#ifdef DEBUG_MISC
  353. +#ifdef DEBUG_FSCTL
  354.      default:
  355. -        DbgP("FsControlCode: %d\n",
  356. -             RxContext->LowIoContext.ParamsFor.FsCtl.FsControlCode);
  357. +        DbgP("nfs41_FsCtl: FsControlCode: %d\n",
  358. +             (int)RxContext->LowIoContext.ParamsFor.FsCtl.FsControlCode);
  359.  #endif
  360.      }
  361. -#ifdef DEBUG_MISC
  362. +#ifdef DEBUG_FSCTL
  363.      DbgEx();
  364.  #endif
  365.      return status;
  366. --
  367. 2.43.0
  368.  
  369. From 6e79afa46b29ded3cd718f797d87ff60ba24f608 Mon Sep 17 00:00:00 2001
  370. From: Roland Mainz <roland.mainz@nrubsig.org>
  371. Date: Mon, 6 May 2024 14:42:03 +0200
  372. Subject: [PATCH 6/8] sys: Provide better debugging messages for |FSCTL_*|
  373.  
  374. Provide better debugging messages for |FSCTL_*|
  375.  
  376. Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
  377. ---
  378. sys/nfs41_debug.c  | 223 +++++++++++++++++++++++++++++++++++++++++++++
  379.  sys/nfs41_debug.h  |   1 +
  380.  sys/nfs41_driver.c |  25 +++--
  381.  3 files changed, 243 insertions(+), 6 deletions(-)
  382.  
  383. diff --git a/sys/nfs41_debug.c b/sys/nfs41_debug.c
  384. index 6fbdc22..2a3a7dc 100644
  385. --- a/sys/nfs41_debug.c
  386. +++ b/sys/nfs41_debug.c
  387. @@ -738,3 +738,226 @@ dprintk(
  388.      return rv;
  389.  }
  390.  
  391. +const char *fsctl2string(ULONG fscontrolcode)
  392. +{
  393. +#define CASE_SYM2STR_RET(x) case (x): return #x ; break;
  394. +    switch(fscontrolcode) {
  395. +        CASE_SYM2STR_RET(FSCTL_ADD_OVERLAY)
  396. +        CASE_SYM2STR_RET(FSCTL_ADVANCE_FILE_ID)
  397. +        CASE_SYM2STR_RET(FSCTL_ALLOW_EXTENDED_DASD_IO)
  398. +        CASE_SYM2STR_RET(FSCTL_CLEAN_VOLUME_METADATA)
  399. +        CASE_SYM2STR_RET(FSCTL_CORRUPTION_HANDLING)
  400. +        CASE_SYM2STR_RET(FSCTL_CREATE_OR_GET_OBJECT_ID)
  401. +        CASE_SYM2STR_RET(FSCTL_CREATE_USN_JOURNAL)
  402. +        CASE_SYM2STR_RET(FSCTL_CSC_INTERNAL)
  403. +        CASE_SYM2STR_RET(FSCTL_CSV_CONTROL)
  404. +        CASE_SYM2STR_RET(FSCTL_CSV_GET_VOLUME_NAME_FOR_VOLUME_MOUNT_POINT)
  405. +        CASE_SYM2STR_RET(FSCTL_CSV_GET_VOLUME_PATH_NAME)
  406. +        CASE_SYM2STR_RET(FSCTL_CSV_GET_VOLUME_PATH_NAMES_FOR_VOLUME_NAME)
  407. +        CASE_SYM2STR_RET(FSCTL_CSV_H_BREAKING_SYNC_TUNNEL_REQUEST)
  408. +        CASE_SYM2STR_RET(FSCTL_CSV_INTERNAL)
  409. +        CASE_SYM2STR_RET(FSCTL_CSV_MGMT_LOCK)
  410. +        CASE_SYM2STR_RET(FSCTL_CSV_QUERY_DOWN_LEVEL_FILE_SYSTEM_CHARACTERISTICS)
  411. +        CASE_SYM2STR_RET(FSCTL_CSV_QUERY_VETO_FILE_DIRECT_IO)
  412. +        CASE_SYM2STR_RET(FSCTL_CSV_SYNC_TUNNEL_REQUEST)
  413. +        CASE_SYM2STR_RET(FSCTL_CSV_TUNNEL_REQUEST)
  414. +        CASE_SYM2STR_RET(FSCTL_DELETE_CORRUPTED_REFS_CONTAINER)
  415. +        CASE_SYM2STR_RET(FSCTL_DELETE_EXTERNAL_BACKING)
  416. +        CASE_SYM2STR_RET(FSCTL_DELETE_OBJECT_ID)
  417. +        CASE_SYM2STR_RET(FSCTL_DELETE_REPARSE_POINT)
  418. +        CASE_SYM2STR_RET(FSCTL_DELETE_USN_JOURNAL)
  419. +        CASE_SYM2STR_RET(FSCTL_DFSR_SET_GHOST_HANDLE_STATE)
  420. +        CASE_SYM2STR_RET(FSCTL_DISABLE_LOCAL_BUFFERING)
  421. +        CASE_SYM2STR_RET(FSCTL_DISMOUNT_VOLUME)
  422. +        CASE_SYM2STR_RET(FSCTL_DUPLICATE_EXTENTS_TO_FILE)
  423. +        CASE_SYM2STR_RET(FSCTL_DUPLICATE_EXTENTS_TO_FILE_EX)
  424. +        CASE_SYM2STR_RET(FSCTL_ENABLE_PER_IO_FLAGS)
  425. +        CASE_SYM2STR_RET(FSCTL_ENABLE_UPGRADE)
  426. +        CASE_SYM2STR_RET(FSCTL_ENCRYPTION_FSCTL_IO)
  427. +        CASE_SYM2STR_RET(FSCTL_ENCRYPTION_KEY_CONTROL)
  428. +        CASE_SYM2STR_RET(FSCTL_ENUM_EXTERNAL_BACKING)
  429. +        CASE_SYM2STR_RET(FSCTL_ENUM_OVERLAY)
  430. +        CASE_SYM2STR_RET(FSCTL_ENUM_USN_DATA)
  431. +        CASE_SYM2STR_RET(FSCTL_EXTEND_VOLUME)
  432. +        CASE_SYM2STR_RET(FSCTL_FILESYSTEM_GET_STATISTICS)
  433. +        CASE_SYM2STR_RET(FSCTL_FILESYSTEM_GET_STATISTICS_EX)
  434. +        CASE_SYM2STR_RET(FSCTL_FILE_LEVEL_TRIM)
  435. +        CASE_SYM2STR_RET(FSCTL_FILE_PREFETCH)
  436. +        CASE_SYM2STR_RET(FSCTL_FILE_TYPE_NOTIFICATION)
  437. +        CASE_SYM2STR_RET(FSCTL_FIND_FILES_BY_SID)
  438. +        CASE_SYM2STR_RET(FSCTL_GET_BOOT_AREA_INFO)
  439. +        CASE_SYM2STR_RET(FSCTL_GET_COMPRESSION)
  440. +        CASE_SYM2STR_RET(FSCTL_GET_EXTERNAL_BACKING)
  441. +        CASE_SYM2STR_RET(FSCTL_GET_INTEGRITY_INFORMATION)
  442. +        CASE_SYM2STR_RET(FSCTL_GET_NTFS_FILE_RECORD)
  443. +        CASE_SYM2STR_RET(FSCTL_GET_NTFS_VOLUME_DATA)
  444. +        CASE_SYM2STR_RET(FSCTL_GET_OBJECT_ID)
  445. +        CASE_SYM2STR_RET(FSCTL_GET_REFS_VOLUME_DATA)
  446. +        CASE_SYM2STR_RET(FSCTL_GET_REPAIR)
  447. +        CASE_SYM2STR_RET(FSCTL_GET_REPARSE_POINT)
  448. +        CASE_SYM2STR_RET(FSCTL_GET_RETRIEVAL_POINTERS)
  449. +        CASE_SYM2STR_RET(FSCTL_GET_RETRIEVAL_POINTERS_AND_REFCOUNT)
  450. +        CASE_SYM2STR_RET(FSCTL_GET_RETRIEVAL_POINTER_BASE)
  451. +        CASE_SYM2STR_RET(FSCTL_GET_RETRIEVAL_POINTER_COUNT)
  452. +        CASE_SYM2STR_RET(FSCTL_GET_VOLUME_BITMAP)
  453. +        CASE_SYM2STR_RET(FSCTL_GET_WOF_VERSION)
  454. +        CASE_SYM2STR_RET(FSCTL_GHOST_FILE_EXTENTS)
  455. +        CASE_SYM2STR_RET(FSCTL_HCS_ASYNC_TUNNEL_REQUEST)
  456. +        CASE_SYM2STR_RET(FSCTL_HCS_SYNC_NO_WRITE_TUNNEL_REQUEST)
  457. +        CASE_SYM2STR_RET(FSCTL_HCS_SYNC_TUNNEL_REQUEST)
  458. +        CASE_SYM2STR_RET(FSCTL_INITIATE_FILE_METADATA_OPTIMIZATION)
  459. +        CASE_SYM2STR_RET(FSCTL_INITIATE_REPAIR)
  460. +        CASE_SYM2STR_RET(FSCTL_INTEGRITY_FLAG_CHECKSUM_ENFORCEMENT_OFF)
  461. +        CASE_SYM2STR_RET(FSCTL_INVALIDATE_VOLUMES)
  462. +        CASE_SYM2STR_RET(FSCTL_IS_CSV_FILE)
  463. +        CASE_SYM2STR_RET(FSCTL_IS_FILE_ON_CSV_VOLUME)
  464. +        CASE_SYM2STR_RET(FSCTL_IS_PATHNAME_VALID)
  465. +        CASE_SYM2STR_RET(FSCTL_IS_VOLUME_DIRTY)
  466. +        CASE_SYM2STR_RET(FSCTL_IS_VOLUME_MOUNTED)
  467. +        CASE_SYM2STR_RET(FSCTL_IS_VOLUME_OWNED_BYCSVFS)
  468. +        CASE_SYM2STR_RET(FSCTL_LOCK_VOLUME)
  469. +        CASE_SYM2STR_RET(FSCTL_LOOKUP_STREAM_FROM_CLUSTER)
  470. +        CASE_SYM2STR_RET(FSCTL_MAKE_MEDIA_COMPATIBLE)
  471. +        CASE_SYM2STR_RET(FSCTL_MARK_AS_SYSTEM_HIVE)
  472. +        CASE_SYM2STR_RET(FSCTL_MARK_HANDLE)
  473. +        CASE_SYM2STR_RET(FSCTL_MARK_VOLUME_DIRTY)
  474. +        CASE_SYM2STR_RET(FSCTL_MOVE_FILE)
  475. +        CASE_SYM2STR_RET(FSCTL_NOTIFY_DATA_CHANGE)
  476. +        CASE_SYM2STR_RET(FSCTL_NOTIFY_STORAGE_SPACE_ALLOCATION)
  477. +        CASE_SYM2STR_RET(FSCTL_OFFLOAD_READ)
  478. +        CASE_SYM2STR_RET(FSCTL_OFFLOAD_WRITE)
  479. +        CASE_SYM2STR_RET(FSCTL_OPBATCH_ACK_CLOSE_PENDING)
  480. +        CASE_SYM2STR_RET(FSCTL_OPLOCK_BREAK_ACKNOWLEDGE)
  481. +        CASE_SYM2STR_RET(FSCTL_OPLOCK_BREAK_ACK_NO_2)
  482. +        CASE_SYM2STR_RET(FSCTL_OPLOCK_BREAK_NOTIFY)
  483. +        CASE_SYM2STR_RET(FSCTL_QUERY_ALLOCATED_RANGES)
  484. +#ifdef FSCTL_QUERY_ASYNC_DUPLICATE_EXTENTS_STATUS
  485. +        CASE_SYM2STR_RET(FSCTL_QUERY_ASYNC_DUPLICATE_EXTENTS_STATUS)
  486. +#endif
  487. +        CASE_SYM2STR_RET(FSCTL_QUERY_BAD_RANGES)
  488. +        CASE_SYM2STR_RET(FSCTL_QUERY_DEPENDENT_VOLUME)
  489. +        CASE_SYM2STR_RET(FSCTL_QUERY_DIRECT_ACCESS_EXTENTS)
  490. +        CASE_SYM2STR_RET(FSCTL_QUERY_DIRECT_IMAGE_ORIGINAL_BASE)
  491. +        CASE_SYM2STR_RET(FSCTL_QUERY_EXTENT_READ_CACHE_INFO)
  492. +        CASE_SYM2STR_RET(FSCTL_QUERY_FAT_BPB)
  493. +        CASE_SYM2STR_RET(FSCTL_QUERY_FILE_LAYOUT)
  494. +        CASE_SYM2STR_RET(FSCTL_QUERY_FILE_METADATA_OPTIMIZATION)
  495. +        CASE_SYM2STR_RET(FSCTL_QUERY_FILE_REGIONS)
  496. +        CASE_SYM2STR_RET(FSCTL_QUERY_FILE_SYSTEM_RECOGNITION)
  497. +        CASE_SYM2STR_RET(FSCTL_QUERY_GHOSTED_FILE_EXTENTS)
  498. +        CASE_SYM2STR_RET(FSCTL_QUERY_ON_DISK_VOLUME_INFO)
  499. +        CASE_SYM2STR_RET(FSCTL_QUERY_PAGEFILE_ENCRYPTION)
  500. +        CASE_SYM2STR_RET(FSCTL_QUERY_PERSISTENT_VOLUME_STATE)
  501. +        CASE_SYM2STR_RET(FSCTL_QUERY_REFS_SMR_VOLUME_INFO)
  502. +        CASE_SYM2STR_RET(FSCTL_QUERY_REFS_VOLUME_COUNTER_INFO)
  503. +        CASE_SYM2STR_RET(FSCTL_QUERY_REGION_INFO)
  504. +        CASE_SYM2STR_RET(FSCTL_QUERY_REGION_INFO_INPUT_VERSION)
  505. +        CASE_SYM2STR_RET(FSCTL_QUERY_REGION_INFO_OUTPUT_VERSION)
  506. +        CASE_SYM2STR_RET(FSCTL_QUERY_RETRIEVAL_POINTERS)
  507. +        CASE_SYM2STR_RET(FSCTL_QUERY_SHARED_VIRTUAL_DISK_SUPPORT)
  508. +        CASE_SYM2STR_RET(FSCTL_QUERY_SPARING_INFO)
  509. +        CASE_SYM2STR_RET(FSCTL_QUERY_STORAGE_CLASSES)
  510. +        CASE_SYM2STR_RET(FSCTL_QUERY_STORAGE_CLASSES_OUTPUT_VERSION)
  511. +        CASE_SYM2STR_RET(FSCTL_QUERY_USN_JOURNAL)
  512. +        CASE_SYM2STR_RET(FSCTL_QUERY_VOLUME_CONTAINER_STATE)
  513. +        CASE_SYM2STR_RET(FSCTL_QUERY_VOLUME_NUMA_INFO)
  514. +        CASE_SYM2STR_RET(FSCTL_READ_FILE_USN_DATA)
  515. +        CASE_SYM2STR_RET(FSCTL_READ_FROM_PLEX)
  516. +        CASE_SYM2STR_RET(FSCTL_READ_RAW_ENCRYPTED)
  517. +        CASE_SYM2STR_RET(FSCTL_READ_UNPRIVILEGED_USN_JOURNAL)
  518. +        CASE_SYM2STR_RET(FSCTL_READ_USN_JOURNAL)
  519. +        CASE_SYM2STR_RET(FSCTL_REARRANGE_FILE)
  520. +        CASE_SYM2STR_RET(FSCTL_RECALL_FILE)
  521. +        CASE_SYM2STR_RET(FSCTL_REFS_DEALLOCATE_RANGES)
  522. +#ifdef FSCTL_REFS_STREAM_SNAPSHOT_MANAGEMENT
  523. +        CASE_SYM2STR_RET(FSCTL_REFS_STREAM_SNAPSHOT_MANAGEMENT)
  524. +#endif
  525. +        CASE_SYM2STR_RET(FSCTL_REMOVE_OVERLAY)
  526. +        CASE_SYM2STR_RET(FSCTL_REPAIR_COPIES)
  527. +        CASE_SYM2STR_RET(FSCTL_REQUEST_BATCH_OPLOCK)
  528. +        CASE_SYM2STR_RET(FSCTL_REQUEST_FILTER_OPLOCK)
  529. +        CASE_SYM2STR_RET(FSCTL_REQUEST_OPLOCK)
  530. +        CASE_SYM2STR_RET(FSCTL_REQUEST_OPLOCK_LEVEL_1)
  531. +        CASE_SYM2STR_RET(FSCTL_REQUEST_OPLOCK_LEVEL_2)
  532. +        CASE_SYM2STR_RET(FSCTL_RESET_VOLUME_ALLOCATION_HINTS)
  533. +        CASE_SYM2STR_RET(FSCTL_RKF_INTERNAL)
  534. +        CASE_SYM2STR_RET(FSCTL_SCRUB_DATA)
  535. +        CASE_SYM2STR_RET(FSCTL_SCRUB_UNDISCOVERABLE_ID)
  536. +        CASE_SYM2STR_RET(FSCTL_SD_GLOBAL_CHANGE)
  537. +        CASE_SYM2STR_RET(FSCTL_SECURITY_ID_CHECK)
  538. +        CASE_SYM2STR_RET(FSCTL_SET_COMPRESSION)
  539. +        CASE_SYM2STR_RET(FSCTL_SET_DAX_ALLOC_ALIGNMENT_HINT)
  540. +        CASE_SYM2STR_RET(FSCTL_SET_DEFECT_MANAGEMENT)
  541. +        CASE_SYM2STR_RET(FSCTL_SET_ENCRYPTION)
  542. +        CASE_SYM2STR_RET(FSCTL_SET_EXTERNAL_BACKING)
  543. +        CASE_SYM2STR_RET(FSCTL_SET_INTEGRITY_INFORMATION)
  544. +        CASE_SYM2STR_RET(FSCTL_SET_INTEGRITY_INFORMATION_EX)
  545. +        CASE_SYM2STR_RET(FSCTL_SET_LAYER_ROOT)
  546. +        CASE_SYM2STR_RET(FSCTL_SET_OBJECT_ID)
  547. +        CASE_SYM2STR_RET(FSCTL_SET_OBJECT_ID_EXTENDED)
  548. +        CASE_SYM2STR_RET(FSCTL_SET_PERSISTENT_VOLUME_STATE)
  549. +        CASE_SYM2STR_RET(FSCTL_SET_PURGE_FAILURE_MODE)
  550. +        CASE_SYM2STR_RET(FSCTL_SET_REFS_FILE_STRICTLY_SEQUENTIAL)
  551. +        CASE_SYM2STR_RET(FSCTL_SET_REFS_SMR_VOLUME_GC_PARAMETERS)
  552. +        CASE_SYM2STR_RET(FSCTL_SET_REPAIR)
  553. +        CASE_SYM2STR_RET(FSCTL_SET_REPARSE_POINT)
  554. +        CASE_SYM2STR_RET(FSCTL_SET_REPARSE_POINT_EX)
  555. +        CASE_SYM2STR_RET(FSCTL_SET_SHORT_NAME_BEHAVIOR)
  556. +        CASE_SYM2STR_RET(FSCTL_SET_SPARSE)
  557. +        CASE_SYM2STR_RET(FSCTL_SET_VOLUME_COMPRESSION_STATE)
  558. +        CASE_SYM2STR_RET(FSCTL_SET_ZERO_DATA)
  559. +        CASE_SYM2STR_RET(FSCTL_SET_ZERO_ON_DEALLOCATION)
  560. +        CASE_SYM2STR_RET(FSCTL_SHRINK_VOLUME)
  561. +        CASE_SYM2STR_RET(FSCTL_SHUFFLE_FILE)
  562. +        CASE_SYM2STR_RET(FSCTL_SIS_COPYFILE)
  563. +        CASE_SYM2STR_RET(FSCTL_SIS_LINK_FILES)
  564. +#ifdef FSCTL_SMB_SHARE_FLUSH_AND_PURGE
  565. +        CASE_SYM2STR_RET(FSCTL_SMB_SHARE_FLUSH_AND_PURGE)
  566. +#endif
  567. +        CASE_SYM2STR_RET(FSCTL_SPARSE_OVERALLOCATE)
  568. +        CASE_SYM2STR_RET(FSCTL_SSDI_STORAGE_REQUEST)
  569. +        CASE_SYM2STR_RET(FSCTL_START_VIRTUALIZATION_INSTANCE_EX)
  570. +        CASE_SYM2STR_RET(FSCTL_STORAGE_QOS_CONTROL)
  571. +        CASE_SYM2STR_RET(FSCTL_STREAMS_ASSOCIATE_ID)
  572. +        CASE_SYM2STR_RET(FSCTL_STREAMS_QUERY_ID)
  573. +        CASE_SYM2STR_RET(FSCTL_STREAMS_QUERY_PARAMETERS)
  574. +        CASE_SYM2STR_RET(FSCTL_SUSPEND_OVERLAY)
  575. +        CASE_SYM2STR_RET(FSCTL_SVHDX_ASYNC_TUNNEL_REQUEST)
  576. +        CASE_SYM2STR_RET(FSCTL_SVHDX_SET_INITIATOR_INFORMATION)
  577. +        CASE_SYM2STR_RET(FSCTL_SVHDX_SYNC_TUNNEL_REQUEST)
  578. +        CASE_SYM2STR_RET(FSCTL_TXFS_CREATE_MINIVERSION)
  579. +        CASE_SYM2STR_RET(FSCTL_TXFS_CREATE_SECONDARY_RM)
  580. +        CASE_SYM2STR_RET(FSCTL_TXFS_GET_METADATA_INFO)
  581. +        CASE_SYM2STR_RET(FSCTL_TXFS_GET_TRANSACTED_VERSION)
  582. +        CASE_SYM2STR_RET(FSCTL_TXFS_LIST_TRANSACTIONS)
  583. +        CASE_SYM2STR_RET(FSCTL_TXFS_LIST_TRANSACTION_LOCKED_FILES)
  584. +        CASE_SYM2STR_RET(FSCTL_TXFS_MODIFY_RM)
  585. +        CASE_SYM2STR_RET(FSCTL_TXFS_QUERY_RM_INFORMATION)
  586. +        CASE_SYM2STR_RET(FSCTL_TXFS_READ_BACKUP_INFORMATION)
  587. +        CASE_SYM2STR_RET(FSCTL_TXFS_READ_BACKUP_INFORMATION2)
  588. +        CASE_SYM2STR_RET(FSCTL_TXFS_ROLLFORWARD_REDO)
  589. +        CASE_SYM2STR_RET(FSCTL_TXFS_ROLLFORWARD_UNDO)
  590. +        CASE_SYM2STR_RET(FSCTL_TXFS_SAVEPOINT_INFORMATION)
  591. +        CASE_SYM2STR_RET(FSCTL_TXFS_SHUTDOWN_RM)
  592. +        CASE_SYM2STR_RET(FSCTL_TXFS_START_RM)
  593. +        CASE_SYM2STR_RET(FSCTL_TXFS_TRANSACTION_ACTIVE)
  594. +        CASE_SYM2STR_RET(FSCTL_TXFS_WRITE_BACKUP_INFORMATION)
  595. +        CASE_SYM2STR_RET(FSCTL_TXFS_WRITE_BACKUP_INFORMATION2)
  596. +        CASE_SYM2STR_RET(FSCTL_UNLOCK_VOLUME)
  597. +        CASE_SYM2STR_RET(FSCTL_UNMAP_SPACE)
  598. +        CASE_SYM2STR_RET(FSCTL_UPDATE_OVERLAY)
  599. +        CASE_SYM2STR_RET(FSCTL_USN_TRACK_MODIFIED_RANGES)
  600. +        CASE_SYM2STR_RET(FSCTL_VIRTUAL_STORAGE_PASSTHROUGH)
  601. +        CASE_SYM2STR_RET(FSCTL_VIRTUAL_STORAGE_QUERY_PROPERTY)
  602. +        CASE_SYM2STR_RET(FSCTL_VIRTUAL_STORAGE_SET_BEHAVIOR)
  603. +        CASE_SYM2STR_RET(FSCTL_WAIT_FOR_REPAIR)
  604. +        CASE_SYM2STR_RET(FSCTL_WRITE_RAW_ENCRYPTED)
  605. +        CASE_SYM2STR_RET(FSCTL_WRITE_USN_CLOSE_RECORD)
  606. +        CASE_SYM2STR_RET(FSCTL_WRITE_USN_REASON)
  607. +        default:
  608. +            return NULL;
  609. +            break;
  610. +    }
  611. +
  612. +    /* not reached */
  613. +}
  614. diff --git a/sys/nfs41_debug.h b/sys/nfs41_debug.h
  615. index 6d649a6..a8f9f1c 100644
  616. --- a/sys/nfs41_debug.h
  617. +++ b/sys/nfs41_debug.h
  618. @@ -55,6 +55,7 @@ void print_open_error(int on, int status);
  619.  void print_wait_status(int on, const char *str, NTSTATUS status,
  620.                         const char *opcode, PVOID entry, LONGLONG xid);
  621.  void print_acl_args(SECURITY_INFORMATION info);
  622. +const char *fsctl2string(ULONG fsctl);
  623.  
  624.  #define PTR2PTRDIFF_T(p) (((char *)(p))-((char *)0))
  625.  #define PsGetCurrentProcessShortDebugId() ((int)PTR2PTRDIFF_T(PsGetCurrentProcessId()))
  626. diff --git a/sys/nfs41_driver.c b/sys/nfs41_driver.c
  627. index 412e2d7..9c0d2ee 100644
  628. --- a/sys/nfs41_driver.c
  629. +++ b/sys/nfs41_driver.c
  630. @@ -6890,20 +6890,33 @@ NTSTATUS nfs41_FsCtl(
  631.      DbgEn();
  632.      print_debug_header(RxContext);
  633.  #endif
  634. -    switch (RxContext->LowIoContext.ParamsFor.FsCtl.FsControlCode) {
  635. +    const ULONG fscontrolcode =
  636. +        RxContext->LowIoContext.ParamsFor.FsCtl.FsControlCode;
  637. +
  638. +    switch (fscontrolcode) {
  639.      case FSCTL_SET_REPARSE_POINT:
  640.          status = nfs41_SetReparsePoint(RxContext);
  641.          break;
  642. -
  643.      case FSCTL_GET_REPARSE_POINT:
  644.          status = nfs41_GetReparsePoint(RxContext);
  645.          break;
  646. -#ifdef DEBUG_FSCTL
  647.      default:
  648. -        DbgP("nfs41_FsCtl: FsControlCode: %d\n",
  649. -             (int)RxContext->LowIoContext.ParamsFor.FsCtl.FsControlCode);
  650. -#endif
  651. +        break;
  652. +    }
  653. +
  654. +#ifdef DEBUG_FSCTL
  655. +    const char *fsctl_str = fsctl2string(fscontrolcode);
  656. +
  657. +    if (fsctl_str) {
  658. +        DbgP("nfs41_FsCtl: FsControlCode='%s', status=0x%x\n",
  659. +            fsctl_str, (int)status);
  660.      }
  661. +    else {
  662. +        DbgP("nfs41_FsCtl: FsControlCode=0x%lx, status=0x%x\n",
  663. +            (unsigned long)fscontrolcode, (int)status);
  664. +    }
  665. +#endif /* DEBUG_FSCTL */
  666. +
  667.  #ifdef DEBUG_FSCTL
  668.      DbgEx();
  669.  #endif
  670. --
  671. 2.43.0
  672.  
  673. From 14805720d3247ccf7e6b45238334a3fab57bb04d Mon Sep 17 00:00:00 2001
  674. From: Roland Mainz <roland.mainz@nrubsig.org>
  675. Date: Mon, 6 May 2024 14:44:24 +0200
  676. Subject: [PATCH 7/8] daemon: 32bit build cannot find
  677.  |__RtlGetNtVersionNumbers()|
  678.  
  679. Trying to build nfsd.exe as 32bit executable fails because
  680. |__RtlGetNtVersionNumbers()| cannot be found by the linker.
  681. For now we disable this for 32bit builds.
  682.  
  683. Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
  684. ---
  685. daemon/util.c | 13 +++++++++++++
  686.  1 file changed, 13 insertions(+)
  687.  
  688. diff --git a/daemon/util.c b/daemon/util.c
  689. index 9915b06..9ea2b77 100644
  690. --- a/daemon/util.c
  691. +++ b/daemon/util.c
  692. @@ -708,6 +708,16 @@ bool getwinntversionnnumbers(
  693.      DWORD *MinorVersionPtr,
  694.      DWORD *BuildNumberPtr)
  695.  {
  696. +#ifdef _WIN64
  697. +    /*
  698. +     * Windows private API, so we add prototype here ourselves
  699. +     *
  700. +     * Note that this currently only works with 64bit Windows,
  701. +     * 32bit Windows generates this build error:
  702. +     * ---- snip ----
  703. +     * util.obj : error LNK2019: unresolved external symbol __RtlGetNtVersionNumbers referenced in function _getwinntversionnnumbers
  704. +     * ---- snip ----
  705. +     */
  706.      NTSTATUS RtlGetNtVersionNumbers(LPDWORD, LPDWORD, LPDWORD);
  707.  
  708.      /*
  709. @@ -718,6 +728,9 @@ bool getwinntversionnnumbers(
  710.      *BuildNumberPtr &= 0xffff;
  711.  
  712.      return true;
  713. +#else
  714. +    return false;
  715. +#endif /* _WIN64 */
  716.  }
  717.  
  718.  /*
  719. --
  720. 2.43.0
  721.  
  722. From 9cc07d0281370442da7da7f7c919ae164d352f9e Mon Sep 17 00:00:00 2001
  723. From: Roland Mainz <roland.mainz@nrubsig.org>
  724. Date: Tue, 7 May 2024 17:40:24 +0200
  725. Subject: [PATCH 8/8] sys: Keep client token refcounted for the lifetime of the
  726.  |updowncall_entry|
  727.  
  728. Keep the token of the calling thread refcounted for the lifetime of the
  729. |updowncall_entry|, otherwise ||SeImpersonateClientEx()| can crash
  730. when the calling thread exits before we can start the impersonation.
  731.  
  732. Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
  733. ---
  734. sys/nfs41_driver.c | 87 ++++++++++++++++++++++++++++++++--------------
  735.  1 file changed, 60 insertions(+), 27 deletions(-)
  736.  
  737. diff --git a/sys/nfs41_driver.c b/sys/nfs41_driver.c
  738. index 9c0d2ee..94c3070 100644
  739. --- a/sys/nfs41_driver.c
  740. +++ b/sys/nfs41_driver.c
  741. @@ -177,6 +177,12 @@ typedef struct _updowncall_entry {
  742.      BOOLEAN async_op;
  743.      SECURITY_CLIENT_CONTEXT sec_ctx;
  744.      PSECURITY_CLIENT_CONTEXT psec_ctx;
  745. +    /*
  746. +     * Refcount client token during lifetime of this |updowncall_entry|
  747. +     * to avoid crashes during |SeImpersonateClientEx()| if the
  748. +     * calling thread disappears.
  749. +     */
  750. +    PVOID psec_ctx_clienttoken;
  751.      HANDLE open_state;
  752.      HANDLE session;
  753.      PUNICODE_STRING filename;
  754. @@ -1562,14 +1568,39 @@ NTSTATUS nfs41_UpcallCreate(
  755.          }
  756.  
  757.          SeReleaseSubjectContext(&sec_ctx);
  758. -    } else
  759. +    } else {
  760.          entry->psec_ctx = clnt_sec_ctx;
  761. +    }
  762. +
  763. +    if (entry && entry->psec_ctx) {
  764. +        /*
  765. +         * Refcount client token (as |entry->psec_ctx_clienttoken|)
  766. +         * during lifetime of this |updowncall_entry| to avoid
  767. +         * crashes during |SeImpersonateClientEx()| if the
  768. +         * calling client thread exits.
  769. +         */
  770. +        entry->psec_ctx_clienttoken = entry->psec_ctx->ClientToken;
  771. +        ObReferenceObject(entry->psec_ctx_clienttoken);
  772. +    }
  773.  
  774.      *entry_out = entry;
  775.  out:
  776.      return status;
  777.  }
  778.  
  779. +void nfs41_UpcallDestroy(nfs41_updowncall_entry *entry)
  780. +{
  781. +    if (!entry)
  782. +        return;
  783. +
  784. +    if (entry->psec_ctx_clienttoken) {
  785. +        ObDereferenceObject(entry->psec_ctx_clienttoken);
  786. +    }
  787. +
  788. +    RxFreePool(entry);
  789. +}
  790. +
  791. +
  792.  NTSTATUS nfs41_UpcallWaitForReply(
  793.      IN nfs41_updowncall_entry *entry,
  794.      IN DWORD secs)
  795. @@ -2023,7 +2054,7 @@ NTSTATUS nfs41_downcall(
  796.          }
  797.          ExReleaseFastMutex(&cur->lock);
  798.          nfs41_RemoveEntry(downcallLock, cur);
  799. -        RxFreePool(cur);
  800. +        nfs41_UpcallDestroy(cur);
  801.          status = STATUS_UNSUCCESSFUL;
  802.          goto out_free;
  803.      }
  804. @@ -2086,7 +2117,7 @@ NTSTATUS nfs41_downcall(
  805.          }
  806.          nfs41_RemoveEntry(downcallLock, cur);
  807.          RxLowIoCompletion(cur->u.ReadWrite.rxcontext);
  808. -        RxFreePool(cur);
  809. +        nfs41_UpcallDestroy(cur);
  810.      } else
  811.          KeSetEvent(&cur->cond, 0, FALSE);    
  812.  
  813. @@ -2114,7 +2145,7 @@ NTSTATUS nfs41_shutdown_daemon(
  814.      entry->psec_ctx = NULL;
  815.      if (status) goto out;
  816.  
  817. -    RxFreePool(entry);
  818. +    nfs41_UpcallDestroy(entry);
  819.  out:
  820.      DbgEx();
  821.      return status;
  822. @@ -2378,7 +2409,7 @@ NTSTATUS nfs41_unmount(
  823.          SeDeleteClientSecurity(entry->psec_ctx);
  824.      }
  825.      entry->psec_ctx = NULL;
  826. -    RxFreePool(entry);
  827. +    nfs41_UpcallDestroy(entry);
  828.  out:
  829.  #ifdef ENABLE_TIMINGS
  830.      print_op_stat("lookup", &lookup, 1);
  831. @@ -2770,7 +2801,7 @@ NTSTATUS nfs41_mount(
  832.      status = map_mount_errors(entry->status);
  833.      if (status == STATUS_SUCCESS)
  834.          *version = entry->version;
  835. -    RxFreePool(entry);
  836. +    nfs41_UpcallDestroy(entry);
  837.  out:
  838.  #ifdef DEBUG_MOUNT
  839.      DbgEx();
  840. @@ -3933,7 +3964,8 @@ retry_on_link:
  841.              FALSE, FALSE, NULL);
  842.          if (entry->u.Open.EaMdl == NULL) {
  843.              status = STATUS_INTERNAL_ERROR;
  844. -            RxFreePool(entry);
  845. +            nfs41_UpcallDestroy(entry);
  846. +            entry = NULL;
  847.              goto out;
  848.          }
  849.  #pragma warning( push )
  850. @@ -4187,7 +4219,7 @@ retry_on_link:
  851.  
  852.  out_free:
  853.      if (entry)
  854. -        RxFreePool(entry);
  855. +        nfs41_UpcallDestroy(entry);
  856.  out:
  857.  #ifdef ENABLE_TIMINGS
  858.      t2 = KeQueryPerformanceCounter(NULL);
  859. @@ -4359,7 +4391,7 @@ NTSTATUS nfs41_CloseSrvOpen(
  860.  
  861.      /* map windows ERRORs to NTSTATUS */
  862.      status = map_close_errors(entry->status);
  863. -    RxFreePool(entry);
  864. +    nfs41_UpcallDestroy(entry);
  865.  out:
  866.  #ifdef ENABLE_TIMINGS
  867.      t2 = KeQueryPerformanceCounter(NULL);
  868. @@ -4503,7 +4535,7 @@ NTSTATUS nfs41_QueryDirectory(
  869.          RxContext->Info.LengthRemaining, FALSE, FALSE, NULL);
  870.      if (entry->u.QueryFile.mdl == NULL) {
  871.          status = STATUS_INTERNAL_ERROR;
  872. -        RxFreePool(entry);
  873. +        nfs41_UpcallDestroy(entry);
  874.          goto out;
  875.      }
  876.  #pragma warning( push )
  877. @@ -4543,7 +4575,7 @@ NTSTATUS nfs41_QueryDirectory(
  878.          status = map_querydir_errors(entry->status);
  879.      }
  880.      IoFreeMdl(entry->u.QueryFile.mdl);
  881. -    RxFreePool(entry);
  882. +    nfs41_UpcallDestroy(entry);
  883.  out:
  884.  #ifdef ENABLE_TIMINGS
  885.      t2 = KeQueryPerformanceCounter(NULL);
  886. @@ -4751,7 +4783,7 @@ NTSTATUS nfs41_QueryVolumeInformation(
  887.      } else {
  888.          status = map_volume_errors(entry->status);
  889.      }
  890. -    RxFreePool(entry);
  891. +    nfs41_UpcallDestroy(entry);
  892.  out:
  893.  #ifdef ENABLE_TIMINGS
  894.      t2 = KeQueryPerformanceCounter(NULL);
  895. @@ -4963,7 +4995,8 @@ NTSTATUS nfs41_SetEaInformation(
  896.                  "(eainfo=%p, buflen=%lu, &(error_offset=%d))\n",
  897.                  (int)status, (void *)eainfo, buflen,
  898.                  (int)error_offset);
  899. -            RxFreePool(entry);
  900. +            nfs41_UpcallDestroy(entry);
  901. +            entry = NULL;
  902.              goto out;
  903.          }
  904.      }
  905. @@ -4987,7 +5020,7 @@ NTSTATUS nfs41_SetEaInformation(
  906.          nfs41_fcb->changeattr = entry->ChangeTime;
  907.          nfs41_fcb->mode = entry->u.SetEa.mode;
  908.      }
  909. -    RxFreePool(entry);
  910. +    nfs41_UpcallDestroy(entry);
  911.  out:
  912.  #ifdef ENABLE_TIMINGS
  913.      t2 = KeQueryPerformanceCounter(NULL);
  914. @@ -5090,7 +5123,7 @@ static NTSTATUS QueryCygwinSymlink(
  915.          RxContext->InformationToReturn = HeaderLen +
  916.              entry->u.Symlink.target->Length;
  917.      }
  918. -    RxFreePool(entry);
  919. +    nfs41_UpcallDestroy(entry);
  920.  out:
  921.      return status;
  922.  }
  923. @@ -5253,7 +5286,7 @@ NTSTATUS nfs41_QueryEaInformation(
  924.      } else {
  925.          status = map_setea_error(entry->status);
  926.      }
  927. -    RxFreePool(entry);
  928. +    nfs41_UpcallDestroy(entry);
  929.  out:
  930.  #ifdef ENABLE_TIMINGS
  931.      t2 = KeQueryPerformanceCounter(NULL);
  932. @@ -5408,7 +5441,7 @@ NTSTATUS nfs41_QuerySecurityInformation(
  933.      } else {
  934.          status = map_query_acl_error(entry->status);
  935.      }
  936. -    RxFreePool(entry);
  937. +    nfs41_UpcallDestroy(entry);
  938.  out:
  939.  #ifdef ENABLE_TIMINGS
  940.      t2 = KeQueryPerformanceCounter(NULL);
  941. @@ -5522,7 +5555,7 @@ NTSTATUS nfs41_SetSecurityInformation(
  942.              nfs41_update_fcb_list(RxContext->pFcb, entry->ChangeTime);
  943.          nfs41_fcb->changeattr = entry->ChangeTime;
  944.      }
  945. -    RxFreePool(entry);
  946. +    nfs41_UpcallDestroy(entry);
  947.  out:
  948.  #ifdef ENABLE_TIMINGS
  949.      t2 = KeQueryPerformanceCounter(NULL);
  950. @@ -5699,7 +5732,7 @@ NTSTATUS nfs41_QueryFileInformation(
  951.          status = map_queryfile_error(entry->status);
  952.          print_error("status(0x%lx) = map_queryfile_error(entry->status(0x%lx));\n", (long)status, (long)entry->status);
  953.      }
  954. -    RxFreePool(entry);
  955. +    nfs41_UpcallDestroy(entry);
  956.  out:
  957.  #ifdef ENABLE_TIMINGS
  958.      t2 = KeQueryPerformanceCounter(NULL);
  959. @@ -5949,7 +5982,7 @@ NTSTATUS nfs41_SetFileInformation(
  960.              nfs41_update_fcb_list(RxContext->pFcb, entry->ChangeTime);
  961.          nfs41_fcb->changeattr = entry->ChangeTime;
  962.      }
  963. -    RxFreePool(entry);
  964. +    nfs41_UpcallDestroy(entry);
  965.  out:
  966.  #ifdef ENABLE_TIMINGS
  967.      t2 = KeQueryPerformanceCounter(NULL);
  968. @@ -6219,7 +6252,7 @@ NTSTATUS nfs41_Read(
  969.          RxContext->CurrentIrp->IoStatus.Status = status;
  970.          RxContext->IoStatusBlock.Information = 0;
  971.      }
  972. -    RxFreePool(entry);
  973. +    nfs41_UpcallDestroy(entry);
  974.  out:
  975.  #ifdef ENABLE_TIMINGS
  976.      t2 = KeQueryPerformanceCounter(NULL);
  977. @@ -6347,7 +6380,7 @@ NTSTATUS nfs41_Write(
  978.          RxContext->CurrentIrp->IoStatus.Status = status;
  979.          RxContext->IoStatusBlock.Information = 0;
  980.      }
  981. -    RxFreePool(entry);
  982. +    nfs41_UpcallDestroy(entry);
  983.  out:
  984.  #ifdef ENABLE_TIMINGS
  985.      t2 = KeQueryPerformanceCounter(NULL);
  986. @@ -6500,7 +6533,7 @@ retry_upcall:
  987.      status = map_lock_errors(entry->status);
  988.      RxContext->CurrentIrp->IoStatus.Status = status;
  989.  
  990. -    RxFreePool(entry);
  991. +    nfs41_UpcallDestroy(entry);
  992.  out:
  993.  #ifdef ENABLE_TIMINGS
  994.      t2 = KeQueryPerformanceCounter(NULL);
  995. @@ -6596,7 +6629,7 @@ NTSTATUS nfs41_Unlock(
  996.  
  997.      status = map_lock_errors(entry->status);
  998.      RxContext->CurrentIrp->IoStatus.Status = status;
  999. -    RxFreePool(entry);
  1000. +    nfs41_UpcallDestroy(entry);
  1001.  out:
  1002.  #ifdef ENABLE_TIMINGS
  1003.      t2 = KeQueryPerformanceCounter(NULL);
  1004. @@ -6767,7 +6800,7 @@ NTSTATUS nfs41_SetReparsePoint(
  1005.      if (status) goto out;
  1006.  
  1007.      status = map_symlink_errors(entry->status);
  1008. -    RxFreePool(entry);
  1009. +    nfs41_UpcallDestroy(entry);
  1010.  out:
  1011.  #ifdef DEBUG_SYMLINK
  1012.      DbgEx();
  1013. @@ -6874,7 +6907,7 @@ NTSTATUS nfs41_GetReparsePoint(
  1014.      } else if (status == STATUS_BUFFER_TOO_SMALL) {
  1015.          RxContext->InformationToReturn = HeaderLen + TargetName.Length;
  1016.      }
  1017. -    RxFreePool(entry);
  1018. +    nfs41_UpcallDestroy(entry);
  1019.  out:
  1020.  #ifdef DEBUG_SYMLINK
  1021.      DbgEx();
  1022. @@ -7199,7 +7232,7 @@ VOID fcbopen_main(PVOID ctx)
  1023.              }
  1024.              nfs41_fcb = (PNFS41_FCB)cur->fcb->Context;
  1025.              nfs41_fcb->changeattr = entry->ChangeTime;
  1026. -            RxFreePool(entry);
  1027. +            nfs41_UpcallDestroy(entry);
  1028.  out:
  1029.              if (pEntry->Flink == &openlist.head) {
  1030.  #ifdef DEBUG_TIME_BASED_COHERENCY
  1031. --
  1032. 2.43.0

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