From: Vincent Torri Date: Mon, 11 Dec 2017 06:06:02 +0000 (+0900) Subject: Evil: use static buffer to store error messages X-Git-Tag: submit/sandbox/upgrade/efl120/20180319.053334~1237 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=771bb6e6a79113fe86b9bd641d1418a78aee81ae;p=platform%2Fupstream%2Fefl.git Evil: use static buffer to store error messages Reviewers: cedric, jpeg Differential Revision: https://phab.enlightenment.org/D5394 --- diff --git a/src/lib/ecore/ecore_exe_win32.c b/src/lib/ecore/ecore_exe_win32.c index 80a4e70..204f13e 100644 --- a/src/lib/ecore/ecore_exe_win32.c +++ b/src/lib/ecore/ecore_exe_win32.c @@ -64,11 +64,7 @@ _ecore_exe_close_cb(void *data, /* FIXME : manage the STILL_ACTIVE returned error */ if (!GetExitCodeProcess(exe->process, &exit_code)) - { - char *msg = evil_last_error_get(); - DBG("%s", msg); - free(msg); - } + DBG("%s", evil_last_error_get()); e->exit_code = exit_code; e->exited = 1; @@ -498,16 +494,8 @@ _impl_ecore_exe_efl_object_finalize(Eo *obj, Ecore_Exe_Data *exe) if (!CreateProcess(shell, exe_cmd_buf, NULL, NULL, EINA_TRUE, run_pri | CREATE_SUSPENDED, NULL, NULL, &si, &pi)) { - char *msg; - - msg = evil_last_error_get(); - if (msg) - { - WRN("Failed to create process %s: %s", exe_cmd_buf, msg); - free(msg); - } - else - WRN("Failed to create process %s: %ld", exe_cmd_buf, GetLastError()); + WRN("Failed to create process %s: %s", + exe_cmd_buf, evil_last_error_get()); goto error; } diff --git a/src/lib/ecore/ecore_main.c b/src/lib/ecore/ecore_main.c index a854397..d72de0d 100644 --- a/src/lib/ecore/ecore_main.c +++ b/src/lib/ecore/ecore_main.c @@ -2594,13 +2594,7 @@ _ecore_main_win32_objects_wait(DWORD objects_nbr, { ERR("Error when waiting threads."); if (result == WAIT_FAILED) - { - char *str; - - str = evil_last_error_get(); - ERR("%s", str); - free(str); - } + ERR("%s", evil_last_error_get()); goto close_thread; } @@ -2755,11 +2749,7 @@ _ecore_main_win32_select(int nfds EINA_UNUSED, /* The result tells us the type of event we have. */ if (result == WAIT_FAILED) { - char *m; - - m = evil_last_error_get(); - WRN("%s", m); - free(m); + WRN("%s", evil_last_error_get()); res = -1; } else if (result == WAIT_TIMEOUT) diff --git a/src/lib/ecore_con/ecore_con_local_win32.c b/src/lib/ecore_con/ecore_con_local_win32.c index 9a5b731..126ccda 100644 --- a/src/lib/ecore_con/ecore_con_local_win32.c +++ b/src/lib/ecore_con/ecore_con_local_win32.c @@ -64,14 +64,7 @@ _ecore_con_local_win32_server_read_client_handler(void *data, Ecore_Win32_Handle if (broken_pipe) { #if 0 - char *msg; - - msg = evil_last_error_get(); - if (msg) - { - ecore_con_event_client_error(cl, msg); - free(msg); - } + ecore_con_event_client_error(cl, evil_last_error_get()); #endif _ecore_con_client_kill(obj); return ECORE_CALLBACK_CANCEL; @@ -99,12 +92,7 @@ _ecore_con_local_win32_server_peek_client_handler(void *data, Ecore_Win32_Handle return ECORE_CALLBACK_RENEW; #if 0 - msg = evil_last_error_get(); - if (msg) - { - ecore_con_event_server_error(host_svr, msg); - free(msg); - } + ecore_con_event_server_error(host_svr, evil_last_error_get()); #endif _ecore_con_server_kill(cl->host_server); return ECORE_CALLBACK_CANCEL; @@ -126,12 +114,7 @@ _ecore_con_local_win32_client_peek_server_handler(void *data, Ecore_Win32_Handle if (!ResetEvent(svr->event_peek)) return ECORE_CALLBACK_RENEW; #if 0 - msg = evil_last_error_get(); - if (msg) - { - ecore_con_event_server_error(svr, msg); - free(msg); - } + ecore_con_event_server_error(svr, evil_last_error_get()); #endif _ecore_con_server_kill(obj); return ECORE_CALLBACK_CANCEL; @@ -172,14 +155,7 @@ _ecore_con_local_win32_client_read_server_handler(void *data, Ecore_Win32_Handle if (broken_pipe) { #if 0 - char *msg; - - msg = evil_last_error_get(); - if (msg) - { - ecore_con_event_server_error(svr, msg); - free(msg); - } + ecore_con_event_server_error(svr, evil_last_error_get()); #endif _ecore_con_server_kill(obj); return ECORE_CALLBACK_CANCEL; @@ -686,14 +662,7 @@ ecore_con_local_win32_server_flush(Ecore_Con_Server *obj) res = WriteFile(svr->pipe, eina_binbuf_string_get(svr->buf) + svr->write_buf_offset, num, &written, NULL); if (!res) { - char *msg; - - msg = evil_last_error_get(); - if (msg) - { - ecore_con_event_server_error(obj, msg); - free(msg); - } + ecore_con_event_server_error(obj, evil_last_error_get()); _ecore_con_server_kill(obj); } @@ -737,14 +706,7 @@ ecore_con_local_win32_client_flush(Ecore_Con_Client *obj) res = WriteFile(svr->pipe, eina_binbuf_string_get(cl->buf) + cl->buf_offset, num, &written, NULL); if (!res) { - char *msg; - - msg = evil_last_error_get(); - if (msg) - { - ecore_con_event_client_error(obj, msg); - free(msg); - } + ecore_con_event_client_error(obj, evil_last_error_get()); _ecore_con_client_kill(obj); } diff --git a/src/lib/ecore_con/efl_net_dialer_windows.c b/src/lib/ecore_con/efl_net_dialer_windows.c index f174d2d..f96b731 100644 --- a/src/lib/ecore_con/efl_net_dialer_windows.c +++ b/src/lib/ecore_con/efl_net_dialer_windows.c @@ -66,9 +66,8 @@ _efl_net_dialer_windows_efl_net_dialer_dial(Eo *o, Efl_Net_Dialer_Windows_Data * case ERROR_INVALID_NAME: return EADDRNOTAVAIL; default: { - char *msg = evil_format_message(win32err); - ERR("CreateFile(%s): Unexpected win32err=%lu (%s)", pd->address_dial, win32err, msg); - free(msg); + ERR("CreateFile(%s): Unexpected win32err=%lu (%s)", + pd->address_dial, win32err, evil_format_message(win32err)); return EINVAL; } } @@ -85,9 +84,8 @@ _efl_net_dialer_windows_efl_net_dialer_dial(Eo *o, Efl_Net_Dialer_Windows_Data * snprintf(cstr, sizeof(cstr), "%s:%lu", address, cpid); else { - char *msg = evil_last_error_get(); - WRN("server=%p (%s) could not GetNamedPipeClientProcessId(o): %s", o, address, msg); - free(msg); + WRN("server=%p (%s) could not GetNamedPipeClientProcessId(o): %s", + o, address, evil_last_error_get()); eina_strlcpy(cstr, address, sizeof(cstr)); } @@ -95,9 +93,8 @@ _efl_net_dialer_windows_efl_net_dialer_dial(Eo *o, Efl_Net_Dialer_Windows_Data * snprintf(sstr, sizeof(sstr), "%s:%lu", address, spid); else { - char *msg = evil_last_error_get(); - WRN("server=%p (%s) could not GetNamedPipeServerProcessId(o): %s", o, address, msg); - free(msg); + WRN("server=%p (%s) could not GetNamedPipeServerProcessId(o): %s", + o, address, evil_last_error_get()); eina_strlcpy(sstr, address, sizeof(sstr)); } diff --git a/src/lib/ecore_con/efl_net_server_windows.c b/src/lib/ecore_con/efl_net_server_windows.c index 76dd5b0..5c8c489 100644 --- a/src/lib/ecore_con/efl_net_server_windows.c +++ b/src/lib/ecore_con/efl_net_server_windows.c @@ -61,9 +61,8 @@ _efl_net_server_windows_client_listen_success(void *data, Eo *client, DWORD used snprintf(cstr, sizeof(cstr), "%s:%lu", addr, cpid); else { - char *msg = evil_last_error_get(); - WRN("server=%p (%s) could not GetNamedPipeClientProcessId(client): %s", o, addr, msg); - free(msg); + WRN("server=%p (%s) could not GetNamedPipeClientProcessId(client): %s", + o, addr, evil_last_error_get()); eina_strlcpy(cstr, addr, sizeof(cstr)); } @@ -71,9 +70,8 @@ _efl_net_server_windows_client_listen_success(void *data, Eo *client, DWORD used snprintf(sstr, sizeof(sstr), "%s:%lu", addr, spid); else { - char *msg = evil_last_error_get(); - WRN("server=%p (%s) could not GetNamedPipeServerProcessId(client): %s", o, addr, msg); - free(msg); + WRN("server=%p (%s) could not GetNamedPipeServerProcessId(client): %s", + o, addr, evil_last_error_get()); eina_strlcpy(sstr, addr, sizeof(sstr)); } @@ -225,8 +223,8 @@ _efl_net_server_windows_client_new(Eo *o, Efl_Net_Server_Windows_Data *pd) case ERROR_INVALID_PARAMETER: return EINVAL; default: { - char *msg = evil_format_message(win32err); - ERR("Unexpected win32err=%lu (%s)", win32err, msg); + ERR("Unexpected win32err=%lu (%s)", + win32err, evil_format_message(win32err)); return EINVAL; } } diff --git a/src/lib/eina/eina_file_win32.c b/src/lib/eina/eina_file_win32.c index 9307b59..4cb0a22 100644 --- a/src/lib/eina/eina_file_win32.c +++ b/src/lib/eina/eina_file_win32.c @@ -737,16 +737,9 @@ eina_file_open(const char *path, Eina_Bool shared) if (handle == INVALID_HANDLE_VALUE) { - char *msg; - - msg = evil_last_error_get(); - if (msg) - { - WRN("eina_file_open() failed with file %s: %s", filename, msg); - free(msg); - } - else - goto free_file; + WRN("eina_file_open() failed with file %s: %s", + filename, evil_last_error_get()); + goto free_file; } if (!GetFileAttributesEx(filename, GetFileExInfoStandard, &fad)) diff --git a/src/lib/eio/eio_monitor_win32.c b/src/lib/eio/eio_monitor_win32.c index 05374f1..bfbb0ec 100644 --- a/src/lib/eio/eio_monitor_win32.c +++ b/src/lib/eio/eio_monitor_win32.c @@ -191,14 +191,7 @@ _eio_monitor_win32_cb(void *data, Ecore_Win32_Handler *wh EINA_UNUSED) &w->overlapped, NULL)) { - char *msg; - - msg = evil_last_error_get(); - if (msg) - { - ERR("%s", msg); - free(msg); - } + ERR("%s", evil_last_error_get()); return ECORE_CALLBACK_CANCEL; } @@ -271,14 +264,7 @@ _eio_monitor_win32_watcher_new(Eio_Monitor *monitor, &w->overlapped, NULL)) { - char *msg; - - msg = evil_last_error_get(); - if (msg) - { - ERR("%s", msg); - free(msg); - } + ERR("%s", evil_last_error_get()); goto close_event; } diff --git a/src/lib/evil/evil_dlfcn.c b/src/lib/evil/evil_dlfcn.c index fe1dc7d..1a7db5e 100644 --- a/src/lib/evil/evil_dlfcn.c +++ b/src/lib/evil/evil_dlfcn.c @@ -24,7 +24,7 @@ static int _dl_err_viewed = 0; static void _dl_get_last_error(char *desc) { - char *str; + const char *str; size_t l1; size_t l2; @@ -45,7 +45,6 @@ _dl_get_last_error(char *desc) memcpy(_dl_err + l1, str, l2); _dl_err[l1 + l2] = '\0'; } - free(str); _dl_err_viewed = 0; } diff --git a/src/lib/evil/evil_main.c b/src/lib/evil/evil_main.c index 8ddd85f..875d6c5 100644 --- a/src/lib/evil/evil_main.c +++ b/src/lib/evil/evil_main.c @@ -22,6 +22,8 @@ extern LONGLONG _evil_time_freq; extern LONGLONG _evil_time_count; extern long _evil_time_second; +extern DWORD _evil_tls_index; + long _evil_systemtime_to_time(SYSTEMTIME st); int @@ -96,3 +98,41 @@ evil_shutdown(void) return _evil_init_count; } + +BOOL WINAPI DllMain(HINSTANCE inst, DWORD reason, LPVOID reserved) +{ + LPVOID data; + + switch (reason) + { + case DLL_PROCESS_ATTACH: + _evil_tls_index = TlsAlloc(); + if (_evil_tls_index == TLS_OUT_OF_INDEXES) + return FALSE; + case DLL_THREAD_ATTACH: + data = (LPVOID)LocalAlloc(LPTR, 4096); + if (!data) + return FALSE; + if (!TlsSetValue(_evil_tls_index, data)) + return FALSE; + break; + case DLL_THREAD_DETACH: + data = TlsGetValue(_evil_tls_index); + if (data) + LocalFree((HLOCAL)data); + break; + case DLL_PROCESS_DETACH: + data = TlsGetValue(_evil_tls_index); + if (data) + LocalFree((HLOCAL)data); + TlsFree(_evil_tls_index); + break; + default: + break; + } + + return TRUE; + + (void)inst; + (void)reserved; +} diff --git a/src/lib/evil/evil_mman.c b/src/lib/evil/evil_mman.c index fca3c72..3f632e5 100644 --- a/src/lib/evil/evil_mman.c +++ b/src/lib/evil/evil_mman.c @@ -83,12 +83,8 @@ mmap(void *addr EVIL_UNUSED, fm = CreateFileMapping(handle, NULL, protect, 0, 0, NULL); if (!fm) { - char *str; - - str = evil_last_error_get(); - fprintf(stderr, "[Evil] [mmap] CreateFileMapping failed: %s\n", str); - free(str); - + fprintf(stderr, "[Evil] [mmap] CreateFileMapping failed: %s\n", + evil_last_error_get()); return MAP_FAILED; } @@ -117,12 +113,8 @@ mmap(void *addr EVIL_UNUSED, if (!data) { - char *str; - - str = evil_last_error_get(); - fprintf(stderr, "[Evil] [mmap] MapViewOfFile failed: %s\n", str); - free(str); - + fprintf(stderr, "[Evil] [mmap] MapViewOfFile failed: %s\n", + evil_last_error_get()); return MAP_FAILED; } @@ -137,13 +129,8 @@ munmap(void *addr, res = UnmapViewOfFile(addr); if (!res) - { - char *str; - - str = evil_last_error_get(); - fprintf(stderr, "[Evil] [munmap] UnmapViewOfFile failed: %s\n", str); - free(str); - } + fprintf(stderr, "[Evil] [munmap] UnmapViewOfFile failed: %s\n", + evil_last_error_get()); return (res == 0) ? -1 : 0; } diff --git a/src/lib/evil/evil_util.c b/src/lib/evil/evil_util.c index 4f74353..36ee38e 100644 --- a/src/lib/evil/evil_util.c +++ b/src/lib/evil/evil_util.c @@ -17,6 +17,7 @@ #include "evil_macro.h" #include "evil_util.h" +DWORD _evil_tls_index; /* static void _evil_error_display(const char *fct, LONG res); */ static void _evil_last_error_display(const char *fct); @@ -113,12 +114,12 @@ evil_utf16_to_utf8(const wchar_t *text16) return text8; } -char * +const char * evil_format_message(long err) { + char *buf; LPTSTR msg; char *str; - char *disp; if (!FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, @@ -128,10 +129,10 @@ evil_format_message(long err) 0, NULL)) { - char buf[4096]; - - snprintf(buf, 4096, "FormatMessage failed with error %ld\n", GetLastError()); - return strdup(buf); + buf = (char *)TlsGetValue(_evil_tls_index); + snprintf(buf, 4096, + "FormatMessage failed with error %ld\n", GetLastError()); + return (const char *)buf; } #ifdef UNICODE @@ -140,15 +141,8 @@ evil_format_message(long err) str = msg; #endif /* UNICODE */ - disp = (char *)malloc((strlen(str) + strlen("(00000) ") + 1) * sizeof(char)); - if (!disp) - { - LocalFree(msg); - return NULL; - } - - snprintf(disp, strlen(str) + strlen("(00000) ") + 1, - "(%5ld) %s", err, str); + buf = (char *)TlsGetValue(_evil_tls_index); + snprintf(buf, 4096, "(%5ld) %s", err, str); #ifdef UNICODE free(str); @@ -156,10 +150,10 @@ evil_format_message(long err) LocalFree(msg); - return disp; + return (const char *)buf; } -char * +const char * evil_last_error_get(void) { DWORD err; @@ -171,11 +165,7 @@ evil_last_error_get(void) static void _evil_last_error_display(const char *fct) { - char *error; - - error = evil_last_error_get(); - fprintf(stderr, "[Evil] [%s] ERROR: %s\n", fct, error); - free(error); + fprintf(stderr, "[Evil] [%s] ERROR: %s\n", fct, evil_last_error_get()); } diff --git a/src/lib/evil/evil_util.h b/src/lib/evil/evil_util.h index 8392d96..6b3e504 100644 --- a/src/lib/evil/evil_util.h +++ b/src/lib/evil/evil_util.h @@ -59,9 +59,9 @@ EAPI char *evil_wchar_to_char(const wchar_t *text); */ EAPI char *evil_utf16_to_utf8(const wchar_t *text); -EAPI char *evil_format_message(long err); +EAPI const char *evil_format_message(long err); -EAPI char *evil_last_error_get(void); +EAPI const char *evil_last_error_get(void); /** * @brief Return a dir to store temporary files.