Author: branden
Date: 2003-07-24 14:36:25 -0500 (Thu, 24 Jul 2003)
New Revision: 312

Modified:
   trunk/debian/changelog
   trunk/debian/patches/000_stolen_from_HEAD_xlib.diff
Log:
debian/patches/000_stolen_from_HEAD_xlib.diff: fix for buffer overflow in
  _XlcLocaleDirName(); privileged binaries ignore the XLOCALEDIR
  environment variable and are not vulnerable


Modified: trunk/debian/changelog
==============================================================================
--- trunk/debian/changelog      2003-07-24 18:38:32 UTC (rev 311)
+++ trunk/debian/changelog      2003-07-24 19:36:25 UTC (rev 312)
@@ -1,5 +1,9 @@
-xfree86 (4.2.1-10) unstable; urgency=low
+xfree86 (4.2.1-10) unstable; urgency=medium
 
+  * patch #000_stolen_from_HEAD_xlib: fix for buffer overflow in
+    _XlcLocaleDirName(); privileged binaries ignore the XLOCALEDIR
+    environment variable and are not vulnerable (Closes: #201750)
+
   * debian/scripts/manifest-install-reconcile: new script to help keep
     MANIFEST and *.install* files in sync
 
@@ -25,7 +29,7 @@
     - xutils.install.{m68k,s390}: ship luit program, its manpage, and
       darwinLib.{rules,tmpl} Imake configuration files
 
- -- Branden Robinson <[EMAIL PROTECTED]>  Wed,  2 Jul 2003 15:00:37 -0500
+ -- Branden Robinson <[EMAIL PROTECTED]>  Thu, 24 Jul 2003 14:33:03 -0500
 
 xfree86 (4.2.1-9) unstable; urgency=high
 

Modified: trunk/debian/patches/000_stolen_from_HEAD_xlib.diff
==============================================================================
--- trunk/debian/patches/000_stolen_from_HEAD_xlib.diff 2003-07-24 18:38:32 UTC (rev 
311)
+++ trunk/debian/patches/000_stolen_from_HEAD_xlib.diff 2003-07-24 19:36:25 UTC (rev 
312)
@@ -95,6 +95,8 @@
   + fix memory leaks and speed font loading (Oliver Chapuis)
 * (omText.c): Fixed obvious typo in OMlib (Egbert Eich).
 * (xlibi18n/Xi18nLib.conf): reindent preprocessor statements (Egbert Eich)
+* (XlcDL.c,XlcPubI.h,lcFile.c): SECURITY: Fix for possible buffer overflow
+  in _XlcLocaleDirName().
 
 These patches were in 000_stolen_from_HEAD and have been migrated over:
 
@@ -2821,8 +2823,57 @@
  
  #if BuildLoadableXlibI18n
  MakeSubdirs($(SUBDIRS))
---- xc/lib/X11/XlcDL.c~        2003-02-20 11:26:56.000000000 -0500
-+++ xc/lib/X11/XlcDL.c 2003-02-20 11:32:16.000000000 -0500
+--- xc/lib/X11/xlibi18n/Xi18nLib.conf~ 2003-02-20 11:27:05.000000000 -0500
++++ xc/lib/X11/xlibi18n/Xi18nLib.conf  2003-02-20 11:30:59.000000000 -0500
+@@ -23,7 +23,7 @@
+ 
+ #include <Library.tmpl>
+ 
+-#ifdef HPArchitecture && OSMajorVersion > 9
++#if defined(HPArchitecture) && OSMajorVersion > 9
+     EXTRA_SHLIBLDFLAGS = +s +b $(USRLIBDIR)
+ #else
+     EXTRA_SHLIBLDFLAGS = 
+@@ -47,8 +47,6 @@
+       $(RM) $@
+       $(CC) -c $(CFLAGS) $(_NOOP_) $(SHLIBDEF) $(SHAREDCODEDEF) $(PICFLAGS) $*.c
+ 
+-DependTarget()
+-
+ clean::
+       rm -rf *.so.$(SOXI18NREV)
+ 
+@@ -56,8 +54,8 @@
+       $(LINT) $(LINTFLAGS) $(SRCS) $(LINTLIBS)
+ 
+ #ifndef Xi18nLibraryTarget
+-#if 0
+-#define       Xi18nLibraryTarget(libname)             @@\
++# if 0 /* !CrossCompiling */
++#  define     Xi18nLibraryTarget(libname)             @@\
+ all:: libname.so.$(SOXI18NREV)                        @@\
+ libname.so.$(SOXI18NREV): $(OBJS)             @@\
+       $(RM) [EMAIL PROTECTED]                         @@\
+@@ -69,13 +67,14 @@
+       else (set -x; $(MKDIRHIER) $(DESTDIR)$(XLOCALEDIR)/$(POSTLOCALE)); fi @@\
+       $(RM) $(DESTDIR)$(XLOCALEDIR)/$(POSTLOCALE)/libname.so.$(SOXI18NREV)    @@\
+       $(INSTALL) $(INSTALLFLAGS) $(INSTLIBFLAGS) libname.so.$(SOXI18NREV) 
$(DESTDIR)$(XLOCALEDIR)/$(POSTLOCALE)
+-#else
+-#define Xi18nLibraryTarget(libname)                           @@\
++# else
++#  define Xi18nLibraryTarget(libname)                         @@\
++DependTarget()                                                        @@\
+ SharedLibraryTarget(libname,$(SOXI18NREV),$(OBJS),.,.)                @@\
+ install:: Concat(lib,libname.so.$(SOXI18NREV))                        @@\
+       MakeDir($(DESTDIR)$(XLOCALEDIR)/$(POSTLOCALE))          @@\
+       $(RM) $(DESTDIR)$(XLOCALEDIR)/$(POSTLOCALE)/libname.so.$(SOXI18NREV)    @@\
+       $(INSTALL) $(INSTALLFLAGS) $(INSTLIBFLAGS) 
Concat(lib,libname.so.$(SOXI18NREV)) 
$(DESTDIR)$(XLOCALEDIR)/$(POSTLOCALE)/libname.so.$(SOXI18NREV)
+ 
+-#endif
++# endif
+ #endif
+--- xc/lib/X11/XlcDL.c~        2003-07-24 14:23:42.000000000 -0500
++++ xc/lib/X11/XlcDL.c 2003-07-24 14:27:11.000000000 -0500
 @@ -56,12 +56,16 @@
  #include "XlcPubI.h"
  
@@ -2963,7 +3014,7 @@
  XLCd
  #if NeedFunctionPrototypes
  _XlcDynamicLoad(const char *lc_name)
-@@ -300,14 +391,9 @@
+@@ -300,18 +391,13 @@
  {
      XLCd lcd = (XLCd)NULL;
      XLCd (*lc_loader)() = (XLCd(*)())NULL;
@@ -2978,6 +3029,11 @@
  
      if (lc_name == NULL) return (XLCd)NULL;
  
+-    if (_XlcLocaleDirName(lc_dir, (char *)lc_name) == (char*)NULL)
++    if (_XlcLocaleDirName(lc_dir, BUFSIZE, (char *)lc_name) == (char*)NULL)
+       return (XLCd)NULL;
+ 
+     resolve_object(lc_dir, lc_name);
 @@ -321,47 +407,17 @@
      for (; count-- > 0; objects_list++) {
          if (objects_list->type != XLC_OBJECT ||
@@ -3031,7 +3087,7 @@
      }
      return (XLCd)lcd;
  }
-@@ -379,16 +435,11 @@
+@@ -379,67 +435,32 @@
  #endif
  {
    XIM im = (XIM)NULL;
@@ -3048,7 +3104,10 @@
  
    lc_name = lcd->core->name;
  
-@@ -398,48 +449,18 @@
+-  if (_XlcLocaleDirName(lc_dir, lc_name) == NULL) return (XIM)0;
++  if (_XlcLocaleDirName(lc_dir, BUFSIZE, lc_name) == NULL) return (XIM)0;
+ 
+   count = lc_count;
    for (; count-- > 0; objects_list++) {
      if (objects_list->type != XIM_OBJECT ||
        strcmp(objects_list->locale_name, lc_name)) continue;
@@ -3111,7 +3170,14 @@
    char lc_dir[BUFSIZE];
    char *lc_name;
    Bool (*im_registerIM)() = (Bool(*)())NULL;
-@@ -475,49 +495,18 @@
+@@ -469,55 +489,24 @@
+ 
+   lc_name = lcd->core->name;
+ 
+-  if (_XlcLocaleDirName(lc_dir, lc_name) == NULL) return False;
++  if (_XlcLocaleDirName(lc_dir, BUFSIZE, lc_name) == NULL) return False;
+ 
+   count = lc_count;
    for (; count-- > 0; objects_list++) {
      if (objects_list->type != XIM_OBJECT ||
        strcmp(objects_list->locale_name, lc_name)) continue;
@@ -3174,7 +3240,14 @@
    char lc_dir[BUFSIZE];
    char *lc_name;
    Bool (*im_unregisterIM)() = (Bool(*)())NULL;
-@@ -552,50 +540,21 @@
+@@ -546,56 +534,27 @@
+ #endif
+ 
+   lc_name = lcd->core->name;
+-  if (_XlcLocaleDirName(lc_dir, lc_name) == NULL) return False;
++  if (_XlcLocaleDirName(lc_dir, BUFSIZE, lc_name) == NULL) return False;
+ 
+   count = lc_count;
    for (; count-- > 0; objects_list++) {
      if (objects_list->type != XIM_OBJECT ||
        strcmp(objects_list->locale_name, lc_name)) continue;
@@ -3241,7 +3314,14 @@
    char lc_dir[BUFSIZE];
    char *lc_name;
    XOM (*om_openOM)() = (XOM(*)())NULL;
-@@ -649,48 +607,16 @@
+@@ -643,54 +601,22 @@
+ 
+   lc_name = lcd->core->name;
+ 
+-  if (_XlcLocaleDirName(lc_dir, lc_name) == NULL) return (XOM)0;
++  if (_XlcLocaleDirName(lc_dir, BUFSIZE, lc_name) == NULL) return (XOM)0;
+ 
+   count = lc_count;
    for (; count-- > 0; objects_list++) {
      if (objects_list->type != XOM_OBJECT ||
        strcmp(objects_list->locale_name, lc_name)) continue;
@@ -3296,52 +3376,137 @@
    }
    return (XOM)om;
  }
---- xc/lib/X11/xlibi18n/Xi18nLib.conf~ 2003-02-20 11:27:05.000000000 -0500
-+++ xc/lib/X11/xlibi18n/Xi18nLib.conf  2003-02-20 11:30:59.000000000 -0500
-@@ -23,7 +23,7 @@
+--- xc/lib/X11/XlcPubI.h~      2003-07-24 14:23:42.000000000 -0500
++++ xc/lib/X11/XlcPubI.h       2003-07-24 14:27:11.000000000 -0500
+@@ -217,6 +217,7 @@
+ extern char *_XlcLocaleDirName(
+ #if NeedFunctionPrototypes
+      char*             /* dir_name */,
++     size_t,         /* dir_len */
+      char*             /* lc_name */
+ #endif
+ );
+--- xc/lib/X11/lcFile.c~       2003-07-24 14:23:42.000000000 -0500
++++ xc/lib/X11/lcFile.c        2003-07-24 14:27:11.000000000 -0500
+@@ -429,57 +429,75 @@
+ }
  
- #include <Library.tmpl>
+ char *
+-_XlcLocaleDirName(dir_name, lc_name)
++_XlcLocaleDirName(dir_name, dir_len, lc_name)
+      char *dir_name;
++     size_t dir_len;
+      char *lc_name;
+ {
+-  char dir[PATH_MAX], buf[PATH_MAX], *name = NULL;
+-  int i, n;
+-  char *args[NUM_LOCALEDIR];
+-  static char locale_alias[] = LOCALE_ALIAS;
+-  char *target_name = (char*)0;
+-  char *target_dir = (char*)0;
++    char dir[PATH_MAX], buf[PATH_MAX], *name = NULL;
++    int i, n;
++    char *args[NUM_LOCALEDIR];
++    static char locale_alias[] = LOCALE_ALIAS;
++    char *target_name = (char*)0;
++    char *target_dir = (char*)0;
  
--#ifdef HPArchitecture && OSMajorVersion > 9
-+#if defined(HPArchitecture) && OSMajorVersion > 9
-     EXTRA_SHLIBLDFLAGS = +s +b $(USRLIBDIR)
- #else
-     EXTRA_SHLIBLDFLAGS = 
-@@ -47,8 +47,6 @@
-       $(RM) $@
-       $(CC) -c $(CFLAGS) $(_NOOP_) $(SHLIBDEF) $(SHAREDCODEDEF) $(PICFLAGS) $*.c
- 
--DependTarget()
+-  xlocaledir (dir, PATH_MAX);
+-  n = _XlcParsePath(dir, args, 256);
+-  for (i = 0; i < n; ++i){
+-    if ((2 + (args[i] ? strlen(args[i]) : 0) + 
+-       strlen(locale_alias)) < PATH_MAX) {
+-      sprintf (buf, "%s/%s", args[i], locale_alias);
+-      name = resolve_name(lc_name, buf, LtoR);
++    xlocaledir (dir, PATH_MAX);
++    n = _XlcParsePath(dir, args, 256);
++    for (i = 0; i < n; ++i) {
++  
++      if ((2 + (args[i] ? strlen(args[i]) : 0) + 
++           strlen(locale_alias)) < PATH_MAX) {
++          sprintf (buf, "%s/%s", args[i], locale_alias);
++          name = resolve_name(lc_name, buf, LtoR);
++      }
++  
++      /* If name is not an alias, use lc_name for locale.dir search */
++      if (name == NULL)
++          name = lc_name;
++ 
++      /* look at locale.dir */
++ 
++      target_dir = args[i];
++      if (!target_dir) {
++          /* something wrong */
++          if (name != lc_name)
++              Xfree(name);
++          continue;
++      }
++      if ((1 + (target_dir ? strlen (target_dir) : 0) +
++           strlen("locale.dir")) < PATH_MAX) {
++          sprintf(buf, "%s/locale.dir", target_dir);
++          target_name = resolve_name(name, buf, RtoL);
++      }
++      if (name != lc_name)
++          Xfree(name);
++      if (target_name != NULL) {
++          char *p = 0;
++          if ((p = strstr(target_name, "/XLC_LOCALE"))) {
++              *p = '\0';
++              break;
++          }
++          Xfree(target_name);
++          target_name = NULL;
++      }
++      name = NULL;
+     }
 -
- clean::
-       rm -rf *.so.$(SOXI18NREV)
- 
-@@ -56,8 +54,8 @@
-       $(LINT) $(LINTFLAGS) $(SRCS) $(LINTLIBS)
- 
- #ifndef Xi18nLibraryTarget
--#if 0
--#define       Xi18nLibraryTarget(libname)             @@\
-+# if 0 /* !CrossCompiling */
-+#  define     Xi18nLibraryTarget(libname)             @@\
- all:: libname.so.$(SOXI18NREV)                        @@\
- libname.so.$(SOXI18NREV): $(OBJS)             @@\
-       $(RM) [EMAIL PROTECTED]                         @@\
-@@ -69,13 +67,14 @@
-       else (set -x; $(MKDIRHIER) $(DESTDIR)$(XLOCALEDIR)/$(POSTLOCALE)); fi @@\
-       $(RM) $(DESTDIR)$(XLOCALEDIR)/$(POSTLOCALE)/libname.so.$(SOXI18NREV)    @@\
-       $(INSTALL) $(INSTALLFLAGS) $(INSTLIBFLAGS) libname.so.$(SOXI18NREV) 
$(DESTDIR)$(XLOCALEDIR)/$(POSTLOCALE)
--#else
--#define Xi18nLibraryTarget(libname)                           @@\
-+# else
-+#  define Xi18nLibraryTarget(libname)                         @@\
-+DependTarget()                                                        @@\
- SharedLibraryTarget(libname,$(SOXI18NREV),$(OBJS),.,.)                @@\
- install:: Concat(lib,libname.so.$(SOXI18NREV))                        @@\
-       MakeDir($(DESTDIR)$(XLOCALEDIR)/$(POSTLOCALE))          @@\
-       $(RM) $(DESTDIR)$(XLOCALEDIR)/$(POSTLOCALE)/libname.so.$(SOXI18NREV)    @@\
-       $(INSTALL) $(INSTALLFLAGS) $(INSTLIBFLAGS) 
Concat(lib,libname.so.$(SOXI18NREV)) 
$(DESTDIR)$(XLOCALEDIR)/$(POSTLOCALE)/libname.so.$(SOXI18NREV)
- 
--#endif
-+# endif
- #endif
+-    /* If name is not an alias, use lc_name for locale.dir search */
+-    if (name == NULL)
+-      name = lc_name;
+-
+-    /* look at locale.dir */
+-
+-    target_dir = args[i];
+-    if (!target_dir) {
+-      /* something wrong */
+-      continue;
+-    }
+-    if ((1 + (target_dir ? strlen (target_dir) : 0) +
+-       strlen("locale.dir")) < PATH_MAX) {
+-      sprintf(buf, "%s/locale.dir", target_dir);
+-      target_name = resolve_name(name, buf, RtoL);
++    if (target_name == NULL) {
++      /* vendor locale name == Xlocale name, no expansion of alias */
++      target_dir = args[0];
++      target_name = lc_name;
+     }
+-    if (target_name != NULL) {
+-      char *p = 0;
+-      if ((p = strstr(target_name, "/XLC_LOCALE"))) {
+-      *p = '\0';
+-      break;
+-      }
++    /* snprintf(dir_name, dir_len, "%s/%", target_dir, target_name); */
++    strncpy(dir_name, target_dir, dir_len - 1);
++    if (strlen(target_dir) >= dir_len - 1) {
++      dir_name[dir_len - 1] = '\0';
++    } else  {
++      strcat(dir_name, "/");
++      strncat(dir_name, target_name, dir_len - strlen(dir_name) - 1);
++      if (strlen(target_name) >= dir_len - strlen(dir_name) - 1) 
++          dir_name[dir_len - 1] = '\0';
+     }
+-  }
+-  if (target_name == NULL) {
+-    /* vendor locale name == Xlocale name, no expansion of alias */
+-    target_dir = args[0];
+-    target_name = lc_name;
+-  }
+-  strcpy(dir_name, target_dir);
+-  strcat(dir_name, "/");
+-  strcat(dir_name, target_name);
+-  return dir_name;
++    if (target_name != lc_name)
++      Xfree(target_name);
++    return dir_name;
+ }


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to