summaryrefslogtreecommitdiffstats
path: root/StdLib/LibC
diff options
context:
space:
mode:
authorDaryl McDaniel <daryl.mcdaniel@intel.com>2013-09-13 00:46:19 +0000
committerdarylm503 <darylm503@6f19259b-4bc3-4df7-8a09-765794883524>2013-09-13 00:46:19 +0000
commit3a2f8f421648cbf6282b66e28f69df0740b76467 (patch)
treed062cc34a14a89650b50a504ea7b893458f971a6 /StdLib/LibC
parentac7f472be7d0b78faf256bec5cba8a937a555133 (diff)
downloadedk2-3a2f8f421648cbf6282b66e28f69df0740b76467.tar.gz
edk2-3a2f8f421648cbf6282b66e28f69df0740b76467.tar.bz2
edk2-3a2f8f421648cbf6282b66e28f69df0740b76467.zip
StdLib: Fix pointer arithmetic issues in the strncasecmp function.
The original Linux code tried to be too fancy so the internal pointers got out of sync. Rewrote the function to at least be more clear. Regardless, it now works properly. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Daryl McDaniel <daryl.mcdaniel@intel.com> Reviewed by: matthew.stanbro@intel.com Reviewed by: erik.c.bjorge@intel.com git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@14664 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'StdLib/LibC')
-rw-r--r--StdLib/LibC/String/strncasecmp.c41
1 files changed, 22 insertions, 19 deletions
diff --git a/StdLib/LibC/String/strncasecmp.c b/StdLib/LibC/String/strncasecmp.c
index b3f6d05965..9cc1851ee2 100644
--- a/StdLib/LibC/String/strncasecmp.c
+++ b/StdLib/LibC/String/strncasecmp.c
@@ -1,4 +1,4 @@
-/** @file
+/** @file
strncasecmp implementation
Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
@@ -11,7 +11,7 @@
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
* Copyright (c) 1987, 1993
- * The Regents of the University of California. All rights reserved.
+ * The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -37,8 +37,8 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
- $NetBSD: strncasecmp.c,v 1.2 2007/06/04 18:19:27 christos Exp $
- strcasecmp.c 8.1 (Berkeley) 6/4/93
+ $NetBSD: strncasecmp.c,v 1.2 2007/06/04 18:19:27 christos Exp $
+ strcasecmp.c 8.1 (Berkeley) 6/4/93
**/
#include <LibConfig.h>
#include <sys/cdefs.h>
@@ -55,25 +55,28 @@ __weak_alias(strncasecmp,_strncasecmp)
#else
#include <lib/libkern/libkern.h>
#include <machine/limits.h>
-#endif
+#endif
int
strncasecmp(const char *s1, const char *s2, size_t n)
{
+ int CompareVal;
- _DIAGASSERT(s1 != NULL);
- _DIAGASSERT(s2 != NULL);
-
- if (n != 0) {
- const unsigned char *us1 = (const unsigned char *)s1,
- *us2 = (const unsigned char *)s2;
+ _DIAGASSERT(s1 != NULL);
+ _DIAGASSERT(s2 != NULL);
- do {
- if (tolower(*us1) != tolower(*us2++))
- return (tolower(*us1) - tolower(*--us2));
- if (*us1++ == '\0')
- break;
- } while (--n != 0);
- }
- return (0);
+ if (n != 0) {
+ do {
+ CompareVal = tolower(*s1) - tolower(*s2);
+ if (CompareVal != 0) {
+ return (CompareVal);
+ }
+ ++s1;
+ ++s2;
+ if (*s1 == '\0') {
+ break;
+ }
+ } while (--n != 0);
+ }
+ return (0);
}