Apply by doing
	cd /usr/src (or the directory containing X11) 
	patch -p0 < xterm-xaw.patch

And then to rebuild and install
	cd X11/xc/lib/Xaw ; make && make install
	cd X11/xc/programs/xterm ; make && make install

diff --exclude=CVS -u -r /cdrom/X11/xc/programs/xterm/Tekproc.c X11/xc/programs/xterm/Tekproc.c
--- /cdrom/X11/xc/programs/xterm/Tekproc.c	Fri Sep  5 05:17:06 1997
+++ X11/xc/programs/xterm/Tekproc.c	Sun May  3 10:32:17 1998
@@ -74,6 +74,9 @@
 #include <errno.h>
 #include <setjmp.h>
 #include <signal.h>
+
+#include "xterm.h"
+
 #include "Tekparse.h"
 #include "data.h"
 #include "error.h"
@@ -1724,8 +1727,10 @@
 
 
 #ifndef X_NOT_POSIX
+#ifndef linux
 #define HAS_WAITPID
 #endif
+#endif
 
 #ifdef HAS_WAITPID
 #include <sys/wait.h>
@@ -1743,7 +1748,7 @@
 	int pid;
 #ifndef HAS_WAITPID
 	int waited;
-	int (*chldfunc)();
+	SIGNAL_T (*chldfunc) PROTO((int n));
 
 	chldfunc = signal(SIGCHLD, SIG_DFL);
 #endif
diff --exclude=CVS -u -r /cdrom/X11/xc/programs/xterm/charproc.c X11/xc/programs/xterm/charproc.c
--- /cdrom/X11/xc/programs/xterm/charproc.c	Fri Sep  5 05:17:07 1997
+++ X11/xc/programs/xterm/charproc.c	Sun May  3 10:32:18 1998
@@ -3774,7 +3774,6 @@
 	       *s,
 	       *ns,
 	       *end,
-		tmp[1024],
 	  	buf[32];
     XIM		xim = (XIM) NULL;
     XIMStyles  *xim_styles;
@@ -3789,17 +3788,18 @@
 	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;) {
+	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--;
-	    *end = '\0';
 
 	    strcpy(buf, "@im=");
-	    strcat(buf, s);
+	    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,8 +3824,7 @@
     }
 
     found = False;
-    strcpy(tmp, term->misc.preedit_type);
-    for(s = tmp; s && !found;) {
+    for(s = term->misc.preedit_type; s && !found;) { 
 	while (*s && isspace(*s)) s++;
 	if (!*s) break;
 	if ((ns = end = strchr(s, ',')) != 0)
@@ -3833,13 +3832,12 @@
 	else
 	    end = s + strlen(s);
 	while (isspace(*end)) end--;
-	*end = '\0';
 
-	if (!strcmp(s, "OverTheSpot")) {
+	if (!strncmp(s, "OverTheSpot", end - s)) { 
 	    input_style = (XIMPreeditPosition | XIMStatusArea);
-	} else if (!strcmp(s, "OffTheSpot")) {
+	} else if (!strncmp(s, "OffTheSpot", end - s)) { 
 	    input_style = (XIMPreeditArea | XIMStatusArea);
-	} else if (!strcmp(s, "Root")) {
+	} else if (!strncmp(s, "Root", end - s)) { 
 	    input_style = (XIMPreeditNothing | XIMStatusNothing);
 	}
 	for (i = 0; (unsigned short)i < xim_styles->count_styles; i++)
@@ -4372,7 +4370,7 @@
 	XtOverrideTranslations(w, original);
 	return;
     }
-    (void) sprintf( mapName, "%sKeymap", params[0] );
+    (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,7 +4788,7 @@
      * not be set before the widget's realized, so it's tested separately).
      */
     if(screen->colorMode) {
-	if (TextWindow(screen) != 0 && (cc != bg)) {
+	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);
diff --exclude=CVS -u -r /cdrom/X11/xc/programs/xterm/main.c X11/xc/programs/xterm/main.c
--- /cdrom/X11/xc/programs/xterm/main.c	Fri Sep  5 05:17:08 1997
+++ X11/xc/programs/xterm/main.c	Sun May  3 10:32:18 1998
@@ -938,6 +938,12 @@
 "default.",
 NULL};
 
+static int abbrev (char *tst, char *cmp)
+{
+	size_t len = strlen(tst);
+	return ((len >= 2) && (!strncmp(tst, cmp, len)));
+}
+
 static void Syntax (badOption)
     char *badOption;
 {
@@ -3467,7 +3473,7 @@
     int i, n, ncap;
     errstat err;
     struct caplist *cl;
-    char buf[64], numbuf[12];
+    char buf[64];
     struct caplist *capvnew;
     int ttythread();
     int xwatchdogthread();
diff --exclude=CVS -u -r /cdrom/X11/xc/programs/xterm/misc.c X11/xc/programs/xterm/misc.c
--- /cdrom/X11/xc/programs/xterm/misc.c	Fri Sep  5 05:17:09 1997
+++ X11/xc/programs/xterm/misc.c	Sun May  3 10:32:18 1998
@@ -48,13 +48,13 @@
 #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"
 
-#include "xterm.h"
-
 #if XtSpecificationRelease < 6
 #ifndef X_GETTIMEOFDAY
 #define X_GETTIMEOFDAY(t) gettimeofday(t,(struct timezone *)0)
@@ -515,7 +515,9 @@
 #if defined(ALLOWLOGGING) || defined(DEBUG)
 
 #ifndef X_NOT_POSIX
+#ifndef linux
 #define HAS_WAITPID
+#endif
 #endif
 
 /*
diff --exclude=CVS -u -r /cdrom/X11/xc/programs/xterm/os2main.c X11/xc/programs/xterm/os2main.c
--- /cdrom/X11/xc/programs/xterm/os2main.c	Fri Sep  5 05:17:09 1997
+++ X11/xc/programs/xterm/os2main.c	Sun May  3 10:32:19 1998
@@ -471,6 +471,12 @@
 "default.",
 NULL};
 
+static int abbrev (char *tst, char *cmp)
+{
+	size_t len = strlen(tst);
+	return ((len >= 2) && (!strncmp(tst, cmp, len)));
+}
+
 static void Syntax (badOption)
     char *badOption;
 {
diff --exclude=CVS -u -r /cdrom/X11/xc/lib/Xaw/XawIm.c X11/xc/lib/Xaw/XawIm.c
--- /cdrom/X11/xc/lib/Xaw/XawIm.c	Fri Sep  5 04:59:50 1997
+++ X11/xc/lib/Xaw/XawIm.c	Sun May  3 10:32:28 1998
@@ -53,6 +53,7 @@
 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,7 +453,7 @@
     } else {
 	for (i = 0; i < ve->im.im_list_num; i++) {
 	    strcpy(modifiers, "@im=");
-	    strcat(modifiers, ve->im.im_list[i]);
+	    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,7 +1355,7 @@
     strcpy(s, p);
     save_s = s;
 
-    while(1) {
+    while(i < (sizeof(list) / sizeof(list[0]))) {
 	list[i] = s;
 	ss = index(s, ',');
 	if (!ss) {
@@ -1645,10 +1646,10 @@
 
     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,
+	  return(XwcLookupString(p->xic, event, buffer_return, bytes_buffer/sizeof(wchar_t),
 				 keysym_return, status_return));
     }
-    ret = XLookupString( event, tmp_buf, 64, keysym_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++);