Opened 7 years ago
Closed 7 years ago
#4093 closed defect (fixed)
Inconsistent results from qsort callback
Reported by: | yugr | Owned by: | pramsey |
---|---|---|---|
Priority: | medium | Milestone: | PostGIS 2.4.5 |
Component: | postgis | Version: | 2.4.x |
Keywords: | Cc: |
Description
Hi,
qsort callbacks struct_cmp_by_measure and cmpfunc may return invalid result when arguments are swapped. Such bugs may causes inconsistent order or even crashes in some qsort implementations (https://bugzilla.samba.org/show_bug.cgi?id=3959).
The issue has been detected when running standard testsuite under SortChecker (https://github.com/yugr/sortcheck):
lt-cu_tester[425]: qsort: comparison function is not symmetric (comparison function 0x7f1913a75ef0 (/build/postgis-2.2.1+dfsg/liblwgeom/.libs/liblwgeom-2.2.so.5.0.0+0x10ef0), called from 0x7f1913a77456 (/build/postgis-2.2.1+dfsg/liblwgeom/.libs/liblwgeom-2.2.so.5.0.0+0x12456), cmdline is "/build/postgis-2.2.1+dfsg/liblwgeom/cunit/.libs/lt-cu_tester")
The fix is to replace
return ( ia→themeasure>ib→themeasure ) ? 1 : -1;
with
return ( ia→themeasure>ib→themeasure ) ? 1 : ( ia→themeasure<ib→themeasure ) ? -1 : 0;
and
return (v1>v2 ) ? 1 : -1;
with
return (v1>v2 ) ? 1 : (v1<v2) ? -1 : 0;
In 16583: