diff --git a/server/proxy/filters/filter_demo.c b/server/proxy/filters/filter_demo.c index 2653fec8d..55255f21f 100644 --- a/server/proxy/filters/filter_demo.c +++ b/server/proxy/filters/filter_demo.c @@ -29,7 +29,7 @@ static PF_FILTER_RESULT demo_filter_keyboard_event(connectionInfo* info, void* p static PF_FILTER_RESULT demo_filter_mouse_event(connectionInfo* info, void* param) { - proxyMouseEventInfo* event_data = (proxyMouseEventInfo*) param; + proxyMouseEventInfo* event_data = (proxyMouseEventInfo*) param; if (event_data->x % 100 == 0) { diff --git a/server/proxy/pf_config.c b/server/proxy/pf_config.c index 88841e60b..4802631b3 100644 --- a/server/proxy/pf_config.c +++ b/server/proxy/pf_config.c @@ -35,6 +35,9 @@ wArrayList* parse_string_array_from_str(const char* str) { wArrayList* list = ArrayList_New(FALSE); + char* s; + char* temp; + char* token; if (list == NULL) { @@ -42,9 +45,13 @@ wArrayList* parse_string_array_from_str(const char* str) return NULL; } - char* s = _strdup(str); - char* temp = s; - char* token; + + temp = s = _strdup(str); + if (!s) + { + WLog_ERR(TAG, "parse_string_array_from_str(): strdup failed!"); + return NULL; + } if (s == NULL) { @@ -115,6 +122,7 @@ DWORD pf_server_load_config(const char* path, proxyConfig* config) char** filters_names; int rc; int filters_count = 0; + UINT32 index; DWORD result = CONFIG_PARSE_ERROR; wIniFile* ini = IniFile_New(); @@ -182,9 +190,9 @@ DWORD pf_server_load_config(const char* path, proxyConfig* config) filters_names = IniFile_GetSectionKeyNames(ini, "Filters", &filters_count); - for (int i = 0; i < filters_count; i++) + for (index = 0; index < filters_count; index++) { - char* filter_name = filters_names[i]; + char* filter_name = filters_names[index]; const char* path = IniFile_GetKeyValueString(ini, "Filters", filter_name); if (!pf_filters_register_new(config->Filters, path, filter_name)) diff --git a/server/proxy/pf_filters.c b/server/proxy/pf_filters.c index 41bad3e8a..21c120f2c 100644 --- a/server/proxy/pf_filters.c +++ b/server/proxy/pf_filters.c @@ -122,7 +122,9 @@ PF_FILTER_RESULT pf_filters_run_by_type(filters_list* list, PF_FILTER_TYPE type, static void pf_filters_filter_free(proxyFilter* filter) { assert(filter != NULL); - FreeLibrary(filter->handle); + if (filter->handle) + FreeLibrary(filter->handle); + free(filter->name); free(filter->events); free(filter); @@ -130,11 +132,13 @@ static void pf_filters_filter_free(proxyFilter* filter) void pf_filters_unregister_all(filters_list* list) { + size_t count; + size_t index; + if (list == NULL) return; - const size_t count = (size_t) ArrayList_Count(list); - size_t index; + count = (size_t) ArrayList_Count(list); for (index = 0; index < count; index++) { @@ -159,7 +163,7 @@ BOOL pf_filters_register_new(filters_list* list, const char* module_path, const if (handle == NULL) { WLog_ERR(TAG, "pf_filters_register_new(): failed loading external module: %s", module_path); - goto error; + return FALSE; } if (!(fn = (filterInitFn) GetProcAddress(handle, FILTER_INIT_METHOD))) @@ -207,7 +211,6 @@ error: if (handle) FreeLibrary(handle); - free(events); - free(filter); + pf_filters_filter_free(filter); return FALSE; } diff --git a/server/proxy/pf_filters.h b/server/proxy/pf_filters.h index 8924bcade..d88cf72d3 100644 --- a/server/proxy/pf_filters.h +++ b/server/proxy/pf_filters.h @@ -57,19 +57,18 @@ PF_FILTER_RESULT pf_filters_run_by_type(filters_list* list, PF_FILTER_TYPE type, void* param); void pf_filters_unregister_all(filters_list* list); -#define RUN_FILTER(_filters,_type,_conn_info,_event_info,_cb,...) ({ \ - ({ BOOL result; switch(pf_filters_run_by_type(_filters,_type,_conn_info,_event_info)) { \ +#define RUN_FILTER(_filters,_type,_conn_info,_event_info,_ret,_cb,...) do { \ + switch(pf_filters_run_by_type(_filters,_type,_conn_info,_event_info)) { \ case FILTER_PASS: \ - result = _cb(__VA_ARGS__); \ + _ret = _cb(__VA_ARGS__); \ break; \ case FILTER_IGNORE: \ - result = TRUE; \ + _ret = TRUE; \ break; \ case FILTER_DROP: \ default: \ - result = FALSE; \ - }; result; \ - }); \ - }) + _ret = FALSE; \ + } \ + } while(0) #endif /* FREERDP_SERVER_PROXY_FILTERS_H */ diff --git a/server/proxy/pf_input.c b/server/proxy/pf_input.c index 396129224..01b8862c3 100644 --- a/server/proxy/pf_input.c +++ b/server/proxy/pf_input.c @@ -32,21 +32,22 @@ static BOOL pf_server_synchronize_event(rdpInput* input, UINT32 flags) static BOOL pf_server_keyboard_event(rdpInput* input, UINT16 flags, UINT16 code) { + BOOL result = FALSE; pServerContext* ps = (pServerContext*)input->context; pClientContext* pc = ps->pdata->pc; rdpContext* context = (rdpContext*) pc; proxyConfig* config = ps->pdata->config; + proxyKeyboardEventInfo event; if (!config->Keyboard) return TRUE; - proxyKeyboardEventInfo info = - { - .flags = flags, - .rdp_scan_code = code - }; - return RUN_FILTER(config->Filters, FILTER_TYPE_KEYBOARD, ps->pdata->info, &info, + event.flags = flags; + event.rdp_scan_code = code; + + RUN_FILTER(config->Filters, FILTER_TYPE_KEYBOARD, ps->pdata->info, &event, result, freerdp_input_send_keyboard_event, context->input, flags, code); + return result; } static BOOL pf_server_unicode_keyboard_event(rdpInput* input, UINT16 flags, UINT16 code) @@ -64,21 +65,23 @@ static BOOL pf_server_unicode_keyboard_event(rdpInput* input, UINT16 flags, UINT static BOOL pf_server_mouse_event(rdpInput* input, UINT16 flags, UINT16 x, UINT16 y) { + BOOL result = FALSE; pServerContext* ps = (pServerContext*)input->context; pClientContext* pc = ps->pdata->pc; rdpContext* context = (rdpContext*) pc; proxyConfig* config = ps->pdata->config; + proxyMouseEventInfo event; if (!config->Mouse) return TRUE; - proxyMouseEventInfo info = - { - .flags = flags, - .x = x, .y = y - }; - return RUN_FILTER(config->Filters, FILTER_TYPE_MOUSE, ps->pdata->info, &info, + event.flags = flags; + event.x = x; + event.y = y; + + RUN_FILTER(config->Filters, FILTER_TYPE_MOUSE, ps->pdata->info, &event, result, freerdp_input_send_mouse_event, context->input, flags, x, y); + return result; } static BOOL pf_server_extended_mouse_event(rdpInput* input, UINT16 flags, UINT16 x,