From cdf66c0e3aa17b80ab38fdf1b9b83c4ee689f4d9 Mon Sep 17 00:00:00 2001 From: Paul Ramsey Date: Fri, 6 Oct 2017 13:17:34 +0000 Subject: [PATCH] Undefined behaviour in TYPMOD_GET_SRID References #3880 git-svn-id: http://svn.osgeo.org/postgis/branches/2.4@15915 b70326c6-7e19-0410-871a-916f4a2858ee --- NEWS | 2 ++ liblwgeom/cunit/cu_libgeom.c | 10 ++++++++++ liblwgeom/liblwgeom.h.in | 2 +- 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 0f83e434d..0e632ca9c 100644 --- a/NEWS +++ b/NEWS @@ -8,6 +8,8 @@ YYYY/MM/DD - #3871, Performance tweak for geometry cmp function - #3879, Division by zero in some arc cases - #3878, Single defn of signum in header + - #3880, Undefined behaviour in TYPMOD_GET_SRID + PostGIS 2.4.0 2017/09/30 diff --git a/liblwgeom/cunit/cu_libgeom.c b/liblwgeom/cunit/cu_libgeom.c index c91c17ac0..6d658aff4 100644 --- a/liblwgeom/cunit/cu_libgeom.c +++ b/liblwgeom/cunit/cu_libgeom.c @@ -35,6 +35,16 @@ static void test_typmod_macros(void) rv = TYPMOD_GET_SRID(typmod); CU_ASSERT_EQUAL(rv, srid); + srid = 999999; + TYPMOD_SET_SRID(typmod,srid); + rv = TYPMOD_GET_SRID(typmod); + CU_ASSERT_EQUAL(rv, srid); + + srid = -999999; + TYPMOD_SET_SRID(typmod,srid); + rv = TYPMOD_GET_SRID(typmod); + CU_ASSERT_EQUAL(rv, srid); + srid = SRID_UNKNOWN; TYPMOD_SET_SRID(typmod,srid); rv = TYPMOD_GET_SRID(typmod); diff --git a/liblwgeom/liblwgeom.h.in b/liblwgeom/liblwgeom.h.in index 702283d64..4e7b5c929 100644 --- a/liblwgeom/liblwgeom.h.in +++ b/liblwgeom/liblwgeom.h.in @@ -161,7 +161,7 @@ typedef enum LWORD_T { * ZM Flags = Bottom 2 bits. */ -#define TYPMOD_GET_SRID(typmod) ((((typmod) & 0x1FFFFF00)<<3)>>11) +#define TYPMOD_GET_SRID(typmod) ((((typmod) & 0x0FFFFF00) - ((typmod) & 0x10000000)) >> 8) #define TYPMOD_SET_SRID(typmod, srid) ((typmod) = (((typmod) & 0xE00000FF) | ((srid & 0x001FFFFF)<<8))) #define TYPMOD_GET_TYPE(typmod) ((typmod & 0x000000FC)>>2) #define TYPMOD_SET_TYPE(typmod, type) ((typmod) = (typmod & 0xFFFFFF03) | ((type & 0x0000003F)<<2)) -- 2.50.1