aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJay Satiro <raysatiro@yahoo.com>2019-11-09 18:07:59 -0500
committerJay Satiro <raysatiro@yahoo.com>2019-11-09 18:07:59 -0500
commit07cf042ececdcdc2b731c7a2040a48f21dde85b6 (patch)
tree9a0ba692fb0a8d393d790417689181d0b452e3e2
parent8063c32209df2d8a90f0ad488188e7a9591db9c2 (diff)
strerror: Fix an error looking up some Windows error strings
- Use FORMAT_MESSAGE_IGNORE_INSERTS to ignore format specifiers in Windows error strings. Since we are not in control of the error code we don't know what information may be needed by the error string's format specifiers. Prior to this change Windows API error strings which contain specifiers (think specifiers like similar to printf specifiers) would not be shown. The FormatMessage Windows API call which turns a Windows error code into a string could fail and set error ERROR_INVALID_PARAMETER if that error string contained a format specifier. FormatMessage expects a va_list for the specifiers, unless inserts are ignored in which case no substitution is attempted. Ref: https://devblogs.microsoft.com/oldnewthing/20071128-00/?p=24353
-rw-r--r--lib/strerror.c6
-rw-r--r--tests/server/util.c3
2 files changed, 6 insertions, 3 deletions
diff --git a/lib/strerror.c b/lib/strerror.c
index d0650d80c..7aaa9f4a7 100644
--- a/lib/strerror.c
+++ b/lib/strerror.c
@@ -670,7 +670,8 @@ const char *Curl_strerror(int err, char *buf, size_t buflen)
wchar_t wbuf[256];
wbuf[0] = L'\0';
- FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, err,
+ FormatMessage((FORMAT_MESSAGE_FROM_SYSTEM |
+ FORMAT_MESSAGE_IGNORE_INSERTS), NULL, err,
LANG_NEUTRAL, wbuf, sizeof(wbuf)/sizeof(wchar_t), NULL);
wcstombs(buf, wbuf, max);
}
@@ -680,7 +681,8 @@ const char *Curl_strerror(int err, char *buf, size_t buflen)
strncpy(buf, strerror(err), max);
else {
if(!get_winsock_error(err, buf, max) &&
- !FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, err,
+ !FormatMessageA((FORMAT_MESSAGE_FROM_SYSTEM |
+ FORMAT_MESSAGE_IGNORE_INSERTS), NULL, err,
LANG_NEUTRAL, buf, (DWORD)max, NULL))
msnprintf(buf, max, "Unknown error %d (%#x)", err, err);
}
diff --git a/tests/server/util.c b/tests/server/util.c
index cc53d3bf4..263f0cece 100644
--- a/tests/server/util.c
+++ b/tests/server/util.c
@@ -150,7 +150,8 @@ void win32_perror(const char *msg)
char buf[512];
DWORD err = SOCKERRNO;
- if(!FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, err,
+ if(!FormatMessageA((FORMAT_MESSAGE_FROM_SYSTEM |
+ FORMAT_MESSAGE_IGNORE_INSERTS), NULL, err,
LANG_NEUTRAL, buf, sizeof(buf), NULL))
msnprintf(buf, sizeof(buf), "Unknown error %lu (%#lx)", err, err);
if(msg)