(lwpInitSystem): Stack checking doesn't work and is not necessary for
main thread; clear LWP_STACKCHECK. (lwpStackCheck): Log stack overflow/underflow and abort.
This commit is contained in:
parent
06c326fc5f
commit
75deff7811
1 changed files with 14 additions and 18 deletions
|
@ -50,7 +50,7 @@ extern char *strdup();
|
||||||
#endif /* NOSTRDUP */
|
#endif /* NOSTRDUP */
|
||||||
|
|
||||||
static void lwpStackCheckInit(struct lwpProc *newp);
|
static void lwpStackCheckInit(struct lwpProc *newp);
|
||||||
static int lwpStackCheck(struct lwpProc *newp);
|
static void lwpStackCheck(struct lwpProc *newp);
|
||||||
static void lwpStackCheckUsed(struct lwpProc *newp);
|
static void lwpStackCheckUsed(struct lwpProc *newp);
|
||||||
|
|
||||||
/* check stack direction */
|
/* check stack direction */
|
||||||
|
@ -444,7 +444,7 @@ lwpInitSystem(int pri, char **ctxptr, int flags)
|
||||||
LwpCurrent->sbtm = stack; /* dummy stack for "main" */
|
LwpCurrent->sbtm = stack; /* dummy stack for "main" */
|
||||||
LwpCurrent->pri = pri;
|
LwpCurrent->pri = pri;
|
||||||
LwpCurrent->dead = 0;
|
LwpCurrent->dead = 0;
|
||||||
LwpCurrent->flags = flags;
|
LwpCurrent->flags = flags & ~LWP_STACKCHECK;
|
||||||
LwpCurrent->name = "Main";
|
LwpCurrent->name = "Main";
|
||||||
for (i = LWP_MAX_PRIO, q = LwpSchedQ; i--; q++)
|
for (i = LWP_MAX_PRIO, q = LwpSchedQ; i--; q++)
|
||||||
q->head = q->tail = 0;
|
q->head = q->tail = 0;
|
||||||
|
@ -479,14 +479,9 @@ lwpStackCheckInit(struct lwpProc *newp)
|
||||||
/* lwpStackCheck
|
/* lwpStackCheck
|
||||||
*
|
*
|
||||||
* Check if the thread has overflowed/underflowed its stack.
|
* Check if the thread has overflowed/underflowed its stack.
|
||||||
* NOTE:
|
* Should that happen, abort the process, as we cannot recover.
|
||||||
* If an problem occurs, it is not corrected.
|
|
||||||
* The buffer is not cleaned up, nor is the thread terminated.
|
|
||||||
* Cleaning up the buffer would be a mistake, and terminating
|
|
||||||
* the thread, well, could be done. Should more like take
|
|
||||||
* down the entire process.
|
|
||||||
*/
|
*/
|
||||||
static int
|
static void
|
||||||
lwpStackCheck(struct lwpProc *newp)
|
lwpStackCheck(struct lwpProc *newp)
|
||||||
{
|
{
|
||||||
register int end, amt;
|
register int end, amt;
|
||||||
|
@ -495,8 +490,8 @@ lwpStackCheck(struct lwpProc *newp)
|
||||||
register int growsDown;
|
register int growsDown;
|
||||||
int marker;
|
int marker;
|
||||||
|
|
||||||
if (!newp || !newp->himark || !newp->lowmark)
|
if (CANT_HAPPEN(!newp || !newp->himark || !newp->lowmark))
|
||||||
return (1);
|
return;
|
||||||
growsDown = growsdown(&marker);
|
growsDown = growsdown(&marker);
|
||||||
for (lp = newp->himark, i = 0; i < LWP_REDZONE / sizeof(long);
|
for (lp = newp->himark, i = 0; i < LWP_REDZONE / sizeof(long);
|
||||||
i++, lp++) {
|
i++, lp++) {
|
||||||
|
@ -514,9 +509,10 @@ lwpStackCheck(struct lwpProc *newp)
|
||||||
} else {
|
} else {
|
||||||
amt = (i + 1) * sizeof(long);
|
amt = (i + 1) * sizeof(long);
|
||||||
}
|
}
|
||||||
lwpStatus(newp, "Thread stack overflowed %d bytes (of %u)",
|
logerror("Thread %s stack overflow %d bytes (of %u)",
|
||||||
amt, newp->size - 2 * LWP_REDZONE - (int)sizeof(stkalign_t));
|
newp->name, amt,
|
||||||
return (0);
|
newp->size - 2 * LWP_REDZONE - (int)sizeof(stkalign_t));
|
||||||
|
abort();
|
||||||
}
|
}
|
||||||
for (lp = newp->lowmark, i = 0; i < LWP_REDZONE / sizeof(long);
|
for (lp = newp->lowmark, i = 0; i < LWP_REDZONE / sizeof(long);
|
||||||
i++, lp++) {
|
i++, lp++) {
|
||||||
|
@ -534,11 +530,11 @@ lwpStackCheck(struct lwpProc *newp)
|
||||||
} else {
|
} else {
|
||||||
amt = (LWP_REDZONE - i + 1) * sizeof(long);
|
amt = (LWP_REDZONE - i + 1) * sizeof(long);
|
||||||
}
|
}
|
||||||
lwpStatus(newp, "Thread stack underflow %d bytes (of %u)",
|
logerror("Thread %s stack underflow %d bytes (of %u)",
|
||||||
amt, newp->size - 2 * LWP_REDZONE - (int)sizeof(stkalign_t));
|
newp->name, amt,
|
||||||
return (0);
|
newp->size - 2 * LWP_REDZONE - (int)sizeof(stkalign_t));
|
||||||
|
abort();
|
||||||
}
|
}
|
||||||
return (1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* lwpStackCheckUsed
|
/* lwpStackCheckUsed
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue