uint32_t major;
uint32_t minor;
uint64_t session_id;
+
+ /*
+ * This contains streams that are received on that connection. It's used to
+ * store them until we get the streams sent command where they are removed
+ * and flagged ready for the viewer. This is ONLY used by the control
+ * thread thus any action on it should happen in that thread.
+ */
struct cds_list_head recv_head;
unsigned int version_check_done:1;
session->stream_count--;
assert(session->stream_count >= 0);
+ /*
+ * Remove the stream from the connection recv list since we are about to
+ * flag it invalid and thus might be freed. This has to be done here since
+ * only the control thread can do actions on that list.
+ *
+ * Note that this stream might NOT be in the list but we have to try to
+ * remove it here else this can race with the stream destruction freeing
+ * the object and the connection destroy doing a use after free when
+ * deleting the remaining nodes in this list.
+ */
+ cds_list_del(&stream->recv_list);
+
/* Check if we can close it or else the data will do it. */
try_close_stream(session, stream);