diff options
author | Jakub Jelinek <jakub@redhat.com> | 2007-01-12 15:09:57 +0000 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2007-01-12 15:09:57 +0000 |
commit | 9ea3b0192f4f5bf36715957ab919bffbb24e9710 (patch) | |
tree | d08658df4c35b5f11d712200cb8b8949bbb209d8 /sunrpc | |
parent | 9b004c59dd78161f1b2ec49f9ea8d8a4c58f5e5e (diff) |
* sunrpc/xdr_mem.c (xdrmem_setpos): Don't compare addresses
as signed longs, check for x_base + pos overflow.
* sunrpc/Makefile (tests): Add tst-xdrmem2.
* sunrpc/tst-xdrmem2.c: New test.
Diffstat (limited to 'sunrpc')
-rw-r--r-- | sunrpc/Makefile | 2 | ||||
-rw-r--r-- | sunrpc/xdr_mem.c | 10 |
2 files changed, 7 insertions, 5 deletions
diff --git a/sunrpc/Makefile b/sunrpc/Makefile index bc826affdd..4e169c713d 100644 --- a/sunrpc/Makefile +++ b/sunrpc/Makefile @@ -85,7 +85,7 @@ all: # Make this the default target; it will be defined in Rules. include ../Makeconfig -tests = tst-xdrmem +tests = tst-xdrmem tst-xdrmem2 xtests := tst-getmyaddr ifeq ($(have-thread-library),yes) diff --git a/sunrpc/xdr_mem.c b/sunrpc/xdr_mem.c index e3167de040..7b1261bbae 100644 --- a/sunrpc/xdr_mem.c +++ b/sunrpc/xdr_mem.c @@ -177,13 +177,15 @@ xdrmem_setpos (xdrs, pos) { caddr_t newaddr = xdrs->x_base + pos; caddr_t lastaddr = xdrs->x_private + xdrs->x_handy; + size_t handy = lastaddr - newaddr; - if ((long) newaddr > (long) lastaddr - || (UINT_MAX < LONG_MAX - && (long) UINT_MAX < (long) lastaddr - (long) newaddr)) + if (newaddr > lastaddr + || newaddr < xdrs->x_base + || handy != (u_int) handy) return FALSE; + xdrs->x_private = newaddr; - xdrs->x_handy = (long) lastaddr - (long) newaddr; + xdrs->x_handy = (u_int) handy; return TRUE; } |