Bugzilla – Attachment 1193 Details for
Bug 1240
Better sigaction() emulation: No NULL dereferences
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Better sigaction() emulation on non-POSIX systems
sigact.c.patch (text/plain), 2.34 KB, created by
Ighighi
on 2006-10-01 22:00:06 AEST
(
hide
)
Description:
Better sigaction() emulation on non-POSIX systems
Filename:
MIME Type:
Creator:
Ighighi
Created:
2006-10-01 22:00:06 AEST
Size:
2.34 KB
patch
obsolete
># ># (!c) 2006 by Ighighi - ighighi at gmail.com ># ># This patch provides a better emulation of sigaction() and friends. ># ># Changes: ># + No NULL dereferences. ># + Use EINVAL for corner cases. ># + Added sigfillset(). ># > >--- sigact.c.orig Sun Oct 1 07:12:25 2006 >+++ sigact.c Sun Oct 1 07:31:00 2006 >@@ -37,6 +37,7 @@ > > #include "includes.h" > #include <signal.h> >+#include <errno.h> > #include "sigact.h" > > /* This file provides sigaction() emulation using sigvec() */ >@@ -47,43 +48,80 @@ > int > sigaction(int sig, struct sigaction *sigact, struct sigaction *osigact) > { >- return sigvec(sig, &(sigact->sv), &(osigact->sv)); >+ return sigvec(sig, (struct sigvec *) (sigact ? &(sigact->sv) : 0), >+ (struct sigvec *) (osigact ? &(osigact->sv) : 0)); > } > > int > sigemptyset (sigset_t * mask) > { >- *mask = 0; >- return 0; >+ if (mask) { >+ *mask = 0; >+ return 0; >+ } >+ else { >+ errno = EINVAL; >+ return -1; >+ } >+} >+ >+int >+sigfillset (sigset_t * mask) >+{ >+ if (mask) { >+ *mask = ~0; >+ return 0; >+ } >+ else { >+ errno = EINVAL; >+ return -1; >+ } > } > > int > sigprocmask (int mode, sigset_t * mask, sigset_t * omask) > { >- sigset_t current = sigsetmask(0); >+ sigset_t current = sigblock(0); > > if (omask) *omask = current; > >- if (mode==SIG_BLOCK) >- current |= *mask; >- else if (mode==SIG_UNBLOCK) >- current &= ~*mask; >- else if (mode==SIG_SETMASK) >- current = *mask; >+ if (mask) { >+ if (mode==SIG_BLOCK) >+ current |= *mask; >+ else if (mode==SIG_UNBLOCK) >+ current &= ~*mask; >+ else if (mode==SIG_SETMASK) >+ current = *mask; >+ else { >+ errno = EINVAL; >+ return -1; >+ } >+ sigsetmask(current); >+ } > >- sigsetmask(current); > return 0; > } > > int > sigsuspend (sigset_t * mask) > { >+ if (!mask) { >+ errno = EINVAL; >+ return -1; >+ } >+ >+ /* XXX - there's incompatible system call with the same name in SVR4 */ > return sigpause(*mask); > } > > int > sigdelset (sigset_t * mask, int sig) > { >+ if (!mask || sig < 1 || sig >= NSIG) { >+ errno = EINVAL; >+ return -1; >+ } >+ > *mask &= ~sigmask(sig); > return 0; > } >@@ -91,6 +129,11 @@ > int > sigaddset (sigset_t * mask, int sig) > { >+ if (!mask || sig < 1 || sig >= NSIG) { >+ errno = EINVAL; >+ return -1; >+ } >+ > *mask |= sigmask(sig); > return 0; > } >@@ -98,6 +141,11 @@ > int > sigismember (sigset_t * mask, int sig) > { >+ if (!mask || sig < 1 || sig >= NSIG) { >+ errno = EINVAL; >+ return -1; >+ } >+ > return (*mask & sigmask(sig)) != 0; > } >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 1240
:
1193
|
1527