[comp.windows.x] Bug in twm, X11R4

rolfh@garmidt.unit.no (Rolf P Halle) (02/13/90)

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


VERSION:
    R4

CLIENT MACHINE and OPERATING SYSTEM:
    Discovered on a Sun 3/60, SunOS 4.0.1(Export), but I guess any 
    machine or OS would do :-)

DISPLAY TYPE:
    All

WINDOW MANAGER:
    twm

AREA:
    twm

SYNOPSIS:
    Calls to the ExpandFilename function sometimes return wrong answer.

DESCRIPTION:
    We're doing some extensions to twm (like f.source). In connection with
    this, we had to use the ExpandFilename-function. When giving 
    ExpandFilename ~rolfh/foo.bar as argument, it will return something
    like /home/solan4/rolfh/rolfh/foo.bar, assuming I'm logged in as rolfh.
    This should really be /home/solan4/rolfh/foo.bar.


REPEAT BY:
    Try a call like name = ExpandFilename("~root/foo.bar");

SAMPLE FIX:
    Apply the patch included below in the mit/clients/twm directory.

*** util.c	Sun Feb 11 22:40:10 1990
--- util.c.new	Sun Feb 11 22:42:31 1990
***************
*** 42,47 ****
--- 42,49 ----
  #endif
  
  #include <stdio.h>
+ #include <string.h>
+ #include <pwd.h>
  #include "twm.h"
  #include "util.h"
  #include "gram.h"
***************
*** 322,339 ****
  char *name;
  {
      char *newname;
  
      if (name[0] != '~') return name;
  
!     newname = (char *) malloc (HomeLen + strlen(name) + 2);
!     if (!newname) {
! 	fprintf (stderr, 
  		 "%s:  unable to allocate %d bytes to expand filename %s/%s\n",
  		 ProgramName, HomeLen + strlen(name) + 2, Home, &name[1]);
!     } else {
! 	(void) sprintf (newname, "%s/%s", Home, &name[1]);
      }
! 
      return newname;
  }
  
--- 324,365 ----
  char *name;
  {
      char *newname;
+     char *username;
+     struct passwd *user;
  
      if (name[0] != '~') return name;
  
!     /* Is this my own HOME? */
!     if (name[1]=='/')    /* yes */
!     {
!       newname = (char *) malloc (HomeLen + strlen(name) + 2);
!       if (!newname) {
! 	  fprintf (stderr, 
  		 "%s:  unable to allocate %d bytes to expand filename %s/%s\n",
  		 ProgramName, HomeLen + strlen(name) + 2, Home, &name[1]);
!       } else {
! 	  (void) sprintf (newname, "%s/%s", Home, &name[1]);
!       }
      }
!     else
!     {
!       /* Get rid of the ~ in name */
!       ++name;
!       username = strtok(name,"/"); /* Get the username */
!       name = strtok(NULL,"");    /* Get rest of filename */
!       user = getpwnam(username);
!       newname = (char *) malloc (strlen(user->pw_dir) 
! 		                 + strlen(name) + 2);
!       
!       if (!newname) {
! 	  fprintf (stderr, 
! 		 "%s:  unable to allocate %d bytes to expand filename %s/%s\n",
! 		 ProgramName, strlen(user->pw_dir) + 
!                  strlen(name) + 20, user->pw_dir, name);
!       } else {
! 	  (void) sprintf (newname, "%s/%s", user->pw_dir, name);
!       }
!     }
      return newname;
  }

--  

Rolf Halle
rolfh@idt.unit.no