From 9ea3b0192f4f5bf36715957ab919bffbb24e9710 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Fri, 12 Jan 2007 15:09:57 +0000 Subject: [PATCH] * 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. --- ChangeLog | 7 +++++++ sunrpc/Makefile | 2 +- sunrpc/xdr_mem.c | 10 ++++++---- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 97461c2398..3785256cd4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2006-10-17 Jakub Jelinek + + * 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. + 2006-10-16 Ulrich Drepper [BZ #3369] 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; }