| 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. */ |