From: Ralph Boehme Date: Fri, 24 May 2019 10:51:15 +0000 (+0200) Subject: vfs_fruit: use fsp and remove syscalls from ad_convert_blank_rfork() X-Git-Tag: samba-4.9.10~9 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1a8dffceff47a198875cb5155fe6d751c19f2c15;p=thirdparty%2Fsamba.git vfs_fruit: use fsp and remove syscalls from ad_convert_blank_rfork() Bug: https://bugzilla.samba.org/show_bug.cgi?id=13968 Signed-off-by: Ralph Boehme Reviewed-by: Jeremy Allison (cherry picked from commit 70c4a8f0ac307009c26e857523192c95b42a92f5) --- diff --git a/source3/modules/vfs_fruit.c b/source3/modules/vfs_fruit.c index 2fd40338b71..ed31f27cfca 100644 --- a/source3/modules/vfs_fruit.c +++ b/source3/modules/vfs_fruit.c @@ -1329,10 +1329,10 @@ static bool ad_convert_blank_rfork(vfs_handle_struct *handle, bool *blank) { struct fruit_config_data *config = NULL; - uint8_t *map = MAP_FAILED; - size_t maplen; + size_t rforklen = sizeof(empty_resourcefork); + char buf[rforklen]; + ssize_t nread; int cmp; - ssize_t len; int rc; bool ok; @@ -1345,43 +1345,31 @@ static bool ad_convert_blank_rfork(vfs_handle_struct *handle, return true; } - if (ad_getentrylen(ad, ADEID_RFORK) != sizeof(empty_resourcefork)) { + if (ad_getentrylen(ad, ADEID_RFORK) != rforklen) { return true; } - maplen = ad_getentryoff(ad, ADEID_RFORK) + - ad_getentrylen(ad, ADEID_RFORK); - - /* FIXME: direct use of mmap(), vfs_aio_fork does it too */ - map = mmap(NULL, maplen, PROT_READ|PROT_WRITE, MAP_SHARED, - ad->ad_fsp->fh->fd, 0); - if (map == MAP_FAILED) { - DBG_ERR("mmap AppleDouble: %s\n", strerror(errno)); - return false; - } - - cmp = memcmp(map + ADEDOFF_RFORK_DOT_UND, - empty_resourcefork, - sizeof(empty_resourcefork)); - rc = munmap(map, maplen); - if (rc != 0) { - DBG_ERR("munmap failed: %s\n", strerror(errno)); + nread = SMB_VFS_PREAD(ad->ad_fsp, buf, rforklen, ADEDOFF_RFORK_DOT_UND); + if (nread != rforklen) { + DBG_ERR("Reading %zu bytes from rfork [%s] failed: %s\n", + rforklen, fsp_str_dbg(ad->ad_fsp), strerror(errno)); return false; } + cmp = memcmp(buf, empty_resourcefork, rforklen); if (cmp != 0) { return true; } ad_setentrylen(ad, ADEID_RFORK, 0); - ok = ad_pack(ad); if (!ok) { return false; } - len = sys_pwrite(ad->ad_fsp->fh->fd, ad->ad_data, AD_DATASZ_DOT_UND, 0); - if (len != AD_DATASZ_DOT_UND) { + rc = ad_fset(handle, ad, ad->ad_fsp); + if (rc != 0) { + DBG_ERR("ad_fset on [%s] failed\n", fsp_str_dbg(ad->ad_fsp)); return false; }