pastebin - collaborative debugging tool
nrubsig.kpaste.net RSS


Prototype fix for "cd: myfile/anotherfile: Not a directory"
Posted by Anonymous on Tue 22nd Apr 2025 19:42
raw | new post

  1. # fix $ cd myfile/anotherfile # it should return "cd: myfile/anotherfile: Not a directory"
  2. diff --git a/daemon/open.c b/daemon/open.c
  3. index 1996e98..8f9fcfe 100644
  4. --- a/daemon/open.c
  5. +++ b/daemon/open.c
  6. @@ -903,7 +903,8 @@ static int handle_open(void *daemon_context, nfs41_upcall *upcall)
  7.              if (args->create_opts & FILE_NON_DIRECTORY_FILE) {
  8.                  DPRINTF(1, ("trying to open directory '%s' as a file\n",
  9.                      state->path.path));
  10. -                status = ERROR_DIRECTORY;
  11. +                /* Note: SMB returns |STATUS_FILE_IS_A_DIRECTORY| */
  12. +                status = ERROR_DIRECTORY_NOT_SUPPORTED;
  13.                  goto out_free_state;
  14.              }
  15.          } else if (info.type == NF4REG) {
  16. @@ -911,7 +912,11 @@ static int handle_open(void *daemon_context, nfs41_upcall *upcall)
  17.              if (args->create_opts & FILE_DIRECTORY_FILE) {
  18.                  DPRINTF(1, ("trying to open file '%s' as a directory\n",
  19.                      state->path.path));
  20. -                status = ERROR_BAD_FILE_TYPE;
  21. +                /*
  22. +                 * Note: SMB returns |STATUS_OBJECT_TYPE_MISMATCH|
  23. +                 * while NTFS returns |STATUS_NOT_A_DIRECTORY|
  24. +                 */
  25. +                status = ERROR_DIRECTORY;
  26.                  goto out_free_state;
  27.              }
  28.          } else if (info.type == NF4LNK) {
  29. diff --git a/daemon/util.c b/daemon/util.c
  30. index bb5bc88..a9ddbd4 100644
  31. --- a/daemon/util.c
  32. +++ b/daemon/util.c
  33. @@ -1,5 +1,6 @@
  34.  /* NFSv4.1 client for Windows
  35. - * Copyright (C) 2012 The Regents of the University of Michigan
  36. + * Copyright (C) 2012 The Regents of the University of Michigan
  37. + * Copyright (C) 2023-2025 Roland Mainz <roland.mainz@nrubsig.org>
  38.   *
  39.   * Olga Kornievskaia <aglo@umich.edu>
  40.   * Casey Bodley <cbodley@umich.edu>
  41. @@ -198,7 +199,7 @@ int nfs_to_windows_error(int status, int default_error)
  42.      case NFS4ERR_MLINK:         return ERROR_TOO_MANY_LINKS;
  43.      case NFS4ERR_NAMETOOLONG:   return ERROR_FILENAME_EXCED_RANGE;
  44.      case NFS4ERR_STALE:         return ERROR_NETNAME_DELETED;
  45. -    case NFS4ERR_NOTEMPTY:      return ERROR_NOT_EMPTY;
  46. +    case NFS4ERR_NOTEMPTY:      return ERROR_DIR_NOT_EMPTY;
  47.      case NFS4ERR_DENIED:        return ERROR_LOCK_FAILED;
  48.      case NFS4ERR_NOTSUPP:       return ERROR_NOT_SUPPORTED;
  49.      case NFS4ERR_TOOSMALL:      return ERROR_BUFFER_OVERFLOW;
  50. @@ -213,9 +214,22 @@ int nfs_to_windows_error(int status, int default_error)
  51.      case NFS4ERR_BADCHAR:
  52.      case NFS4ERR_BADNAME:       return ERROR_INVALID_NAME;
  53.  
  54. -    case NFS4ERR_NOTDIR:
  55. -    case NFS4ERR_ISDIR:
  56. -    case NFS4ERR_SYMLINK:
  57. +    /*
  58. +     * |NFS4ERR_NOTDIR| - The current (or saved) filehandle
  59. +     * designates an object that is not a directory for an operation
  60. +     * in which a directory is required.
  61. +     * |ERROR_DIRECTORY| - The directory name is invalid.
  62. +     */
  63. +    case NFS4ERR_NOTDIR:        return ERROR_DIRECTORY;
  64. +    /*
  65. +     * |NFS4ERR_ISDIR| - The current or saved filehandle designates
  66. +     * a directory when the current operation does not allow a
  67. +     * directory to be accepted as the target of this operation.
  68. +     * |ERROR_DIRECTORY_NOT_SUPPORTED| - An operation is not supported
  69. +     * on a directory.
  70. +     */
  71. +    case NFS4ERR_ISDIR:         return ERROR_DIRECTORY_NOT_SUPPORTED;
  72. +    case NFS4ERR_SYMLINK:       return ERROR_INVALID_PARAMETER;
  73.      case NFS4ERR_WRONG_TYPE:    return ERROR_INVALID_PARAMETER;
  74.  
  75.      case NFS4ERR_EXPIRED:
  76. @@ -241,7 +255,7 @@ int map_symlink_errors(int status)
  77.      case NFS4ERR_BADNAME:       return ERROR_INVALID_REPARSE_DATA;
  78.      case NFS4ERR_WRONG_TYPE:    return ERROR_NOT_A_REPARSE_POINT;
  79.      case NFS4ERR_ACCESS:        return ERROR_ACCESS_DENIED;
  80. -    case NFS4ERR_NOTEMPTY:      return ERROR_NOT_EMPTY;
  81. +    case NFS4ERR_NOTEMPTY:      return ERROR_DIR_NOT_EMPTY;
  82.      default: return nfs_to_windows_error(status, ERROR_BAD_NET_RESP);
  83.      }
  84.  }
  85. diff --git a/sys/nfs41sys_fileinfo.c b/sys/nfs41sys_fileinfo.c
  86. index 4c7dceb..e5bd1a0 100644
  87. --- a/sys/nfs41sys_fileinfo.c
  88. +++ b/sys/nfs41sys_fileinfo.c
  89. @@ -511,7 +511,7 @@ NTSTATUS map_setfile_error(
  90.  {
  91.      switch (error) {
  92.      case NO_ERROR:                      return STATUS_SUCCESS;
  93. -    case ERROR_NOT_EMPTY:               return STATUS_DIRECTORY_NOT_EMPTY;
  94. +    case ERROR_DIR_NOT_EMPTY:           return STATUS_DIRECTORY_NOT_EMPTY;
  95.      case ERROR_FILE_EXISTS:             return STATUS_OBJECT_NAME_COLLISION;
  96.      case ERROR_FILE_NOT_FOUND:          return STATUS_OBJECT_NAME_NOT_FOUND;
  97.      case ERROR_PATH_NOT_FOUND:          return STATUS_OBJECT_PATH_NOT_FOUND;
  98. diff --git a/sys/nfs41sys_openclose.c b/sys/nfs41sys_openclose.c
  99. index d0cc36f..1c11dd6 100644
  100. --- a/sys/nfs41sys_openclose.c
  101. +++ b/sys/nfs41sys_openclose.c
  102. @@ -408,12 +408,15 @@ NTSTATUS map_open_errors(
  103.      case ERROR_SHARING_VIOLATION:       return STATUS_SHARING_VIOLATION;
  104.      case ERROR_REPARSE:                 return STATUS_REPARSE;
  105.      case ERROR_TOO_MANY_LINKS:          return STATUS_TOO_MANY_LINKS;
  106. -    case ERROR_DIRECTORY:               return STATUS_FILE_IS_A_DIRECTORY;
  107. -    case ERROR_BAD_FILE_TYPE:           return STATUS_NOT_A_DIRECTORY;
  108. +    case ERROR_INVALID_PARAMETER:       return STATUS_INVALID_PARAMETER;
  109. +    case ERROR_DIRECTORY:               return STATUS_NOT_A_DIRECTORY;
  110. +    case ERROR_DIRECTORY_NOT_SUPPORTED: return STATUS_FILE_IS_A_DIRECTORY;
  111. +    case ERROR_BAD_FILE_TYPE:           return STATUS_BAD_FILE_TYPE;
  112.      case ERROR_DISK_FULL:               return STATUS_DISK_FULL;
  113.      case ERROR_DISK_QUOTA_EXCEEDED:     return STATUS_DISK_QUOTA_EXCEEDED;
  114.      case ERROR_FILE_TOO_LARGE:          return STATUS_FILE_TOO_LARGE;
  115.      case ERROR_INTERNAL_ERROR:          return STATUS_INTERNAL_ERROR;
  116. +    case ERROR_DIR_NOT_EMPTY:           return STATUS_DIRECTORY_NOT_EMPTY;
  117.      default:
  118.          print_error("[ERROR] nfs41_Create: upcall returned ERROR_0x%lx "
  119.              "returning STATUS_INSUFFICIENT_RESOURCES\n",
  120. @@ -1100,7 +1103,7 @@ NTSTATUS map_close_errors(
  121.      case NO_ERROR:              return STATUS_SUCCESS;
  122.      case ERROR_FILE_NOT_FOUND:  return STATUS_NO_SUCH_FILE;
  123.      case ERROR_NETNAME_DELETED: return STATUS_NETWORK_NAME_DELETED;
  124. -    case ERROR_NOT_EMPTY:       return STATUS_DIRECTORY_NOT_EMPTY;
  125. +    case ERROR_DIR_NOT_EMPTY:   return STATUS_DIRECTORY_NOT_EMPTY;
  126.      case ERROR_FILE_INVALID:    return STATUS_FILE_INVALID;
  127.      case ERROR_DISK_FULL:       return STATUS_DISK_FULL;
  128.      case ERROR_DISK_QUOTA_EXCEEDED: return STATUS_DISK_QUOTA_EXCEEDED;
  129. diff --git a/sys/nfs41sys_symlink.c b/sys/nfs41sys_symlink.c
  130. index ead2e96..fffcde7 100644
  131. --- a/sys/nfs41sys_symlink.c
  132. +++ b/sys/nfs41sys_symlink.c
  133. @@ -148,7 +148,7 @@ NTSTATUS map_symlink_errors(
  134.      case ERROR_INVALID_REPARSE_DATA: return STATUS_IO_REPARSE_DATA_INVALID;
  135.      case ERROR_NOT_A_REPARSE_POINT: return STATUS_NOT_A_REPARSE_POINT;
  136.      case ERROR_ACCESS_DENIED:       return STATUS_ACCESS_DENIED;
  137. -    case ERROR_NOT_EMPTY:           return STATUS_DIRECTORY_NOT_EMPTY;
  138. +    case ERROR_DIR_NOT_EMPTY:       return STATUS_DIRECTORY_NOT_EMPTY;
  139.      case ERROR_OUTOFMEMORY:         return STATUS_INSUFFICIENT_RESOURCES;
  140.      case ERROR_INSUFFICIENT_BUFFER: return STATUS_BUFFER_TOO_SMALL;
  141.      case STATUS_BUFFER_TOO_SMALL:

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