|
@@ -1,61 +0,0 @@
|
|
|
-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.
|
|
|
-
|
|
|
-Signed-off-by: Joel Stanley <joel@jms.id.au>
|
|
|
-
|
|
|
---- 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. */
|