]> granicus.if.org Git - postgis/commitdiff
Undefined behaviour in TYPMOD_GET_SRID
authorPaul Ramsey <pramsey@cleverelephant.ca>
Fri, 6 Oct 2017 13:17:34 +0000 (13:17 +0000)
committerPaul Ramsey <pramsey@cleverelephant.ca>
Fri, 6 Oct 2017 13:17:34 +0000 (13:17 +0000)
References #3880

git-svn-id: http://svn.osgeo.org/postgis/branches/2.4@15915 b70326c6-7e19-0410-871a-916f4a2858ee

NEWS
liblwgeom/cunit/cu_libgeom.c
liblwgeom/liblwgeom.h.in

diff --git a/NEWS b/NEWS
index 0f83e434d985497355e3c16082d0e351c18d946a..0e632ca9c72076e6aa7213bbf672133e29efaed6 100644 (file)
--- 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
index c91c17ac0f8ff88ef06158d8df231a230c970bde..6d658aff4fd0252110b2ca77eecf4230eaa71d76 100644 (file)
@@ -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);
index 702283d6464238b49adee4fabb883a0341d6fedd..4e7b5c9295f46219d4ccab7b4babac9f57a47548 100644 (file)
@@ -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))