From 9af8d46e7794c323a69bed4a84dd73d5a8d05a8c Mon Sep 17 00:00:00 2001 From: Andrew Deason Date: Wed, 10 Mar 2010 14:15:58 -0600 Subject: [PATCH] vos: Avoid LWP stack overflow error on SIGINT vsproc's method of longjmp'ing out of a signal handler can thoroughly confuse LWP. At the very least, the information on our stack becomes incorrect, since we're no longer using the stack supplied by LWP. At the very least, we seem to (almost) always fail the sanity check checking for stack overflow. To prevent the test from happening, NULL the stack pointer before the longjmp so we can attempt recovery. FIXES 33360 Change-Id: Ie910cb1cc8564ac119c3b751fd8295bf312a3ce7 Reviewed-on: http://gerrit.openafs.org/1559 Tested-by: Andrew Deason Reviewed-by: Derrick Brashear Tested-by: Derrick Brashear --- src/volser/vsprocs.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/volser/vsprocs.c b/src/volser/vsprocs.c index 7728def30b..34686ca9cb 100644 --- a/src/volser/vsprocs.c +++ b/src/volser/vsprocs.c @@ -1146,8 +1146,16 @@ int interrupt = 0; static void * do_interrupt(void * unused) { - if (interrupt) + if (interrupt) { +#ifndef AFS_PTHREAD_ENV + /* Avoid LWP from getting confused that our stack has suddenly + * changed. This will avoid some sanity checks, but until a better way + * is found, the only alternative is always crashing and burning on at + * least the stack-overflow check. */ + lwp_cpptr->stack = NULL; +#endif longjmp(env, 0); + } fprintf(STDOUT, "\nSIGINT handler: vos move operation in progress\n"); fprintf(STDOUT,