diff options
author | ngie <ngie@FreeBSD.org> | 2016-12-03 16:52:40 +0000 |
---|---|---|
committer | ngie <ngie@FreeBSD.org> | 2016-12-03 16:52:40 +0000 |
commit | 7e1697c9902f5cbbfaf68ccd4c9423153c76f3b3 (patch) | |
tree | 33033fa29bdb67ff59acf6834b09db207202329f /lib/libc/iconv/bsd_iconv.c | |
parent | f60eca04b095d5b8197f213dd199d2678846afe2 (diff) | |
download | FreeBSD-src-7e1697c9902f5cbbfaf68ccd4c9423153c76f3b3.zip FreeBSD-src-7e1697c9902f5cbbfaf68ccd4c9423153c76f3b3.tar.gz |
MFC r299704:
r299704 (by vangyzen):
iconvctl(3): remove superfluous NULL pointer tests
convname and dst are guaranteed to be non-NULL by iconv_open(3).
src is an array. Remove these tests for NULL pointers.
While I'm here, eliminate a strlcpy with a correct but suspicious-looking
calculation for the third parameter (i.e. not a simple sizeof).
Compare the strings in-place instead of copying.
Found by: bdrewery
Found by: Coverity
CID: 1130050, 1130056
Diffstat (limited to 'lib/libc/iconv/bsd_iconv.c')
-rw-r--r-- | lib/libc/iconv/bsd_iconv.c | 10 |
1 files changed, 4 insertions, 6 deletions
diff --git a/lib/libc/iconv/bsd_iconv.c b/lib/libc/iconv/bsd_iconv.c index e032a5b..cc1ea3d 100644 --- a/lib/libc/iconv/bsd_iconv.c +++ b/lib/libc/iconv/bsd_iconv.c @@ -259,8 +259,9 @@ __bsd_iconvctl(iconv_t cd, int request, void *argument) struct _citrus_iconv *cv; struct iconv_hooks *hooks; const char *convname; - char src[PATH_MAX], *dst; + char *dst; int *i; + size_t srclen; cv = (struct _citrus_iconv *)(void *)cd; hooks = (struct iconv_hooks *)argument; @@ -275,12 +276,9 @@ __bsd_iconvctl(iconv_t cd, int request, void *argument) case ICONV_TRIVIALP: convname = cv->cv_shared->ci_convname; dst = strchr(convname, '/'); - - strlcpy(src, convname, dst - convname + 1); + srclen = dst - convname; dst++; - if ((convname == NULL) || (src == NULL) || (dst == NULL)) - return (-1); - *i = strcmp(src, dst) == 0 ? 1 : 0; + *i = (srclen == strlen(dst)) && !memcmp(convname, dst, srclen); return (0); case ICONV_GET_TRANSLITERATE: *i = 1; |