[comp.windows.x] BUG: Tvtwm/Twm messes up app name processing +FIX

gnb@bby.oz.au (Gregory N. Bond) (03/21/91)

NB: The same bug is in tvtwm, and perhaps other twm variants.  This
has been mailed to xbugs.

			  X Window System Bug Report
			    xbugs@expo.lcs.mit.edu


VERSION:
    R4;  fixes 1-18 installed.

CLIENT MACHINE and OPERATING SYSTEM:
	Any.  Noticed on Sun 3/80+SunOs 4.1 and Solbourne+OS/MP 4.0D

DISPLAY TYPE:
	Sun CG4 on 3/80.

WINDOW MANAGER:
	twm

AREA:
	twm

SYNOPSIS:
	twm gets confused with processing application names if one
	name is	a proper substring of another.

DESCRIPTION: 
	When twm is processing application names to determine whether
	to use an icon manager or title bar (and others; this is where
	I noticed it), and it has an entry for an application with a
	short name (e.g. "xcal") specifying a certain behaviour (e.g.
	no title), then if an application is launched with a name that
	is a superstring of the shorter name (e.g.  "xcalc") then the
	new application will get the behaviour specified for the other
	application.

	This is because LookInList in list.c is effectivly doing
		strncmp(newname, oldname, strlen(oldname))
	to determine how to treat the new application.  If newname =
	"xcalc" and oldname = "xcal" then the compare will succeed
	when it shouldn't.

REPEAT BY:
	Setup a .twmrc file containing no reference to xcalc, and some
	references to xcal, for example:

	IconManagerDontShow { 
		"xcal"
	}
	NoTitle {
		"xcal"
	}

	Start twm and then start up xcalc.  Notice that xcalc doesn't
	appear in the icon manager, nor does it have a title bar.

SAMPLE FIX:
	This fix will correct the problem, and doesn't seem to have
	broken anything else, but I don't trust myself to understand
	twm enought to say there is nothing that depends on the
	partial matching semantics that LookInList used to provide.

	This is patched against .../mit/clients/twm/list.c, MIT X11R4
	distribution with fixes 1-18 installed.

*** list.c.ORIG	Tue Mar  5 15:51:06 1991
--- list.c	Thu Mar 21 15:33:27 1991
***************
*** 117,127 ****
  XClassHint *class;
  {
      name_list *nptr;
  
      /* look for the name first */
      for (nptr = list_head; nptr != NULL; nptr = nptr->next)
      {
! 	if (strncmp(name, nptr->name, nptr->namelen) == 0)
  	    return (nptr->ptr);
      }
  
--- 117,129 ----
  XClassHint *class;
  {
      name_list *nptr;
+     int l = strlen(name);
  
      /* look for the name first */
      for (nptr = list_head; nptr != NULL; nptr = nptr->next)
      {
! 	if (l == nptr->namelen && 
! 	    strncmp(name, nptr->name, nptr->namelen) == 0)
  	    return (nptr->ptr);
      }
  
***************
*** 128,143 ****
      if (class)
      {
  	/* look for the res_name next */
  	for (nptr = list_head; nptr != NULL; nptr = nptr->next)
  	{
! 	    if (strncmp(class->res_name, nptr->name, nptr->namelen) == 0)
  		return (nptr->ptr);
  	}
  
  	/* finally look for the res_class */
  	for (nptr = list_head; nptr != NULL; nptr = nptr->next)
  	{
! 	    if (strncmp(class->res_class, nptr->name, nptr->namelen) == 0)
  		return (nptr->ptr);
  	}
      }
--- 130,149 ----
      if (class)
      {
  	/* look for the res_name next */
+ 	l = strlen(class->res_name);
  	for (nptr = list_head; nptr != NULL; nptr = nptr->next)
  	{
! 	    if (l == nptr->namelen && 
! 		strncmp(class->res_name, nptr->name, nptr->namelen) == 0)
  		return (nptr->ptr);
  	}
  
  	/* finally look for the res_class */
+ 	l = strlen(class->res_class);
  	for (nptr = list_head; nptr != NULL; nptr = nptr->next)
  	{
! 	    if (l == nptr->namelen && 
! 	        strncmp(class->res_class, nptr->name, nptr->namelen) == 0)
  		return (nptr->ptr);
  	}
      }

--
Gregory Bond, Burdett Buckeridge & Young Ltd, Melbourne, Australia
Internet: gnb@melba.bby.oz.au    non-MX: gnb%melba.bby.oz@uunet.uu.net
Uucp: {uunet,pyramid,ubc-cs,ukc,mcvax,prlb2,nttlab...}!munnari!melba.bby.oz!gnb