Re: avr32: handle_signal() bug?

From: Matt Fleming
Date: Mon Aug 08 2011 - 06:26:02 EST


On Sun, 2011-08-07 at 10:20 -0700, HÃvard Skinnemoen wrote:
> Hi Matt,
>
> On Wed, Aug 3, 2011 at 2:04 AM, Matt Fleming <matt@xxxxxxxxxxxxxxxxx> wrote:
> > That doesn't look correct to me. Now, if we were unsuccessful in setting
> > up a signal frame, say, ret == -EFAULT, do we really want to block the
> > signal or any of the signals in the handler mask?
>
> I'm assuming this is a rhetorical question :-)

Sort of. I phrased it as a question so that someone could point out
whether my analysis was correct or not ;-)

> Looks good to me. I'm not sure how to test it though...I can try to
> build a kernel, run it on my board and see if it explodes, but I
> suspect this bug is a lot more subtle than that.

I suspect the best test would be one that makes use of SA_NODEFER.
Something like this,

#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

void handler(int signum)
{
sigset_t mask;

sigprocmask(SIG_BLOCK, NULL, &mask);
printf("SIGUSR2: %s\n",
sigismember(&mask, SIGUSR2) ? "blocked" : "not blocked");
printf("SIGTERM: %s\n",
sigismember(&mask, SIGTERM) ? "blocked" : "not blocked");
}

int main(int argc, char **argv)
{
pid_t pid;

pid = fork();
if (pid == -1) {
perror("fork");
exit(EXIT_FAILURE);
} else if (!pid) {
struct sigaction act;

memset(&act, 0, sizeof(act));
act.sa_handler = handler;
act.sa_flags = SA_NODEFER;

sigaddset(&act.sa_mask, SIGUSR2);
sigaddset(&act.sa_mask, SIGTERM);

sigaction(SIGUSR1, &act, NULL);

pause();
} else {
int status;

sleep(3);
kill(pid, SIGUSR1);
waitpid(pid, &status, 0);
}

return 0;
}

Without the patch applied I would expect this testcase to run the signal
handler without SIGUSR2 or SIGTERM blocked. With the patch I'd hope you
would see the following,

[matt@mfleming-mobl1 signal-tests]$ ./nodefer
SIGUSR2: blocked
SIGTERM: blocked

--
Matt Fleming, Intel Open Source Technology Center

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/