Add function LongJmp which checks the parameters before calling
longjmp. I suspect that the occasional double panic may be the result of incorrect parameters to longjmp. This happens, of course, like the entire file, only with -DVINUMDEBUG.
This commit is contained in:
parent
738082e8b0
commit
1238689209
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=45082
@ -33,24 +33,65 @@
|
|||||||
* otherwise) arising in any way out of the use of this software, even if
|
* otherwise) arising in any way out of the use of this software, even if
|
||||||
* advised of the possibility of such damage.
|
* advised of the possibility of such damage.
|
||||||
*
|
*
|
||||||
* $Id: vinummemory.c,v 1.19 1998/12/30 06:22:26 grog Exp grog $
|
* $Id: vinummemory.c,v 1.20 1999/03/19 03:21:08 grog Exp grog $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define REALLYKERNEL
|
#define REALLYKERNEL
|
||||||
#include "opt_vinum.h"
|
#include "opt_vinum.h"
|
||||||
#include <dev/vinum/vinumhdr.h>
|
#include <dev/vinum/vinumhdr.h>
|
||||||
|
|
||||||
extern jmp_buf command_fail; /* return on a failed command */
|
|
||||||
|
|
||||||
#ifdef VINUMDEBUG
|
#ifdef VINUMDEBUG
|
||||||
|
jmp_buf command_fail; /* return on a failed command */
|
||||||
|
#undef longjmp /* this was defined as LongJmp */
|
||||||
|
void longjmp(jmp_buf, int); /* the kernel doesn't define this */
|
||||||
|
|
||||||
#include <dev/vinum/request.h>
|
#include <dev/vinum/request.h>
|
||||||
extern struct rqinfo rqinfo[];
|
extern struct rqinfo rqinfo[];
|
||||||
extern struct rqinfo *rqip;
|
extern struct rqinfo *rqip;
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Why aren't these declared anywhere? XXX */
|
#ifdef __i386__ /* check for validity */
|
||||||
int setjmp(jmp_buf);
|
void
|
||||||
void longjmp(jmp_buf, int);
|
LongJmp(jmp_buf buf, int retval)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* longjmp is not documented, not even jmp_buf.
|
||||||
|
* This is what's in i386/i386/support.s:
|
||||||
|
* ENTRY(longjmp)
|
||||||
|
* movl 4(%esp),%eax
|
||||||
|
* movl (%eax),%ebx restore ebx
|
||||||
|
* movl 4(%eax),%esp restore esp
|
||||||
|
* movl 8(%eax),%ebp restore ebp
|
||||||
|
* movl 12(%eax),%esi restore esi
|
||||||
|
* movl 16(%eax),%edi restore edi
|
||||||
|
* movl 20(%eax),%edx get rta
|
||||||
|
* movl %edx,(%esp) put in return frame
|
||||||
|
* xorl %eax,%eax return(1);
|
||||||
|
* incl %eax
|
||||||
|
* ret
|
||||||
|
*
|
||||||
|
* from which we deduce the structure of jmp_buf:
|
||||||
|
*/
|
||||||
|
struct JmpBuf {
|
||||||
|
int jb_ebx;
|
||||||
|
int jb_esp;
|
||||||
|
int jb_ebp;
|
||||||
|
int jb_esi;
|
||||||
|
int jb_edi;
|
||||||
|
int jb_eip;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct JmpBuf *jb = (struct JmpBuf *) buf;
|
||||||
|
|
||||||
|
if ((jb->jb_esp < 0xd0000000)
|
||||||
|
|| (jb->jb_ebp < 0xd0000000)
|
||||||
|
|| (jb->jb_eip < 0xe0000000))
|
||||||
|
panic("Invalid longjmp");
|
||||||
|
longjmp(buf, retval);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#define LongJmp longjmp /* just use the kernel function */
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
void
|
void
|
||||||
expand_table(void **table, int oldsize, int newsize)
|
expand_table(void **table, int oldsize, int newsize)
|
||||||
|
Loading…
Reference in New Issue
Block a user