Skip to content

Commit 345635e

Browse files
authored
Merge pull request #512 from bazsi/filterx-handle-unsigned-length-value-in-stack-allocated-strings
Filterx stack based string allocation fixes
2 parents 3dae2c8 + 6449e05 commit 345635e

File tree

4 files changed

+11
-5
lines changed

4 files changed

+11
-5
lines changed

lib/filterx/func-set-fields.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,7 @@ _extract_field_key_obj(FilterXExpr *key, GError **error)
358358
static gboolean
359359
_are_field_keys_equal(FilterXObject *key_a, FilterXObject *key_b)
360360
{
361-
gsize len_a, len_b;
361+
gsize len_a = 0, len_b = 0;
362362
const gchar *key_a_str = filterx_string_get_value_ref(key_a, &len_a);
363363
const gchar *key_b_str = filterx_string_get_value_ref(key_b, &len_b);
364364

lib/filterx/func-vars.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ _load_from_dict(FilterXObject *key, FilterXObject *value, gpointer user_data)
146146
return FALSE;
147147
}
148148

149-
gsize key_len;
149+
gsize key_len = 0;
150150
const gchar *key_str = filterx_string_get_value_ref(key, &key_len);
151151
APPEND_ZERO(key_str, key_str, key_len);
152152

lib/filterx/object-string.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ _string_clone(FilterXObject *s)
132132
static inline FilterXString *
133133
_string_new(const gchar *str, gssize str_len, FilterXStringTranslateFunc translate)
134134
{
135-
if (str_len < 0)
135+
if (str_len == -1)
136136
str_len = strlen(str);
137137

138138
FilterXString *self = g_malloc(sizeof(FilterXString) + str_len + 1);

lib/filterx/object-string.h

+8-2
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,11 @@ FilterXObject *filterx_string_new_translated(const gchar *str, gssize str_len, F
5353
FilterXObject *filterx_bytes_new(const gchar *str, gssize str_len);
5454
FilterXObject *filterx_protobuf_new(const gchar *str, gssize str_len);
5555

56-
/* NOTE: Consider using filterx_object_extract_string_ref() to also support message_value. */
56+
/* NOTE: Consider using filterx_object_extract_string_ref() to also support message_value.
57+
*
58+
* Also NOTE: the returned string may not be NUL terminated, although often
59+
* it will be. Generic code should handle the cases where it is not.
60+
*/
5761
static inline const gchar *
5862
filterx_string_get_value_ref(FilterXObject *s, gsize *length)
5963
{
@@ -64,6 +68,8 @@ filterx_string_get_value_ref(FilterXObject *s, gsize *length)
6468

6569
if (length)
6670
*length = self->str_len;
71+
else
72+
g_assert(self->str[self->str_len] == 0);
6773
return self->str;
6874
}
6975

@@ -89,7 +95,7 @@ void filterx_string_global_deinit(void);
8995
{ \
9096
FILTERX_OBJECT_STACK_INIT(string), \
9197
.str = (cstr), \
92-
.str_len = ((cstr_len) < 0 ? strlen(cstr) : (cstr_len)), \
98+
.str_len = (((gssize) cstr_len) == -1 ? strlen(cstr) : (cstr_len)), \
9399
}
94100

95101
#define FILTERX_STRING_DECLARE_ON_STACK(_name, cstr, cstr_len) \

0 commit comments

Comments
 (0)