Fix stat() mocking for new glibc
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
This commit is contained in:
parent
18b1c9d77e
commit
c2f3be1f4d
30
0002-tests-Fix-lstat-mock-initialization-on-macOS.patch
Normal file
30
0002-tests-Fix-lstat-mock-initialization-on-macOS.patch
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
From 2c51432376f0ff3743633fd655756260b88313ff Mon Sep 17 00:00:00 2001
|
||||||
|
From: Roman Bolshakov <r.bolshakov@yadro.com>
|
||||||
|
Date: Sun, 18 Oct 2020 18:30:56 +0300
|
||||||
|
Subject: [PATCH 1/3] tests: Fix lstat() mock initialization on macOS
|
||||||
|
|
||||||
|
There is a typo that prevents initialization of real_lstat.
|
||||||
|
|
||||||
|
Fixes: d6b17edd5163 ("tests: Lookup extended stat/lstat in mocks")
|
||||||
|
Signed-off-by: Roman Bolshakov <r.bolshakov@yadro.com>
|
||||||
|
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
---
|
||||||
|
tests/virmockstathelpers.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/tests/virmockstathelpers.c b/tests/virmockstathelpers.c
|
||||||
|
index 1a58025a0a..90b9ceedb6 100644
|
||||||
|
--- a/tests/virmockstathelpers.c
|
||||||
|
+++ b/tests/virmockstathelpers.c
|
||||||
|
@@ -153,7 +153,7 @@ static void virMockStatInit(void)
|
||||||
|
#endif
|
||||||
|
#ifdef MOCK_LSTAT
|
||||||
|
# ifdef __APPLE__
|
||||||
|
- VIR_MOCK_REAL_INIT_ALIASED(stat, "lstat$INODE64");
|
||||||
|
+ VIR_MOCK_REAL_INIT_ALIASED(lstat, "lstat$INODE64");
|
||||||
|
# else
|
||||||
|
VIR_MOCK_REAL_INIT(lstat);
|
||||||
|
# endif
|
||||||
|
--
|
||||||
|
2.28.0
|
||||||
|
|
61
0003-tests-Re-introduce-stat-lstat-mocks-on-macOS.patch
Normal file
61
0003-tests-Re-introduce-stat-lstat-mocks-on-macOS.patch
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
From c46299170bd318bc1ffc95da1774515634fd03d9 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Roman Bolshakov <r.bolshakov@yadro.com>
|
||||||
|
Date: Sun, 18 Oct 2020 18:30:57 +0300
|
||||||
|
Subject: [PATCH 2/3] tests: Re-introduce stat/lstat mocks on macOS
|
||||||
|
|
||||||
|
Commit d6b17edd5163 ("tests: Lookup extended stat/lstat in mocks")
|
||||||
|
adds support for mocking of stat() and lstat() on macOS.
|
||||||
|
|
||||||
|
The change was broken because virmockstathelpers.c only follows glibc
|
||||||
|
logic and MOCK_STAT and MOCK_LSTAT are not getting defined on macOS.
|
||||||
|
|
||||||
|
Signed-off-by: Roman Bolshakov <r.bolshakov@yadro.com>
|
||||||
|
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
---
|
||||||
|
tests/virmockstathelpers.c | 16 ++++++++++++----
|
||||||
|
1 file changed, 12 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/tests/virmockstathelpers.c b/tests/virmockstathelpers.c
|
||||||
|
index 90b9ceedb6..5a71de24e9 100644
|
||||||
|
--- a/tests/virmockstathelpers.c
|
||||||
|
+++ b/tests/virmockstathelpers.c
|
||||||
|
@@ -55,6 +55,10 @@
|
||||||
|
* Unfortunately, because we are trying to mock replace the C library,
|
||||||
|
* we need to know about this internal impl detail.
|
||||||
|
*
|
||||||
|
+ * On macOS stat() and lstat() are resolved to _stat$INODE64 and
|
||||||
|
+ * _lstat$INODE64, respectively. stat(2) man page also declares that
|
||||||
|
+ * stat64(), lstat64() and fstat64() are deprecated.
|
||||||
|
+ *
|
||||||
|
* With all this in mind the list of functions we have to mock will depend
|
||||||
|
* on several factors
|
||||||
|
*
|
||||||
|
@@ -68,8 +72,10 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-#if defined(WITH_STAT) && !defined(WITH___XSTAT) && !defined(WITH_STAT64)
|
||||||
|
-# define MOCK_STAT
|
||||||
|
+#if defined(WITH_STAT)
|
||||||
|
+# if !defined(WITH___XSTAT) && !defined(WITH_STAT64) || defined(__APPLE__)
|
||||||
|
+# define MOCK_STAT
|
||||||
|
+# endif
|
||||||
|
#endif
|
||||||
|
#if defined(WITH_STAT64) && !defined(WITH___XSTAT64)
|
||||||
|
# define MOCK_STAT64
|
||||||
|
@@ -80,8 +86,10 @@
|
||||||
|
#if defined(WITH___XSTAT64)
|
||||||
|
# define MOCK___XSTAT64
|
||||||
|
#endif
|
||||||
|
-#if defined(WITH_LSTAT) && !defined(WITH___LXSTAT) && !defined(WITH_LSTAT64)
|
||||||
|
-# define MOCK_LSTAT
|
||||||
|
+#if defined(WITH_LSTAT)
|
||||||
|
+# if !defined(WITH___LXSTAT) && !defined(WITH_LSTAT64) || defined(__APPLE__)
|
||||||
|
+# define MOCK_LSTAT
|
||||||
|
+# endif
|
||||||
|
#endif
|
||||||
|
#if defined(WITH_LSTAT64) && !defined(WITH___LXSTAT64)
|
||||||
|
# define MOCK_LSTAT64
|
||||||
|
--
|
||||||
|
2.28.0
|
||||||
|
|
191
0004-tests-fix-stat-mocking-with-Fedora-rawhide.patch
Normal file
191
0004-tests-fix-stat-mocking-with-Fedora-rawhide.patch
Normal file
@ -0,0 +1,191 @@
|
|||||||
|
From 2b93bcc7e84dfae34b16fd687b8c3d35fa0c54be Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
|
||||||
|
Date: Thu, 29 Oct 2020 17:25:07 +0000
|
||||||
|
Subject: [PATCH 3/3] tests: fix stat mocking with Fedora rawhide
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
GLibC has a really complicated way of dealing with the 'stat' function
|
||||||
|
historically, which means our mocks in turn have to look at four
|
||||||
|
different possible functions to replace, stat, stat64, __xstat,
|
||||||
|
__xstat64.
|
||||||
|
|
||||||
|
In Fedora 33 and earlier:
|
||||||
|
|
||||||
|
- libvirt.so links to __xstat64
|
||||||
|
- libc.so library exports stat, stat64, __xstat, __xstat64
|
||||||
|
- sys/stat.h header exposes stat and __xstat
|
||||||
|
|
||||||
|
In Fedora 34 rawhide:
|
||||||
|
|
||||||
|
- libvirt.so links to stat64
|
||||||
|
- libc.so library exports stat, stat64, __xstat, __xstat64
|
||||||
|
- sys/stat.h header exposes stat
|
||||||
|
|
||||||
|
Historically we only looked at the exported symbols from libc.so to
|
||||||
|
decide which to mock.
|
||||||
|
|
||||||
|
In F34 though we must not consider __xstat / __xstat64 though because
|
||||||
|
they only existance for binary compatibility. Newly built binaries
|
||||||
|
won't reference them.
|
||||||
|
|
||||||
|
Thus we must introduce a header file check into our logic for deciding
|
||||||
|
which symbol to mock. We must ignore the __xstat / __xstat64 symbols
|
||||||
|
if they don't appear in the sys/stat.h header, even if they appear
|
||||||
|
in libc.so
|
||||||
|
|
||||||
|
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
|
||||||
|
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
|
||||||
|
---
|
||||||
|
meson.build | 28 ++++++++++++-----
|
||||||
|
tests/virmockstathelpers.c | 62 ++++++++++++++++++++++----------------
|
||||||
|
2 files changed, 56 insertions(+), 34 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/meson.build b/meson.build
|
||||||
|
index 2e57a435df..87b4aaf9aa 100644
|
||||||
|
--- a/meson.build
|
||||||
|
+++ b/meson.build
|
||||||
|
@@ -636,10 +636,6 @@ libvirt_export_dynamic = cc.first_supported_link_argument([
|
||||||
|
# check availability of various common functions (non-fatal if missing)
|
||||||
|
|
||||||
|
functions = [
|
||||||
|
- '__lxstat',
|
||||||
|
- '__lxstat64',
|
||||||
|
- '__xstat',
|
||||||
|
- '__xstat64',
|
||||||
|
'elf_aux_info',
|
||||||
|
'fallocate',
|
||||||
|
'getauxval',
|
||||||
|
@@ -653,8 +649,6 @@ functions = [
|
||||||
|
'getuid',
|
||||||
|
'getutxid',
|
||||||
|
'if_indextoname',
|
||||||
|
- 'lstat',
|
||||||
|
- 'lstat64',
|
||||||
|
'mmap',
|
||||||
|
'newlocale',
|
||||||
|
'pipe2',
|
||||||
|
@@ -666,12 +660,23 @@ functions = [
|
||||||
|
'setgroups',
|
||||||
|
'setns',
|
||||||
|
'setrlimit',
|
||||||
|
- 'stat',
|
||||||
|
- 'stat64',
|
||||||
|
'symlink',
|
||||||
|
'sysctlbyname',
|
||||||
|
]
|
||||||
|
|
||||||
|
+stat_functions = [
|
||||||
|
+ '__lxstat',
|
||||||
|
+ '__lxstat64',
|
||||||
|
+ '__xstat',
|
||||||
|
+ '__xstat64',
|
||||||
|
+ 'lstat',
|
||||||
|
+ 'lstat64',
|
||||||
|
+ 'stat',
|
||||||
|
+ 'stat64',
|
||||||
|
+]
|
||||||
|
+
|
||||||
|
+functions += stat_functions
|
||||||
|
+
|
||||||
|
foreach function : functions
|
||||||
|
if cc.has_function(function)
|
||||||
|
conf.set('WITH_@0@'.format(function.to_upper()), 1)
|
||||||
|
@@ -679,6 +684,13 @@ foreach function : functions
|
||||||
|
endforeach
|
||||||
|
|
||||||
|
|
||||||
|
+foreach function : stat_functions
|
||||||
|
+ if cc.has_header_symbol('sys/stat.h', function)
|
||||||
|
+ conf.set('WITH_@0@_DECL'.format(function.to_upper()), 1)
|
||||||
|
+ endif
|
||||||
|
+endforeach
|
||||||
|
+
|
||||||
|
+
|
||||||
|
# various header checks
|
||||||
|
|
||||||
|
headers = [
|
||||||
|
diff --git a/tests/virmockstathelpers.c b/tests/virmockstathelpers.c
|
||||||
|
index 5a71de24e9..ebe357aa49 100644
|
||||||
|
--- a/tests/virmockstathelpers.c
|
||||||
|
+++ b/tests/virmockstathelpers.c
|
||||||
|
@@ -67,39 +67,49 @@
|
||||||
|
* - If __xstat & __xstat64 exist, then stat & stat64 will not exist
|
||||||
|
* as symbols in the library, so the latter should not be mocked.
|
||||||
|
*
|
||||||
|
+ * - If __xstat exists in the library, but not the header than it
|
||||||
|
+ * it is just there for binary back compat and should not be
|
||||||
|
+ * mocked
|
||||||
|
+ *
|
||||||
|
* The same all applies to lstat()
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
+#if !defined(WITH___XSTAT_DECL)
|
||||||
|
+# if defined(WITH_STAT)
|
||||||
|
+# if !defined(WITH___XSTAT) && !defined(WITH_STAT64) || defined(__APPLE__)
|
||||||
|
+# define MOCK_STAT
|
||||||
|
+# endif
|
||||||
|
+# endif
|
||||||
|
+# if defined(WITH_STAT64)
|
||||||
|
+# define MOCK_STAT64
|
||||||
|
+# endif
|
||||||
|
+#else /* WITH___XSTAT_DECL */
|
||||||
|
+# if defined(WITH___XSTAT) && !defined(WITH___XSTAT64)
|
||||||
|
+# define MOCK___XSTAT
|
||||||
|
+# endif
|
||||||
|
+# if defined(WITH___XSTAT64)
|
||||||
|
+# define MOCK___XSTAT64
|
||||||
|
+# endif
|
||||||
|
+#endif /* WITH___XSTAT_DECL */
|
||||||
|
|
||||||
|
-#if defined(WITH_STAT)
|
||||||
|
-# if !defined(WITH___XSTAT) && !defined(WITH_STAT64) || defined(__APPLE__)
|
||||||
|
-# define MOCK_STAT
|
||||||
|
+#if !defined(WITH___LXSTAT_DECL)
|
||||||
|
+# if defined(WITH_LSTAT)
|
||||||
|
+# if !defined(WITH___LXSTAT) && !defined(WITH_LSTAT64) || defined(__APPLE__)
|
||||||
|
+# define MOCK_LSTAT
|
||||||
|
+# endif
|
||||||
|
# endif
|
||||||
|
-#endif
|
||||||
|
-#if defined(WITH_STAT64) && !defined(WITH___XSTAT64)
|
||||||
|
-# define MOCK_STAT64
|
||||||
|
-#endif
|
||||||
|
-#if defined(WITH___XSTAT) && !defined(WITH___XSTAT64)
|
||||||
|
-# define MOCK___XSTAT
|
||||||
|
-#endif
|
||||||
|
-#if defined(WITH___XSTAT64)
|
||||||
|
-# define MOCK___XSTAT64
|
||||||
|
-#endif
|
||||||
|
-#if defined(WITH_LSTAT)
|
||||||
|
-# if !defined(WITH___LXSTAT) && !defined(WITH_LSTAT64) || defined(__APPLE__)
|
||||||
|
-# define MOCK_LSTAT
|
||||||
|
+# if defined(WITH_LSTAT64)
|
||||||
|
+# define MOCK_LSTAT64
|
||||||
|
# endif
|
||||||
|
-#endif
|
||||||
|
-#if defined(WITH_LSTAT64) && !defined(WITH___LXSTAT64)
|
||||||
|
-# define MOCK_LSTAT64
|
||||||
|
-#endif
|
||||||
|
-#if defined(WITH___LXSTAT) && !defined(WITH___LXSTAT64)
|
||||||
|
-# define MOCK___LXSTAT
|
||||||
|
-#endif
|
||||||
|
-#if defined(WITH___LXSTAT64)
|
||||||
|
-# define MOCK___LXSTAT64
|
||||||
|
-#endif
|
||||||
|
+#else /* WITH___LXSTAT_DECL */
|
||||||
|
+# if defined(WITH___LXSTAT) && !defined(WITH___LXSTAT64)
|
||||||
|
+# define MOCK___LXSTAT
|
||||||
|
+# endif
|
||||||
|
+# if defined(WITH___LXSTAT64)
|
||||||
|
+# define MOCK___LXSTAT64
|
||||||
|
+# endif
|
||||||
|
+#endif /* WITH___LXSTAT_DECL */
|
||||||
|
|
||||||
|
#ifdef MOCK_STAT
|
||||||
|
static int (*real_stat)(const char *path, struct stat *sb);
|
||||||
|
--
|
||||||
|
2.28.0
|
||||||
|
|
@ -208,7 +208,7 @@
|
|||||||
Summary: Library providing a simple virtualization API
|
Summary: Library providing a simple virtualization API
|
||||||
Name: libvirt
|
Name: libvirt
|
||||||
Version: 6.8.0
|
Version: 6.8.0
|
||||||
Release: 2%{?dist}
|
Release: 3%{?dist}
|
||||||
License: LGPLv2+
|
License: LGPLv2+
|
||||||
URL: https://libvirt.org/
|
URL: https://libvirt.org/
|
||||||
|
|
||||||
@ -218,6 +218,10 @@ URL: https://libvirt.org/
|
|||||||
Source: https://libvirt.org/sources/%{?mainturl}libvirt-%{version}.tar.xz
|
Source: https://libvirt.org/sources/%{?mainturl}libvirt-%{version}.tar.xz
|
||||||
# Fix glib errors in virsystemdtest
|
# Fix glib errors in virsystemdtest
|
||||||
Patch0001: 0001-tests-fix-incorrect-free-of-GVariant-in-our-GLib-moc.patch
|
Patch0001: 0001-tests-fix-incorrect-free-of-GVariant-in-our-GLib-moc.patch
|
||||||
|
# Fix glibc incompatibility in stat() mocking
|
||||||
|
Patch0002: 0002-tests-Fix-lstat-mock-initialization-on-macOS.patch
|
||||||
|
Patch0003: 0003-tests-Re-introduce-stat-lstat-mocks-on-macOS.patch
|
||||||
|
Patch0004: 0004-tests-fix-stat-mocking-with-Fedora-rawhide.patch
|
||||||
|
|
||||||
Requires: libvirt-daemon = %{version}-%{release}
|
Requires: libvirt-daemon = %{version}-%{release}
|
||||||
Requires: libvirt-daemon-config-network = %{version}-%{release}
|
Requires: libvirt-daemon-config-network = %{version}-%{release}
|
||||||
@ -1959,6 +1963,9 @@ exit 0
|
|||||||
|
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Fri Oct 30 2020 Daniel P. Berrangé <berrange@redhat.com> - 6.8.0-3
|
||||||
|
- Fix stat() mocking for new glibc
|
||||||
|
|
||||||
* Wed Oct 28 2020 Daniel P. Berrangé <berrange@redhat.com> - 6.8.0-2
|
* Wed Oct 28 2020 Daniel P. Berrangé <berrange@redhat.com> - 6.8.0-2
|
||||||
- Remove obsolete bash_completion conditional
|
- Remove obsolete bash_completion conditional
|
||||||
- Pass args to meson based on with_libssh/with_libssh2
|
- Pass args to meson based on with_libssh/with_libssh2
|
||||||
|
Loading…
Reference in New Issue
Block a user