status = openat_pathref_fsp_case_insensitive(
smb_dirname->fsp, smb_fname_rel, ucf_flags);
- if (NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_NOT_FOUND)) {
-
- char *normalized = NULL;
+ if (NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_NOT_FOUND) &&
+ VALID_STAT(smb_fname_rel->st) &&
+ S_ISLNK(smb_fname_rel->st.st_ex_mode)) {
- if (VALID_STAT(smb_fname_rel->st)) {
- /*
- * If we're on an MSDFS share, see if this is
- * an MSDFS link.
- */
- if (lp_host_msdfs() &&
- lp_msdfs_root(SNUM(conn)) &&
- S_ISLNK(smb_fname_rel->st.st_ex_mode) &&
- is_msdfs_link(smb_dirname->fsp, smb_fname_rel))
- {
- status = NT_STATUS_PATH_NOT_COVERED;
- goto fail;
- }
+ /*
+ * If we're on an MSDFS share, see if this is
+ * an MSDFS link.
+ */
+ if (lp_host_msdfs() &&
+ lp_msdfs_root(SNUM(conn)) &&
+ is_msdfs_link(smb_dirname->fsp, smb_fname_rel))
+ {
+ status = NT_STATUS_PATH_NOT_COVERED;
+ goto fail;
+ }
#if defined(WITH_SMB1SERVER)
- /*
- * In SMB1 posix mode, if this is a symlink,
- * allow access to the name with a NULL smb_fname->fsp.
- */
- if (!conn->sconn->using_smb2 &&
- posix &&
- S_ISLNK(smb_fname_rel->st.st_ex_mode)) {
- SMB_ASSERT(smb_fname_rel->fsp == NULL);
- SMB_ASSERT(streamname == NULL);
-
- smb_fname = full_path_from_dirfsp_atname(
- mem_ctx,
- smb_dirname->fsp,
- smb_fname_rel);
- if (smb_fname == NULL) {
- status = NT_STATUS_NO_MEMORY;
- goto fail;
- }
- goto done;
+ /*
+ * In SMB1 posix mode, if this is a symlink,
+ * allow access to the name with a NULL smb_fname->fsp.
+ */
+ if (!conn->sconn->using_smb2 && posix) {
+ SMB_ASSERT(smb_fname_rel->fsp == NULL);
+ SMB_ASSERT(streamname == NULL);
+
+ smb_fname = full_path_from_dirfsp_atname(
+ mem_ctx,
+ smb_dirname->fsp,
+ smb_fname_rel);
+ if (smb_fname == NULL) {
+ status = NT_STATUS_NO_MEMORY;
+ goto fail;
}
+ goto done;
+ }
#endif
+ }
+
+ if (NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_NOT_FOUND)) {
+
+ char *normalized = NULL;
+
+ if (VALID_STAT(smb_fname_rel->st)) {
/*
* NT_STATUS_OBJECT_NAME_NOT_FOUND is
* misleading: The object exists but might be