This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH] Save final 'error' in __nptl_setxid_error()
- From: Peter Zelezny <peter dot zelezny at dektech dot com dot au>
- To: libc-alpha at sourceware dot org
- Date: Tue, 19 Sep 2017 17:55:37 +1000
- Subject: [PATCH] Save final 'error' in __nptl_setxid_error()
- Authentication-results: sourceware.org; auth=none
Hi,
I recently got an abort() inside allocatestack.c::__nptl_setxid_error().
Unfortunately it's impossible to see the last error from the syscall (from kernel). It would be really invaluable to see this number, but it tends to be optimized out into registers, which are then clobbered by abort() itself.
I suggest the newest 'error' is placed into the cmdp structure (into memory), so that core dumps will contain this value.
Would something like this (patch attached) be reasonable?
--- glibc.orig/nptl/allocatestack.c 2017-09-19 12:58:11.456588117 +1000
+++ glibc/nptl/allocatestack.c 2017-09-19 12:59:43.906355264 +1000
@@ -1083,9 +1083,12 @@ __nptl_setxid_error (struct xid_command
int olderror = cmdp->error;
if (olderror == error)
break;
- if (olderror != -1)
+ if (olderror != -1) {
+ /* save error to memory so it's not lost in coredumps. */
+ cmdp->error = error;
/* Mismatch between current and previous results. */
abort ();
+ }
}
while (atomic_compare_and_exchange_bool_acq (&cmdp->error, error, -1));
}