}
/* LCOV_EXCL_START */
+static int
+_tdm_client_vblank_wait_list_validation_check(tdm_private_client_vblank *private_vblank)
+{
+ if (private_vblank->wait_list.next == NULL || private_vblank->wait_list.prev == NULL) {
+ TDM_ERR("vblank(%p) wait_list broken. prev(%p), next(%p) pid(%d)",
+ private_vblank, private_vblank->wait_list.prev, private_vblank->wait_list.next, getpid());
+ }
+
+ return 0;
+}
+
static void
_tdm_client_vblank_cb_done(void *data, struct wl_tdm_vblank *wl_tdm_vblank,
uint32_t req_id, uint32_t sequence, uint32_t tv_sec,
TDM_DBG("vblank(%p) req_id(%u) sequence(%u) time(%.6f)",
private_vblank, req_id, sequence, TDM_TIME(tv_sec, tv_usec));
+ _tdm_client_vblank_wait_list_validation_check(private_vblank);
+
LIST_FOR_EACH_ENTRY(w, &private_vblank->wait_list, link) {
if (w->req_id != req_id)
continue;
tdm_client_create_voutput(tdm_client *client, const char *name, tdm_error *error)
{
tdm_private_client *private_client;
- tdm_private_client_output *private_output;
+ tdm_private_client_output *private_output = NULL;
tdm_private_client_voutput *private_voutput;
struct wl_proxy *wrapper;
LIST_INITHEAD(&private_voutput->buffer_list);
private_voutput->private_client = private_client;
- strncpy(private_voutput->name, name, TDM_NAME_LEN);
+ strncpy(private_voutput->name, name, TDM_NAME_LEN - 1);
+ private_voutput->name[TDM_NAME_LEN - 1] = '\0';
private_voutput->wl_voutput = wl_tdm_create_voutput((struct wl_tdm *)wrapper, name);
wl_proxy_wrapper_destroy(wrapper);
LIST_FOR_EACH_ENTRY_SAFE(cb, cbb, &private_voutput->buffer_list, link) {
tbm_surface_h tbm_surface = NULL;
- if (!cb) continue;
-
LIST_DEL(&cb->link);
tbm_surface = (tbm_surface_h)wl_buffer_get_user_data(cb->wl_buffer);
if (count != 0) {
private_voutput->available_modes.modes = calloc(count, sizeof(tdm_client_output_mode));
+ if (private_voutput->available_modes.modes == NULL) {
+ private_voutput->available_modes.count = 0;
+ pthread_mutex_unlock(&private_client->lock);
+ return TDM_ERROR_OUT_OF_MEMORY;
+ }
memcpy(private_voutput->available_modes.modes, modes, sizeof(tdm_client_output_mode) * count);
}
free(h);
pthread_mutex_unlock(&private_client->lock);
+
+ return;
}
pthread_mutex_unlock(&private_client->lock);