File: revert_remove_our_use_of_syscall_for-statx.patch

package info (click to toggle)
qtbase-opensource-src 5.11.3%2Bdfsg1-1%2Bdeb10u5
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 313,804 kB
  • sloc: cpp: 1,831,962; ansic: 318,856; xml: 113,585; python: 9,691; java: 7,209; asm: 4,023; perl: 2,151; sh: 1,790; yacc: 1,733; lex: 1,197; javascript: 469; makefile: 301; objc: 70
file content (119 lines) | stat: -rw-r--r-- 4,655 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
Description: revert upstream commit that removes use of syscall() and statx(2)
 The commit https://code.qt.io/cgit/qt/qtbase.git/commit/?id=b7887f9b4faad222
 removes the use of the above mentioned syscalls. This makes Qt not able
 to run on current stable servers under a testing/unstable VM.
 .
 This patch should be removed in testing/unstable after Buster gets released.
Author: Lisandro Damián Nicanor Pérez Meyer <lisandro@debian.org>
Forwarded: not-needed

---
 src/corelib/global/minimum-linux_p.h      |    7 ----
 src/corelib/io/qfilesystemengine_unix.cpp |   45 ++++++++++++++++++++++++++++--
 2 files changed, 43 insertions(+), 9 deletions(-)

--- a/src/corelib/global/minimum-linux_p.h
+++ b/src/corelib/global/minimum-linux_p.h
@@ -75,14 +75,9 @@ QT_BEGIN_NAMESPACE
  * - accept4                    2.6.28
  * - renameat2                  3.16                    QT_CONFIG(renameat2)
  * - getrandom                  3.17                    QT_CONFIG(getentropy)
- * - statx                      4.11                    QT_CONFIG(statx)
  */
 
-#if QT_CONFIG(statx)
-#  define MINLINUX_MAJOR        4
-#  define MINLINUX_MINOR        11
-#  define MINLINUX_PATCH        0
-#elif QT_CONFIG(getentropy)
+#if QT_CONFIG(getentropy)
 #  define MINLINUX_MAJOR        3
 #  define MINLINUX_MINOR        17
 #  define MINLINUX_PATCH        0
--- a/src/corelib/io/qfilesystemengine_unix.cpp
+++ b/src/corelib/io/qfilesystemengine_unix.cpp
@@ -1,6 +1,6 @@
 /****************************************************************************
 **
-** Copyright (C) 2018 Intel Corporation.
+** Copyright (C) 2017 Intel Corporation.
 ** Copyright (C) 2016 The Qt Company Ltd.
 ** Copyright (C) 2013 Samuel Gaist <samuel.gaist@edeltech.ch>
 ** Contact: https://www.qt.io/licensing/
@@ -88,6 +88,7 @@ extern "C" NSString *NSTemporaryDirector
 
 #if defined(Q_OS_LINUX)
 #  include <sys/ioctl.h>
+#  include <sys/syscall.h>
 #  include <sys/sendfile.h>
 #  include <linux/fs.h>
 
@@ -95,6 +96,28 @@ extern "C" NSString *NSTemporaryDirector
 #ifndef FICLONE
 #  define FICLONE       _IOW(0x94, 9, int)
 #endif
+
+#  if defined(Q_OS_ANDROID)
+// renameat2() and statx() are disabled on Android because quite a few systems
+// come with sandboxes that kill applications that make system calls outside a
+// whitelist and several Android vendors can't be bothered to update the list.
+#    undef SYS_renameat2
+#    undef SYS_statx
+#    undef STATX_BASIC_STATS
+#  else
+#    if !QT_CONFIG(renameat2) && defined(SYS_renameat2)
+static int renameat2(int oldfd, const char *oldpath, int newfd, const char *newpath, unsigned flags)
+{ return syscall(SYS_renameat2, oldfd, oldpath, newfd, newpath, flags); }
+#    endif
+
+#    if !QT_CONFIG(statx) && defined(SYS_statx)
+#      include <linux/stat.h>
+static int statx(int dirfd, const char *pathname, int flag, unsigned mask, struct statx *statxbuf)
+{ return syscall(SYS_statx, dirfd, pathname, flag, mask, statxbuf); }
+#    elif !QT_CONFIG(statx) && !defined(SYS_statx)
+#      undef STATX_BASIC_STATS
+#    endif
+#  endif // !Q_OS_ANDROID
 #endif
 
 #if defined(Q_OS_ANDROID)
@@ -315,8 +338,22 @@ mtime(const T &statBuffer, int)
 #ifdef STATX_BASIC_STATS
 static int qt_real_statx(int fd, const char *pathname, int flags, struct statx *statxBuffer)
 {
+#ifdef Q_ATOMIC_INT8_IS_SUPPORTED
+    static QBasicAtomicInteger<qint8> statxTested  = Q_BASIC_ATOMIC_INITIALIZER(0);
+#else
+    static QBasicAtomicInt statxTested = Q_BASIC_ATOMIC_INITIALIZER(0);
+#endif
+
+    if (statxTested.load() == -1)
+        return -ENOSYS;
+
     unsigned mask = STATX_BASIC_STATS | STATX_BTIME;
     int ret = statx(fd, pathname, flags, mask, statxBuffer);
+    if (ret == -1 && errno == ENOSYS) {
+        statxTested.store(-1);
+        return -ENOSYS;
+    }
+    statxTested.store(1);
     return ret == -1 ? -errno : 0;
 }
 
@@ -1252,12 +1289,14 @@ bool QFileSystemEngine::renameFile(const
     if (Q_UNLIKELY(srcPath.isEmpty() || tgtPath.isEmpty()))
         return emptyFileEntryWarning(), false;
 
-#if defined(RENAME_NOREPLACE) && QT_CONFIG(renameat2)
+#if defined(RENAME_NOREPLACE) && (QT_CONFIG(renameat2) || defined(SYS_renameat2))
     if (renameat2(AT_FDCWD, srcPath, AT_FDCWD, tgtPath, RENAME_NOREPLACE) == 0)
         return true;
 
+    // If we're using syscall(), check for ENOSYS;
+    // if renameat2 came from libc, we don't accept ENOSYS.
     // We can also get EINVAL for some non-local filesystems.
-    if (errno != EINVAL) {
+    if ((QT_CONFIG(renameat2) || errno != ENOSYS) && errno != EINVAL) {
         error = QSystemError(errno, QSystemError::StandardLibraryError);
         return false;
     }