glx: Fix a regression in the new XCB code
authorFredrik Höglund <fredrik@kde.org>
Mon, 15 Oct 2012 19:02:05 +0000 (21:02 +0200)
committerFredrik Höglund <fredrik@kde.org>
Tue, 16 Oct 2012 00:24:42 +0000 (02:24 +0200)
dri2DrawableGetMSC(), dri2WaitForMSC() and dri2WaitForSBC() were
inadvertently changed to return 0 on success.  This resulted in the callers
returning an error to the client.

Restore the previous behavior and also check that the reply pointers are
valid before accessing them.

Reviewed-by: Eric Anholt <eric@anholt.net>
src/glx/dri2_glx.c

index ee07e6060100c5abb4f540a4717744b1adbb4af2..a58b3152c9d80b9857ea337a87cd03b180bf9ddf 100644 (file)
@@ -439,12 +439,16 @@ dri2DrawableGetMSC(struct glx_screen *psc, __GLXDRIdrawable *pdraw,
 
    get_msc_cookie = xcb_dri2_get_msc_unchecked(c, pdraw->xDrawable);
    get_msc_reply = xcb_dri2_get_msc_reply(c, get_msc_cookie, NULL);
+
+   if (!get_msc_reply)
+      return 0;
+
    *ust = merge_counter(get_msc_reply->ust_hi, get_msc_reply->ust_lo);
    *msc = merge_counter(get_msc_reply->msc_hi, get_msc_reply->msc_lo);
    *sbc = merge_counter(get_msc_reply->sbc_hi, get_msc_reply->sbc_lo);
    free(get_msc_reply);
 
-   return 0;
+   return 1;
 }
 
 static int
@@ -467,12 +471,16 @@ dri2WaitForMSC(__GLXDRIdrawable *pdraw, int64_t target_msc, int64_t divisor,
                                                  divisor_hi, divisor_lo,
                                                  remainder_hi, remainder_lo);
    wait_msc_reply = xcb_dri2_wait_msc_reply(c, wait_msc_cookie, NULL);
+
+   if (!wait_msc_reply)
+      return 0;
+
    *ust = merge_counter(wait_msc_reply->ust_hi, wait_msc_reply->ust_lo);
    *msc = merge_counter(wait_msc_reply->msc_hi, wait_msc_reply->msc_lo);
    *sbc = merge_counter(wait_msc_reply->sbc_hi, wait_msc_reply->sbc_lo);
    free(wait_msc_reply);
 
-   return 0;
+   return 1;
 }
 
 static int
@@ -489,12 +497,16 @@ dri2WaitForSBC(__GLXDRIdrawable *pdraw, int64_t target_sbc, int64_t *ust,
    wait_sbc_cookie = xcb_dri2_wait_sbc_unchecked(c, pdraw->xDrawable,
                                                  target_sbc_hi, target_sbc_lo);
    wait_sbc_reply = xcb_dri2_wait_sbc_reply(c, wait_sbc_cookie, NULL);
+
+   if (!wait_sbc_reply)
+      return 0;
+
    *ust = merge_counter(wait_sbc_reply->ust_hi, wait_sbc_reply->ust_lo);
    *msc = merge_counter(wait_sbc_reply->msc_hi, wait_sbc_reply->msc_lo);
    *sbc = merge_counter(wait_sbc_reply->sbc_hi, wait_sbc_reply->sbc_lo);
    free(wait_sbc_reply);
 
-   return 0;
+   return 1;
 }
 
 /**