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++);