clone 348513 -1 -2
reassign -1 tetex-bin 3.0-13
retitle -1 tetex-bin: should at least Suggest xbase-clients
severity -1 minor
owner -1 !
reassign -2 tetex-bin 3.0-13
retitle -2 tetex-bin: texdoctk shouldn't configure Tk::Button with an undef font
severity -2 normal
owner -2 !
tags -2 patch
retitle 348513 perl-tk: segfault when configuring widgets with an undef font
found 348513 1:804.027-3
tags 348513 patch
thanks
On Fri, Feb 03, 2006 at 07:31:16PM +0100, Frank Küster wrote:
> > Anyone have any ideas on how to fix the segfault?
>
> That goes to the perl people.
Hi,
first of all, the segfault manifests when xbase-clients is not installed.
Specifically, texdoctk calls xwininfo to find out the display resolution.
It then uses this info to configure a Tk::Button object with a suitable
font. If xwininfo is not present, it falls back to
$Qbut->configure(-font=>$deffont);
(/usr/bin/texdoctk:1693) with $deffont undefined. The current version of
perl-tk segfaults here.
Even if there was no segfault, apparently texdoctk would benefit from
xwininfo being present, and thus tetex-bin should at least Suggest
xbase-clients. I'm cloning this as a minor bug against tetex-bin.
The correct perl-tk behaviour is to throw an exception:
font "" doesn't exist at /usr/lib/perl5/Tk/Widget.pm line 196.
This is what the sarge version of perl-tk (1:800.025-2) does. So, even
with a fixed perl-tk, texdoctk will exit with a fatal error when xwininfo
is not present. I'm cloning this as a normal bug against tetex-bin,
and including a suggested simple fix as the first attached patch.
Now for the perl-tk segfault. A minimal testcase for it is:
#!/usr/bin/perl
use Tk;
my $main = new MainWindow;
my $cmdframe = $main->Frame;
my $b = $cmdframe->Button(-font => undef);
This segfaults for at least the Button, Radiobutton and Text widgets.
After some gdb debugging, I came up with the second attached patch,
which seems to fix this and reverts to the sarge behaviour.
Cheers,
--
Niko Tyni [EMAIL PROTECTED]
--- /usr/bin/texdoctk 2006/02/05 17:08:01 1.1
+++ /usr/bin/texdoctk 2006/02/05 17:08:17
@@ -1690,7 +1690,7 @@
my @deffont=$Qbut->configure(-font);
# ensure readability on high-res screens (suggested by R.Kotucha)
$deffont='Helvetica -16 bold' if &x_resolution > 1200;
- $Qbut->configure(-font=>$deffont);
+ $Qbut->configure(-font=>$deffont) if $deffont;
$msgframe->Label(-text=>'FATAL ERROR',
-font=>$deffont)->pack(-side=>'top', -fill=>'x');
# get size of message text
--- ./pTk/mTk/generic/tkFont.c 2006/02/05 16:44:35 1.1
+++ ./pTk/mTk/generic/tkFont.c 2006/02/05 16:44:36
@@ -1044,6 +1044,7 @@
TkFont *fontPtr, *firstFontPtr, *oldFontPtr;
int new, descent;
NamedFont *nfPtr;
+ char *fontString;
fiPtr = ((TkWindow *) tkwin)->mainPtr->fontInfoPtr;
if (objPtr->typePtr != &tkFontObjType) {
@@ -1077,8 +1078,12 @@
cacheHashPtr = oldFontPtr->cacheHashPtr;
FreeFontObjProc(objPtr);
} else {
+ fontString = Tcl_GetString(objPtr);
+ if (fontString == NULL) {
+ fontString = "";
+ }
cacheHashPtr = Tcl_CreateHashEntry(&fiPtr->fontCache,
- Tcl_GetString(objPtr), &new);
+ fontString, &new);
}
firstFontPtr = (TkFont *) Tcl_GetHashValue(cacheHashPtr);
for (fontPtr = firstFontPtr; (fontPtr != NULL);
@@ -1095,8 +1100,12 @@
* The desired font isn't in the table. Make a new one.
*/
+ fontString = Tcl_GetString(objPtr);
+ if (fontString == NULL) {
+ fontString = "";
+ }
namedHashPtr = Tcl_FindHashEntry(&fiPtr->namedTable,
- Tcl_GetString(objPtr));
+ fontString);
if (namedHashPtr != NULL) {
/*
* Construct a font based on a named font.
@@ -1111,7 +1120,7 @@
* Native font?
*/
- fontPtr = TkpGetNativeFont(tkwin, Tcl_GetString(objPtr));
+ fontPtr = TkpGetNativeFont(tkwin, fontString);
if (fontPtr == NULL) {
TkFontAttributes fa;
Tcl_Obj *dupObjPtr = Tcl_DuplicateObj(objPtr);
--- ./objGlue.c 2006/02/05 16:39:09 1.1
+++ ./objGlue.c 2006/02/05 16:39:13
@@ -555,6 +555,10 @@
else
{
s = LangString(objPtr);
+ if (!s)
+ {
+ return NULL;
+ }
#ifdef SvUTF8
if (!is_utf8_string(s,strlen(s)))
{