|
@@ -3046,28 +3046,37 @@ format_win32_error(DWORD err)
|
|
|
{
|
|
|
TCHAR *str = NULL;
|
|
|
char *result;
|
|
|
+ DWORD n;
|
|
|
|
|
|
/* Somebody once decided that this interface was better than strerror(). */
|
|
|
- FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
|
|
+ n = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
|
|
FORMAT_MESSAGE_FROM_SYSTEM |
|
|
|
FORMAT_MESSAGE_IGNORE_INSERTS,
|
|
|
NULL, err,
|
|
|
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
|
|
- (LPVOID)&str,
|
|
|
+ (LPVOID)&str,
|
|
|
0, NULL);
|
|
|
|
|
|
- if (str) {
|
|
|
+ if (str && n) {
|
|
|
#ifdef UNICODE
|
|
|
- char abuf[1024] = {0};
|
|
|
- wcstombs(abuf,str,1024);
|
|
|
- result = tor_strdup(abuf);
|
|
|
+ size_t len;
|
|
|
+ if (n > 128*1024)
|
|
|
+ len = (128 * 1024) * 2 + 1; /* This shouldn't be possible, but let's
|
|
|
+ * make sure. */
|
|
|
+ else
|
|
|
+ len = n * 2 + 1;
|
|
|
+ result = tor_malloc(len);
|
|
|
+ wcstombs(result,str,len);
|
|
|
+ result[len-1] = '\0';
|
|
|
#else
|
|
|
result = tor_strdup(str);
|
|
|
#endif
|
|
|
- LocalFree(str); /* LocalFree != free() */
|
|
|
} else {
|
|
|
result = tor_strdup("<unformattable error>");
|
|
|
}
|
|
|
+ if (str) {
|
|
|
+ LocalFree(str); /* LocalFree != free() */
|
|
|
+ }
|
|
|
return result;
|
|
|
}
|
|
|
#endif
|