From: Jeremy Allison Date: Thu, 1 Jul 2021 18:26:21 +0000 (-0700) Subject: s3: smbd: Code inside non_widelink_open() breaks an invarient inside the VFS. Demonst... X-Git-Tag: tevent-0.11.0~51 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4e97e33c3b74d2d66420e9ef509431deae0e67a5;p=thirdparty%2Fsamba.git s3: smbd: Code inside non_widelink_open() breaks an invarient inside the VFS. Demonstrate this. vfs_fruit isn't the bad guy here. It's just a convenient place to show that non_widelink_open() violates: fsp->base_fsp->fsp_name->fsp == fsp->base_fsp invarient Add selftest/knownfail.d/fruit_vfs_invariant to show what this breaks. Next patch will fix the non_widelink_open() code and remove the knownfail. Signed-off-by: Jeremy Allison Reviewed-by: Ralph Boehme --- diff --git a/selftest/knownfail.d/fruit_vfs_invariant b/selftest/knownfail.d/fruit_vfs_invariant new file mode 100644 index 00000000000..e8a435e7dc8 --- /dev/null +++ b/selftest/knownfail.d/fruit_vfs_invariant @@ -0,0 +1,18 @@ +^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\) diff --git a/source3/modules/vfs_fruit.c b/source3/modules/vfs_fruit.c index ae1541ea9f1..7d9f4f7a113 100644 --- a/source3/modules/vfs_fruit.c +++ b/source3/modules/vfs_fruit.c @@ -1425,6 +1425,13 @@ static int fruit_open_meta_netatalk(vfs_handle_struct *handle, DBG_DEBUG("Path [%s]\n", smb_fname_str_dbg(smb_fname)); + /* + * We know this is a stream open, so fsp->base_fsp must + * already be open. + */ + SMB_ASSERT(fsp->base_fsp != NULL); + SMB_ASSERT(fsp->base_fsp->fsp_name->fsp == fsp->base_fsp); + ad = ad_get(talloc_tos(), handle, smb_fname, ADOUBLE_META); if (ad != NULL) { meta_exists = true;