diff options
author | Fujii Hironori <Hironori.Fujii@sony.com> | 2023-01-10 15:12:07 +0900 |
---|---|---|
committer | Fujii Hironori <Hironori.Fujii@sony.com> | 2023-01-11 06:11:28 +0900 |
commit | 2135fd4a49eff16284397982448f1496fa9361ca (patch) | |
tree | 2e230f040bec2b5484adbe788d889148b59f8935 /src/cairo-atomic-private.h | |
parent | c76a699f6cfd386b134f63515dc6a3c791fdd226 (diff) | |
download | cairo-2135fd4a49eff16284397982448f1496fa9361ca.tar.gz |
sizeof(cairo_atomic_int_t) should be sizeof(int)
`_cairo_status_set_error` was using `_cairo_atomic_int_cmpxchg` to set
a `cairo_status_t` variable by casting a `cairo_status_t*` to
`cairo_atomic_int_t*`. `cairo_atomic_int` has a generic implementation
which is using a mutex. In the implementation, `cairo_atomic_int_t`
was typedef-ed to `cairo_atomic_intptr_t`. In a typical 64bit system,
cairo_atomic_intptr_t is 64bit and cairo_status_t is 32bit,
_cairo_status_set_error didn't work as expected.
Define `cairo_atomic_int_t` as an alias of `int`.
Added an assertion in `_cairo_status_set_error` to ensure
that `*err` has the same size with `cairo_atomic_int_t`.
Fixes cairo/cairo#606
Diffstat (limited to 'src/cairo-atomic-private.h')
-rw-r--r-- | src/cairo-atomic-private.h | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/src/cairo-atomic-private.h b/src/cairo-atomic-private.h index a9eb38a7f..727f97c75 100644 --- a/src/cairo-atomic-private.h +++ b/src/cairo-atomic-private.h @@ -340,6 +340,8 @@ _cairo_atomic_ptr_cmpxchg_return_old (void **x, void *oldv, void *newv) #ifndef HAS_ATOMIC_OPS +typedef int cairo_atomic_int_t; + #if SIZEOF_VOID_P==SIZEOF_INT typedef unsigned int cairo_atomic_intptr_t; #elif SIZEOF_VOID_P==SIZEOF_LONG @@ -350,8 +352,6 @@ typedef unsigned long long cairo_atomic_intptr_t; #error No matching integer pointer type #endif -typedef cairo_atomic_intptr_t cairo_atomic_int_t; - cairo_private void _cairo_atomic_int_inc (cairo_atomic_int_t *x); @@ -376,7 +376,8 @@ cairo_private cairo_atomic_int_t _cairo_atomic_int_get_relaxed (cairo_atomic_int_t *x); void _cairo_atomic_int_set_relaxed (cairo_atomic_int_t *x, cairo_atomic_int_t val); -# define _cairo_atomic_ptr_get(x) (void *) _cairo_atomic_int_get((cairo_atomic_int_t *) x) +cairo_private void* +_cairo_atomic_ptr_get(void **x); #else # define _cairo_atomic_int_get(x) (*x) # define _cairo_atomic_int_get_relaxed(x) (*x) @@ -441,6 +442,7 @@ _cairo_atomic_ptr_cmpxchg_return_old_fallback(void **x, void *oldv, void *newv) #define _cairo_status_set_error(status, err) do { \ int ret__; \ assert (err < CAIRO_STATUS_LAST_STATUS); \ + assert (sizeof(*status) == sizeof(cairo_atomic_int_t)); \ /* hide compiler warnings about cairo_status_t != int (gcc treats its as \ * an unsigned integer instead, and about ignoring the return value. */ \ ret__ = _cairo_atomic_int_cmpxchg ((cairo_atomic_int_t *) status, CAIRO_STATUS_SUCCESS, err); \ |