Module Name: othersrc Committed By: dholland Date: Sat Mar 23 18:12:12 UTC 2013
Modified Files: othersrc/usr.bin/dholland-make2: suff.c Log Message: Rewrite SuffSuffIsSuffix to avoid potential undefined behavior. To generate a diff of this commit: cvs rdiff -u -r1.15 -r1.16 othersrc/usr.bin/dholland-make2/suff.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: othersrc/usr.bin/dholland-make2/suff.c diff -u othersrc/usr.bin/dholland-make2/suff.c:1.15 othersrc/usr.bin/dholland-make2/suff.c:1.16 --- othersrc/usr.bin/dholland-make2/suff.c:1.15 Sat Mar 23 18:02:58 2013 +++ othersrc/usr.bin/dholland-make2/suff.c Sat Mar 23 18:12:12 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: suff.c,v 1.15 2013/03/23 18:02:58 dholland Exp $ */ +/* $NetBSD: suff.c,v 1.16 2013/03/23 18:12:12 dholland Exp $ */ /* * Copyright (c) 1988, 1989, 1990, 1993 @@ -131,7 +131,7 @@ #include "hash.h" #include "dir.h" -MAKE_RCSID("$NetBSD: suff.c,v 1.15 2013/03/23 18:02:58 dholland Exp $"); +MAKE_RCSID("$NetBSD: suff.c,v 1.16 2013/03/23 18:12:12 dholland Exp $"); #define CLEANUP @@ -257,44 +257,27 @@ SuffStrIsPrefix(const char *pref, const return (*pref ? NULL : str); } -/*- - *----------------------------------------------------------------------- - * SuffSuffIsSuffix -- - * See if suff is a suffix of str. sd->ename should point to THE END - * of the string to check. (THE END == the null byte) - * - * Input: - * s possible suffix - * sd string to examine - * - * Results: - * NULL if it ain't, pointer to character in str before suffix if - * it is. - * - * Side Effects: - * None - *----------------------------------------------------------------------- +/* + * Check if SUFF is a suffix of NAME. If so, return a pointer to + * the position of the suffix in NAME; otherwise, NULL. */ static const char * -SuffSuffIsSuffix(const Suff *s, const char *name) +SuffSuffIsSuffix(const Suff *suff, const char *name) { size_t namelen; - const char *p1; /* Pointer into suffix name */ - const char *p2; /* Pointer into string being examined */ + const char *candidate; namelen = strlen(name); - if (namelen < s->nameLen) - return NULL; /* this string is shorter than the suffix */ - - p1 = s->name + s->nameLen; - p2 = name + namelen; - - while (p1 >= s->name && *p1 == *p2) { - p1--; - p2--; + if (namelen < suff->nameLen) { + /* this string is shorter than the suffix */ + return NULL; } - return (p1 == s->name - 1 ? p2 : NULL); + candidate = name + namelen - suff->nameLen; + if (!strcmp(candidate, suff->name)) { + return candidate; + } + return NULL; } /*- @@ -789,7 +772,7 @@ SuffRebuildGraph(GNode *transform, Suff const char *cp; Suff *s2; unsigned i, numsuffixes; - size_t matchlen; + size_t prefixlen; numsuffixes = sufflist_num(&sufflist); @@ -817,19 +800,11 @@ SuffRebuildGraph(GNode *transform, Suff */ cp = SuffSuffIsSuffix(s, transform->name); if (cp != NULL) { - /* - * For reasons best known to whoever wrote it, - * SuffSuffIsSuffix returns one less than the pointer to - * the suffix inside transform->name, instead of the - * pointer to the suffix. - */ - cp++; - - matchlen = cp - transform->name; + prefixlen = cp - transform->name; for (i=0; i<numsuffixes; i++) { s2 = sufflist_get(&sufflist, i); - if (s2->nameLen == matchlen && - !memcmp(s2->name, transform->name, matchlen)) { + if (s2->nameLen == prefixlen && + !memcmp(s2->name, transform->name, prefixlen)) { /* * Found it -- establish the proper relationship */ @@ -2102,7 +2077,7 @@ SuffFindNormalDeps(GNode *gn, struct src for (pos = 0; pos < num; pos++) { suff = sufflist_get(&sufflist, pos); - if (SuffSuffIsSuffix(suff, gn->name)) { + if (SuffSuffIsSuffix(suff, gn->name) != NULL) { /* * Next possible suffix...