[osgeo4w-dev] [osgeo4w] #668: Union crashes when there are EMPTY items inside MULTI- or GEOMETRYCOLLECTION objects

OSGeo4W trac_osgeo4w at osgeo.org
Thu Mar 18 03:30:18 PDT 2021


#668: Union crashes when there are EMPTY items inside MULTI- or
GEOMETRYCOLLECTION objects
-------------------+----------------------------
Reporter:  otan    |       Owner:  osgeo4w-dev@…
    Type:  defect  |      Status:  closed
Priority:  minor   |   Component:  Package
 Version:          |  Resolution:  invalid
Keywords:          |
-------------------+----------------------------

Comment (by otan):

 This is a GEOS issue. Here is a GEOS repro (using intersects, which AFAICT
 union calls).


 {{{
  ✘ ⚙ otan at otan-mbp  ~   g++ -o tst tst.cc -lgeos -lgeos_c -std=c++11
  ⚙ otan at otan-mbp  ~  ./tst
 [3]    86414 segmentation fault  ./tst
  ✘ ⚙ otan at otan-mbp  ~  cat tst.cc
 #include <geos_c.h>
 #include <string>

 using namespace std;

 void geos_message_handler(const char *fmt, ...) {}
 void geos_error_handler(const char *fmt, ...) {}

 int main() {
   // POLYGON Z ((-8576813007.651572 -932867148.5664893 -594332188.2168996,
 -9076378702.816006 -1058770692.353365 -2286612467.79976,
 -8577214214.487094 -923078893.7098079 -922845555.2543786,
 -8763948942.517227 3632693707.16387 -1890400776.3303413,
 -7612818442.454826 3813396489.705141 -376275881.4206352,
 -4258868082.9764023 2821219037.959036 -7927470779.677084,
 -2376927148.576969 762393778.6277254 -5185416958.8125515,
 8374297972.826973 3684983643.201231 -3159751777.281743,
 -2311638561.4350195 690968693.0169502 -2246826599.5283184,
 3511882417.12018 -5679907177.601899 -7190612231.893617, -8305726872.755655
 -7546563480.596777 3891638858.362171, -8576813007.651572
 -932867148.5664893 -594332188.2168996))
   string aEWKB =
 "0103000080010000000C000000D76CFA7C7CF3FFC1B982482636CDCBC15EC31B0E65B6C1C12E877662F4E700C2103B2D82C78DCFC1A29779FE5D09E1C123CB6770DEF3FFC1FCDADA768882CBC17A8FA0B9C080CBC1482374FCF95200C26C3E6539D010EB41502415824E2BDCC1F846A740265CFCC1849036017A69EC41C0AE6BA9836DB6C1B03E5F6E25BBEFC16CB0BE5B0C05E54156D5BAAB3988FDC1887692F5A0B5E1C14E5950599AB8C6413600EDEF3251F3C1483B4D575A32FF417C70666B8C74EB410A04298CBF8AE7C1AEEB2DC41939E1C16D2B823AAC97C441FCE7F04C7BBDE0C184D82356622AEA4161A19916C828F5C1414C7E9080C9FAC12A178C59F5F0FEC1668C89B9F61CFCC1E8964B49B6FEEC41D76CFA7C7CF3FFC1B982482636CDCBC15EC31B0E65B6C1C1";
   // GEOMETRYCOLLECTION ZM (MULTIPOINT ZM (-572200857.2088509
 7909820002.898613 -5497698646.885041 6664440051.466028,
 -429525248.49892807 9279013845.258144 1865812608.4202595
 -5627983850.52976, -8961875736.194313 -3646093887.306757 6114061050.084791
 7928242422.52462, -1658395500.6136656 5463281975.551853 1226372454.8883152
 -6033337335.334749, EMPTY), LINESTRING ZM (5640013450.60927
 -4034194887.4798727 7233778169.767132 -8214889161.72134, 9862309549.538734
 5014594919.08839 -925144949.3365879 -5659691769.45695), MULTIPOLYGON ZM
 EMPTY, MULTIPOINT ZM (EMPTY, 4481472784.121752 -8278911850.336457
 6955040725.022459 4792703658.978086, EMPTY))
   string bEWKB = "
 01070000C00400000001040000C00500000001010000C0A0BB9ACC8B0DC1C1B8602E666477FD4121296E95037BF4C1DA74378FB4D3F84101010000C0C0B97F00099AB9C1AE10AA1E9448014288E51AA082CDDB41E679A87E43F7F4C101010000C0F48DC1F85AB100C2F4D0E9475F2AEBC14E5BA1AFD2C6F641D864680FF688FD4101010000C04C4627DB46B6D8C164D47813315AF44128DAB8593D46D241225B75BFD679F6C101010000C0000000000000F87F000000000000F87F000000000000F87F000000000000F87F01020000C00200000092BFA968BC02F5411E5BEFB89D0EEEC12C469C1FABF2FA419C8A9B2C549AFEC1544F6C35B75E02420C6A71564AAEF2415015ABBA4B92CBC1AB4F97AF8015F5C101060000C00000000001040000C00300000001010000C0000000000000F87F000000000000F87F000000000000F87F000000000000F87F01010000C0B2F20191DDB1F0412162A5B662D7FEC1FE5B50FDD7E8F9413EA6AFAAADDAF14101010000C0000000000000F87F000000000000F87F000000000000F87F000000000000F87F";

   initGEOS(&geos_message_handler, &geos_error_handler);

   auto wkbReader = GEOSWKBReader_create();
   auto geomA = GEOSWKBReader_read(wkbReader, reinterpret_cast<const
 unsigned char*>(aEWKB.data()), aEWKB.length());
   auto geomB = GEOSWKBReader_read(wkbReader, reinterpret_cast<const
 unsigned char*>(bEWKB.data()), bEWKB.length());
   GEOSIntersects(geomA, geomB);
   return 0;
 }
 }}}

-- 
Ticket URL: <https://trac.osgeo.org/osgeo4w/ticket/668#comment:2>
OSGeo4W <http://trac.osgeo.org/osgeo4w>
OSGeo4W is the Windows installer and package environment for the OSGeo stack.


More information about the osgeo4w-dev mailing list