Skip to content

Commit b248078

Browse files
committed
Inline string sanitization.
Instead of using stl string algorithms to remove invalid characters from strings, use an inline function instead. As before, it removes invalid characters from the string. While doing performance tests with falco I noticed that the combination of erase, remove_if, and a non-inline operator g_invalidchar() resulted in a non-trivial usage in flame views.
1 parent 6d75ff4 commit b248078

File tree

5 files changed

+49
-21
lines changed

5 files changed

+49
-21
lines changed

userspace/libsinsp/cursescomponents.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -841,7 +841,7 @@ void curses_textbox::process_event_spy(sinsp_evt* evt, int32_t next_res)
841841
//
842842
// Sanitize the info string
843843
//
844-
info_str.erase(remove_if(info_str.begin(), info_str.end(), g_invalidchar()), info_str.end());
844+
sanitize_string(info_str);
845845

846846
//
847847
// Print the whole thing

userspace/libsinsp/event.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -590,7 +590,7 @@ int sinsp_evt::render_fd_json(Json::Value *ret, int64_t fd, const char** resolve
590590
//
591591
string sanitized_str = fdinfo->m_name;
592592

593-
sanitized_str.erase(remove_if(sanitized_str.begin(), sanitized_str.end(), g_invalidchar()), sanitized_str.end());
593+
sanitize_string(sanitized_str);
594594

595595
(*ret)["typechar"] = typestr;
596596
(*ret)["name"] = sanitized_str;
@@ -676,7 +676,7 @@ char* sinsp_evt::render_fd(int64_t fd, const char** resolved_str, sinsp_evt::par
676676
//
677677
string sanitized_str = fdinfo->m_name;
678678

679-
sanitized_str.erase(remove_if(sanitized_str.begin(), sanitized_str.end(), g_invalidchar()), sanitized_str.end());
679+
sanitize_string(sanitized_str);
680680

681681
//
682682
// Make sure the string will fit
@@ -897,7 +897,7 @@ Json::Value sinsp_evt::get_param_as_json(uint32_t id, OUT const char** resolved_
897897
// Sanitize the file string.
898898
//
899899
string sanitized_str = payload + 1;
900-
sanitized_str.erase(remove_if(sanitized_str.begin(), sanitized_str.end(), g_invalidchar()), sanitized_str.end());
900+
sanitize_string(sanitized_str);
901901

902902
ret = sanitized_str;
903903
}
@@ -1069,7 +1069,7 @@ Json::Value sinsp_evt::get_param_as_json(uint32_t id, OUT const char** resolved_
10691069
// Sanitize the file string.
10701070
//
10711071
string sanitized_str = payload + 17;
1072-
sanitized_str.erase(remove_if(sanitized_str.begin(), sanitized_str.end(), g_invalidchar()), sanitized_str.end());
1072+
sanitize_string(sanitized_str);
10731073

10741074
snprintf(&m_paramstr_storage[0],
10751075
m_paramstr_storage.size(),
@@ -1653,7 +1653,7 @@ const char* sinsp_evt::get_param_as_str(uint32_t id, OUT const char** resolved_s
16531653
// Sanitize the file string.
16541654
//
16551655
string sanitized_str = payload + 1;
1656-
sanitized_str.erase(remove_if(sanitized_str.begin(), sanitized_str.end(), g_invalidchar()), sanitized_str.end());
1656+
sanitize_string(sanitized_str);
16571657

16581658
snprintf(&m_paramstr_storage[0],
16591659
m_paramstr_storage.size(),
@@ -1780,7 +1780,7 @@ const char* sinsp_evt::get_param_as_str(uint32_t id, OUT const char** resolved_s
17801780
// Sanitize the file string.
17811781
//
17821782
string sanitized_str = payload + 17;
1783-
sanitized_str.erase(remove_if(sanitized_str.begin(), sanitized_str.end(), g_invalidchar()), sanitized_str.end());
1783+
sanitize_string(sanitized_str);
17841784

17851785
snprintf(&m_paramstr_storage[0],
17861786
m_paramstr_storage.size(),

userspace/libsinsp/fdinfo.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,8 @@ template<> char* sinsp_fdinfo_t::get_typestring()
124124
template<> string sinsp_fdinfo_t::tostring_clean()
125125
{
126126
string m_tstr = m_name;
127-
m_tstr.erase(remove_if(m_tstr.begin(), m_tstr.end(), g_invalidchar()), m_tstr.end());
127+
sanitize_string(m_tstr);
128+
128129
return m_tstr;
129130
}
130131

userspace/libsinsp/filterchecks.cpp

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,8 @@ bool sinsp_filter_check_fd::extract_fdname_from_creator(sinsp_evt *evt, OUT uint
247247
namelen);
248248

249249
m_tstr = fullpath;
250-
m_tstr.erase(remove_if(m_tstr.begin(), m_tstr.end(), g_invalidchar()), m_tstr.end());
250+
sanitize_string(m_tstr);
251+
251252
return true;
252253
}
253254
default:
@@ -292,7 +293,7 @@ uint8_t* sinsp_filter_check_fd::extract_from_null_fd(sinsp_evt *evt, OUT uint32_
292293
{
293294
if(extract_fdname_from_creator(evt, len) == true)
294295
{
295-
m_tstr.erase(remove_if(m_tstr.begin(), m_tstr.end(), g_invalidchar()), m_tstr.end());
296+
sanitize_string(m_tstr);
296297

297298
size_t pos = m_tstr.rfind('/');
298299
if(pos != string::npos)
@@ -318,7 +319,7 @@ uint8_t* sinsp_filter_check_fd::extract_from_null_fd(sinsp_evt *evt, OUT uint32_
318319
{
319320
if(extract_fdname_from_creator(evt, len) == true)
320321
{
321-
m_tstr.erase(remove_if(m_tstr.begin(), m_tstr.end(), g_invalidchar()), m_tstr.end());
322+
sanitize_string(m_tstr);
322323

323324
size_t pos = m_tstr.rfind('/');
324325
if(pos != string::npos)
@@ -351,7 +352,7 @@ uint8_t* sinsp_filter_check_fd::extract_from_null_fd(sinsp_evt *evt, OUT uint32_
351352

352353
if(extract_fdname_from_creator(evt, len) == true)
353354
{
354-
m_tstr.erase(remove_if(m_tstr.begin(), m_tstr.end(), g_invalidchar()), m_tstr.end());
355+
sanitize_string(m_tstr);
355356

356357
size_t pos = m_tstr.rfind('/');
357358
if(pos != string::npos)
@@ -472,7 +473,8 @@ uint8_t* sinsp_filter_check_fd::extract(sinsp_evt *evt, OUT uint32_t* len)
472473
m_tstr = m_fdinfo->m_name;
473474
}
474475

475-
m_tstr.erase(remove_if(m_tstr.begin(), m_tstr.end(), g_invalidchar()), m_tstr.end());
476+
sanitize_string(m_tstr);
477+
476478
return (uint8_t*)m_tstr.c_str();
477479
case TYPE_FDTYPE:
478480
if(m_fdinfo == NULL)
@@ -495,7 +497,7 @@ uint8_t* sinsp_filter_check_fd::extract(sinsp_evt *evt, OUT uint32_t* len)
495497
}
496498

497499
m_tstr = m_fdinfo->m_name;
498-
m_tstr.erase(remove_if(m_tstr.begin(), m_tstr.end(), g_invalidchar()), m_tstr.end());
500+
sanitize_string(m_tstr);
499501

500502
if(m_fdinfo->is_file())
501503
{
@@ -533,7 +535,7 @@ uint8_t* sinsp_filter_check_fd::extract(sinsp_evt *evt, OUT uint32_t* len)
533535
}
534536

535537
m_tstr = m_fdinfo->m_name;
536-
m_tstr.erase(remove_if(m_tstr.begin(), m_tstr.end(), g_invalidchar()), m_tstr.end());
538+
sanitize_string(m_tstr);
537539

538540
size_t pos = m_tstr.rfind('/');
539541
if(pos != string::npos)

userspace/libsinsp/utils.h

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -100,18 +100,43 @@ class sinsp_utils
100100
///////////////////////////////////////////////////////////////////////////////
101101
// little STL thing to sanitize strings
102102
///////////////////////////////////////////////////////////////////////////////
103+
104+
inline bool is_invalid_char(char c)
105+
{
106+
if(c < -1)
107+
{
108+
return true;
109+
}
110+
111+
return !isprint((unsigned)c);
112+
}
113+
103114
struct g_invalidchar
104115
{
105-
bool operator()(char c) const
116+
bool operator()(char c) const
106117
{
107-
if(c < -1)
118+
return is_invalid_char(c);
119+
}
120+
};
121+
122+
inline void sanitize_string(string &str)
123+
{
124+
uint32_t j=0, k=0;
125+
126+
while(k < str.length())
127+
{
128+
if(is_invalid_char(str[k]))
129+
{
130+
k++;
131+
}
132+
else
108133
{
109-
return true;
134+
str[j++] = str[k++];
110135
}
136+
}
111137

112-
return !isprint((unsigned)c);
113-
}
114-
};
138+
str.resize(j);
139+
}
115140

116141
///////////////////////////////////////////////////////////////////////////////
117142
// Time utility functions.

0 commit comments

Comments
 (0)