diff options
author | dtucker <> | 2016-10-16 17:37:39 +0000 |
---|---|---|
committer | dtucker <> | 2016-10-16 17:37:39 +0000 |
commit | 1acc763f8abc805a5a68ff035a1f538b0d6ccf65 (patch) | |
tree | 9802b0cedab21e98c8a7def7761445293fbcba80 /src/lib/libc/string/strnlen.c | |
parent | a5593cbfdf09c39fb89451e83f00de99d806660f (diff) | |
download | openbsd-1acc763f8abc805a5a68ff035a1f538b0d6ccf65.tar.gz openbsd-1acc763f8abc805a5a68ff035a1f538b0d6ccf65.tar.bz2 openbsd-1acc763f8abc805a5a68ff035a1f538b0d6ccf65.zip |
Roll back uintptr_t cast changes after discussions with tedu, otto and
others.
C11 6.5.6.9 says:
When two pointers are subtracted, both shall point to elements of the
same array object, or one past the last element of the array object; the
result is the difference of the subscripts of the two array elements.
In these cases the objects are arrays of char so the result is defined,
and we believe that the report is based on a compiler incorrectly trapping
on defined behaviour.
Diffstat (limited to 'src/lib/libc/string/strnlen.c')
-rw-r--r-- | src/lib/libc/string/strnlen.c | 9 |
1 files changed, 2 insertions, 7 deletions
diff --git a/src/lib/libc/string/strnlen.c b/src/lib/libc/string/strnlen.c index 33c3b6e2ca..db809756ac 100644 --- a/src/lib/libc/string/strnlen.c +++ b/src/lib/libc/string/strnlen.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: strnlen.c,v 1.7 2016/10/14 18:19:04 dtucker Exp $ */ | 1 | /* $OpenBSD: strnlen.c,v 1.8 2016/10/16 17:37:39 dtucker Exp $ */ |
2 | 2 | ||
3 | /* | 3 | /* |
4 | * Copyright (c) 2010 Todd C. Miller <Todd.Miller@courtesan.com> | 4 | * Copyright (c) 2010 Todd C. Miller <Todd.Miller@courtesan.com> |
@@ -19,7 +19,6 @@ | |||
19 | #include <sys/types.h> | 19 | #include <sys/types.h> |
20 | 20 | ||
21 | #include <string.h> | 21 | #include <string.h> |
22 | #include <stdint.h> | ||
23 | 22 | ||
24 | size_t | 23 | size_t |
25 | strnlen(const char *str, size_t maxlen) | 24 | strnlen(const char *str, size_t maxlen) |
@@ -29,10 +28,6 @@ strnlen(const char *str, size_t maxlen) | |||
29 | for (cp = str; maxlen != 0 && *cp != '\0'; cp++, maxlen--) | 28 | for (cp = str; maxlen != 0 && *cp != '\0'; cp++, maxlen--) |
30 | ; | 29 | ; |
31 | 30 | ||
32 | /* | 31 | return (size_t)(cp - str); |
33 | * Cast pointers to unsigned type before calculation, to avoid signed | ||
34 | * overflow when the string ends where the MSB has changed. | ||
35 | */ | ||
36 | return (size_t)((uintptr_t)cp - (uintptr_t)str); | ||
37 | } | 32 | } |
38 | DEF_WEAK(strnlen); | 33 | DEF_WEAK(strnlen); |