diff options
author | Havoc Pennington <hp@redhat.com> | 2003-03-02 17:34:30 +0000 |
---|---|---|
committer | Havoc Pennington <hp@redhat.com> | 2003-03-02 17:34:30 +0000 |
commit | f7d96bdf80129d95cf33f26a778ce2c94a818bd0 (patch) | |
tree | f1df8da8c12b134a5ab5e06eab9951394754b69b /dbus | |
parent | 7584a7bdccc6c7cf9f3d11c315f088794729b7e4 (diff) |
2003-03-02 Havoc Pennington <hp@pobox.com>
* test/break-loader.c (randomly_set_extreme_ints): add test that
sets really huge and small integers
* dbus/dbus-marshal.c (_dbus_marshal_validate_arg): add check
that length of boolean array fits in the string, and that
string has room for boolean value in single-bool case.
* dbus/dbus-message-builder.c (_dbus_message_data_load): add
optional value to "ALIGN" command which is what to fill the
alignment with.
* test/data/valid-messages/no-padding.message: add regression
test for the message padding problem
Diffstat (limited to 'dbus')
-rw-r--r-- | dbus/dbus-internals.h | 1 | ||||
-rw-r--r-- | dbus/dbus-marshal.c | 18 | ||||
-rw-r--r-- | dbus/dbus-message-builder.c | 35 |
3 files changed, 50 insertions, 4 deletions
diff --git a/dbus/dbus-internals.h b/dbus/dbus-internals.h index d928a5c8..19a5cdc3 100644 --- a/dbus/dbus-internals.h +++ b/dbus/dbus-internals.h @@ -115,6 +115,7 @@ char* _dbus_strdup (const char *str); #define _DBUS_INT_MIN (-_DBUS_INT_MAX - 1) #define _DBUS_INT_MAX 2147483647 +#define _DBUS_UINT_MAX 0xffffffff #define _DBUS_MAX_SUN_PATH_LENGTH 99 #define _DBUS_ONE_KILOBYTE 1024 #define _DBUS_ONE_MEGABYTE 1024 * _DBUS_ONE_KILOBYTE diff --git a/dbus/dbus-marshal.c b/dbus/dbus-marshal.c index b199561b..f78757fd 100644 --- a/dbus/dbus-marshal.c +++ b/dbus/dbus-marshal.c @@ -997,7 +997,9 @@ _dbus_marshal_get_arg_end_pos (const DBusString *str, * Demarshals and validates a length; returns < 0 if the validation * fails. The length is required to be small enough that * len*sizeof(double) will not overflow, and small enough to fit in a - * signed integer. + * signed integer. DOES NOT check whether the length points + * beyond the end of the string, because it doesn't know the + * size of array elements. * * @param str the string * @param byte_order the byte order @@ -1012,6 +1014,8 @@ demarshal_and_validate_len (const DBusString *str, { int align_4 = _DBUS_ALIGN_VALUE (pos, 4); unsigned int len; + + _dbus_assert (new_pos != NULL); if ((align_4 + 4) >= _dbus_string_get_length (str)) { @@ -1116,6 +1120,12 @@ _dbus_marshal_validate_arg (const DBusString *str, { unsigned char c; + if (2 > _dbus_string_get_length (str) - pos) + { + _dbus_verbose ("no room for boolean value\n"); + return FALSE; + } + c = _dbus_string_get_byte (str, pos + 1); if (c != 0 && c != 1) @@ -1184,6 +1194,12 @@ _dbus_marshal_validate_arg (const DBusString *str, if (len < 0) return FALSE; + if (len > _dbus_string_get_length (str) - pos) + { + _dbus_verbose ("boolean array length outside length of the message\n"); + return FALSE; + } + i = 0; while (i < len) { diff --git a/dbus/dbus-message-builder.c b/dbus/dbus-message-builder.c index dea50d7f..3501da9a 100644 --- a/dbus/dbus-message-builder.c +++ b/dbus/dbus-message-builder.c @@ -334,6 +334,12 @@ _dbus_message_data_load (DBusString *dest, _dbus_string_free (&file); return FALSE; } + + { + const char *s; + _dbus_string_get_const_data (filename, &s); + _dbus_verbose ("Loading %s\n", s); + } if ((result = _dbus_file_get_contents (&file, filename)) != DBUS_RESULT_SUCCESS) { @@ -439,24 +445,47 @@ _dbus_message_data_load (DBusString *dest, "ALIGN")) { long val; - + int end; + int orig_len; + _dbus_string_delete_first_word (&line); - if (!_dbus_string_parse_int (&line, 0, &val, NULL)) + if (!_dbus_string_parse_int (&line, 0, &val, &end)) { _dbus_warn ("Failed to parse integer\n"); goto parse_failed; } - if (val > 16) + if (val > 8) { _dbus_warn ("Aligning to %ld boundary is crack\n", val); goto parse_failed; } + + orig_len = _dbus_string_get_length (dest); if (!_dbus_string_align_length (dest, val)) goto parse_failed; + + if (_dbus_string_parse_int (&line, end, &val, NULL)) + { + /* If there's an optional second int argument, + * fill in align padding with that value + */ + if (val < 0 || val > 255) + { + _dbus_warn ("can't fill align padding with %ld, must be a byte value\n", val); + goto parse_failed; + } + + end = orig_len; + while (end < _dbus_string_get_length (dest)) + { + _dbus_string_set_byte (dest, end, val); + ++end; + } + } } else if (_dbus_string_starts_with_c_str (&line, "UNALIGN")) { |