[Libreoffice] [REVIEW] fix for a chart crasher
Kevin Hunter
hunteke at earlham.edu
Thu Mar 3 06:42:38 PST 2011
At 4:22am -0500 Thu, 03 Mar 2011, Tor Lillqvist wrote:
>> for a cherry-pick candidate to libreoffice-3-3. It's a very simple&
>> safe fix, and fixes a crasher as reported in
>
> But do you know how those values can end up being negative in the
> first place, is that a symptom of something being horribly wrong
> otherwise, and this patch now then just plasters over that and
> instead of crashing it might permit silent data corruption elsewhere
> then instead?
Alas, in my limited 20 minutes last night I was not able to get the full
scope in my mind, so I pose it as a question here instead: I'm a little
concerned with /why/ either of those two functions are returning a
negative number at all. (I certainly didn't give LO one in the input!)
Is there ever a time that either of those should be negative? The
rest of the code in getAllTicks() assumes that they're always >= 0.
At first glance, getTickDepth() and getMaxTickCount() read to me as
requests for non-negative values (from an English/math sense). However,
I note that the return values are sal_Int32 instead of sal_uInt32.
Going one call down in the stack trace:
sal_Int32 TickmarkHelper::getTickDepth() const
{
return m_rIncrement.SubIncrements.getLength() + 1;
}
If that's truly a length (where are the frickin' data definitions?!?!),
then, sans a wraparound, that certainly shouldn't be negative. Surely
we aren't at MAX_INT?
sal_Int32 TickmarkHelper::getMaxTickCount( sal_Int32 nDepth ) const
Again, I've run out of time, but my spidey sense is pointing to a
combination of "too small a range" = close enough to zero for the
computer to interpret as 0 or returning a negative "almost 0", and then
line 484 or 495:
484: sal_Int32 nIntervalCount = static_cast<sal_Int32>( fSub /
m_rIncrement.Distance );
I have not yet sussed out what approxSub() or isFinite() does to fSub.
Are they making nIntervalCount negative, through the fSub proxy?
495: nTickCount = nIntervalCount *
(m_rIncrement.SubIncrements[nDepth-1].IntervalCount-1);
If it's 495, I don't know how it's getting past the if above.
Thoughts?
Kevin
More information about the LibreOffice
mailing list