/* copy the message header */
ret = kdbus_pool_write(conn->pool, off, &kmsg->msg, size);
if (ret < 0)
- goto exit_unlock;
+ goto exit_pool_free;
/* update the size */
ret = kdbus_pool_write(conn->pool, off, &msg_size, sizeof(kmsg->msg.size));
if (ret < 0)
- goto exit_unlock;
+ goto exit_pool_free;
/* add PAYLOAD items */
if (payloads > 0) {
ret = kdbus_conn_payload_add(conn, queue, kmsg,
off, payloads, vec_data);
if (ret < 0)
- goto exit_unlock;
+ goto exit_pool_free;
}
/* add a FDS item; the array content will be updated at RECV time */
it->size = size + (kmsg->fds_count * sizeof(int));
ret = kdbus_pool_write(conn->pool, off + fds, it, size);
if (ret < 0)
- goto exit_unlock;
+ goto exit_pool_free;
ret = kdbus_conn_fds_ref(queue, kmsg->fds, kmsg->fds_count);
if (ret < 0)
- goto exit_unlock;
+ goto exit_pool_free;
/* remember the array to update at RECV */
queue->fds = fds + offsetof(struct kdbus_item, fds);
ret = kdbus_pool_write(conn->pool, off + meta,
kmsg->meta.data, kmsg->meta.size);
if (ret < 0)
- goto exit_unlock;
+ goto exit_pool_free;
}
/* remember the offset to the message */
wake_up_interruptible(&conn->ep->wait);
return 0;
+exit_pool_free:
+ kdbus_pool_free_range(conn->pool, off);
+
exit_unlock:
mutex_unlock(&conn->lock);
kdbus_conn_queue_cleanup(queue);
- kdbus_pool_free_range(conn->pool, off);
return ret;
}