pastebin - collaborative debugging tool
rovema.kpaste.net RSS


msnfs42client: Test for Cygwin/SFU uid/gid in nfs3_attrs
Posted by Anonymous on Mon 9th Oct 2023 08:17
raw | new post
view followups (newest first): msnfs42client: Add infrastructure so Cygwin |stat()| can return local uid/gid by Anonymous
modification of post by Anonymous (view diff)

  1. diff --git a/daemon/open.c b/daemon/open.c
  2. index c7bd412..aee931c 100644
  3. --- a/daemon/open.c
  4. +++ b/daemon/open.c
  5. @@ -295,6 +295,12 @@ static int parse_open(unsigned char *buffer, uint32_t length, nfs41_upcall *upca
  6.      if (status) goto out;
  7.      status = safe_read(&buffer, &length, &args->mode, sizeof(DWORD));
  8.      if (status) goto out;
  9. +#if 1
  10. +    status = safe_read(&buffer, &length, &args->owner_cygwin_uid, sizeof(DWORD));
  11. +    if (status) goto out;
  12. +    status = safe_read(&buffer, &length, &args->owner_group_cygwin_gid, sizeof(DWORD));
  13. +    if (status) goto out;
  14. +#endif
  15.      status = safe_read(&buffer, &length, &args->srv_open, sizeof(HANDLE));
  16.      if (status) goto out;
  17.      status = parse_abs_path(&buffer, &length, &args->symlink);
  18. @@ -305,9 +311,16 @@ static int parse_open(unsigned char *buffer, uint32_t length, nfs41_upcall *upca
  19.      dprintf(1, "parsing NFS41_OPEN: filename='%s' access mask=%d "
  20.          "access mode=%d\n\tfile attrs=0x%x create attrs=0x%x "
  21.          "(kernel) disposition=%d\n\topen_owner_id=%d mode=%o "
  22. +#if 1
  23. +        "owner_cygwin_uid=%lu owner_group_cygwin_gid=%lu "
  24. +#endif
  25.          "srv_open=%p symlink=%s ea=%p\n", args->path, args->access_mask,
  26.          args->access_mode, args->file_attrs, args->create_opts,
  27. -        args->disposition, args->open_owner_id, args->mode, args->srv_open,
  28. +        args->disposition, args->open_owner_id, args->mode,
  29. +#if 1
  30. +        (unsigned long)args->owner_cygwin_uid, (unsigned long)args->owner_group_cygwin_gid,
  31. +#endif
  32. +        args->srv_open,
  33.          args->symlink.path, args->ea);
  34.      print_disposition(2, args->disposition);
  35.      print_access_mask(2, args->access_mask);
  36. @@ -644,6 +657,31 @@ static int handle_open(nfs41_upcall *upcall)
  37.          nfs_to_standard_info(&info, &args->std_info);
  38.          args->mode = info.mode;
  39.          args->changeattr = info.change;
  40. +
  41. +#if 1
  42. +        bitmap4 og_attr_request = { 0 };
  43. +        nfs41_file_info og_info = { 0 };
  44. +        char owner[NFS4_OPAQUE_LIMIT], group[NFS4_OPAQUE_LIMIT];
  45. +        nfsacl41 acl = { 0 };
  46. +
  47. +        /* gisburn: need to cache owner/group information */
  48. +        og_attr_request.count = 2;
  49. +        og_attr_request.arr[1] = FATTR4_WORD1_OWNER | FATTR4_WORD1_OWNER_GROUP;
  50. +        og_info.owner = owner;
  51. +        og_info.owner_group = group;
  52. +        status = nfs41_getattr(state->session, &state->file, &og_attr_request, &og_info);
  53. +        if (status) {
  54. +            eprintf("get_stat_data: nfs41_cached_getattr() failed with %d\n",
  55. +            status);
  56. +        }
  57. +
  58. +        args->owner_cygwin_uid = atol(og_info.owner);
  59. +        args->owner_group_cygwin_gid = atol(og_info.owner_group);
  60. +
  61. +       dprintf(1, "/usr/bin/stat: owner=%lu/'%s', owner_group=%lu/'%s'\n",
  62. +            (unsigned long)args->owner_cygwin_uid, og_info.owner,
  63. +            (unsigned long)args->owner_group_cygwin_gid, og_info.owner_group);
  64. +#endif
  65.      } else {
  66.          nfs41_file_info createattrs = { 0 };
  67.          uint32_t create = 0, createhowmode = 0, lookup_status = status;
  68. @@ -753,6 +791,12 @@ static int marshall_open(unsigned char *buffer, uint32_t *length, nfs41_upcall *
  69.      if (status) goto out;
  70.      status = safe_write(&buffer, length, &args->mode, sizeof(args->mode));
  71.      if (status) goto out;
  72. +#if 1
  73. +    status = safe_write(&buffer, length, &args->owner_cygwin_uid, sizeof(args->owner_cygwin_uid));
  74. +    if (status) goto out;
  75. +    status = safe_write(&buffer, length, &args->owner_group_cygwin_gid, sizeof(args->owner_group_cygwin_gid));
  76. +    if (status) goto out;
  77. +#endif
  78.      status = safe_write(&buffer, length, &args->changeattr, sizeof(args->changeattr));
  79.      if (status) goto out;
  80.      status = safe_write(&buffer, length, &args->deleg_type, sizeof(args->deleg_type));
  81. diff --git a/daemon/upcall.h b/daemon/upcall.h
  82. index d224a6d..99149be 100644
  83. --- a/daemon/upcall.h
  84. +++ b/daemon/upcall.h
  85. @@ -50,6 +50,8 @@ typedef struct __open_upcall_args {
  86.      ULONG create_opts;
  87.      LONG open_owner_id;
  88.      DWORD mode;
  89. +    DWORD owner_cygwin_uid;         /* owner mapped into local uid */
  90. +    DWORD owner_group_cygwin_gid;   /* owner group mapped into local gid */
  91.      ULONGLONG changeattr;
  92.      HANDLE srv_open;
  93.      DWORD deleg_type;
  94. diff --git a/sys/nfs41_driver.c b/sys/nfs41_driver.c
  95. index 6a8061d..7deb9ec 100644
  96. --- a/sys/nfs41_driver.c
  97. +++ b/sys/nfs41_driver.c
  98. @@ -200,6 +200,8 @@ typedef struct _updowncall_entry {
  99.              ULONG cattrs;
  100.              LONG open_owner_id;
  101.              DWORD mode;
  102. +           DWORD owner_cygwin_uid;
  103. +           DWORD owner_group_cygwin_gid;
  104.              HANDLE srv_open;
  105.              DWORD deleg_type;
  106.              BOOLEAN symlink_embedded;
  107. @@ -385,6 +387,8 @@ typedef struct _NFS41_FCB {
  108.      BOOLEAN                 Renamed;
  109.      BOOLEAN                 DeletePending;
  110.      DWORD                   mode;
  111. +    DWORD                   owner_cygwin_uid;       /* owner mapped into local uid */
  112. +    DWORD                   owner_group_cygwin_gid; /* owner group mapped into local gid */
  113.      ULONGLONG               changeattr;    
  114.  } NFS41_FCB, *PNFS41_FCB;
  115.  #define NFS41GetFcbExtension(pFcb)      \
  116. @@ -667,7 +671,11 @@ NTSTATUS marshal_nfs41_open(
  117.      else tmp += *len;
  118.  
  119.      header_len = *len + length_as_utf8(entry->filename) +
  120. -        7 * sizeof(ULONG) + 2 * sizeof(HANDLE) +
  121. +        7 * sizeof(ULONG) +
  122. +#if 1
  123. +        2 * sizeof(DWORD) +
  124. +#endif
  125. +        2 * sizeof(HANDLE) +
  126.          length_as_utf8(&entry->u.Open.symlink);
  127.      if (header_len > buf_len) {
  128.          status = STATUS_INSUFFICIENT_RESOURCES;
  129. @@ -692,6 +700,12 @@ NTSTATUS marshal_nfs41_open(
  130.      tmp += sizeof(entry->u.Open.open_owner_id);
  131.      RtlCopyMemory(tmp, &entry->u.Open.mode, sizeof(DWORD));
  132.      tmp += sizeof(DWORD);
  133. +#if 1
  134. +    RtlCopyMemory(tmp, &entry->u.Open.owner_cygwin_uid, sizeof(DWORD));
  135. +    tmp += sizeof(DWORD);
  136. +    RtlCopyMemory(tmp, &entry->u.Open.owner_group_cygwin_gid, sizeof(DWORD));
  137. +    tmp += sizeof(DWORD);
  138. +#endif
  139.      RtlCopyMemory(tmp, &entry->u.Open.srv_open, sizeof(HANDLE));
  140.      tmp += sizeof(HANDLE);
  141.      status = marshall_unicode_as_utf8(&tmp, &entry->u.Open.symlink);
  142. @@ -718,10 +732,17 @@ NTSTATUS marshal_nfs41_open(
  143.  
  144.  #ifdef DEBUG_MARSHAL_DETAIL
  145.      DbgP("marshal_nfs41_open: name=%wZ mask=0x%x access=0x%x attrs=0x%x "
  146. -         "opts=0x%x dispo=0x%x open_owner_id=0x%x mode=%o srv_open=%p ea=%p\n",
  147. +         "opts=0x%x dispo=0x%x open_owner_id=0x%x mode=%o "
  148. +#if 1
  149. +        "owner_cygwin_uid=%lu owner_group_cygwin_gid=%lu "
  150. +#endif
  151. +        "srv_open=%p ea=%p\n",
  152.           entry->filename, entry->u.Open.access_mask,
  153.           entry->u.Open.access_mode, entry->u.Open.attrs, entry->u.Open.copts,
  154.           entry->u.Open.disp, entry->u.Open.open_owner_id, entry->u.Open.mode,
  155. +#if 1
  156. +        entry->u.Open.owner_cygwin_uid,entry->u.Open.owner_group_cygwin_gid,
  157. +#endif
  158.           entry->u.Open.srv_open, entry->u.Open.EaBuffer);
  159.  #endif
  160.  out:
  161. @@ -1647,6 +1668,12 @@ NTSTATUS unmarshal_nfs41_open(
  162.      *buf += sizeof(HANDLE);
  163.      RtlCopyMemory(&cur->u.Open.mode, *buf, sizeof(DWORD));
  164.      *buf += sizeof(DWORD);
  165. +#if 1
  166. +    RtlCopyMemory(&cur->u.Open.owner_cygwin_uid, *buf, sizeof(DWORD));
  167. +    *buf += sizeof(DWORD);
  168. +    RtlCopyMemory(&cur->u.Open.owner_group_cygwin_gid, *buf, sizeof(DWORD));
  169. +    *buf += sizeof(DWORD);
  170. +#endif
  171.      RtlCopyMemory(&cur->ChangeTime, *buf, sizeof(ULONGLONG));
  172.      *buf += sizeof(ULONGLONG);
  173.      RtlCopyMemory(&cur->u.Open.deleg_type, *buf, sizeof(DWORD));
  174. @@ -1673,8 +1700,15 @@ NTSTATUS unmarshal_nfs41_open(
  175.  #endif
  176.      }
  177.  #ifdef DEBUG_MARSHAL_DETAIL
  178. -    DbgP("unmarshal_nfs41_open: open_state 0x%x mode %o changeattr %llu "
  179. +    DbgP("unmarshal_nfs41_open: open_state 0x%x mode %o "
  180. +#if 1
  181. +        "owner_cygwin_uid %u owner_group_cygwin_gid %u "
  182. +#endif
  183. +        "changeattr %llu "
  184.          "deleg_type %d\n", cur->open_state, cur->u.Open.mode,
  185. +#if 1
  186. +        cur->u.Open.owner_cygwin_uid, cur->u.Open.owner_group_cygwin_gid,
  187. +#endif
  188.          cur->ChangeTime, cur->u.Open.deleg_type);
  189.  #endif
  190.  out:
  191. @@ -3754,6 +3788,10 @@ retry_on_link:
  192.          RtlCopyMemory(&nfs41_fcb->StandardInfo, &entry->u.Open.sinfo,
  193.              sizeof(entry->u.Open.sinfo));
  194.          nfs41_fcb->mode = entry->u.Open.mode;
  195. +#if 1
  196. +       nfs41_fcb->owner_cygwin_uid = entry->u.Open.owner_cygwin_uid;
  197. +       nfs41_fcb->owner_group_cygwin_gid = entry->u.Open.owner_group_cygwin_gid;
  198. +#endif
  199.          nfs41_fcb->changeattr = entry->ChangeTime;
  200.          if (((params->CreateOptions & FILE_DELETE_ON_CLOSE) &&
  201.                  !pVNetRootContext->read_only) || oldDeletePending)
  202. @@ -4502,6 +4540,8 @@ void create_nfs3_attrs(
  203.      else
  204.          attrs->type = NF3REG;
  205.      attrs->mode = nfs41_fcb->mode;
  206. +    attrs->uid = nfs41_fcb->owner_cygwin_uid;
  207. +    attrs->gid = nfs41_fcb->owner_group_cygwin_gid;
  208.      attrs->nlink = nfs41_fcb->StandardInfo.NumberOfLinks;
  209.      attrs->size.QuadPart = attrs->used.QuadPart =
  210.          nfs41_fcb->StandardInfo.EndOfFile.QuadPart;

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