1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-10 01:18:15 +03:00

libreplace: properly execute SYS_copy_file_range check

It seems some systems (like Centos 7) have the SYS_copy_file_range define but
fail the syscall when actually being called. The current configure check is only
compiled, not run so erroneously reports a working SYS_copy_file_range.

BUG: https://bugzilla.samba.org/show_bug.cgi?id=14786
RN: Insufficient libreplace check for SYS_copy_file_range check

Signed-off-by: Ralph Boehme <slow@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>

Autobuild-User(master): Jeremy Allison <jra@samba.org>
Autobuild-Date(master): Tue Aug 10 19:37:14 UTC 2021 on sn-devel-184
This commit is contained in:
Ralph Boehme 2021-08-07 17:18:25 +02:00 committed by Jeremy Allison
parent 22a58a5184
commit 4354823c51

View File

@ -456,10 +456,32 @@ def configure(conf):
conf.CHECK_FUNCS('getprogname')
if not conf.CHECK_FUNCS('copy_file_range'):
conf.CHECK_CODE('''
syscall(SYS_copy_file_range,0,NULL,0,NULL,0,0);
int src_fd = -1, dst_fd = -1, ret;
ssize_t written;
char src[]="/tmp/test.XXXXXX";
char dst[]="/tmp/test.XXXXXX";
src_fd = mkstemp(src);
if (src_fd == -1) {ret = 1; goto cleanup;}
dst_fd = mkstemp(dst);
if (dst_fd == -1) {ret = 2; goto cleanup;}
written = pwrite(src_fd, "x", 1, 0);
if (written != 1) {ret = 3; goto cleanup;}
written = syscall(SYS_copy_file_range,src_fd,0,dst_fd,0,1,0);
if (written != 1) {
printf("SYS_copy_file_range failed: %s", strerror(errno));
ret = 4; goto cleanup;
}
ret = 0;
cleanup:
if (src_fd != -1) close(src_fd);
if (dst_fd != -1) close(dst_fd);
unlink(src);
unlink(dst);
return ret;
''',
'HAVE_SYSCALL_COPY_FILE_RANGE',
headers='sys/syscall.h unistd.h',
headers='errno.h string.h stdio.h sys/syscall.h unistd.h sys/types.h sys/stat.h fcntl.h',
execute=True,
msg='Checking whether we have copy_file_range system call')
if conf.CONFIG_SET('HAVE_COPY_FILE_RANGE') or conf.CONFIG_SET('HAVE_SYSCALL_COPY_FILE_RANGE'):
conf.DEFINE('USE_COPY_FILE_RANGE', 1)