From cbf7cd3db2f7e8c8951c2bbb101a52a264fc9f75 Mon Sep 17 00:00:00 2001 From: dkf Date: Mon, 22 Jan 2007 09:15:50 +0000 Subject: Fix [Bug 1631017] --- ChangeLog | 5 +++++ compat/memcmp.c | 50 ++++++++++++++++++++++++++++---------------------- 2 files changed, 33 insertions(+), 22 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8dc700f..e7ec041 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2007-01-22 Donal K. Fellows + + * compat/memcmp.c (memcmp): Reworked so that arithmetic is never + performed upon void pointers, since that is illegal. [Bug 1631017] + 2007-01-19 Donal K. Fellows * generic/tclCompile.c (TclCompileScript): Reduce the frequency with diff --git a/compat/memcmp.c b/compat/memcmp.c index 68e18c5..43202a5 100644 --- a/compat/memcmp.c +++ b/compat/memcmp.c @@ -1,25 +1,23 @@ -/* +/* * memcmp.c -- * * Source code for the "memcmp" library routine. * * Copyright (c) 1998 Sun Microsystems, Inc. * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. + * See the file "license.terms" for information on usage and redistribution of + * this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * SCCS: @(#) memcmp.c 1.2 98/01/19 10:48:58 + * RCS: @(#) $Id: memcmp.c,v 1.4 2007/01/22 09:15:50 dkf Exp $ */ #include "tclPort.h" /* - * Here is the prototype just in case it is not included - * in tclPort.h. + * Here is the prototype just in case it is not included in tclPort.h. */ -int memcmp _ANSI_ARGS_((CONST VOID *s1, - CONST VOID *s2, size_t n)); +int memcmp(CONST VOID *s1, CONST VOID *s2, size_t n); /* *---------------------------------------------------------------------- @@ -29,11 +27,10 @@ int memcmp _ANSI_ARGS_((CONST VOID *s1, * Compares two bytes sequences. * * Results: - * compares its arguments, looking at the first n - * bytes (each interpreted as an unsigned char), and returns - * an integer less than, equal to, or greater than 0, accord- - * ing as s1 is less than, equal to, or - * greater than s2 when taken to be unsigned 8 bit numbers. + * Compares its arguments, looking at the first n bytes (each interpreted + * as an unsigned char), and returns an integer less than, equal to, or + * greater than 0, according as s1 is less than, equal to, or greater + * than s2 when taken to be unsigned 8 bit numbers. * * Side effects: * None. @@ -42,19 +39,28 @@ int memcmp _ANSI_ARGS_((CONST VOID *s1, */ int -memcmp(s1, s2, n) - CONST VOID *s1; /* First string. */ - CONST VOID *s2; /* Second string. */ - size_t n; /* Length to compare. */ +memcmp( + CONST VOID *s1, /* First string. */ + CONST VOID *s2, /* Second string. */ + size_t n) /* Length to compare. */ { - unsigned char u1, u2; + CONST unsigned char *ptr1 = (CONST unsigned char *) s1; + CONST unsigned char *ptr2 = (CONST unsigned char *) s2; + + for ( ; n-- ; ptr1++, ptr2++) { + unsigned char u1 = *ptr1, u2 = *ptr2; - for ( ; n-- ; s1++, s2++) { - u1 = * (unsigned char *) s1; - u2 = * (unsigned char *) s2; - if ( u1 != u2) { + if (u1 != u2) { return (u1-u2); } } return 0; } + +/* + * Local Variables: + * mode: c + * c-basic-offset: 4 + * fill-column: 78 + * End: + */ -- cgit v0.12