From 3eca016fc7d77832f7c6c67439f9bb10e19174fb Mon Sep 17 00:00:00 2001 From: henrypp Date: Wed, 6 May 2020 13:34:58 +0600 Subject: [PATCH] fixed map cleanup npe --- src/helper.cpp | 27 +++++++++++++-------------- src/helper.hpp | 2 +- src/main.cpp | 2 +- src/profile.cpp | 32 +++----------------------------- 4 files changed, 18 insertions(+), 45 deletions(-) diff --git a/src/helper.cpp b/src/helper.cpp index f27fa49a..c5e45732 100644 --- a/src/helper.cpp +++ b/src/helper.cpp @@ -127,7 +127,7 @@ bool _app_formataddress (ADDRESS_FAMILY af, UINT8 proto, const PVOID ptr_addr, U _r_str_cat (formatted_address, _countof (formatted_address), _r_fmt (L" (%s)", ptr_cache)); _r_fastlock_acquireexclusive (&lock_cache); - _app_freeobjects_map (cache_hosts, false); + _app_freeobjects_map (cache_hosts, UMAP_CACHE_LIMIT); _r_fastlock_releaseexclusive (&lock_cache); cache_hosts[addr_hash] = _r_obj_allocate (ptr_cache, &_app_dereferencestring); @@ -163,20 +163,19 @@ rstring _app_formatport (UINT16 port, bool is_noempty) return result; } -void _app_freeobjects_map (OBJECTS_MAP& ptr_map, bool is_forced) +void _app_freeobjects_map (OBJECTS_MAP& ptr_map, size_t max_size) { - if (is_forced || ptr_map.size () >= UMAP_CACHE_LIMIT) + for (auto &it = ptr_map.end (); it-- != ptr_map.begin ();) { - for (auto &it = ptr_map.end (); it-- != ptr_map.begin ();) - { - PR_OBJECT ptr_object = _r_obj_reference (it->second); + if (max_size && max_size >= ptr_map.size ()) + break; - if (ptr_object) - _r_obj_dereferenceex (ptr_object, 2); + PR_OBJECT ptr_object = _r_obj_reference (it->second); - ptr_map.erase (it); + if (ptr_object) + _r_obj_dereferenceex (ptr_object, 2); - } + ptr_map.erase (it->first); } } @@ -411,7 +410,7 @@ PR_OBJECT _app_getsignatureinfo (size_t app_hash, const PITEM_APP ptr_app) if (CertGetNameString (psProvCert->pCert, CERT_NAME_ATTR_TYPE, 0, szOID_COMMON_NAME, ptr_cache, num_chars) > 1) { _r_fastlock_acquireexclusive (&lock_cache); - _app_freeobjects_map (cache_signatures, false); + _app_freeobjects_map (cache_signatures, UMAP_CACHE_LIMIT); _r_fastlock_releaseexclusive (&lock_cache); cache_signatures[app_hash] = _r_obj_allocate (ptr_cache, &_app_dereferencestring); @@ -533,7 +532,7 @@ PR_OBJECT _app_getversioninfo (size_t app_hash, const PITEM_APP ptr_app) if (_r_str_alloc (&ptr_cache, buffer.GetLength (), buffer)) { _r_fastlock_acquireexclusive (&lock_cache); - _app_freeobjects_map (cache_versions, false); + _app_freeobjects_map (cache_versions, UMAP_CACHE_LIMIT); _r_fastlock_releaseexclusive (&lock_cache); cache_versions[app_hash] = _r_obj_allocate (ptr_cache, &_app_dereferencestring); @@ -2465,7 +2464,7 @@ bool _app_parsenetworkstring (LPCWSTR network_string, NET_ADDRESS_FORMAT * forma if (_r_str_alloc (&ptr_cache, host.GetLength (), host)) { _r_fastlock_acquireexclusive (&lock_cache); - _app_freeobjects_map (cache_dns, false); + _app_freeobjects_map (cache_dns, UMAP_CACHE_LIMIT); _r_fastlock_releaseexclusive (&lock_cache); cache_dns[dns_hash] = _r_obj_allocate (ptr_cache, &_app_dereferencestring); @@ -2748,7 +2747,7 @@ bool _app_resolveaddress (ADDRESS_FAMILY af, LPVOID paddr, LPWSTR* pbuffer) if (_r_str_alloc (&ptr_cache, len, ppQueryResultsSet->Data.PTR.pNameHost)) { _r_fastlock_acquireexclusive (&lock_cache); - _app_freeobjects_map (cache_arpa, false); + _app_freeobjects_map (cache_arpa, UMAP_CACHE_LIMIT); _r_fastlock_releaseexclusive (&lock_cache); cache_arpa[arpa_hash] = _r_obj_allocate (ptr_cache, &_app_dereferencestring); diff --git a/src/helper.hpp b/src/helper.hpp index 5d9a11d8..fe8badc6 100644 --- a/src/helper.hpp +++ b/src/helper.hpp @@ -19,7 +19,7 @@ void _app_dereferencestring (PVOID pdata); bool _app_formataddress (ADDRESS_FAMILY af, UINT8 proto, const PVOID ptr_addr, UINT16 port, LPWSTR* ptr_dest, DWORD flags); rstring _app_formatport (UINT16 port, bool is_noempty); -void _app_freeobjects_map (OBJECTS_MAP& ptr_map, bool is_forced); +void _app_freeobjects_map (OBJECTS_MAP& ptr_map, size_t max_size); void _app_freeobjects_vec (OBJECTS_VEC& ptr_vec); void _app_freethreadpool (THREADS_VEC& ptr_vec); void _app_freelogstack (); diff --git a/src/main.cpp b/src/main.cpp index 5192007c..208dc17e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2395,7 +2395,7 @@ find_wrap: { const time_t current_timestamp = (time_t)lparam; - _app_freeobjects_map (rules_config, true); + _app_freeobjects_map (rules_config, 0); _r_fs_makebackup (config.profile_path, current_timestamp); diff --git a/src/profile.cpp b/src/profile.cpp index d8e5ac50..15bcf0cb 100644 --- a/src/profile.cpp +++ b/src/profile.cpp @@ -1375,9 +1375,7 @@ void _app_profile_load_helper (const pugi::xml_node& root, EnumDataType type, UI { if (type == DataAppRegular) { - _r_fastlock_acquireshared (&lock_access); _app_addapplication (nullptr, item.attribute (L"path").as_string (), item.attribute (L"timestamp").as_llong (), item.attribute (L"timer").as_llong (), 0, item.attribute (L"is_silent").as_bool (), item.attribute (L"is_enabled").as_bool ()); - _r_fastlock_releaseshared (&lock_access); } else if (type == DataRuleBlocklist || type == DataRuleSystem || type == DataRuleCustom) { @@ -1599,16 +1597,14 @@ void _app_profile_load (HWND hwnd, LPCWSTR path_custom) _r_listview_deleteallitems (hwnd, i); } - _r_fastlock_acquireshared (&lock_access); - // clear apps - _app_freeobjects_map (apps, true); + _app_freeobjects_map (apps, 0); // clear services/uwp apps - _app_freeobjects_map (apps_helper, true); + _app_freeobjects_map (apps_helper, 0); // clear rules config - _app_freeobjects_map (rules_config, true); + _app_freeobjects_map (rules_config, 0); // clear rules _app_freeobjects_vec (rules_arr); @@ -1620,8 +1616,6 @@ void _app_profile_load (HWND hwnd, LPCWSTR path_custom) // generate services list _app_generate_services (); - _r_fastlock_releaseshared (&lock_access); - // load profile if (!_r_str_isempty (path_custom) || _r_fs_exists (config.profile_path) || _r_fs_exists (config.profile_path_backup)) { @@ -1638,9 +1632,7 @@ void _app_profile_load (HWND hwnd, LPCWSTR path_custom) if (result.status != pugi::status_file_not_found && result.status != pugi::status_no_document_element) app.LogError (L"pugi::load_file", 0, _r_fmt (L"status: %d,offset: %" PR_PTRDIFF L",text: %hs,file: %s", result.status, result.offset, result.description (), !_r_str_isempty (path_custom) ? path_custom : config.profile_path), UID); - _r_fastlock_acquireshared (&lock_access); _app_profile_load_fallback (); - _r_fastlock_releaseshared (&lock_access); } else { @@ -1658,9 +1650,7 @@ void _app_profile_load (HWND hwnd, LPCWSTR path_custom) if (root_apps) _app_profile_load_helper (root_apps, DataAppRegular, version); - _r_fastlock_acquireshared (&lock_access); _app_profile_load_fallback (); - _r_fastlock_releaseshared (&lock_access); // load rules config (new!) pugi::xml_node root_rules_config = root.child (L"rules_config"); @@ -1686,8 +1676,6 @@ void _app_profile_load (HWND hwnd, LPCWSTR path_custom) { const time_t current_time = _r_unixtime_now (); - _r_fastlock_acquireshared (&lock_access); - // add apps for (auto &p : apps) { @@ -1767,8 +1755,6 @@ void _app_profile_load (HWND hwnd, LPCWSTR path_custom) _r_obj_dereference (ptr_rule_object); } - - _r_fastlock_releaseshared (&lock_access); } if (hwnd && current_listview_id) @@ -1806,8 +1792,6 @@ void _app_profile_save (LPCWSTR path_custom) // save apps if (root_apps) { - _r_fastlock_acquireshared (&lock_access); - for (auto &p : apps) { PR_OBJECT ptr_app_object = _r_obj_reference (p.second); @@ -1860,15 +1844,11 @@ void _app_profile_save (LPCWSTR path_custom) _r_obj_dereference (ptr_app_object); } - - _r_fastlock_releaseshared (&lock_access); } // save user rules if (root_rules_custom) { - _r_fastlock_acquireshared (&lock_access); - for (auto& p : rules_arr) { PR_OBJECT ptr_rule_object = _r_obj_reference (p); @@ -1927,15 +1907,11 @@ void _app_profile_save (LPCWSTR path_custom) _r_obj_dereference (ptr_rule_object); } - - _r_fastlock_releaseshared (&lock_access); } // save rules config if (root_rule_config) { - _r_fastlock_acquireshared (&lock_access); - for (auto &p : rules_config) { PR_OBJECT ptr_config_object = _r_obj_reference (p.second); @@ -1998,8 +1974,6 @@ void _app_profile_save (LPCWSTR path_custom) _r_obj_dereference (ptr_config_object); } - - _r_fastlock_releaseshared (&lock_access); } doc.save_file (_r_str_isempty (path_custom) ? config.profile_path : path_custom, L"\t", PUGIXML_SAVE_FLAGS, PUGIXML_SAVE_ENCODING);