summaryrefslogtreecommitdiff
path: root/system/fakeroot/fix-prototype-generation.patch
blob: 38d32ff3b22c0ee4f41d4208ded4fe9590fb1ecd (plain) (blame)
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
Subject: Fix prototype generation for openat
Author: Christoph Biedl <debian.axhn@manchmal.in-ulm.de>
Date: 2021-12-30
Bug-Debian: https://bugs.debian.org/995393
Forwarded: Yes (implicitely)

    As jrtc27 pointed out in IRC, ppc64el is more strict than other
    architectures when it comes to va_arg handling:

        it's that ppc64le uses the elfv2 abi, and for variadic calls you
        must reserve space for a parameter save area

    So enhance wrapawk to create a proper prototype and argument
    handling although it's specific to the openat call. Also add the
    missing documentation for the sixth column to wrapfunc.inp.

--- a/wrapawk
+++ b/wrapawk
@@ -37,7 +37,25 @@
   argtype=$3;
   argname=$4;
   MACRO=$5;
-  if(MACRO){
+  openat_extra=$6;
+  if(openat_extra){
+    print "  {(void(*))&next_" name ", \"" name "\"},"  > structfile;
+    print "extern " ret " (*next_" name ")" openat_extra ";" > headerfile;
+    print ret " (*next_" name ")" openat_extra "=tmp_" name ";"> deffile;
+
+    print ret " tmp_" name,  openat_extra "{"           > tmpffile;
+    print "  mode_t mode = 0;"                          > tmpffile;
+    print "  if (flags & O_CREAT) {"                    > tmpffile;
+    print "    va_list args;"                           > tmpffile;
+    print "    va_start(args, flags);"                  > tmpffile;
+    print "    mode = va_arg(args, int);"               > tmpffile;
+    print "    va_end(args);"                           > tmpffile;
+    print "  }"                                         > tmpffile;
+    print "  load_library_symbols();"                   > tmpffile;
+    print "  return  next_" name,  argname ";"          > tmpffile;
+    print "}"                                           > tmpffile;
+    print ""                                            > tmpffile;
+  } else if(MACRO){
     print "  {(void(*))&NEXT_" MACRO "_NOARG, " name "_QUOTE},"  > structfile;
     print "extern " ret " (*NEXT_" MACRO "_NOARG)" argtype ";" > headerfile;
     print ret " (*NEXT_" MACRO "_NOARG)" argtype "=TMP_" MACRO ";"> deffile;
--- a/wrapfunc.inp
+++ b/wrapfunc.inp
@@ -9,8 +9,10 @@
 /**/									  */
 /* each line of this file lists 4 fields, seperated by a ";".		  */
 /* The first field is the name of the wrapped function, then it's return  */
-/* value. After that come the function arguments with types, and the last */
+/* value. After that come the function arguments with types, and the fifth */
 /* field contains the function arguments without types.                   */
+/* A sixth field is a special needed when wrapping the openat syscall.    */
+/* Otherwise it's like the third (function arguments with types).         */
 /**/
 
 /* __*xstat are used on glibc systems instead of just *xstat. */