]> granicus.if.org Git - postgis/commitdiff
Fix the calculation of gserialized_max_header_size
authorRaúl Marín Rodríguez <rmrodriguez@carto.com>
Tue, 9 Jul 2019 15:33:24 +0000 (15:33 +0000)
committerRaúl Marín Rodríguez <rmrodriguez@carto.com>
Tue, 9 Jul 2019 15:33:24 +0000 (15:33 +0000)
Closes #4451
Closes https://github.com/postgis/postgis/pull/433

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

NEWS
liblwgeom/gserialized1.c
liblwgeom/gserialized2.c

diff --git a/NEWS b/NEWS
index b79aefa918ea7eeedb323e1e01e142ef6af09e20..902fd75cba7916d6906396ea9927cc2cf7edf46e 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -7,6 +7,7 @@ Additional features enabled if you are running Proj6+ and PostgreSQL 12
 * Major highlights *
   - #4433 32-bit hash fix (requires reindexing hash(geometry) indexes) (Raúl Marín)
   - #4445, Fix a bug in geometry_le (Raúl Marín)
+  - #4451, Fix the calculation of gserialized_max_header_size (Raúl Marín)
 
 
 PostGIS 3.0.0alpha3
index e0a30188d373ddaf620cdbac0142c72e149be0ba..764565a636656e46c49073a06476b50ef5854f99 100644 (file)
@@ -113,8 +113,9 @@ int gserialized1_is_geodetic(const GSERIALIZED *gser)
 
 uint32_t gserialized1_max_header_size(void)
 {
-       /* read GSERIALIZED size + max bbox according gbox_serialized_size (2 + Z + M) + 1 int for type */
-       return sizeof(GSERIALIZED) + 8 * sizeof(float) + sizeof(int);
+       static const intptr_t size_of_gserialized_up_to_data = (intptr_t) & ((GSERIALIZED *)NULL)->data;
+       /* GSERIALIZED size + max bbox according gbox_serialized_size (XYZM*2) + extended flags + type */
+       return size_of_gserialized_up_to_data + 8 * sizeof(float) + sizeof(uint32_t);
 }
 
 static uint32_t gserialized1_header_size(const GSERIALIZED *gser)
index 3e2e65a0b766c0417a9f481362865389227ddada..979dfc55c018bed5d4a0d687a9879bf2ab7e5e72 100644 (file)
@@ -161,8 +161,9 @@ int gserialized2_is_geodetic(const GSERIALIZED *g)
 
 uint32_t gserialized2_max_header_size(void)
 {
-       /* read GSERIALIZED size + max bbox according gbox_serialized_size (XYZM*2) + extended flags + 1 int for type */
-       return sizeof(GSERIALIZED) + 8 * sizeof(float) + sizeof(uint64_t) + sizeof(int);
+       static const intptr_t size_of_gserialized_up_to_data = (intptr_t) & ((GSERIALIZED *)NULL)->data;
+       /* GSERIALIZED size + max bbox according gbox_serialized_size (XYZM*2) + extended flags + type */
+       return size_of_gserialized_up_to_data + 8 * sizeof(float) + sizeof(uint64_t) + sizeof(uint32_t);
 }