+static int recv_sessiond_optional_data(size_t len, void **user_buf,
+ size_t *user_len)
+{
+ int ret = 0;
+ void *buf = NULL;
+
+ if (len) {
+ if (!user_len) {
+ ret = -LTTNG_ERR_INVALID;
+ goto end;
+ }
+
+ buf = zmalloc(len);
+ if (!buf) {
+ ret = -ENOMEM;
+ goto end;
+ }
+
+ ret = recv_data_sessiond(buf, len);
+ if (ret < 0) {
+ goto end;
+ }
+
+ if (!user_buf) {
+ ret = -LTTNG_ERR_INVALID;
+ goto end;
+ }
+
+ /* Move ownership of command header buffer to user. */
+ *user_buf = buf;
+ buf = NULL;
+ *user_len = len;
+ } else {
+ /* No command header. */
+ if (user_len) {
+ *user_len = 0;
+ }
+
+ if (user_buf) {
+ *user_buf = NULL;
+ }
+ }
+
+end:
+ free(buf);
+ return ret;
+}
+