summaryrefslogtreecommitdiff
path: root/sunrpc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2007-01-12 15:09:57 +0000
committerJakub Jelinek <jakub@redhat.com>2007-01-12 15:09:57 +0000
commit9ea3b0192f4f5bf36715957ab919bffbb24e9710 (patch)
treed08658df4c35b5f11d712200cb8b8949bbb209d8 /sunrpc
parent9b004c59dd78161f1b2ec49f9ea8d8a4c58f5e5e (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/Makefile2
-rw-r--r--sunrpc/xdr_mem.c10
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;
}