diff options
| author | Denys Vlasenko <vda.linux@googlemail.com> | 2009-09-09 01:34:30 +0200 | 
|---|---|---|
| committer | Denys Vlasenko <vda.linux@googlemail.com> | 2009-09-09 01:34:30 +0200 | 
| commit | 39142c932fccc38c3323a1d1ae9eb743d1bef01c (patch) | |
| tree | 31241ce468a0e56fb28e53851dccb71a14072ca4 /libc | |
| parent | daad89426b6fc2b2a3835d48d676e90860d2cd41 (diff) | |
sparc/sigaction.c: note possible bugs by comments. style fixes
no code is actually changed
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'libc')
| -rw-r--r-- | libc/sysdeps/linux/sparc/sigaction.c | 106 | 
1 files changed, 57 insertions, 49 deletions
| diff --git a/libc/sysdeps/linux/sparc/sigaction.c b/libc/sysdeps/linux/sparc/sigaction.c index 67db1c8f9..950fa2645 100644 --- a/libc/sysdeps/linux/sparc/sigaction.c +++ b/libc/sysdeps/linux/sparc/sigaction.c @@ -31,48 +31,52 @@  _syscall5(int, rt_sigaction, int, a, int, b, int, c, int, d, int, e); -static void __rt_sigreturn_stub (void); -static void __sigreturn_stub (void); +static void __rt_sigreturn_stub(void); +static void __sigreturn_stub(void); -int -__libc_sigaction (int sig, __const struct sigaction *act, struct sigaction *oact) +int __libc_sigaction(int sig, const struct sigaction *act, struct sigaction *oact)  { -    int ret; -    struct old_kernel_sigaction kact, koact; -    unsigned long stub = 0; -    int saved_errno = errno; -     -    if (act) -    { -        kact.k_sa_handler = act->sa_handler; -        memcpy (&kact.sa_mask, &act->sa_mask, sizeof(sigset_t)); -        if (((kact.sa_flags = act->sa_flags) & SA_SIGINFO)!= 0) -            stub = (unsigned long) &__rt_sigreturn_stub; -        else -            stub = (unsigned long) &__sigreturn_stub; -        stub -= 8; -        kact.sa_restorer = NULL; -    } -    /* XXX The size argument hopefully will have to be changed to the real size of the user-level sigset_t.  */ -    ret = rt_sigaction(sig,  -	(int)(act ? &kact : NULL),  -	(int)(oact ? &koact : NULL),  -	stub,  -	_NSIG / 8); +	int ret; +	struct old_kernel_sigaction kact, koact; +	unsigned long stub = 0; +	int saved_errno = errno; -    if (ret >= 0 || errno != ENOSYS) -    { -        if (oact && ret >= 0) -        { -            oact->sa_handler = koact.k_sa_handler; -            memcpy (&oact->sa_mask, &koact.sa_mask, sizeof (sigset_t)); -            oact->sa_flags = koact.sa_flags; -            oact->sa_restorer = koact.sa_restorer; -        } -        return ret; -    } -    __set_errno (saved_errno); -    return -1; +	if (act) { +		kact.k_sa_handler = act->sa_handler; +		// BUG?! kact.sa_mask is a long, but sigset_t is a vector +		// of longs and it may be bigger (in glibc, it _is_ bigger). +		// Should we do this instead? +		// kact.sa_mask = act->sa_mask.__val[0]; +		memcpy(&kact.sa_mask, &act->sa_mask, sizeof(sigset_t)); +		kact.sa_flags = act->sa_flags; +		if (kact.sa_flags & SA_SIGINFO) +			stub = (unsigned long) &__rt_sigreturn_stub; +		else +			stub = (unsigned long) &__sigreturn_stub; +		stub -= 8; +		kact.sa_restorer = NULL; +	} +	/* NB: kernel (as of 2.6.25) will return EINVAL +	 * if _NSIG / 8 does not match kernel's sizeof(sigset_t) */ +	ret = rt_sigaction(sig, +		(int)(act ? &kact : NULL), +		(int)(oact ? &koact : NULL), +		stub, +		_NSIG / 8); + +	// BUG?! if ret == -1, we return -1 but do not set errno?! +	if (ret >= 0 || errno != ENOSYS) { +		if (oact && ret >= 0) { +			oact->sa_handler = koact.k_sa_handler; +			// maybe oact->sa_mask.__val[0] = koact.sa_mask; ? +			memcpy(&oact->sa_mask, &koact.sa_mask, sizeof(sigset_t)); +			oact->sa_flags = koact.sa_flags; +			oact->sa_restorer = koact.sa_restorer; +		} +		return ret; +	} +	__set_errno(saved_errno); +	return -1;  }  #ifndef LIBC_SIGACTION @@ -81,18 +85,22 @@ libc_hidden_weak(sigaction)  #endif  static void -__rt_sigreturn_stub (void) +__rt_sigreturn_stub(void)  { -  __asm__ ("mov %0, %%g1\n\t" -          "ta  0x10\n\t" -          : /* no outputs */ -          : "i" (__NR_rt_sigreturn)); +	__asm__( +		"mov %0, %%g1\n\t" +		"ta  0x10\n\t" +		: /* no outputs */ +		: "i" (__NR_rt_sigreturn) +	);  }  static void -__sigreturn_stub (void) +__sigreturn_stub(void)  { -  __asm__ ("mov %0, %%g1\n\t" -          "ta  0x10\n\t" -          : /* no outputs */ -          : "i" (__NR_sigreturn)); +	__asm__( +		"mov %0, %%g1\n\t" +		"ta  0x10\n\t" +		: /* no outputs */ +		: "i" (__NR_sigreturn) +	);  } | 
