Subject: Fix prototype generation for openat Author: Christoph Biedl 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. */