Select location of divesite in new map widget

Lubomir I. Ivanov neolit123 at gmail.com
Tue Oct 3 11:30:04 PDT 2017


On 3 October 2017 at 21:18, Dirk Hohndel <dirk at hohndel.org> wrote:
>
>> On Oct 3, 2017, at 11:02 AM, Lubomir I. Ivanov <neolit123 at gmail.com> wrote:
>>>> yey, a compiler bug (stack corruption) in:
>>>> gcc version 5.3.0 (i686-posix-dwarf-rev0, Built by MinGW-W64 project)
>>>>
>>>> in divelistview.cpp, for this:
>>>> for (int col = DiveTripModel::NR; col < DiveTripModel::COLUMNS; ++col) {
>>>>
>>>> instead of incrementing col up to 16, it goes up to 2689.
>>>
>>> Sweet. If you look at the preprocessor output, is it the DiveTripModel::COLUMNS
>>> that is incorrectly expanded, or is it really the code generation?
>>>
>>> And given that Gaetan sees this on Arch... different compiler, right?
>>>
>>> WEIRD
>>>
>>
>> apparently, the stack gets corrupted by out-of-bounds access...how?
>> i'm not sure, but i won't disassemble this as there is an easy fix and
>> we are doing something wrong.
>>
>> divelistview.cpp has this:
>> static int defaultWidth[] =    {  70, 140, 90,  50,  50,  50,  50,
>> 70,  50,  50,  70,  50,  50,  5, 500};
>>
>> the loop uses the 'col' iterator which is clamped up to
>> DiveTripModel::COLUMNS, but DiveTripModel::COLUMNS is larger than the
>> N of elements in defaultWidth.
>>
>> so the first out-of-bound access to:
>> defaultWidth[col]
>>
>> modifies the loop's limit to something like 2689 and it proceeds with
>> the out-of-bound access until a SIGSEGV.
>
> That makes more sense.
> We need to figure out why we overwrite the stack! Can you set a memory
> breakpoint to see where this happens?
>

i'm pretty sure we overwrite it with the following, when 'col' is OOB:
defaultWidth[col] = width

but it's very hard to predict if the OOD override will harmful or not.

>> fixes:
>> 1) add another element to defaultWidth[] for 'country' and iterate col
>> up to the size of defaultWIdth[].
>
> can you submit a patch?

yes, that's the trivial fix.
please, confirm with option 2.

>
>> 2) move defaultWidth as a method in DiveTripModel, for safety
>

i was thinking about hardcoding the pixel values in DiveTripModel
inside some method with error checking instead of a int array in
divelistview.cpp.
the idea is that once a new column is added the author should also
modify the method in question to return this column's width and that
would happen in the same source file.

lubomir
--


More information about the subsurface mailing list