aboutsummaryrefslogtreecommitdiff
path: root/package/attr/0002-Switch-back-to-syscall.patch
blob: de879e23ab54d438f79a5e2a494932cb8d86ad9f (plain)
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
120
121
122
123
124
125
126
From 14adc898a36948267bfe5c63b399996879e94c98 Mon Sep 17 00:00:00 2001
From: Andreas Gruenbacher <agruenba@redhat.com>
Date: Fri, 17 Aug 2018 14:07:31 +0200
Subject: Switch back to syscall()

Switch back to syscall() for the *xattr system calls.  The current
mechanism of forwarding those calls to glibc breaks libraries like
libfakeroot (fakeroot) and libasan (the gcc address sanitizer; gcc
-fsanitize=address).

Those libraries provide wrappers for functions defined in other shared
libraries, usually glibc, do their own processing, and forward calls to
the original symbols looke dup via dlsym(RTLD_NEXT, "symbol_name").  In
our case, dlsym returns the libattr_*xattr wrappers.  However, when our
wrappers try calling glibc, they end up calling the libfakeroot /
libasan wrappers instead because those override the original symbols =>
recursion.

The libattr_*xattr wrappers will only be used when symbols are looked up
at runtime (dlopen / dlsym).  Programs linking against libattr will
directly use the glibc provided symbols.  Therefore, the slightly worse
performance of syscall() won't affect any of the "normal" users of
libattr.

[nicolas.cavallari: with uclibc-ng, the recursion always happen]
Signed-off-by: Nicolas Cavallari <nicolas.cavallari@green-communications.fr>
---
 libattr/syscalls.c | 26 ++++++++++++++------------
 1 file changed, 14 insertions(+), 12 deletions(-)

diff --git a/libattr/syscalls.c b/libattr/syscalls.c
index 3013aa0..721ad7f 100644
--- a/libattr/syscalls.c
+++ b/libattr/syscalls.c
@@ -22,6 +22,8 @@
 
 #include "config.h"
 
+#include <unistd.h>
+#include <sys/syscall.h>
 #include <sys/xattr.h>
 
 #ifdef HAVE_VISIBILITY_ATTRIBUTE
@@ -31,67 +33,67 @@
 int libattr_setxattr(const char *path, const char *name,
 		     void *value, size_t size, int flags)
 {
-	return setxattr(path, name, value, size, flags);
+	return syscall(__NR_setxattr, path, name, value, size, flags);
 }
 
 int libattr_lsetxattr(const char *path, const char *name,
 		      void *value, size_t size, int flags)
 {
-	return lsetxattr(path, name, value, size, flags);
+	return syscall(__NR_lsetxattr, path, name, value, size, flags);
 }
 
 int libattr_fsetxattr(int filedes, const char *name,
 		      void *value, size_t size, int flags)
 {
-	return fsetxattr(filedes, name, value, size, flags);
+	return syscall(__NR_fsetxattr, filedes, name, value, size, flags);
 }
 
 ssize_t libattr_getxattr(const char *path, const char *name,
 			 void *value, size_t size)
 {
-	return getxattr(path, name, value, size);
+	return syscall(__NR_getxattr, path, name, value, size);
 }
 
 ssize_t libattr_lgetxattr(const char *path, const char *name,
 			  void *value, size_t size)
 {
-	return lgetxattr(path, name, value, size);
+	return syscall(__NR_lgetxattr, path, name, value, size);
 }
 
 ssize_t libattr_fgetxattr(int filedes, const char *name,
 			  void *value, size_t size)
 {
-	return fgetxattr(filedes, name, value, size);
+	return syscall(__NR_fgetxattr, filedes, name, value, size);
 }
 
 ssize_t libattr_listxattr(const char *path, char *list, size_t size)
 {
-	return listxattr(path, list, size);
+	return syscall(__NR_listxattr, path, list, size);
 }
 
 ssize_t libattr_llistxattr(const char *path, char *list, size_t size)
 {
-	return llistxattr(path, list, size);
+	return syscall(__NR_llistxattr, path, list, size);
 }
 
 ssize_t libattr_flistxattr(int filedes, char *list, size_t size)
 {
-	return flistxattr(filedes, list, size);
+	return syscall(__NR_flistxattr, filedes, list, size);
 }
 
 int libattr_removexattr(const char *path, const char *name)
 {
-	return removexattr(path, name);
+	return syscall(__NR_removexattr, path, name);
 }
 
 int libattr_lremovexattr(const char *path, const char *name)
 {
-	return lremovexattr(path, name);
+	return syscall(__NR_lremovexattr, path, name);
 }
 
 int libattr_fremovexattr(int filedes, const char *name)
 {
-	return fremovexattr(filedes, name);
+	return syscall(__NR_fremovexattr, filedes, name);
 }
 
 #ifdef HAVE_VISIBILITY_ATTRIBUTE
-- 
cgit v1.0-41-gc330