|
@@ -315,11 +315,39 @@ static inline void *__si_bounds_upper(siginfo_t *si)
|
|
|
return si->si_upper;
|
|
|
}
|
|
|
#else
|
|
|
+
|
|
|
+/*
|
|
|
+ * This deals with old version of _sigfault in some distros:
|
|
|
+ *
|
|
|
+
|
|
|
+old _sigfault:
|
|
|
+ struct {
|
|
|
+ void *si_addr;
|
|
|
+ } _sigfault;
|
|
|
+
|
|
|
+new _sigfault:
|
|
|
+ struct {
|
|
|
+ void __user *_addr;
|
|
|
+ int _trapno;
|
|
|
+ short _addr_lsb;
|
|
|
+ union {
|
|
|
+ struct {
|
|
|
+ void __user *_lower;
|
|
|
+ void __user *_upper;
|
|
|
+ } _addr_bnd;
|
|
|
+ __u32 _pkey;
|
|
|
+ };
|
|
|
+ } _sigfault;
|
|
|
+ *
|
|
|
+ */
|
|
|
+
|
|
|
static inline void **__si_bounds_hack(siginfo_t *si)
|
|
|
{
|
|
|
void *sigfault = &si->_sifields._sigfault;
|
|
|
void *end_sigfault = sigfault + sizeof(si->_sifields._sigfault);
|
|
|
- void **__si_lower = end_sigfault;
|
|
|
+ int *trapno = (int*)end_sigfault;
|
|
|
+ /* skip _trapno and _addr_lsb */
|
|
|
+ void **__si_lower = (void**)(trapno + 2);
|
|
|
|
|
|
return __si_lower;
|
|
|
}
|
|
@@ -331,7 +359,7 @@ static inline void *__si_bounds_lower(siginfo_t *si)
|
|
|
|
|
|
static inline void *__si_bounds_upper(siginfo_t *si)
|
|
|
{
|
|
|
- return (*__si_bounds_hack(si)) + sizeof(void *);
|
|
|
+ return *(__si_bounds_hack(si) + 1);
|
|
|
}
|
|
|
#endif
|
|
|
|