kumquat-buildroot/package/fakeroot/0001-fix-prototype-generation.patch
Joel Stanley a38c6827db fakeroot: Fix segfault on ppc64le
When generating a filesystem image on a power10 build machine running
Ubuntu, we see a segfault when fakeroot is running chmod.

This has been reported and fixed upstream in Debian in version 1.26-1.2:

 https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=995393#53

Add the same patch to resolve the segfault.

Signed-off-by: Joel Stanley <joel@jms.id.au>
[Arnout: add patch signoff and give proper name (check-package)]
Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
2022-03-24 21:10:36 +01:00

62 lines
2.8 KiB
Diff

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