[PATCH] STABLE branch: bug 2715 - crash on zoom

From: Johnny Lee (typo_pl@hotmail.com)
Date: Sun Feb 16 2003 - 14:46:45 EST

  • Next message: Mark Gilbert: "Re: [PATCH] STABLE branch: bug 2715 - crash on zoom"

    HEAD has the fix, but STABLE seems to have only fixed the code for the DEBUG
    build, which isn't very helpful for 99% of the userbase.

    Patch is also attached as 'patch2715.txt' in case Hotmail severely munges
    the unified diff patch below.

    For abi\src\wp\ap\xp\ap_TopRuler.cpp:

    --- ap_TopRuler.cpp.old Sun Feb 16 13:59:27 2003
    +++ ap_TopRuler.cpp Sun Feb 16 13:52:45 2003
    @@ -1398,11 +1398,9 @@

            fl_BlockLayout * pBL = (static_cast<FV_View
    *>(m_pView))->getCurrentBlock();
            UT_ASSERT (pBL);
    -#if DEBUG
            if (pBL == NULL) {
                    return false;
            }
    -#endif
            bool bRTLpara = pBL->getDominantDirection() == FRIBIDI_TYPE_RTL;

            if(bRTLpara)

    =================================================================

    Long description:
    ------------------------------------------------------------

    I read the description for bug 2715.

    I was able to repro the bug in the released AbiWord 1.0.4.

    I tried to repro in my debug build of the 1.0.4 source code, but I never got
    a crash.

    I was able to come up with reproable steps for the bug in the release build:

    Repro Steps:

    1. Open the attachment from comment # 65 of bug 2715,
    <http://bugzilla.abisource.com/show_bug.cgi?id=2715#c65>.

    2. From the Zoom submenu under the View menu, select the "Zoom to 50%" menu
    item.

    3. In the Zoom combobox on the toolbar, select the 75% zoom level with the
    mouse.

    Result:
    Crash.

    But the debug build never crashed.

    I was going to have to do this the hard way...

    I fired up the debugger on the release build of AbiWord 1.0.4 and set the
    debugger to always stop for access violation exceptions.

    I reproed the bug and looked at the crash under the debugger.

    Here's the disassembly, crash is at 0x004343BE, eax == 0:

    ------------------------------------------------------------------
    00434383 89 44 24 34 mov dword ptr [esp+34h],eax
    00434387 51 push ecx
    00434388 57 push edi
    00434389 8B CE mov ecx,esi
    0043438B E8 F0 22 00 00 call 00436680
    00434390 8B 8E 88 00 00 00 mov ecx,dword ptr [esi+88h]
    00434396 8D 54 24 23 lea edx,[esp+23h]
    0043439A 03 C8 add ecx,eax
    0043439C 52 push edx
    0043439D 68 5C 79 5B 00 push 5B795Ch
    004343A2 89 44 24 24 mov dword ptr [esp+24h],eax
    004343A6 89 4C 24 20 mov dword ptr [esp+20h],ecx
    004343AA E8 41 70 FD FF call 0040B3F0
    004343AF 8B C8 mov ecx,eax
    004343B1 E8 1A 79 FD FF call 0040BCD0
    004343B6 8B 4E 24 mov ecx,dword ptr [esi+24h]
    004343B9 E8 12 24 0B 00 call 004E67D0

    vvvvvvvvvvvvvvvvvvvvvvvvv

    004343BE 81 B8 E0 00 00 00 11 cmp dword ptr [eax+0E0h],111h

    ^^^^^^^^^^^^^^^^^^^^^^^^^^

    004343C8 0F 94 C0 sete al
    004343CB 84 C0 test al,al
    004343CD 88 44 24 13 mov byte ptr [esp+13h],al
    004343D1 74 10 je 004343E3
    004343D3 8B 44 24 18 mov eax,dword ptr [esp+18h]
    004343D7 8B 4C 24 24 mov ecx,dword ptr [esp+24h]
    004343DB 2B C1 sub eax,ecx
    004343DD 89 44 24 14 mov dword ptr [esp+14h],eax
    004343E1 EB 0E jmp 004343F1
    004343E3 8B 4C 24 24 mov ecx,dword ptr [esp+24h]
    004343E7 8B 44 24 1C mov eax,dword ptr [esp+1Ch]
    004343EB 2B C8 sub ecx,eax
    ------------------------------------------------------------------

    After chasing down several goose chases, I noticed a unique piece of
    assembly language:

    0043439D 68 5C 79 5B 00 push 5B795Ch

    This isn't common. So it's either a constant or a data reference.

    In the debugger, I looked to see what was at memory location 0x005B795C.

    005B795C 44 65 66 61 75 6C 74 44 69 72 65 63 74 69 6F 6E 52
    DefaultDirectionR
    005B796D 74 6C 00 2C 00 00 00 74 65 78 74 2D 69 6E 64 65 6E
    tl.,...text-inden

    Hmm. "DefaultDirectionRtl"?! That's unique and should be easy to track down.

    Searching the code for this string revealed that it was in the BIDI builds.
    But I was only building the debug non-BIDI code.

    Looking at all the code that used the string revealed one bit of code which
    looked like the culprit.

    In abi\src\wp\ap\xp\ap_TopRuler.cpp, ~line 1400:

    #ifdef BIDI_ENABLED
            UT_sint32 xAbsRight = xAbsLeft + m_infoCache.u.c.m_xColumnWidth;
            bool bRTLglobal;
            XAP_App::getApp()->getPrefsValueBool((XML_Char*)AP_PREF_KEY_DefaultDirectionRtl,
    &bRTLglobal);

            fl_BlockLayout * pBL = (static_cast<FV_View
    *>(m_pView))->getCurrentBlock();
            UT_ASSERT (pBL);
    #if DEBUG
            if (pBL == NULL) {
                    return false;
            }
    #endif
            bool bRTLpara = pBL->getDominantDirection() == FRIBIDI_TYPE_RTL;

    The "#if DEBUG" got my attention.

    That would explain why my debug build never crashed even when I build the
    BIDI version.

    Looking at the CVS HEAD branch of ap_TopRuler.cpp, there was a checkin by
    tomas_f back in July 2002 which had a comment about fixing bug 2715. But the
    description for bug 2715 said that the fix had been backported.

    I took a look at the source code for the nightly build of the STABLE branch
    and ap_TopRuler.cpp was the same as mine. So it looks like tomas_f's fix was
    not in the STABLE branch.

    The patch above is equivalent to tomas_f's patch in the release build.

    _________________________________________________________________
    Protect your PC - get McAfee.com VirusScan Online
    http://clinic.mcafee.com/clinic/ibuy/campaign.asp?cid=3963





    This archive was generated by hypermail 2.1.4 : Sun Feb 16 2003 - 14:51:25 EST