WineHQ
Bug Tracking Database – Bug 27398

 Bugzilla

 

Last modified: 2013-12-06 13:44:40 UTC  

Debug4x: Application locks/crashes at start due to bad symbol font handling (failed default charset/map selection)

Bug 27398 - Debug4x: Application locks/crashes at start due to bad symbol font handling (failed default charset/map selection)
Debug4x: Application locks/crashes at start due to bad symbol font handling (...
Status: CLOSED FIXED
AppDB: Show Apps affected by this bug
Product: Wine
Classification: Unclassified
Component: gdi32
1.3.21
x86 Linux
: P2 normal
: ---
Assigned To: Mr. Bugs
http://www.debug4x.com/
: download
Depends on:
Blocks:
  Show dependency tree
 
Reported: 2011-06-05 09:50 UTC by Stefano Priore
Modified: 2013-12-06 13:44 UTC (History)
1 user (show)

See Also:
Regression SHA1:
Fixed by SHA1:
Distribution: ---
Staged patchset:


Attachments
Output of winedbg (626 bytes, text/plain)
2011-06-05 10:00 UTC, Stefano Priore
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Stefano Priore 2011-06-05 09:50:20 UTC
Debug4x is a free development environment for the 48/49/50 series of HP calculators.

Current available version at http://www.debug4x.com/ (v2.2 - build 159) hangs after a successful installation during first launch.

I've tried to obtain a backtrace as suggested at http://wiki.winehq.org/Backtraces?action=show&redirect=winedbg - I'll attach soon the (very short) report.
Comment 1 Stefano Priore 2011-06-05 10:00:04 UTC
Created attachment 35036 [details]
Output of winedbg

That's all the output I've been able to extract from running winedbg. My attempts to "attach" to the pid of Debug4x to obtain a more complete backtrace failed  due to the fact that "attach" is not a recognized command, despite what http://wiki.winehq.org/Backtraces?action=show&redirect=winedbg says.
Comment 2 Anastasius Focht 2011-06-05 13:15:08 UTC
Hello,

the problem seems to be the default charset/map handling for a symbol font "HP48" the application installs and uses at runtime.

--- snip ---
...
0021:trace:font:WineEngCreateFontInstance L"HP48", h=-13, it=0, weight=400, PandF=00, charset=1 orient 0 escapement 0
0021:trace:font:WineEngCreateFontInstance DC transform 1.000000 0.000000 0.000000 1.000000
0021:trace:font:WineEngCreateFontInstance not in cache
0021:trace:font:WineEngCreateFontInstance (it=0, bd=0) is selected for (it=0, bd=0)
0021:trace:font:WineEngCreateFontInstance Chosen: L"HP48" L"Regular" (/home/focht/.wine/dosdevices/c:/windows/Fonts/HP48.TTF/(nil):0)
0021:trace:font:WineEngCreateFontInstance font scale y: 1.000000
0021:trace:font:OpenFontFace "/home/focht/.wine/dosdevices/c:/windows/Fonts/HP48.TTF"/(nil), 0, 0 x -13
0021:trace:font:WineEngGetFontData font=0x1b29b8, table=VDMX, offset=0x0, buf=0x32f1f6, cbData=0x6
0021:trace:font:WineEngGetFontData Can't find table VDMX
0021:trace:font:OpenFontFace height -13 => ppem 13
0021:trace:font:WineEngCreateFontInstance caching: gdiFont=0x1b29b8  hfont=0x4ccc
0021:trace:font:X11DRV_SelectFont hdc=0xabc, hfont=0x4ccc
0021:trace:font:X11DRV_SelectFont gdiFont = 0x1b29b8
0021:trace:font:update_font_code_page charset 0 => cp 1252
0021:Ret  gdi32.SelectObject() retval=0000007c ret=004b3a9b
0021:Call gdi32.GetFontLanguageInfo(00000abc) ret=004b3aa3
0021:Ret  gdi32.GetFontLanguageInfo() retval=00000000 ret=004b3aa3
0021:Call gdi32.SelectObject(00000abc,0000007c) ret=004b3ab2 
...
0021:trace:font:WineEngCreateFontInstance L"HP48", h=-13, it=0, weight=400, PandF=00, charset=1 orient 0 escapement 0
0021:trace:font:WineEngCreateFontInstance DC transform 1.000000 0.000000 0.000000 1.000000
0021:trace:font:WineEngCreateFontInstance returning cached gdiFont(0x1b29b8) for hFont 0x4cd0
0021:trace:font:X11DRV_SelectFont hdc=0xabc, hfont=0x4cd0
0021:trace:font:X11DRV_SelectFont gdiFont = 0x1b29b8
0021:trace:font:update_font_code_page charset 0 => cp 1252
0021:Ret  gdi32.SelectObject() retval=0000007c ret=004b4324
0021:Call gdi32.GetTextMetricsA(00000abc,0032f658) ret=004b3e56
0021:trace:font:WineEngGetOutlineTextMetrics font=0x1b29b8
0021:trace:font:WineEngGetOutlineTextMetrics OS/2 winA = 899 winD = 196 typoA = 613 typoD = -188 typoLG = 100 FT_Face a = 899, d = -196, h = 1150: HORZ a = 899, d = -196 lg = 55 maxY = 899 minY = -196
0021:trace:font:GetTextMetricsW text metrics:
    Weight = 400	 FirstChar = 0	 AveCharWidth = 8
    Italic =   0	 LastChar = 61695		 MaxCharWidth = 14
    UnderLined = 0	 DefaultChar = 31	 Overhang = 0
    StruckOut = 0	 BreakChar = 32	 CharSet = 0
    PitchAndFamily = 36
    --------------------
    InternalLeading = 1
    Ascent = 12
    Descent = 3
    Height = 15
0021:Ret  gdi32.GetTextMetricsA() retval=00000001 ret=004b3e56
0021:Call gdi32.GetCharABCWidthsA(00000abc,0000004d,0000004d,0032f64c) ret=004b3e64
0021:trace:font:FONT_mbtowc mapped "M" -> L"M"
0021:trace:font:WineEngGetCharABCWidths 0x1b29b8, 77, 77, 0x32f64c
0021:trace:seh:raise_exception code=c0000005 flags=0 addr=0x6878c821 ip=6878c821 tid=0021
0021:trace:seh:raise_exception  info[0]=00000000
0021:trace:seh:raise_exception  info[1]=00000004
0021:trace:seh:raise_exception  eax=00000000 ebx=687c4ff4 ecx=00000000 edx=001b29b8 esi=0032f630 edi=0032f5b0
0021:trace:seh:raise_exception  ebp=0032f468 esp=0032f420 cs=0073 ds=007b es=007b fs=0033 gs=003b flags=00010202
0021:trace:seh:call_vectored_handlers calling handler at 0x68f79bdc code=c0000005 flags=0
0021:trace:seh:call_vectored_handlers handler at 0x68f79bdc returned 0 
...
*boom*
--- snip ---

An unhandled failure to select default charmap when the font was initialized leads to a later crash when font->ft_face->charmap is accessed.

Code: http://source.winehq.org/git/wine.git/blob/e6d6fbf6e94282f7063ab3d50bdc8b90a4b88a0f:/dlls/gdi32/freetype.c#l4554

Winedbg:

--- snip ---
Wine-dbg>
0x7b463818 get_glyph_index+0x12 [/opt/projects/wine/wine-git/dlls/gdi32/freetype.c:4558] in gdi32: movl	0x8(%ebp),%eax
4558	    if(font->ft_face->charmap->encoding == FT_ENCODING_NONE) {
Wine-dbg>bt
Backtrace:
=>0 0x7b463818 get_glyph_index+0x12(font=0x19f810, glyph=0x4d) [/opt/projects/wine/wine-git/dlls/gdi32/freetype.c:4558] in gdi32 (0x0033f4e8)
  1 0x7b467fe1 get_glyph_index_linked+0x38(font=0x19f810, c=0x4d, linked_font=0x33f564, glyph=0x33f568) [/opt/projects/wine/wine-git/dlls/gdi32/freetype.c:5928] in gdi32 (0x0033f518)
  2 0x7b4682c2 WineEngGetCharABCWidths+0xd3(font=0x19f810, firstChar=0x4d, lastChar=0x4d, buffer=0x33f64c) [/opt/projects/wine/wine-git/dlls/gdi32/freetype.c:5999] in gdi32 (0x0033f588)
  3 0x7b4524ae GetCharABCWidthsW+0x84(hdc=0xabc, firstChar=0x4d, lastChar=0x4d, abc=0x33f64c) [/opt/projects/wine/wine-git/dlls/gdi32/font.c:2426] in gdi32 (0x0033f5c8)
  4 0x7b4523a2 GetCharABCWidthsA+0xf0(hdc=0xabc, firstChar=0x4d, lastChar=0x4d, abc=0x33f64c) [/opt/projects/wine/wine-git/dlls/gdi32/font.c:2377] in gdi32 (0x0033f618)
  5 0x004b3e64 in debug4x (+0xb3e63) (0x0033f69c)
  6 0x004b435f in debug4x (+0xb435e) (0x004b3870)
  7 0x004b410c in debug4x (+0xb410b) (0x004b4084)
  8 0x7500087b (0x83d88b53)
--- snip ---

Relevant data structures at this point:

--- snip ---
Wine-dbg>p *font
{entry={next=0x19e500, prev=0x7b49fd60}, gm=0x19e2f8, gmsize=0x1, hfontlist={next=0x1a0be0, prev=0x19cf30}, potm=0x1a0c28, total_kern_pairs=0xffffffff, kern_pairs=(nil), child_fonts={next=0x19f834, prev=0x19f834}, ft_face=0x7d103da8, mapping=0x1a0b20, name="HP48", charset=0, codepage=0x4e4, fake_italic=0, fake_bold=0, underline=0, strikeout=0, orientation=0, font_desc={hash=0xfe97fe1f, lf={lfHeight=0xfffffff3, lfWidth=0, lfEscapement=0, lfOrientation=0, lfWeight=0x190, lfItalic=0, lfUnderline=0, lfStrikeOut=0, lfCharSet=1, lfOutPrecision=0, lfClipPrecision=0, lfQuality=0, lfPitchAndFamily=0, lfFaceName={0x48, 0x50, 0x34, 0x38, 0, 0x7ffd, 0x4e4, 0, 0x3, 0, 0x7, 0, 0x4, 0, 0x8d04, 0x7ffd, 0x8c00, 0x7ffd, 0x8d04, 0x7ffd, 0x8c00, 0x7ffd, 0xf60c, 0x33, 0x2d5e, 0x40, 0x4, 0, 0x5070, 0xa6, 0xf638, 0}}, matrix={eM11=1.000000, eM12=0.000000, eM21=0.000000, eM22=1.000000}, can_use_bitmap=0x2000}, aveWidth=0, ppem=0xd, scale_y=1.000000, yMax=0, yMin=0, ntmFlags=0x40, fs={fsUsb={0, 0, 0, 0}, fsCsb={0x1, 0}}, base_font=(nil), GSUB_Table=0x0(nil), cache_num=0x22}

Wine-dbg>p *font->ft_face
{num_faces=0x1, face_index=0, face_flags=0xa1d, style_flags=0, num_glyphs=0x101, family_name="HP48", style_name="Regular", num_fixed_sizes=0, available_sizes=(nil), num_charmaps=0x1, charmaps=0x7d040160, generic={data=0x0(nil), finalizer=(nil)}, bbox={xMin=0xffffffeb, yMin=0xffffff3c, xMax=0x411, yMax=0x383}, units_per_EM=0x3e8, ascender=0x383, descender=0xffffff3c, height=0x47e, max_advance_width=0x312, max_advance_height=0x47e, underline_position=0xffffff04, underline_thickness=0x29, glyph=0x7d104700, size=0x7d104810, charmap=(nil), driver=0x7d01c208, memory=0x7d016970, stream=0x7d104b00, sizes_list={head=0x7d03ffb0, tail=0x7d03ffb0}, autohint={data=0x0(nil), finalizer=(nil)}, extensions=0x0(nil), internal=0x7d1040e8}

Wine-dbg>p *font->ft_face->charmaps[0]
{face=0x7d103da8, encoding=FT_ENCODING_MS_SYMBOL, platform_id=0x3, encoding_id=0}
--- snip ---

The font provides a charmap with encoding -> FT_ENCODING_MS_SYMBOL but this fails to get selected in first place.

lf.lfCharSet -> 1 (DEFAULT_CHARSET)
charset -> 0 (ANSI_CHARSET)

http://source.winehq.org/git/wine.git/blob/e6d6fbf6e94282f7063ab3d50bdc8b90a4b88a0f:/dlls/gdi32/freetype.c#l3839

--- snip ---
3839     ret->ft_face = OpenFontFace(ret, face, width, height);
3840 
3841     if (!ret->ft_face)
3842     {
3843         free_font( ret );
3844         LeaveCriticalSection( &freetype_cs );
3845         return 0;
3846     }
3847 
3848     ret->ntmFlags = face->ntmFlags;
3849 
3850     if (ret->charset == SYMBOL_CHARSET &&
3851         select_charmap(ret->ft_face, FT_ENCODING_MS_SYMBOL)) {
3852         /* No ops */
3853     }
3854     else if (select_charmap(ret->ft_face, FT_ENCODING_UNICODE)) {
3855         /* No ops */
3856     }
3857     else {
3858         select_charmap(ret->ft_face, FT_ENCODING_APPLE_ROMAN);
3859     }
--- snip ---

Failure of "else" select_charmap() is not handled, leading to a loophole of having no default selected at all.

Maybe if everything fails, the first available charmap (with encoding != 0) in the font's list should be selected as ultimate fallback (face->num_charmaps > 0 -> use face->charmaps[x] if encoding != 0).

$ sha1sum Debug4x_b159.exe 
6861e2b45b7468984236882cc03c7e73a5762ba1  Debug4x_b159.exe

$ wine --version
wine-1.3.21-159-ge398b93


--- quote ---
That's all the output I've been able to extract from running winedbg. My
attempts to "attach" to the pid of Debug4x to obtain a more complete backtrace
failed  due to the fact that "attach" is not a recognized command, despite what
http://wiki.winehq.org/Backtraces?action=show&redirect=winedbg says.
--- quote ---

That's because winedbg is already (automatically) attached at this point but doesn't get any useful info due to nested exceptions (delphi exception handling braindamage).

Regards
Comment 3 butraxz 2013-11-24 12:16:11 UTC
This ticket has not been updated for over 900 days. Development recommends
to check the status on your bug every release or two and let to be known if the bug is still present. If not, mark it fixed. If you are no longer able to put effort to this ticket, you can abandon it.

Is this still an issue with 1.7.7 or higher ?
Comment 4 Anastasius Focht 2013-11-26 15:06:33 UTC
Hello folks,

can't reproduce this with recent Wine version and current Debug4x v2.2, Build 168
The IDE starts fine.
Resolving 'fixed'.

Download: http://www.debug4x.com/Debug4x_b168.exe

$ sha1sum Debug4x_b168.exe 
1d85daf0d88516795fc72dd3db63eee67ff85e86  Debug4x_b168.exe

$ du -sh Debug4x_b168.exe 
8.1M	Debug4x_b168.exe

$ wine --version
wine-1.7.7-163-g9ceebff


Regards
Comment 5 Alexandre Julliard 2013-12-06 13:44:40 UTC
Closing bugs fixed in 1.7.8.


Privacy Policy
If you have a privacy inquiry regarding this site, please write to [email protected]

Hosted By CodeWeavers