Opened 8 years ago

Closed 6 years ago

#763 closed defect (worksforme)

Overlay operator crash

Reported by: pramsey Owned by: geos-devel@…
Priority: major Milestone: 3.5.2
Component: Default Version: 3.5.0
Severity: Unassigned Keywords:
Cc:

Description

This was reported by a postgis user:

with a as(select ST_GeomFromText('LINESTRING(1031866.54 248543.54,1031876.58 248482.73,1031835.96 248503.82)') as geom  )
select  
  St_difference( 
    ST_EXTERIORRING (ST_Buffer( geom, 25 ,  'endcap=flat join=round' )),
    ST_collect(
      ST_OffsetCurve(geom, 25, 'join=round'), 
      ST_OffsetCurve(geom, -25, 'join=round')
    )  
  )  as geom
 from a

Unfortunately it requires all the operations to get to the crash, which doesn't occur until the final difference.

* thread #1: tid = 0x1385b22, 0x00000001153ea548 libgeos-3.5.0dev.dylib`geos::geom::Coordinate::equals2D(this=0x00007fc70ad029f0, other=0x0000000000000000) const + 24 at Coordinate.inl:52, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
  * frame #0: 0x00000001153ea548 libgeos-3.5.0dev.dylib`geos::geom::Coordinate::equals2D(this=0x00007fc70ad029f0, other=0x0000000000000000) const + 24 at Coordinate.inl:52
    frame #1: 0x00000001153e9f4d libgeos-3.5.0dev.dylib`geos::geom::operator==(a=0x00007fc70ad029f0, b=0x0000000000000000) + 29 at Coordinate.inl:123
    frame #2: 0x00000001154094bb libgeos-3.5.0dev.dylib`geos::algorithm::PointLocator::locate(this=0x00007fff54434ee8, p=0x00007fc70ad029f0, l=0x00007fc70ad01f50) + 91 at PointLocator.cpp:118
    frame #3: 0x0000000115409a70 libgeos-3.5.0dev.dylib`geos::algorithm::PointLocator::computeLocation(this=0x00007fff54434ee8, p=0x00007fc70ad029f0, geom=0x00007fc70ad01fc0) + 720 at PointLocator.cpp:78
    frame #4: 0x00000001154093f8 libgeos-3.5.0dev.dylib`geos::algorithm::PointLocator::locate(this=0x00007fff54434ee8, p=0x00007fc70ad029f0, geom=0x00007fc70ad01fc0) + 376 at PointLocator.cpp:54
    frame #5: 0x00000001155716cf libgeos-3.5.0dev.dylib`geos::operation::overlay::OverlayOp::labelIncompleteNode(this=0x00007fff54434e48, n=0x00007fc70ad029b0, targetIndex=1) + 127 at OverlayOp.cpp:412
    frame #6: 0x0000000115571516 libgeos-3.5.0dev.dylib`geos::operation::overlay::OverlayOp::labelIncompleteNodes(this=0x00007fff54434e48) + 1126 at OverlayOp.cpp:390
    frame #7: 0x000000011556f032 libgeos-3.5.0dev.dylib`geos::operation::overlay::OverlayOp::computeOverlay(this=0x00007fff54434e48, opCode=opDIFFERENCE) + 2258 at OverlayOp.cpp:794
    frame #8: 0x000000011556dc8f libgeos-3.5.0dev.dylib`geos::operation::overlay::OverlayOp::getResultGeometry(this=0x00007fff54434e48, funcCode=opDIFFERENCE) + 31 at OverlayOp.cpp:187
    frame #9: 0x000000011556dbc0 libgeos-3.5.0dev.dylib`geos::operation::overlay::OverlayOp::overlayOp(geom0=0x00007fc70ad02030, geom1=0x00007fc70ad01fc0, opCode=opDIFFERENCE) + 64 at OverlayOp.cpp:93
    frame #10: 0x000000011542ee87 libgeos-3.5.0dev.dylib`geos::operation::overlay::overlayOp::operator(this=0x00007fff54435470, g0=0x00007fc70ad02030, g1=0x00007fc70ad01fc0)(geos::geom::Geometry const*, geos::geom::Geometry const*) + 39 at OverlayOp.h:388
    frame #11: 0x0000000115427d7e libgeos-3.5.0dev.dylib`std::__1::auto_ptr<geos::geom::Geometry> geos::geom::BinaryOp<geos::operation::overlay::overlayOp>(g0=0x00007fc70ad02030, g1=0x00007fc70ad01fc0, _Op=(opCode = opDIFFERENCE)) + 158 at BinaryOp.h:322
    frame #12: 0x000000011542602a libgeos-3.5.0dev.dylib`geos::geom::Geometry::difference(this=0x00007fc70ad02030, other=0x00007fc70ad01fc0) const + 218 at Geometry.cpp:605
    frame #13: 0x000000010c59f1ef libgeos_c.1.dylib`::GEOSDifference_r(extHandle=0x00007fc70b834000, g1=0x00007fc70ad02030, g2=0x00007fc70ad01fc0) + 159 at geos_ts_c.cpp:2098
    frame #14: 0x000000010c58f414 libgeos_c.1.dylib`::GEOSDifference(g1=0x00007fc70ad02030, g2=0x00007fc70ad01fc0) + 36 at geos_c.cpp:454
    frame #15: 0x000000010c510cc0 postgis-2.3.so`lwgeom_difference + 352
    frame #16: 0x000000010c489168 postgis-2.3.so`geos_difference + 88
    frame #17: 0x000000010c48f1c8 postgis-2.3.so`difference + 40
    frame #18: 0x000000010ba3c3e9 postgres`ExecMakeFunctionResultNoSets(fcache=0x00007fc70b82b898, econtext=0x00007fc70b82b7a0, isNull="", isDone=0x00007fc70b843970) + 361 at execQual.c:2026
    frame #19: 0x000000010ba35afd postgres`ExecEvalFunc(fcache=0x00007fc70b82b898, econtext=0x00007fc70b82b7a0, isNull="", isDone=0x00007fc70b843970) + 205 at execQual.c:2417
    frame #20: 0x000000010ba3b1a5 postgres`ExecTargetList(targetlist=0x00007fc70b843938, econtext=0x00007fc70b82b7a0, values=0x00007fc70b843810, isnull="", itemIsDone=0x00007fc70b843970, isDone=0x00007fff54435ea4) + 181 at execQual.c:5307
    frame #21: 0x000000010ba3b0ba postgres`ExecProject(projInfo=0x00007fc70b843850, isDone=0x00007fff54435ea4) + 778 at execQual.c:5522
    frame #22: 0x000000010ba3c95d postgres`ExecScan(node=0x00007fc70b82b458, accessMtd=(postgres`CteScanNext at nodeCtescan.c:32), recheckMtd=(postgres`CteScanRecheck at nodeCtescan.c:139)) + 493 at execScan.c:207
    frame #23: 0x000000010ba5e849 postgres`ExecCteScan(node=0x00007fc70b82b458) + 41 at nodeCtescan.c:155
    frame #24: 0x000000010ba2ec61 postgres`ExecProcNode(node=0x00007fc70b82b458) + 433 at execProcnode.c:434
    frame #25: 0x000000010ba2a426 postgres`ExecutePlan(estate=0x00007fc70b82ac38, planstate=0x00007fc70b82b458, operation=CMD_SELECT, sendTuples='\x01', numberTuples=0, direction=ForwardScanDirection, dest=0x00007fc70b836c78) + 118 at execMain.c:1490
    frame #26: 0x000000010ba2a34b postgres`standard_ExecutorRun(queryDesc=0x00007fc70b824838, direction=ForwardScanDirection, count=0) + 523 at execMain.c:319
    frame #27: 0x000000010ba2a12d postgres`ExecutorRun(queryDesc=0x00007fc70b824838, direction=ForwardScanDirection, count=0) + 77 at execMain.c:267
    frame #28: 0x000000010bbec909 postgres`PortalRunSelect(portal=0x00007fc70b828c38, forward='\x01', count=0, dest=0x00007fc70b836c78) + 329 at pquery.c:942
    frame #29: 0x000000010bbec2d0 postgres`PortalRun(portal=0x00007fc70b828c38, count=9223372036854775807, isTopLevel='\x01', dest=0x00007fc70b836c78, altdest=0x00007fc70b836c78, completionTag="") + 704 at pquery.c:786
    frame #30: 0x000000010bbe798a postgres`exec_simple_query(query_string="with a as(select ST_GeomFromText('LINESTRING(1031866.54 248543.54,1031876.58 248482.73,1031835.96 248503.82)') as geom  )\nselect  St_difference( ST_EXTERIORRING (ST_Buffer( geom, 25 ,  'endcap=flat join=round' )),\n ST_collect(ST_OffsetCurve(geom, 25, 'join=round'), ST_OffsetCurve(geom, -25, 'join=round'))  )  as geom\n from a\n;") + 1258 at postgres.c:1072
    frame #31: 0x000000010bbe6c74 postgres`PostgresMain(argc=1, argv=0x00007fc70b003cb0, dbname="postgis23", username="pramsey") + 2868 at postgres.c:4079

Change History (3)

comment:1 by strk, 8 years ago

I guess you could rebuild GEOS with instrumented debugging lines to catch the very final input to the crashing operation, in HEXWKB form to avoid drifts

comment:2 by strk, 8 years ago

Milestone: 3.5.13.5.2

Ticket retargeted after milestone closed

comment:3 by robe, 6 years ago

Resolution: worksforme
Status: newclosed

Doesn't crash for me under Windows , GEOS 3.6.2, PostGIS 2.4.4

Note: See TracTickets for help on using tickets.