X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=src%2Fcommon%2Fevent-field-value.c;h=2dd1947c2eaaf5cbb10763423bfb786b779cb8cc;hb=edbac916fd984b0b50dc3f7cc352a94cb7f24287;hp=d7687880f6b8c575d0ae59584676848c29ce9745;hpb=d28fcdec589e6f0c98fed2f6c094defec58e2b24;p=lttng-tools.git diff --git a/src/common/event-field-value.c b/src/common/event-field-value.c index d7687880f..2dd1947c2 100644 --- a/src/common/event-field-value.c +++ b/src/common/event-field-value.c @@ -190,8 +190,16 @@ struct lttng_event_field_value *lttng_event_field_value_string_create_with_size( goto error; } - assert(val); - field_val->val = strndup(val, size); + if (size) { + assert(val); + field_val->val = strndup(val, size); + } else { + /* + * User code do not expect a NULL string pointer. Populate with + * an empty string when length is 0. + */ + field_val->val = strdup(""); + } if (!field_val->val) { goto error; } @@ -387,13 +395,19 @@ lttng_event_field_value_unsigned_int_get_value( parent)->val; break; case LTTNG_EVENT_FIELD_VALUE_TYPE_UNSIGNED_ENUM: - *val = container_of( - container_of(field_val, - const struct lttng_event_field_value_enum, - parent), - const struct lttng_event_field_value_enum_uint, - parent)->val; + { + const struct lttng_event_field_value_enum *field_val_enum = container_of( + field_val, + const struct lttng_event_field_value_enum, + parent); + const struct lttng_event_field_value_enum_uint + *field_val_enum_uint = container_of( + field_val_enum, + const struct lttng_event_field_value_enum_uint, + parent); + *val = field_val_enum_uint->val; break; + } default: status = LTTNG_EVENT_FIELD_VALUE_STATUS_INVALID; goto end; @@ -423,13 +437,19 @@ lttng_event_field_value_signed_int_get_value( parent)->val; break; case LTTNG_EVENT_FIELD_VALUE_TYPE_SIGNED_ENUM: - *val = container_of( - container_of(field_val, - const struct lttng_event_field_value_enum, - parent), - const struct lttng_event_field_value_enum_int, - parent)->val; + { + const struct lttng_event_field_value_enum *field_val_enum = container_of( + field_val, + const struct lttng_event_field_value_enum, + parent); + const struct lttng_event_field_value_enum_int + *field_val_enum_uint = container_of( + field_val_enum, + const struct lttng_event_field_value_enum_int, + parent); + *val = field_val_enum_uint->val; break; + } default: status = LTTNG_EVENT_FIELD_VALUE_STATUS_INVALID; goto end; @@ -517,21 +537,23 @@ end: return ret; } -const char *lttng_event_field_value_string_get_value( - const struct lttng_event_field_value *field_val) +enum lttng_event_field_value_status lttng_event_field_value_string_get_value( + const struct lttng_event_field_value *field_val, + const char **value) { - const char *ret; + enum lttng_event_field_value_status status; if (!field_val || field_val->type != LTTNG_EVENT_FIELD_VALUE_TYPE_STRING) { - ret = NULL; + status = LTTNG_EVENT_FIELD_VALUE_STATUS_INVALID; goto end; } - ret = container_of(field_val, + *value = container_of(field_val, const struct lttng_event_field_value_string, parent)->val; + status = LTTNG_EVENT_FIELD_VALUE_STATUS_OK; end: - return ret; + return status; } enum lttng_event_field_value_status lttng_event_field_value_array_get_length(