Synopsis: Fixes buffer overruns in xterm and Xaw library
NetBSD versions: 1.3, 1.3.1.
Thanks to: XFree86 Project.
Reported by XFree86 Project.

Index: lib/Xaw/XawIm.c
===================================================================
RCS file: /cvsroot/xsrc/xc/lib/Xaw/XawIm.c,v
retrieving revision 1.1.1.2
diff -c -r1.1.1.2 XawIm.c
*** XawIm.c	1997/06/30 12:41:01	1.1.1.2
--- XawIm.c	1998/05/06 06:51:50
***************
*** 53,58 ****
--- 53,59 ----
  in this Software without prior written authorization from the X Consortium.
  
  */
+ /* $XFree86: xc/lib/Xaw/XawIm.c,v 1.1.1.4.2.1 1998/05/01 04:02:42 dawes Exp $ */
  
  #include <X11/IntrinsicP.h>
  #include <X11/StringDefs.h>
***************
*** 452,458 ****
      } else {
  	for (i = 0; i < ve->im.im_list_num; i++) {
  	    strcpy(modifiers, "@im=");
! 	    strcat(modifiers, ve->im.im_list[i]);
  	    if ((p = XSetLocaleModifiers(modifiers)) != NULL && *p &&
  		(xim = XOpenIM(XtDisplay(ve->parent), NULL, NULL, NULL)) != NULL)
  		break;
--- 453,459 ----
      } else {
  	for (i = 0; i < ve->im.im_list_num; i++) {
  	    strcpy(modifiers, "@im=");
! 	    strncat(modifiers, ve->im.im_list[i], sizeof(modifiers) - 5/*strlen("@im=")*/);
  	    if ((p = XSetLocaleModifiers(modifiers)) != NULL && *p &&
  		(xim = XOpenIM(XtDisplay(ve->parent), NULL, NULL, NULL)) != NULL)
  		break;
***************
*** 1354,1360 ****
      strcpy(s, p);
      save_s = s;
  
!     while(1) {
  	list[i] = s;
  	ss = index(s, ',');
  	if (!ss) {
--- 1355,1361 ----
      strcpy(s, p);
      save_s = s;
  
!     while(i < (sizeof(list) / sizeof(list[0]))) {
  	list[i] = s;
  	ss = index(s, ',');
  	if (!ss) {
***************
*** 1645,1654 ****
  
      if ((vw = SearchVendorShell(inwidg)) && (ve = GetExtPart(vw)) &&
  	ve->im.xim && (p = GetIcTableShared(inwidg, ve)) && p->xic) {
! 	  return(XwcLookupString(p->xic, event, buffer_return, bytes_buffer,
  				 keysym_return, status_return));
      }
!     ret = XLookupString( event, tmp_buf, 64, keysym_return,
  		         (XComposeStatus*) status_return );
      for ( i = 0, tmp_p = tmp_buf, buf_p = buffer_return; i < ret; i++ ) {
  	*buf_p++ = _Xaw_atowc(*tmp_p++);
--- 1646,1655 ----
  
      if ((vw = SearchVendorShell(inwidg)) && (ve = GetExtPart(vw)) &&
  	ve->im.xim && (p = GetIcTableShared(inwidg, ve)) && p->xic) {
! 	  return(XwcLookupString(p->xic, event, buffer_return, bytes_buffer/sizeof(wchar_t),
  				 keysym_return, status_return));
      }
!     ret = XLookupString( event, tmp_buf, sizeof(tmp_buf), keysym_return,
  		         (XComposeStatus*) status_return );
      for ( i = 0, tmp_p = tmp_buf, buf_p = buffer_return; i < ret; i++ ) {
  	*buf_p++ = _Xaw_atowc(*tmp_p++);
Index: programs/xterm/Tekproc.c
===================================================================
RCS file: /cvsroot/xsrc/xc/programs/xterm/Tekproc.c,v
retrieving revision 1.1.1.2
diff -c -r1.1.1.2 Tekproc.c
*** Tekproc.c	1997/06/30 14:03:06	1.1.1.2
--- Tekproc.c	1998/05/06 06:52:35
***************
*** 74,79 ****
--- 74,82 ----
  #include <errno.h>
  #include <setjmp.h>
  #include <signal.h>
+ 
+ #include "xterm.h"
+ 
  #include "Tekparse.h"
  #include "data.h"
  #include "error.h"
***************
*** 1724,1731 ****
--- 1727,1736 ----
  
  
  #ifndef X_NOT_POSIX
+ #ifndef linux
  #define HAS_WAITPID
  #endif
+ #endif
  
  #ifdef HAS_WAITPID
  #include <sys/wait.h>
***************
*** 1743,1749 ****
  	int pid;
  #ifndef HAS_WAITPID
  	int waited;
! 	int (*chldfunc)();
  
  	chldfunc = signal(SIGCHLD, SIG_DFL);
  #endif
--- 1748,1754 ----
  	int pid;
  #ifndef HAS_WAITPID
  	int waited;
! 	SIGNAL_T (*chldfunc) PROTO((int n));
  
  	chldfunc = signal(SIGCHLD, SIG_DFL);
  #endif
Index: programs/xterm/charproc.c
===================================================================
RCS file: /cvsroot/xsrc/xc/programs/xterm/charproc.c,v
retrieving revision 1.1.1.3
diff -c -r1.1.1.3 charproc.c
*** charproc.c	1997/08/20 06:28:08	1.1.1.3
--- charproc.c	1998/05/06 06:52:35
***************
*** 3774,3780 ****
  	       *s,
  	       *ns,
  	       *end,
- 		tmp[1024],
  	  	buf[32];
      XIM		xim = (XIM) NULL;
      XIMStyles  *xim_styles;
--- 3774,3779 ----
***************
*** 3789,3805 ****
  	if ((p = XSetLocaleModifiers("@im=none")) != NULL && *p)
  	    xim = XOpenIM(XtDisplay(term), NULL, NULL, NULL);
      } else {
! 	strcpy(tmp, term->misc.input_method);
! 	for(ns=s=tmp; ns && *s;) {
  	    while (*s && isspace(*s)) s++;
  	    if (!*s) break;
  	    if ((ns = end = strchr(s, ',')) == 0)
  		end = s + strlen(s);
  	    while (isspace(*end)) end--;
- 	    *end = '\0';
  
  	    strcpy(buf, "@im=");
! 	    strcat(buf, s);
  	    if ((p = XSetLocaleModifiers(buf)) != NULL && *p
  		&& (xim = XOpenIM(XtDisplay(term), NULL, NULL, NULL)) != NULL)
  		break;
--- 3788,3805 ----
  	if ((p = XSetLocaleModifiers("@im=none")) != NULL && *p)
  	    xim = XOpenIM(XtDisplay(term), NULL, NULL, NULL);
      } else {
! 	for(ns=s=term->misc.input_method; ns && *s;) { 
  	    while (*s && isspace(*s)) s++;
  	    if (!*s) break;
  	    if ((ns = end = strchr(s, ',')) == 0)
  		end = s + strlen(s);
  	    while (isspace(*end)) end--;
  
  	    strcpy(buf, "@im=");
! 	    if (end - (s + (sizeof(buf) - 5)) > 0)
! 		end = s + (sizeof(buf) - 5); 
! 	    strncat(buf, s, end - s); 
!  
  	    if ((p = XSetLocaleModifiers(buf)) != NULL && *p
  		&& (xim = XOpenIM(XtDisplay(term), NULL, NULL, NULL)) != NULL)
  		break;
***************
*** 3824,3831 ****
      }
  
      found = False;
!     strcpy(tmp, term->misc.preedit_type);
!     for(s = tmp; s && !found;) {
  	while (*s && isspace(*s)) s++;
  	if (!*s) break;
  	if ((ns = end = strchr(s, ',')) != 0)
--- 3824,3830 ----
      }
  
      found = False;
!     for(s = term->misc.preedit_type; s && !found;) { 
  	while (*s && isspace(*s)) s++;
  	if (!*s) break;
  	if ((ns = end = strchr(s, ',')) != 0)
***************
*** 3833,3845 ****
  	else
  	    end = s + strlen(s);
  	while (isspace(*end)) end--;
- 	*end = '\0';
  
! 	if (!strcmp(s, "OverTheSpot")) {
  	    input_style = (XIMPreeditPosition | XIMStatusArea);
! 	} else if (!strcmp(s, "OffTheSpot")) {
  	    input_style = (XIMPreeditArea | XIMStatusArea);
! 	} else if (!strcmp(s, "Root")) {
  	    input_style = (XIMPreeditNothing | XIMStatusNothing);
  	}
  	for (i = 0; (unsigned short)i < xim_styles->count_styles; i++)
--- 3832,3843 ----
  	else
  	    end = s + strlen(s);
  	while (isspace(*end)) end--;
  
! 	if (!strncmp(s, "OverTheSpot", end - s)) { 
  	    input_style = (XIMPreeditPosition | XIMStatusArea);
! 	} else if (!strncmp(s, "OffTheSpot", end - s)) { 
  	    input_style = (XIMPreeditArea | XIMStatusArea);
! 	} else if (!strncmp(s, "Root", end - s)) { 
  	    input_style = (XIMPreeditNothing | XIMStatusNothing);
  	}
  	for (i = 0; (unsigned short)i < xim_styles->count_styles; i++)
***************
*** 4372,4378 ****
  	XtOverrideTranslations(w, original);
  	return;
      }
!     (void) sprintf( mapName, "%sKeymap", params[0] );
      (void) strcpy( mapClass, mapName );
      if (islower(mapClass[0])) mapClass[0] = toupper(mapClass[0]);
      XtGetSubresources( w, (XtPointer)&keymap, mapName, mapClass,
--- 4370,4376 ----
  	XtOverrideTranslations(w, original);
  	return;
      }
!     (void) sprintf( mapName, "%.*sKeymap", (int)sizeof(mapName) - 10, params[0] ); 
      (void) strcpy( mapClass, mapName );
      if (islower(mapClass[0])) mapClass[0] = toupper(mapClass[0]);
      XtGetSubresources( w, (XtPointer)&keymap, mapName, mapClass,
***************
*** 4790,4796 ****
       * not be set before the widget's realized, so it's tested separately).
       */
      if(screen->colorMode) {
! 	if (TextWindow(screen) != 0 && (cc != bg)) {
  	    /* we might have a colored foreground/background later */
  	    xgcv.font = screen->fnt_norm->fid;
  	    mask = (GCForeground | GCBackground | GCFont);
--- 4788,4794 ----
       * not be set before the widget's realized, so it's tested separately).
       */
      if(screen->colorMode) {
! 	if (TextWindow(screen) != 0 && (cc != bg) && (cc != fg)) {
  	    /* we might have a colored foreground/background later */
  	    xgcv.font = screen->fnt_norm->fid;
  	    mask = (GCForeground | GCBackground | GCFont);
Index: programs/xterm/main.c
===================================================================
RCS file: /cvsroot/xsrc/xc/programs/xterm/main.c,v
retrieving revision 1.1.1.3
diff -c -r1.1.1.3 main.c
*** main.c	1997/08/20 06:28:15	1.1.1.3
--- main.c	1998/05/06 06:52:35
***************
*** 3467,3473 ****
      int i, n, ncap;
      errstat err;
      struct caplist *cl;
!     char buf[64], numbuf[12];
      struct caplist *capvnew;
      int ttythread();
      int xwatchdogthread();
--- 3467,3473 ----
      int i, n, ncap;
      errstat err;
      struct caplist *cl;
!     char buf[64];
      struct caplist *capvnew;
      int ttythread();
      int xwatchdogthread();
Index: programs/xterm/misc.c
===================================================================
RCS file: /cvsroot/xsrc/xc/programs/xterm/misc.c,v
retrieving revision 1.1.1.2
diff -c -r1.1.1.2 misc.c
*** misc.c	1997/06/30 14:03:25	1.1.1.2
--- misc.c	1998/05/06 06:52:35
***************
*** 48,60 ****
  #include <X11/Xmu/SysUtil.h>
  #include <X11/Xmu/WinUtil.h>
  
  #include "VTparse.h"
  #include "data.h"
  #include "error.h"
  #include "menu.h"
  
- #include "xterm.h"
- 
  #if XtSpecificationRelease < 6
  #ifndef X_GETTIMEOFDAY
  #define X_GETTIMEOFDAY(t) gettimeofday(t,(struct timezone *)0)
--- 48,60 ----
  #include <X11/Xmu/SysUtil.h>
  #include <X11/Xmu/WinUtil.h>
  
+ #include "xterm.h"
+ 
  #include "VTparse.h"
  #include "data.h"
  #include "error.h"
  #include "menu.h"
  
  #if XtSpecificationRelease < 6
  #ifndef X_GETTIMEOFDAY
  #define X_GETTIMEOFDAY(t) gettimeofday(t,(struct timezone *)0)
***************
*** 515,521 ****
--- 515,523 ----
  #if defined(ALLOWLOGGING) || defined(DEBUG)
  
  #ifndef X_NOT_POSIX
+ #ifndef linux
  #define HAS_WAITPID
+ #endif
  #endif
  
  /*