diff options
-rw-r--r-- | nptl/ChangeLog | 8 | ||||
-rw-r--r-- | nptl/tst-context1.c | 56 | ||||
-rw-r--r-- | sunrpc/pmap_prot2.c | 6 |
3 files changed, 59 insertions, 11 deletions
diff --git a/nptl/ChangeLog b/nptl/ChangeLog index 71c89ddd1f..a835cf669a 100644 --- a/nptl/ChangeLog +++ b/nptl/ChangeLog @@ -1,3 +1,11 @@ +2004-06-15 Steven Munroe <sjmunroe@us.ibm.com> + + * tst-context1.c (GUARD_PATTERN): Defined. + (tst_context_t): Define struct containing ucontext_t & guard words. + (ctx): Declare as an array of tst_context_t. + (fct): Verify uc_link & guard words are still valid. + (tf): Initialize guard words in ctx. Adjust ctx refs for new struct. + 2004-06-13 Kaz Kojima <kkojima@rr.iij4u.or.jp> * sysdeps/unix/sysv/linux/sh/bits/pthreadtypes.h (pthread_cond_t): diff --git a/nptl/tst-context1.c b/nptl/tst-context1.c index 06e432b566..1a019ad000 100644 --- a/nptl/tst-context1.c +++ b/nptl/tst-context1.c @@ -25,11 +25,20 @@ #include <stdlib.h> #include <ucontext.h> - #define N 4 +#if __WORDSIZE == 64 +#define GUARD_PATTERN 0xdeadbeafdeadbeaf +#else +#define GUARD_PATTERN 0xdeadbeaf +#endif + +typedef struct { + ucontext_t uctx; + unsigned long guard[3]; + } tst_context_t; static char stacks[N][PTHREAD_STACK_MIN]; -static ucontext_t ctx[N][2]; +static tst_context_t ctx[N][2]; static volatile int failures; @@ -42,6 +51,29 @@ fct (long int n) printf ("%ld: in %s now, on_stack = %p\n", n, __FUNCTION__, on_stack); errno = 0; + if (ctx[n][1].uctx.uc_link != &ctx[n][0].uctx) + { + printf ("context[%ld][1] uc_link damaged, = %p\n", n, + ctx[n][1].uctx.uc_link); + exit (1); + } + + if ((ctx[n][0].guard[0] != GUARD_PATTERN) + || (ctx[n][0].guard[1] != GUARD_PATTERN) + || (ctx[n][0].guard[2] != GUARD_PATTERN)) + { + printf ("%ld: %s context[0] overflow detected!\n", n, __FUNCTION__); + ++failures; + } + + if ((ctx[n][1].guard[0] != GUARD_PATTERN) + || (ctx[n][1].guard[1] != GUARD_PATTERN) + || (ctx[n][1].guard[2] != GUARD_PATTERN)) + { + printf ("%ld: %s context[1] overflow detected!\n", n, __FUNCTION__); + ++failures; + } + if (n < 0 || n >= N) { printf ("%ld out of range\n", n); @@ -61,7 +93,15 @@ tf (void *arg) { int n = (int) (long int) arg; - if (getcontext (&ctx[n][1]) != 0) + ctx[n][0].guard[0] = GUARD_PATTERN; + ctx[n][0].guard[1] = GUARD_PATTERN; + ctx[n][0].guard[2] = GUARD_PATTERN; + + ctx[n][1].guard[0] = GUARD_PATTERN; + ctx[n][1].guard[1] = GUARD_PATTERN; + ctx[n][1].guard[2] = GUARD_PATTERN; + + if (getcontext (&ctx[n][1].uctx) != 0) { printf ("%d: cannot get context: %m\n", n); exit (1); @@ -69,14 +109,14 @@ tf (void *arg) printf ("%d: %s: before makecontext\n", n, __FUNCTION__); - ctx[n][1].uc_stack.ss_sp = stacks[n]; - ctx[n][1].uc_stack.ss_size = PTHREAD_STACK_MIN; - ctx[n][1].uc_link = &ctx[n][0]; - makecontext (&ctx[n][1], (void (*) (void)) fct, 1, (long int) n); + ctx[n][1].uctx.uc_stack.ss_sp = stacks[n]; + ctx[n][1].uctx.uc_stack.ss_size = PTHREAD_STACK_MIN; + ctx[n][1].uctx.uc_link = &ctx[n][0].uctx; + makecontext (&ctx[n][1].uctx, (void (*) (void)) fct, 1, (long int) n); printf ("%d: %s: before swapcontext\n", n, __FUNCTION__); - if (swapcontext (&ctx[n][0], &ctx[n][1]) != 0) + if (swapcontext (&ctx[n][0].uctx, &ctx[n][1].uctx) != 0) { ++failures; printf ("%d: %s: swapcontext failed\n", n, __FUNCTION__); diff --git a/sunrpc/pmap_prot2.c b/sunrpc/pmap_prot2.c index aa1f8eb8ad..9dd4925a19 100644 --- a/sunrpc/pmap_prot2.c +++ b/sunrpc/pmap_prot2.c @@ -93,7 +93,7 @@ xdr_pmaplist (xdrs, rp) */ bool_t more_elements; int freeing = (xdrs->x_op == XDR_FREE); - struct pmaplist **next = NULL; + struct pmaplist *next = NULL; while (TRUE) { @@ -108,12 +108,12 @@ xdr_pmaplist (xdrs, rp) * before we free the current object ... */ if (freeing) - next = &((*rp)->pml_next); + next = (*rp)->pml_next; if (!INTUSE(xdr_reference) (xdrs, (caddr_t *) rp, (u_int) sizeof (struct pmaplist), (xdrproc_t) INTUSE(xdr_pmap))) return FALSE; - rp = freeing ? next : &((*rp)->pml_next); + rp = freeing ? &next : &((*rp)->pml_next); } } INTDEF(xdr_pmaplist) |