diff options
Diffstat (limited to 'dbus/dbus-string.c')
-rw-r--r-- | dbus/dbus-string.c | 158 |
1 files changed, 79 insertions, 79 deletions
diff --git a/dbus/dbus-string.c b/dbus/dbus-string.c index 0d98b379..305b488f 100644 --- a/dbus/dbus-string.c +++ b/dbus/dbus-string.c @@ -168,33 +168,18 @@ undo_alignment (DBusRealString *real) } /** - * Initializes a string. The maximum length may be _DBUS_INT_MAX for - * no maximum. The string starts life with zero length. - * The string must eventually be freed with _dbus_string_free(). - * - * @todo the max length feature is useless, because it looks to the - * app like out of memory, and the app might try to "recover" - but - * recovery in this case is impossible, as we can't ever "get more - * memory" - so should delete the max length feature I think. Well, at - * least there's a strong caveat that it can only be used when - * out-of-memory is a permanent fatal error. - * - * @todo we could make this init routine not alloc any memory and - * return void, would simplify a lot of code, however it might - * complexify things elsewhere because _dbus_string_get_data() - * etc. could suddenly fail as they'd need to alloc new memory. + * Initializes a string. The string starts life with zero length. The + * string must eventually be freed with _dbus_string_free(). * * @param str memory to hold the string - * @param max_length the maximum size of the string - * @returns #TRUE on success */ + * @returns #TRUE on success, #FALSE if no memory + */ dbus_bool_t -_dbus_string_init (DBusString *str, - int max_length) +_dbus_string_init (DBusString *str) { DBusRealString *real; _dbus_assert (str != NULL); - _dbus_assert (max_length >= 0); _dbus_assert (sizeof (DBusString) == sizeof (DBusRealString)); @@ -214,9 +199,7 @@ _dbus_string_init (DBusString *str, real->len = 0; real->str[real->len] = '\0'; - real->max_length = max_length; - if (real->max_length > MAX_MAX_LENGTH) - real->max_length = MAX_MAX_LENGTH; + real->max_length = MAX_MAX_LENGTH; real->constant = FALSE; real->locked = FALSE; real->invalid = FALSE; @@ -227,6 +210,23 @@ _dbus_string_init (DBusString *str, return TRUE; } +/* The max length thing is sort of a historical artifact + * from a feature that turned out to be dumb; perhaps + * we should purge it entirely. The problem with + * the feature is that it looks like memory allocation + * failure, but is not a transient or resolvable failure. + */ +static void +set_max_length (DBusString *str, + int max_length) +{ + DBusRealString *real; + + real = (DBusRealString*) str; + + real->max_length = max_length; +} + /** * Initializes a constant string. The value parameter is not copied * (should be static), and the string may never be modified. @@ -409,36 +409,28 @@ open_gap (int len, * function on a const string. * * @param str the string - * @param data_return place to store the returned data + * @returns the data */ -void -_dbus_string_get_data (DBusString *str, - char **data_return) +char* +_dbus_string_get_data (DBusString *str) { DBUS_STRING_PREAMBLE (str); - _dbus_assert (data_return != NULL); - *data_return = real->str; + return real->str; } /** * Gets the raw character buffer from a const string. * - * @todo should return the const char* instead of using an out param; - * the temporary variable encourages a bug where you use const data - * after modifying the string and possibly causing a realloc. - * * @param str the string - * @param data_return location to store returned data + * @returns the string data */ -void -_dbus_string_get_const_data (const DBusString *str, - const char **data_return) +const char* +_dbus_string_get_const_data (const DBusString *str) { DBUS_CONST_STRING_PREAMBLE (str); - _dbus_assert (data_return != NULL); - *data_return = real->str; + return real->str; } /** @@ -450,24 +442,22 @@ _dbus_string_get_const_data (const DBusString *str, * string, not at start + len. * * @param str the string - * @param data_return location to return the buffer * @param start byte offset to return * @param len length of segment to return + * @returns the string data */ -void +char* _dbus_string_get_data_len (DBusString *str, - char **data_return, int start, int len) { DBUS_STRING_PREAMBLE (str); - _dbus_assert (data_return != NULL); _dbus_assert (start >= 0); _dbus_assert (len >= 0); _dbus_assert (start <= real->len); _dbus_assert (len <= real->len - start); - *data_return = real->str + start; + return real->str + start; } /** @@ -478,24 +468,22 @@ _dbus_string_get_data_len (DBusString *str, * after modifying the string and possibly causing a realloc. * * @param str the string - * @param data_return location to return the buffer * @param start byte offset to return * @param len length of segment to return + * @returns the string data */ -void +const char* _dbus_string_get_const_data_len (const DBusString *str, - const char **data_return, int start, int len) { DBUS_CONST_STRING_PREAMBLE (str); - _dbus_assert (data_return != NULL); _dbus_assert (start >= 0); _dbus_assert (len >= 0); _dbus_assert (start <= real->len); _dbus_assert (len <= real->len - start); - *data_return = real->str + start; + return real->str + start; } /** @@ -574,6 +562,7 @@ dbus_bool_t _dbus_string_steal_data (DBusString *str, char **data_return) { + int old_max_length; DBUS_STRING_PREAMBLE (str); _dbus_assert (data_return != NULL); @@ -581,8 +570,10 @@ _dbus_string_steal_data (DBusString *str, *data_return = real->str; + old_max_length = real->max_length; + /* reset the string */ - if (!_dbus_string_init (str, real->max_length)) + if (!_dbus_string_init (str)) { /* hrm, put it back then */ real->str = *data_return; @@ -591,6 +582,8 @@ _dbus_string_steal_data (DBusString *str, return FALSE; } + real->max_length = old_max_length; + return TRUE; } @@ -616,7 +609,6 @@ _dbus_string_steal_data_len (DBusString *str, int len) { DBusString dest; - DBUS_STRING_PREAMBLE (str); _dbus_assert (data_return != NULL); _dbus_assert (start >= 0); @@ -624,9 +616,11 @@ _dbus_string_steal_data_len (DBusString *str, _dbus_assert (start <= real->len); _dbus_assert (len <= real->len - start); - if (!_dbus_string_init (&dest, real->max_length)) + if (!_dbus_string_init (&dest)) return FALSE; + set_max_length (&dest, real->max_length); + if (!_dbus_string_move_len (str, start, len, &dest, 0)) { _dbus_string_free (&dest); @@ -692,9 +686,11 @@ _dbus_string_copy_data_len (const DBusString *str, _dbus_assert (start <= real->len); _dbus_assert (len <= real->len - start); - if (!_dbus_string_init (&dest, real->max_length)) + if (!_dbus_string_init (&dest)) return FALSE; + set_max_length (&dest, real->max_length); + if (!_dbus_string_copy_len (str, start, len, &dest, 0)) { _dbus_string_free (&dest); @@ -2160,7 +2156,7 @@ _dbus_string_base64_decode (const DBusString *source, if (source_len == 0) return TRUE; - if (!_dbus_string_init (&result, _DBUS_INT_MAX)) + if (!_dbus_string_init (&result)) return FALSE; pad_count = 0; @@ -2283,12 +2279,12 @@ _dbus_string_hex_encode (const DBusString *source, _dbus_assert (start <= _dbus_string_get_length (source)); - if (!_dbus_string_init (&result, _DBUS_INT_MAX)) + if (!_dbus_string_init (&result)) return FALSE; retval = FALSE; - _dbus_string_get_const_data (source, (const char**) &p); + p = (const unsigned char*) _dbus_string_get_const_data (source); end = p + _dbus_string_get_length (source); p += start; @@ -2338,13 +2334,13 @@ _dbus_string_hex_decode (const DBusString *source, _dbus_assert (start <= _dbus_string_get_length (source)); - if (!_dbus_string_init (&result, _DBUS_INT_MAX)) + if (!_dbus_string_init (&result)) return FALSE; retval = FALSE; high_bits = TRUE; - _dbus_string_get_const_data (source, (const char**) &p); + p = (const unsigned char*) _dbus_string_get_const_data (source); end = p + _dbus_string_get_length (source); p += start; @@ -2652,13 +2648,13 @@ test_base64_roundtrip (const unsigned char *data, if (len < 0) len = strlen (data); - if (!_dbus_string_init (&orig, _DBUS_INT_MAX)) + if (!_dbus_string_init (&orig)) _dbus_assert_not_reached ("could not init string"); - if (!_dbus_string_init (&encoded, _DBUS_INT_MAX)) + if (!_dbus_string_init (&encoded)) _dbus_assert_not_reached ("could not init string"); - if (!_dbus_string_init (&decoded, _DBUS_INT_MAX)) + if (!_dbus_string_init (&decoded)) _dbus_assert_not_reached ("could not init string"); if (!_dbus_string_append_len (&orig, data, len)) @@ -2679,7 +2675,7 @@ test_base64_roundtrip (const unsigned char *data, _dbus_string_get_length (&encoded), _dbus_string_get_length (&decoded)); printf ("Original: %s\n", data); - _dbus_string_get_const_data (&decoded, &s); + s = _dbus_string_get_const_data (&decoded); printf ("Decoded: %s\n", s); _dbus_assert_not_reached ("original string not the same as string decoded from base64"); } @@ -2700,13 +2696,13 @@ test_hex_roundtrip (const unsigned char *data, if (len < 0) len = strlen (data); - if (!_dbus_string_init (&orig, _DBUS_INT_MAX)) + if (!_dbus_string_init (&orig)) _dbus_assert_not_reached ("could not init string"); - if (!_dbus_string_init (&encoded, _DBUS_INT_MAX)) + if (!_dbus_string_init (&encoded)) _dbus_assert_not_reached ("could not init string"); - if (!_dbus_string_init (&decoded, _DBUS_INT_MAX)) + if (!_dbus_string_init (&decoded)) _dbus_assert_not_reached ("could not init string"); if (!_dbus_string_append_len (&orig, data, len)) @@ -2727,7 +2723,7 @@ test_hex_roundtrip (const unsigned char *data, _dbus_string_get_length (&encoded), _dbus_string_get_length (&decoded)); printf ("Original: %s\n", data); - _dbus_string_get_const_data (&decoded, &s); + s = _dbus_string_get_const_data (&decoded); printf ("Decoded: %s\n", s); _dbus_assert_not_reached ("original string not the same as string decoded from base64"); } @@ -2805,8 +2801,10 @@ _dbus_string_test (void) i = 0; while (i < _DBUS_N_ELEMENTS (lens)) { - if (!_dbus_string_init (&str, lens[i])) + if (!_dbus_string_init (&str)) _dbus_assert_not_reached ("failed to init string"); + + set_max_length (&str, lens[i]); test_max_len (&str, lens[i]); _dbus_string_free (&str); @@ -2820,8 +2818,10 @@ _dbus_string_test (void) { int j; - if (!_dbus_string_init (&str, lens[i])) + if (!_dbus_string_init (&str)) _dbus_assert_not_reached ("failed to init string"); + + set_max_length (&str, lens[i]); if (!_dbus_string_set_length (&str, lens[i])) _dbus_assert_not_reached ("failed to set string length"); @@ -2844,7 +2844,7 @@ _dbus_string_test (void) } /* Test appending data */ - if (!_dbus_string_init (&str, _DBUS_INT_MAX)) + if (!_dbus_string_init (&str)) _dbus_assert_not_reached ("failed to init string"); i = 0; @@ -2867,7 +2867,7 @@ _dbus_string_test (void) /* Check steal_data */ - if (!_dbus_string_init (&str, _DBUS_INT_MAX)) + if (!_dbus_string_init (&str)) _dbus_assert_not_reached ("failed to init string"); if (!_dbus_string_append (&str, "Hello World")) @@ -2890,7 +2890,7 @@ _dbus_string_test (void) i = _dbus_string_get_length (&str); - if (!_dbus_string_init (&other, _DBUS_INT_MAX)) + if (!_dbus_string_init (&other)) _dbus_assert_not_reached ("could not init string"); if (!_dbus_string_move (&str, 0, &other, 0)) @@ -2926,7 +2926,7 @@ _dbus_string_test (void) i = _dbus_string_get_length (&str); - if (!_dbus_string_init (&other, _DBUS_INT_MAX)) + if (!_dbus_string_init (&other)) _dbus_assert_not_reached ("could not init string"); if (!_dbus_string_copy (&str, 0, &other, 0)) @@ -2956,7 +2956,7 @@ _dbus_string_test (void) /* Check replace */ - if (!_dbus_string_init (&str, _DBUS_INT_MAX)) + if (!_dbus_string_init (&str)) _dbus_assert_not_reached ("failed to init string"); if (!_dbus_string_append (&str, "Hello World")) @@ -2964,7 +2964,7 @@ _dbus_string_test (void) i = _dbus_string_get_length (&str); - if (!_dbus_string_init (&other, _DBUS_INT_MAX)) + if (!_dbus_string_init (&other)) _dbus_assert_not_reached ("could not init string"); if (!_dbus_string_replace_len (&str, 0, _dbus_string_get_length (&str), @@ -3001,7 +3001,7 @@ _dbus_string_test (void) /* Check append/get unichar */ - if (!_dbus_string_init (&str, _DBUS_INT_MAX)) + if (!_dbus_string_init (&str)) _dbus_assert_not_reached ("failed to init string"); ch = 0; @@ -3017,7 +3017,7 @@ _dbus_string_test (void) /* Check insert/set/get byte */ - if (!_dbus_string_init (&str, _DBUS_INT_MAX)) + if (!_dbus_string_init (&str)) _dbus_assert_not_reached ("failed to init string"); if (!_dbus_string_append (&str, "Hello")) @@ -3054,7 +3054,7 @@ _dbus_string_test (void) /* Check append/parse int/double */ - if (!_dbus_string_init (&str, _DBUS_INT_MAX)) + if (!_dbus_string_init (&str)) _dbus_assert_not_reached ("failed to init string"); if (!_dbus_string_append_int (&str, 27)) @@ -3070,7 +3070,7 @@ _dbus_string_test (void) _dbus_string_free (&str); - if (!_dbus_string_init (&str, _DBUS_INT_MAX)) + if (!_dbus_string_init (&str)) _dbus_assert_not_reached ("failed to init string"); if (!_dbus_string_append_double (&str, 50.3)) @@ -3087,7 +3087,7 @@ _dbus_string_test (void) _dbus_string_free (&str); /* Test find */ - if (!_dbus_string_init (&str, _DBUS_INT_MAX)) + if (!_dbus_string_init (&str)) _dbus_assert_not_reached ("failed to init string"); if (!_dbus_string_append (&str, "Hello")) |