aboutsummaryrefslogtreecommitdiffstats
path: root/wsutil/win32-utils.c
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2019-02-01 11:24:16 -0800
committerGuy Harris <guy@alum.mit.edu>2019-02-01 20:35:05 +0000
commitb3bb4aa8f4ee948041442f2e35fb0a4aa3d28667 (patch)
tree80330ba41e64f61a529dc23f0506c72091c93e82 /wsutil/win32-utils.c
parent961d8bfc5d37edf5f3361f4cf0f4e251175de1fc (diff)
Have win32strerror() return interned strings.
That's what g_strerror() does, and it means that the caller doesn't need to free the string (it's kept around, and if another call to win32strerror() generates the same string, the interned string is returned). Change-Id: I564bb700fabe2629131fb1c6468494dd5f5fc9e3 Reviewed-on: https://code.wireshark.org/review/31854 Petri-Dish: Guy Harris <guy@alum.mit.edu> Tested-by: Petri Dish Buildbot Reviewed-by: Guy Harris <guy@alum.mit.edu>
Diffstat (limited to 'wsutil/win32-utils.c')
-rw-r--r--wsutil/win32-utils.c37
1 files changed, 18 insertions, 19 deletions
diff --git a/wsutil/win32-utils.c b/wsutil/win32-utils.c
index 56b6df74bb..3850868e80 100644
--- a/wsutil/win32-utils.c
+++ b/wsutil/win32-utils.c
@@ -83,8 +83,7 @@ protect_arg (const gchar *argv)
}
/*
- * Generate a UTF-8 string for a Win32 error.
- * The string must be freed with g_free().
+ * Generate a UTF-8 string for a Windows error.
*/
/*
@@ -93,13 +92,14 @@ protect_arg (const gchar *argv)
* did Microsoft bother supporting a minimum buffer size?)
*/
#define ERRBUF_SIZE 128
-char *
+const char *
win32strerror(DWORD error)
{
DWORD retval;
WCHAR *utf16_message;
- char *msg;
char *utf8_message;
+ char *tempmsg;
+ const char *msg;
/*
* XXX - what language ID to use?
@@ -119,8 +119,10 @@ win32strerror(DWORD error)
(LPTSTR)&utf16_message, ERRBUF_SIZE, NULL);
if (retval == 0) {
/* Failed. */
- msg = g_strdup_printf("Couldn't get error message for error (%lu) (because %lu)",
- error, GetLastError());
+ tempmsg = g_strdup_printf("Couldn't get error message for error (%lu) (because %lu)",
+ error, GetLastError());
+ msg = g_intern_string(tempmsg);
+ g_free(tempmsg);
return msg;
}
@@ -128,12 +130,16 @@ win32strerror(DWORD error)
LocalFree(utf16_message);
if (utf8_message == NULL) {
/* Conversion failed. */
- msg = g_strdup_printf("Couldn't convert error message for error to UTF-8 (%lu) (because %lu)",
- error, GetLastError());
+ tempmsg = g_strdup_printf("Couldn't convert error message for error to UTF-8 (%lu) (because %lu)",
+ error, GetLastError());
+ msg = g_intern_string(tempmsg);
+ g_free(tempmsg);
return msg;
}
- msg = g_strdup_printf("%s (%lu)", utf8_message, error);
+ tempmsg = g_strdup_printf("%s (%lu)", utf8_message, error);
g_free(utf8_message);
+ msg = g_intern_string(tempmsg);
+ g_free(tempmsg);
return msg;
}
@@ -189,15 +195,12 @@ win32strexception(DWORD exception)
static void win32_kill_child_on_exit(HANDLE child_handle) {
static HANDLE cjo_handle = NULL;
- char *errmsg;
if (!cjo_handle) {
cjo_handle = CreateJobObject(NULL, _T("Local\\Wireshark child process cleanup"));
if (!cjo_handle) {
- errmsg = win32strerror(GetLastError());
g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, "Could not create child cleanup job object: %s",
- errmsg);
- g_free(errmsg);
+ win32strerror(GetLastError()));
return;
}
@@ -206,19 +209,15 @@ static void win32_kill_child_on_exit(HANDLE child_handle) {
BOOL sijo_ret = SetInformationJobObject(cjo_handle, JobObjectExtendedLimitInformation,
&cjo_jel_info, sizeof(cjo_jel_info));
if (!sijo_ret) {
- errmsg = win32strerror(GetLastError());
g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, "Could not set child cleanup limits: %s",
- errmsg);
- g_free(errmsg);
+ win32strerror(GetLastError()));
}
}
BOOL aptjo_ret = AssignProcessToJobObject(cjo_handle, child_handle);
if (!aptjo_ret) {
- errmsg = win32strerror(GetLastError());
g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, "Could not assign child cleanup process: %s",
- errmsg);
- g_free(errmsg);
+ win32strerror(GetLastError()));
}
}