+++ /dev/null
-^samba3.vfs.fruit metadata_netatalk.read metadata\(nt4_dc\)
-^samba3.vfs.fruit metadata_netatalk.write metadata\(nt4_dc\)
-^samba3.vfs.fruit metadata_netatalk.SMB2/CREATE context AAPL\(nt4_dc\)
-^samba3.vfs.fruit metadata_netatalk.create delete-on-close AFP_AfpInfo\(nt4_dc\)
-^samba3.vfs.fruit metadata_netatalk.setinfo delete-on-close AFP_AfpInfo\(nt4_dc\)
-^samba3.vfs.fruit metadata_netatalk.setinfo eof AFP_AfpInfo\(nt4_dc\)
-^samba3.vfs.fruit metadata_netatalk.delete AFP_AfpInfo by writing all 0\(nt4_dc\)
-^samba3.vfs.fruit metadata_netatalk.null afpinfo\(nt4_dc\)
-^samba3.vfs.fruit metadata_netatalk.copy-chunk streams\(nt4_dc\)
-^samba3.vfs.fruit metadata_netatalk.OS X AppleDouble file conversion\(nt4_dc\)
-^samba3.vfs.fruit metadata_netatalk.readdir_attr with names with illegal ntfs characters\(nt4_dc\)
-^samba3.vfs.fruit metadata_netatalk.OS X AppleDouble file conversion without embedded xattr\(nt4_dc\)
-^samba3.vfs.fruit metadata_netatalk.empty_stream\(nt4_dc\)
-^samba3.vfs.fruit metadata_netatalk.writing_afpinfo\(nt4_dc\)
-^samba3.vfs.unfruit metadata_netatalk.unconvert\(nt4_dc:local\)
-^samba3.vfs.fruit_netatalk.read netatalk metadata\(nt4_dc\)
-^samba3.vfs.fruit_netatalk.stream names with locally created xattr\(nt4_dc\)
-^samba3.vfs.fruit_netatalk.locking conflict\(nt4_dc\)
struct smb_filename *orig_fsp_name = fsp->fsp_name;
struct smb_filename *orig_base_fsp_name = NULL;
struct smb_filename *smb_fname_rel = NULL;
- struct smb_filename base_smb_fname_rel;
struct smb_filename *oldwd_fname = NULL;
struct smb_filename *parent_dir_fname = NULL;
bool have_opath = false;
/* Also setup base_fsp to be relative to the new cwd */
if (fsp->base_fsp != NULL) {
- base_smb_fname_rel = (struct smb_filename) {
- .base_name = smb_fname_rel->base_name,
- };
+ struct smb_filename *base_smb_fname_rel = NULL;
+
+ /* Check the invarient is true. */
+ SMB_ASSERT(fsp->base_fsp->fsp_name->fsp ==
+ fsp->base_fsp);
+
+ base_smb_fname_rel = synthetic_smb_fname(
+ talloc_tos(),
+ smb_fname_rel->base_name,
+ NULL,
+ &smb_fname_rel->st,
+ smb_fname_rel->twrp,
+ smb_fname_rel->flags);
+ if (base_smb_fname_rel == NULL) {
+ status = NT_STATUS_NO_MEMORY;
+ goto out;
+ }
+
+ base_smb_fname_rel->fsp = fsp->base_fsp;
+
orig_base_fsp_name = fsp->base_fsp->fsp_name;
- fsp->base_fsp->fsp_name = &base_smb_fname_rel;
+ fsp->base_fsp->fsp_name = base_smb_fname_rel;
+
+ /*
+ * We should have preserved the invarient
+ * fsp->base_fsp->fsp_name->fsp == fsp->base_fsp.
+ */
+ SMB_ASSERT(fsp->base_fsp->fsp_name->fsp ==
+ fsp->base_fsp);
}
} else {
/*
out:
fsp->fsp_name = orig_fsp_name;
if (fsp->base_fsp != NULL) {
+ /* Save off the temporary name. */
+ struct smb_filename *base_smb_fname_rel =
+ fsp->base_fsp->fsp_name;
+ /* It no longer has an associated fsp. */
+ base_smb_fname_rel->fsp = NULL;
+
+ /* Replace the original name. */
fsp->base_fsp->fsp_name = orig_base_fsp_name;
+ /*
+ * We should have preserved the invarient
+ * fsp->base_fsp->fsp_name->fsp == fsp->base_fsp.
+ */
+ SMB_ASSERT(fsp->base_fsp->fsp_name->fsp == fsp->base_fsp);
+ TALLOC_FREE(base_smb_fname_rel);
}
TALLOC_FREE(parent_dir_fname);