lib: reduce use of strncpy

- bearssl: select cipher without buffer copies
- http_aws_sigv4: avoid strncpy, require exact timestamp length
- http_aws_sigv4: use memcpy isntead of strncpy
- openssl: avoid strncpy calls
- schannel: check for 1.3 algos without buffer copies
- strerror: avoid strncpy calls
- telnet: avoid strncpy, return error on too long inputs
- vtls: avoid strncpy in multissl_version()

Closes #12499
This commit is contained in:
Daniel Stenberg 2023-12-11 16:15:57 +01:00
parent 9efdefe6b1
commit ff74cef5d4
No known key found for this signature in database
GPG key ID: 5CC908FDB71E12C2
7 changed files with 101 additions and 98 deletions

View file

@ -572,13 +572,15 @@ curl_url_strerror(CURLUcode error)
* Returns NULL if no error message was found for error code.
*/
static const char *
get_winsock_error (int err, char *buf, size_t len)
get_winsock_error(int err, char *buf, size_t len)
{
#ifndef CURL_DISABLE_VERBOSE_STRINGS
const char *p;
#endif
if(!len)
/* 41 bytes is the longest error string */
DEBUGASSERT(len > 41);
if(!len || len < 41)
return NULL;
*buf = '\0';
@ -755,8 +757,8 @@ get_winsock_error (int err, char *buf, size_t len)
default:
return NULL;
}
strncpy(buf, p, len);
buf [len-1] = '\0';
memcpy(buf, p, len - 1);
buf[len - 1] = '\0';
return buf;
#endif
}
@ -832,7 +834,6 @@ const char *Curl_strerror(int err, char *buf, size_t buflen)
#endif
int old_errno = errno;
char *p;
size_t max;
if(!buflen)
return NULL;
@ -841,23 +842,22 @@ const char *Curl_strerror(int err, char *buf, size_t buflen)
DEBUGASSERT(err >= 0);
#endif
max = buflen - 1;
*buf = '\0';
#if defined(_WIN32) || defined(_WIN32_WCE)
#if defined(_WIN32)
/* 'sys_nerr' is the maximum errno number, it is not widely portable */
if(err >= 0 && err < sys_nerr)
strncpy(buf, sys_errlist[err], max);
msnprintf(buf, buflen, "%s", sys_errlist[err]);
else
#endif
{
if(
#ifdef USE_WINSOCK
!get_winsock_error(err, buf, max) &&
!get_winsock_error(err, buf, buflen) &&
#endif
!get_winapi_error((DWORD)err, buf, max))
msnprintf(buf, max, "Unknown error %d (%#x)", err, err);
!get_winapi_error((DWORD)err, buf, buflen))
msnprintf(buf, buflen, "Unknown error %d (%#x)", err, err);
}
#else /* not Windows coming up */
@ -867,9 +867,9 @@ const char *Curl_strerror(int err, char *buf, size_t buflen)
* storage is supplied via 'strerrbuf' and 'buflen' to hold the generated
* message string, or EINVAL if 'errnum' is not a valid error number.
*/
if(0 != strerror_r(err, buf, max)) {
if(0 != strerror_r(err, buf, buflen)) {
if('\0' == buf[0])
msnprintf(buf, max, "Unknown error %d", err);
msnprintf(buf, buflen, "Unknown error %d", err);
}
#elif defined(HAVE_STRERROR_R) && defined(HAVE_GLIBC_STRERROR_R)
/*
@ -881,25 +881,23 @@ const char *Curl_strerror(int err, char *buf, size_t buflen)
char buffer[256];
char *msg = strerror_r(err, buffer, sizeof(buffer));
if(msg)
strncpy(buf, msg, max);
msnprintf(buf, buflen, "%s", msg);
else
msnprintf(buf, max, "Unknown error %d", err);
msnprintf(buf, buflen, "Unknown error %d", err);
}
#else
{
/* !checksrc! disable STRERROR 1 */
const char *msg = strerror(err);
if(msg)
strncpy(buf, msg, max);
msnprintf(buf, buflen, "%s", msg);
else
msnprintf(buf, max, "Unknown error %d", err);
msnprintf(buf, buflen, "Unknown error %d", err);
}
#endif
#endif /* end of not Windows */
buf[max] = '\0'; /* make sure the string is null-terminated */
/* strip trailing '\r\n' or '\n'. */
p = strrchr(buf, '\n');
if(p && (p - buf) >= 2)
@ -943,8 +941,8 @@ const char *Curl_winapi_strerror(DWORD err, char *buf, size_t buflen)
#else
{
const char *txt = (err == ERROR_SUCCESS) ? "No error" : "Error";
strncpy(buf, txt, buflen);
buf[buflen - 1] = '\0';
if(strlen(txt) < buflen)
strcpy(buf, txt);
}
#endif
@ -1081,17 +1079,11 @@ const char *Curl_sspi_strerror(int err, char *buf, size_t buflen)
err);
}
else {
char txtbuf[80];
char msgbuf[256];
msnprintf(txtbuf, sizeof(txtbuf), "%s (0x%08X)", txt, err);
if(get_winapi_error(err, msgbuf, sizeof(msgbuf)))
msnprintf(buf, buflen, "%s - %s", txtbuf, msgbuf);
else {
strncpy(buf, txtbuf, buflen);
buf[buflen - 1] = '\0';
}
msnprintf(buf, buflen, "%s (0x%08X) - %s", txt, err, msgbuf);
else
msnprintf(buf, buflen, "%s (0x%08X)", txt, err);
}
#else
@ -1099,8 +1091,8 @@ const char *Curl_sspi_strerror(int err, char *buf, size_t buflen)
txt = "No error";
else
txt = "Error";
strncpy(buf, txt, buflen);
buf[buflen - 1] = '\0';
if(buflen > strlen(txt))
strcpy(buf, txt);
#endif
if(errno != old_errno)