diff options
author | Donnie Berkholz <spyderous@gentoo.org> | 2004-11-17 17:38:19 +0000 |
---|---|---|
committer | Donnie Berkholz <spyderous@gentoo.org> | 2004-11-17 17:38:19 +0000 |
commit | e331cd5495bbf36d3935f3b7c6ac7f06cc1f30af (patch) | |
tree | 3476e0a325b090025cdb44053e0349c031e36541 /x11-base/xfree | |
parent | Fix for gcc-2.95. Thanks to Matt Taylor for posting it. Fixes bug #71483. (... (diff) | |
download | gentoo-2-e331cd5495bbf36d3935f3b7c6ac7f06cc1f30af.tar.gz gentoo-2-e331cd5495bbf36d3935f3b7c6ac7f06cc1f30af.tar.bz2 gentoo-2-e331cd5495bbf36d3935f3b7c6ac7f06cc1f30af.zip |
Security update: Add xpm-secfix-thomas.diff to fix many issues, including: integer issues resulting in infinite loops and buffer overflows; a one-byte buffer overflow; stack-based overflows with sprintf() and string functions; replaces popen() with s_popen(); path traversal issues; buffer underruns; and memory leaks (missing free(), found by Egbert Eich). Patch by Thomas Biege and Matthiew Herrb.
Diffstat (limited to 'x11-base/xfree')
-rw-r--r-- | x11-base/xfree/ChangeLog | 13 | ||||
-rw-r--r-- | x11-base/xfree/files/digest-xfree-4.3.0-r8 | 32 | ||||
-rw-r--r-- | x11-base/xfree/files/xpm-secfix-thomas.diff | 1948 | ||||
-rw-r--r-- | x11-base/xfree/xfree-4.3.0-r8.ebuild | 1258 |
4 files changed, 3250 insertions, 1 deletions
diff --git a/x11-base/xfree/ChangeLog b/x11-base/xfree/ChangeLog index b4a13b61507f..e2c0d869e54a 100644 --- a/x11-base/xfree/ChangeLog +++ b/x11-base/xfree/ChangeLog @@ -1,6 +1,17 @@ # ChangeLog for x11-base/xfree # Copyright 2002-2004 Gentoo Foundation; Distributed under the GPL v2 -# $Header: /var/cvsroot/gentoo-x86/x11-base/xfree/ChangeLog,v 1.365 2004/11/11 06:50:47 spyderous Exp $ +# $Header: /var/cvsroot/gentoo-x86/x11-base/xfree/ChangeLog,v 1.366 2004/11/17 17:36:27 spyderous Exp $ + +*xfree-4.3.0-r8 (17 Nov 2004) + + 17 Nov 2004; Donnie Berkholz <spyderous@gentoo.org>; + +files/xpm-secfix-thomas.diff, +xfree-4.3.0-r8.ebuild: + Security update: Add xpm-secfix-thomas.diff to fix many issues, including: + integer issues resulting in infinite loops and buffer overflows; a one-byte + buffer overflow; stack-based overflows with sprintf() and string functions; + replaces popen() with s_popen(); path traversal issues; buffer underruns; + and memory leaks (missing free(), found by Egbert Eich). Patch by Thomas + Biege and Matthiew Herrb. 10 Nov 2004; Donnie Berkholz <spyderous@gentoo.org>; xfree-4.3.0-r7.ebuild: diff --git a/x11-base/xfree/files/digest-xfree-4.3.0-r8 b/x11-base/xfree/files/digest-xfree-4.3.0-r8 new file mode 100644 index 000000000000..c10b2a352243 --- /dev/null +++ b/x11-base/xfree/files/digest-xfree-4.3.0-r8 @@ -0,0 +1,32 @@ +MD5 4f241a4f867363f40efa2b00dca292af X430src-1.tgz 10993622 +MD5 844c2ee908d21dbf8911fd13115bf8b4 X430src-2.tgz 7962239 +MD5 b82a0443e1b7bf860e4343e6b6766cb6 X430src-3.tgz 12366363 +MD5 567903747018f2534965ab6cb3976b38 X430src-4.tgz 12906091 +MD5 4dbdbe9a85c8f7f98dd0ee015a3c7b4f X430src-5.tgz 4388018 +MD5 163d9864e1353a4a9f992cb3843c240f X430src-6.tgz 8074919 +MD5 e002e70f24098ca4f62fabd1c2809ed1 X430src-7.tgz 9317241 +MD5 af14137626cfb101dc15cc9556ab1ebe XFree86-4.3.0-patches-2.1.25.8.tar.bz2 533131 +MD5 e0c52f0e726e20db445e9708665a26d4 xfree86-dri-resume-v8.patch 15333 +MD5 222bffcae6c2be37ec5cd993037f4f45 xf86Wacom.c.gz 26156 +MD5 537bb3e2da7642bd979ebc1cafa8dce7 savage-1.1.27t.zip 76974 +MD5 4550c4f28637be556e2000676072de32 sis_drv_src_311003-1.tar.gz 419840 +MD5 f89f285c15d39679b9c403f6bbddedef synaptics-0.12.0.tar.bz2 133551 +MD5 3d4ee581df78c9dacc6e97aa07a1af72 gemini-koi8-u.tar.bz2 439173 +MD5 4d7d5fdc4ed56c144ef998302581478c eurofonts-X11.tar.bz2 8811 +MD5 cfdef5d00cd4a7937ff4bc136dab1932 xfsft-encodings.tar.bz2 11811 +MD5 4c7920d4b9d2ff1213faff4d718946d6 XFree86-compose.dir-0.1.bz2 1877 +MD5 aafd74e26c541382bb382ff338f81f87 XFree86-en_US.UTF-8.old.bz2 7068 +MD5 2e2263bb4adaee6f959fbb6c8df5336a XFree86-locale.alias.bz2 3592 +MD5 d4402be729da91e849aa5b9f506bda06 XFree86-locale.dir.bz2 2094 +MD5 d0fab996daf97adf095e2dad0bd9012e gentoo-cursors-tad-0.3.1.tar.bz2 1196991 +MD5 cbdc2fdd7d2ed0832795e86a8b9ee19a andale32.exe 198384 +MD5 9637df0e91703179f0723ec095a36cb5 arial32.exe 554208 +MD5 c9089ae0c3b3d0d8c4b0a95979bb9ff0 arialb32.exe 168176 +MD5 2b30de40bb5e803a0452c7715fc835d1 comic32.exe 246008 +MD5 4e412c772294403ab62fb2d247d85c60 courie32.exe 646368 +MD5 4d90016026e2da447593b41a8d8fa8bd georgi32.exe 392440 +MD5 7907c7dd6684e9bade91cff82683d9d7 impact32.exe 173288 +MD5 ed39c8ef91b9fb80f76f702568291bd5 times32.exe 661728 +MD5 0d7ea16cac6261f8513a061fbfcdb2b5 trebuc32.exe 357200 +MD5 12d2a75f8156e10607be1eaa8e8ef120 verdan32.exe 351992 +MD5 230a1d13a365b22815f502eb24d9149b webdin32.exe 185072 diff --git a/x11-base/xfree/files/xpm-secfix-thomas.diff b/x11-base/xfree/files/xpm-secfix-thomas.diff new file mode 100644 index 000000000000..035903dd4fe0 --- /dev/null +++ b/x11-base/xfree/files/xpm-secfix-thomas.diff @@ -0,0 +1,1948 @@ +Index: extras/Xpm/lib/Attrib.c +=================================================================== +RCS file: /cvs/XF4/xc/extras/Xpm/lib/Attrib.c,v +retrieving revision 1.2 +diff -u -r1.2 Attrib.c +--- xc/extras/Xpm/lib/Attrib.c 2004/09/01 21:01:32 1.2 ++++ xc/extras/Xpm/lib/Attrib.c 2004/11/01 15:48:58 +@@ -32,13 +32,15 @@ + * Developed by Arnaud Le Hors * + \*****************************************************************************/ + ++/* October 2004, source code review by Thomas Biege <thomas@suse.de> */ ++ + #include "XpmI.h" + + /* 3.2 backward compatibility code */ + LFUNC(CreateOldColorTable, int, (XpmColor *ct, unsigned int ncolors, + XpmColor ***oldct)); + +-LFUNC(FreeOldColorTable, void, (XpmColor **colorTable, int ncolors)); ++LFUNC(FreeOldColorTable, void, (XpmColor **colorTable, unsigned int ncolors)); + + /* + * Create a colortable compatible with the old style colortable +@@ -50,9 +52,9 @@ + XpmColor ***oldct; + { + XpmColor **colorTable, **color; +- int a; ++ unsigned int a; + +- if (ncolors >= SIZE_MAX / sizeof(XpmColor *)) ++ if (ncolors >= UINT_MAX / sizeof(XpmColor *)) + return XpmNoMemory; + + colorTable = (XpmColor **) XpmMalloc(ncolors * sizeof(XpmColor *)); +@@ -69,9 +71,9 @@ + static void + FreeOldColorTable(colorTable, ncolors) + XpmColor **colorTable; +- int ncolors; ++ unsigned int ncolors; + { +- int a, b; ++ unsigned int a, b; + XpmColor **color; + char **sptr; + +@@ -116,7 +118,7 @@ + void + XpmFreeExtensions(extensions, nextensions) + XpmExtension *extensions; +- int nextensions; ++ unsigned int nextensions; + { + unsigned int i, j, nlines; + XpmExtension *ext; +Index: extras/Xpm/lib/CrBufFrI.c +=================================================================== +RCS file: /cvs/XF4/xc/extras/Xpm/lib/CrBufFrI.c,v +retrieving revision 1.1.1.2 +diff -u -r1.1.1.2 CrBufFrI.c +--- xc/extras/Xpm/lib/CrBufFrI.c 2002/01/19 11:08:43 1.1.1.2 ++++ xc/extras/Xpm/lib/CrBufFrI.c 2004/11/01 15:49:03 +@@ -39,15 +42,17 @@ + unsigned int *used_size, XpmColor *colors, + unsigned int ncolors, unsigned int cpp)); + +-LFUNC(WritePixels, void, (char *dataptr, unsigned int *used_size, ++LFUNC(WritePixels, void, (char *dataptr, unsigned int data_size, ++ unsigned int *used_size, + unsigned int width, unsigned int height, + unsigned int cpp, unsigned int *pixels, + XpmColor *colors)); + +-LFUNC(WriteExtensions, void, (char *dataptr, unsigned int *used_size, ++LFUNC(WriteExtensions, void, (char *dataptr, unsigned int data_size, ++ unsigned int *used_size, + XpmExtension *ext, unsigned int num)); + +-LFUNC(ExtensionsSize, int, (XpmExtension *ext, unsigned int num)); ++LFUNC(ExtensionsSize, unsigned int, (XpmExtension *ext, unsigned int num)); + LFUNC(CommentsSize, int, (XpmInfo *info)); + + int +@@ -90,10 +95,11 @@ + + #undef RETURN + #define RETURN(status) \ ++do \ + { \ + ErrorStatus = status; \ + goto error; \ +-} ++}while(0) + + int + XpmCreateBufferFromXpmImage(buffer_return, image, info) +@@ -107,7 +113,7 @@ + unsigned int cmts, extensions, ext_size = 0; + unsigned int l, cmt_size = 0; + char *ptr = NULL, *p; +- unsigned int ptr_size, used_size; ++ unsigned int ptr_size, used_size, tmp; + + *buffer_return = NULL; + +@@ -129,7 +135,13 @@ + #ifdef VOID_SPRINTF + used_size = strlen(buf); + #endif +- ptr_size = used_size + ext_size + cmt_size + 1; ++ ptr_size = used_size + ext_size + cmt_size + 1; /* ptr_size can't be 0 */ ++ if(ptr_size <= used_size || ++ ptr_size <= ext_size || ++ ptr_size <= cmt_size) ++ { ++ return XpmNoMemory; ++ } + ptr = (char *) XpmMalloc(ptr_size); + if (!ptr) + return XpmNoMemory; +@@ -140,7 +152,7 @@ + #ifndef VOID_SPRINTF + used_size += + #endif +- sprintf(ptr + used_size, "/*%s*/\n", info->hints_cmt); ++ snprintf(ptr + used_size, ptr_size-used_size, "/*%s*/\n", info->hints_cmt); + #ifdef VOID_SPRINTF + used_size += strlen(info->hints_cmt) + 5; + #endif +@@ -158,7 +170,7 @@ + #ifndef VOID_SPRINTF + l += + #endif +- sprintf(buf + l, " %d %d", info->x_hotspot, info->y_hotspot); ++ snprintf(buf + l, sizeof(buf)-l, " %d %d", info->x_hotspot, info->y_hotspot); + #ifdef VOID_SPRINTF + l = strlen(buf); + #endif +@@ -180,6 +192,8 @@ + l = strlen(buf); + #endif + ptr_size += l; ++ if(ptr_size <= l) ++ RETURN(XpmNoMemory); + p = (char *) XpmRealloc(ptr, ptr_size); + if (!p) + RETURN(XpmNoMemory); +@@ -192,7 +206,7 @@ + #ifndef VOID_SPRINTF + used_size += + #endif +- sprintf(ptr + used_size, "/*%s*/\n", info->colors_cmt); ++ snprintf(ptr + used_size, ptr_size-used_size, "/*%s*/\n", info->colors_cmt); + #ifdef VOID_SPRINTF + used_size += strlen(info->colors_cmt) + 5; + #endif +@@ -208,7 +222,12 @@ + * 4 = 1 (for '"') + 3 (for '",\n') + * 1 = - 2 (because the last line does not end with ',\n') + 3 (for '};\n') + */ +- ptr_size += image->height * (image->width * image->cpp + 4) + 1; ++ if(image->width > UINT_MAX / image->cpp || ++ (tmp = image->width * image->cpp + 4) <= 4 || ++ image->height > UINT_MAX / tmp || ++ (tmp = image->height * tmp + 1) <= 1 || ++ (ptr_size += tmp) <= tmp) ++ RETURN(XpmNoMemory); + + p = (char *) XpmRealloc(ptr, ptr_size); + if (!p) +@@ -220,17 +239,17 @@ + #ifndef VOID_SPRINTF + used_size += + #endif +- sprintf(ptr + used_size, "/*%s*/\n", info->pixels_cmt); ++ snprintf(ptr + used_size, ptr_size-used_size, "/*%s*/\n", info->pixels_cmt); + #ifdef VOID_SPRINTF + used_size += strlen(info->pixels_cmt) + 5; + #endif + } +- WritePixels(ptr + used_size, &used_size, image->width, image->height, ++ WritePixels(ptr + used_size, ptr_size - used_size, &used_size, image->width, image->height, + image->cpp, image->data, image->colorTable); + + /* print extensions */ + if (extensions) +- WriteExtensions(ptr + used_size, &used_size, ++ WriteExtensions(ptr + used_size, ptr_size-used_size, &used_size, + info->extensions, info->nextensions); + + /* close the array */ +@@ -247,6 +266,7 @@ + return (ErrorStatus); + } + ++ + static int + WriteColors(dataptr, data_size, used_size, colors, ncolors, cpp) + char **dataptr; +@@ -256,7 +276,7 @@ + unsigned int ncolors; + unsigned int cpp; + { +- char buf[BUFSIZ]; ++ char buf[BUFSIZ] = {0}; + unsigned int a, key, l; + char *s, *s2; + char **defaults; +@@ -266,6 +286,8 @@ + + defaults = (char **) colors; + s = buf + 1; ++ if(cpp > (sizeof(buf) - (s-buf))) ++ return(XpmNoMemory); + strncpy(s, *defaults++, cpp); + s += cpp; + +@@ -274,14 +296,24 @@ + #ifndef VOID_SPRINTF + s += + #endif +- sprintf(s, "\t%s %s", xpmColorKeys[key - 1], s2); ++ /* assume C99 compliance */ ++ snprintf(s, sizeof(buf) - (s-buf), "\t%s %s", xpmColorKeys[key - 1], s2); + #ifdef VOID_SPRINTF + s += strlen(s); + #endif ++ /* now let's check if s points out-of-bounds */ ++ if((s-buf) > sizeof(buf)) ++ return(XpmNoMemory); + } + } ++ if(sizeof(buf) - (s-buf) < 4) ++ return(XpmNoMemory); + strcpy(s, "\",\n"); + l = s + 3 - buf; ++ if( *data_size >= UINT_MAX-l || ++ *data_size + l <= *used_size || ++ (*data_size + l - *used_size) <= sizeof(buf)) ++ return(XpmNoMemory); + s = (char *) XpmRealloc(*dataptr, *data_size + l); + if (!s) + return (XpmNoMemory); +@@ -294,8 +326,9 @@ + } + + static void +-WritePixels(dataptr, used_size, width, height, cpp, pixels, colors) ++WritePixels(dataptr, data_size, used_size, width, height, cpp, pixels, colors) + char *dataptr; ++ unsigned int data_size; + unsigned int *used_size; + unsigned int width; + unsigned int height; +@@ -306,27 +339,36 @@ + char *s = dataptr; + unsigned int x, y, h; + ++ if(height <= 1) ++ return; ++ + h = height - 1; + for (y = 0; y < h; y++) { + *s++ = '"'; + for (x = 0; x < width; x++, pixels++) { +- strncpy(s, colors[*pixels].string, cpp); ++ if(cpp >= (data_size - (s-dataptr))) ++ return; ++ strncpy(s, colors[*pixels].string, cpp); /* how can we trust *pixels? :-\ */ + s += cpp; + } ++ if((data_size - (s-dataptr)) < 4) ++ return; + strcpy(s, "\",\n"); + s += 3; + } + /* duplicate some code to avoid a test in the loop */ + *s++ = '"'; + for (x = 0; x < width; x++, pixels++) { +- strncpy(s, colors[*pixels].string, cpp); ++ if(cpp >= (data_size - (s-dataptr))) ++ return; ++ strncpy(s, colors[*pixels].string, cpp); /* how can we trust *pixels? */ + s += cpp; + } + *s++ = '"'; + *used_size += s - dataptr; + } + +-static int ++static unsigned int + ExtensionsSize(ext, num) + XpmExtension *ext; + unsigned int num; +@@ -335,21 +377,26 @@ + char **line; + + size = 0; ++ if(num == 0) ++ return(0); /* ok? */ + for (x = 0; x < num; x++, ext++) { + /* 11 = 10 (for ',\n"XPMEXT ') + 1 (for '"') */ + size += strlen(ext->name) + 11; +- a = ext->nlines; ++ a = ext->nlines; /* how can we trust ext->nlines to be not out-of-bounds? */ + for (y = 0, line = ext->lines; y < a; y++, line++) + /* 4 = 3 (for ',\n"') + 1 (for '"') */ + size += strlen(*line) + 4; + } + /* 13 is for ',\n"XPMENDEXT"' */ ++ if(size > UINT_MAX - 13) /* unlikely */ ++ return(0); + return size + 13; + } + + static void +-WriteExtensions(dataptr, used_size, ext, num) ++WriteExtensions(dataptr, data_size, used_size, ext, num) + char *dataptr; ++ unsigned int data_size; + unsigned int *used_size; + XpmExtension *ext; + unsigned int num; +@@ -362,7 +409,7 @@ + #ifndef VOID_SPRINTF + s += + #endif +- sprintf(s, ",\n\"XPMEXT %s\"", ext->name); ++ snprintf(s, data_size - (s-dataptr), ",\n\"XPMEXT %s\"", ext->name); + #ifdef VOID_SPRINTF + s += strlen(ext->name) + 11; + #endif +@@ -371,13 +418,13 @@ + #ifndef VOID_SPRINTF + s += + #endif +- sprintf(s, ",\n\"%s\"", *line); ++ snprintf(s, data_size - (s-dataptr), ",\n\"%s\"", *line); + #ifdef VOID_SPRINTF + s += strlen(*line) + 4; + #endif + } + } +- strcpy(s, ",\n\"XPMENDEXT\""); ++ strncpy(s, ",\n\"XPMENDEXT\"", data_size - (s-dataptr)-1); + *used_size += s - dataptr + 13; + } + +@@ -388,6 +435,7 @@ + int size = 0; + + /* 5 = 2 (for "/_*") + 3 (for "*_/\n") */ ++ /* wrap possible but *very* unlikely */ + if (info->hints_cmt) + size += 5 + strlen(info->hints_cmt); + +Index: extras/Xpm/lib/CrDatFrI.c +=================================================================== +RCS file: /cvs/XF4/xc/extras/Xpm/lib/CrDatFrI.c,v +retrieving revision 1.2 +diff -u -r1.2 CrDatFrI.c +--- xc/extras/Xpm/lib/CrDatFrI.c 2004/09/01 21:01:32 1.2 ++++ xc/extras/Xpm/lib/CrDatFrI.c 2004/11/01 15:49:11 +@@ -33,13 +33,16 @@ + \*****************************************************************************/ + /* $XFree86: xc/extras/Xpm/lib/CrDatFrI.c,v 1.2 2001/10/28 03:32:09 tsi Exp $ */ + ++/* October 2004, source code review by Thomas Biege <thomas@suse.de> */ ++ + #include "XpmI.h" + + LFUNC(CreateColors, int, (char **dataptr, unsigned int *data_size, + XpmColor *colors, unsigned int ncolors, + unsigned int cpp)); + +-LFUNC(CreatePixels, void, (char **dataptr, unsigned int width, ++LFUNC(CreatePixels, void, (char **dataptr, unsigned int data_size, ++ unsigned int width, + unsigned int height, unsigned int cpp, + unsigned int *pixels, XpmColor *colors)); + +@@ -47,7 +50,8 @@ + unsigned int *ext_size, + unsigned int *ext_nlines)); + +-LFUNC(CreateExtensions, void, (char **dataptr, unsigned int offset, ++LFUNC(CreateExtensions, void, (char **dataptr, unsigned int data_size, ++ unsigned int offset, + XpmExtension *ext, unsigned int num, + unsigned int ext_nlines)); + +@@ -88,10 +92,11 @@ + + #undef RETURN + #define RETURN(status) \ ++do \ + { \ + ErrorStatus = status; \ + goto exit; \ +-} ++} while(0) + + int + XpmCreateDataFromXpmImage(data_return, image, info) +@@ -122,11 +127,17 @@ + * alloc a temporary array of char pointer for the header section which + * is the hints line + the color table lines + */ +- header_nlines = 1 + image->ncolors; ++ header_nlines = 1 + image->ncolors; /* this may wrap and/or become 0 */ ++ ++ /* 2nd check superfluous if we do not need header_nlines any further */ ++ if(header_nlines <= image->ncolors || ++ header_nlines >= UINT_MAX / sizeof(char *)) ++ return(XpmNoMemory); ++ + header_size = sizeof(char *) * header_nlines; +- if (header_size >= SIZE_MAX / sizeof(char *)) ++ if (header_size >= UINT_MAX / sizeof(char *)) + return (XpmNoMemory); +- header = (char **) XpmCalloc(header_size, sizeof(char *)); ++ header = (char **) XpmCalloc(header_size, sizeof(char *)); /* can we trust image->ncolors */ + if (!header) + return (XpmNoMemory); + +@@ -170,8 +181,22 @@ + + /* now we know the size needed, alloc the data and copy the header lines */ + offset = image->width * image->cpp + 1; +- data_size = header_size + (image->height + ext_nlines) * sizeof(char *) +- + image->height * offset + ext_size; ++ ++ if(offset <= image->width || offset <= image->cpp) ++ RETURN(XpmNoMemory); ++ ++ if( (image->height + ext_nlines) >= UINT_MAX / sizeof(char *)) ++ RETURN(XpmNoMemory); ++ data_size = (image->height + ext_nlines) * sizeof(char *); ++ ++ if (image->height > UINT_MAX / offset || ++ image->height * offset > UINT_MAX - data_size) ++ RETURN(XpmNoMemory); ++ data_size += image->height * offset; ++ ++ if( (header_size + ext_size) >= (UINT_MAX - data_size) ) ++ RETURN(XpmNoMemory); ++ data_size += header_size + ext_size; + + data = (char **) XpmMalloc(data_size); + if (!data) +@@ -179,8 +204,10 @@ + + data_nlines = header_nlines + image->height + ext_nlines; + *data = (char *) (data + data_nlines); ++ ++ /* can header have less elements then n suggests? */ + n = image->ncolors; +- for (l = 0, sptr = data, sptr2 = header; l <= n; l++, sptr++, sptr2++) { ++ for (l = 0, sptr = data, sptr2 = header; l <= n && sptr && sptr2; l++, sptr++, sptr2++) { + strcpy(*sptr, *sptr2); + *(sptr + 1) = *sptr + strlen(*sptr2) + 1; + } +@@ -189,12 +216,13 @@ + data[header_nlines] = (char *) data + header_size + + (image->height + ext_nlines) * sizeof(char *); + +- CreatePixels(data + header_nlines, image->width, image->height, ++ CreatePixels(data + header_nlines, data_size-header_nlines, image->width, image->height, + image->cpp, image->data, image->colorTable); + + /* print extensions */ + if (extensions) +- CreateExtensions(data + header_nlines + image->height - 1, offset, ++ CreateExtensions(data + header_nlines + image->height - 1, ++ data_size - header_nlines - image->height + 1, offset, + info->extensions, info->nextensions, + ext_nlines); + +@@ -225,23 +253,34 @@ + char *s, *s2; + char **defaults; + ++ /* can ncolors be trusted here? */ + for (a = 0; a < ncolors; a++, colors++, dataptr++) { + + defaults = (char **) colors; ++ if(sizeof(buf) <= cpp) ++ return(XpmNoMemory); + strncpy(buf, *defaults++, cpp); + s = buf + cpp; + ++ if(sizeof(buf) <= (s-buf)) ++ return XpmNoMemory; ++ + for (key = 1; key <= NKEYS; key++, defaults++) { + if ((s2 = *defaults)) { + #ifndef VOID_SPRINTF + s += + #endif +- sprintf(s, "\t%s %s", xpmColorKeys[key - 1], s2); ++ /* assume C99 compliance */ ++ snprintf(s, sizeof(buf)-(s-buf), "\t%s %s", xpmColorKeys[key - 1], s2); + #ifdef VOID_SPRINTF + s += strlen(s); + #endif ++ /* does s point out-of-bounds? */ ++ if(sizeof(buf) < (s-buf)) ++ return XpmNoMemory; + } + } ++ /* what about using strdup()? */ + l = s - buf + 1; + s = (char *) XpmMalloc(l); + if (!s) +@@ -253,8 +292,9 @@ + } + + static void +-CreatePixels(dataptr, width, height, cpp, pixels, colors) ++CreatePixels(dataptr, data_size, width, height, cpp, pixels, colors) + char **dataptr; ++ unsigned int data_size; + unsigned int width; + unsigned int height; + unsigned int cpp; +@@ -264,21 +304,38 @@ + char *s; + unsigned int x, y, h, offset; + ++ if(height <= 1) ++ return; ++ + h = height - 1; ++ + offset = width * cpp + 1; ++ ++ if(offset <= width || offset <= cpp) ++ return; ++ ++ /* why trust h? */ + for (y = 0; y < h; y++, dataptr++) { + s = *dataptr; ++ /* why trust width? */ + for (x = 0; x < width; x++, pixels++) { +- strncpy(s, colors[*pixels].string, cpp); ++ if(cpp > (data_size - (s - *dataptr))) ++ return; ++ strncpy(s, colors[*pixels].string, cpp); /* why trust pixel? */ + s += cpp; + } + *s = '\0'; ++ if(offset > data_size) ++ return; + *(dataptr + 1) = *dataptr + offset; + } + /* duplicate some code to avoid a test in the loop */ + s = *dataptr; ++ /* why trust width? */ + for (x = 0; x < width; x++, pixels++) { +- strncpy(s, colors[*pixels].string, cpp); ++ if(cpp > data_size - (s - *dataptr)) ++ return; ++ strncpy(s, colors[*pixels].string, cpp); /* why should we trust *pixel? */ + s += cpp; + } + *s = '\0'; +@@ -311,8 +368,9 @@ + } + + static void +-CreateExtensions(dataptr, offset, ext, num, ext_nlines) ++CreateExtensions(dataptr, data_size, offset, ext, num, ext_nlines) + char **dataptr; ++ unsigned int data_size; + unsigned int offset; + XpmExtension *ext; + unsigned int num; +@@ -325,12 +383,12 @@ + dataptr++; + a = 0; + for (x = 0; x < num; x++, ext++) { +- sprintf(*dataptr, "XPMEXT %s", ext->name); ++ snprintf(*dataptr, data_size, "XPMEXT %s", ext->name); + a++; + if (a < ext_nlines) + *(dataptr + 1) = *dataptr + strlen(ext->name) + 8; + dataptr++; +- b = ext->nlines; ++ b = ext->nlines; /* can we trust these values? */ + for (y = 0, line = ext->lines; y < b; y++, line++) { + strcpy(*dataptr, *line); + a++; +Index: extras/Xpm/lib/Imakefile +=================================================================== +RCS file: /cvs/XF4/xc/extras/Xpm/lib/Imakefile,v +retrieving revision 1.1.1.1 +diff -u -r1.1.1.1 Imakefile +--- xc/extras/Xpm/lib/Imakefile 2001/02/15 07:59:10 1.1.1.1 ++++ xc/extras/Xpm/lib/Imakefile 2004/11/01 15:49:11 +@@ -104,13 +104,15 @@ + CrBufFrI.c CrDatFrP.c CrPFrBuf.c RdFToI.c WrFFrI.c \ + CrBufFrP.c CrIFrBuf.c CrPFrDat.c RdFToP.c WrFFrP.c \ + CrDatFrI.c CrIFrDat.c RdFToDat.c WrFFrDat.c \ +- Attrib.c CrIFrP.c CrPFrI.c Image.c Info.c RdFToBuf.c WrFFrBuf.c ++ Attrib.c CrIFrP.c CrPFrI.c Image.c Info.c RdFToBuf.c WrFFrBuf.c \ ++ s_popen.c + + OBJS = data.o create.o misc.o rgb.o scan.o parse.o hashtab.o \ + CrBufFrI.o CrDatFrP.o CrPFrBuf.o RdFToI.o WrFFrI.o \ + CrBufFrP.o CrIFrBuf.o CrPFrDat.o RdFToP.o WrFFrP.o \ + CrDatFrI.o CrIFrDat.o RdFToDat.o WrFFrDat.o \ +- Attrib.o CrIFrP.o CrPFrI.o Image.o Info.o RdFToBuf.o WrFFrBuf.o ++ Attrib.o CrIFrP.o CrPFrI.o Image.o Info.o RdFToBuf.o WrFFrBuf.o \ ++ s_popen.o + + INCLUDES = -I. + LINTLIBS = $(LINTXTOLL) $(LINTXLIB) +Index: extras/Xpm/lib/RdFToBuf.c +=================================================================== +RCS file: /cvs/XF4/xc/extras/Xpm/lib/RdFToBuf.c,v +retrieving revision 1.1.1.1 +diff -u -r1.1.1.1 RdFToBuf.c +--- xc/extras/Xpm/lib/RdFToBuf.c 2001/02/15 07:59:10 1.1.1.1 ++++ xc/extras/Xpm/lib/RdFToBuf.c 2004/11/01 15:49:16 +@@ -37,6 +37,8 @@ + * HeDu (hedu@cul-ipn.uni-kiel.de) 4/94 + */ + ++/* October 2004, source code review by Thomas Biege <thomas@suse.de> */ ++ + #include "XpmI.h" + #include <sys/stat.h> + #if !defined(FOR_MSW) && !defined(WIN32) +@@ -58,7 +60,8 @@ + char *filename; + char **buffer_return; + { +- int fd, fcheck, len; ++ int fd, fcheck; ++ off_t len; + char *ptr; + struct stat stats; + FILE *fp; +@@ -82,7 +85,7 @@ + close(fd); + return XpmOpenFailed; + } +- len = (int) stats.st_size; ++ len = stats.st_size; + ptr = (char *) XpmMalloc(len + 1); + if (!ptr) { + fclose(fp); +Index: extras/Xpm/lib/RdFToI.c +=================================================================== +RCS file: /cvs/XF4/xc/extras/Xpm/lib/RdFToI.c,v +retrieving revision 1.1.1.2 +diff -u -r1.1.1.2 RdFToI.c +--- xc/extras/Xpm/lib/RdFToI.c 2002/01/19 11:08:43 1.1.1.2 ++++ xc/extras/Xpm/lib/RdFToI.c 2004/11/01 15:49:20 +@@ -33,6 +33,8 @@ + \*****************************************************************************/ + /* $XFree86: xc/extras/Xpm/lib/RdFToI.c,v 1.2 2001/10/28 03:32:09 tsi Exp $ */ + ++/* October 2004, source code review by Thomas Biege <thomas@suse.de> */ ++ + #include "XpmI.h" + #include <sys/stat.h> + #if !defined(NO_ZPIPE) && defined(WIN32) +@@ -123,6 +125,12 @@ + /* + * open the given file to be read as an xpmData which is returned. + */ ++#ifndef NO_ZPIPE ++ FILE *s_popen(char *cmd, const char *type); ++#else ++# define s_popen popen ++#endif ++ + static int + OpenReadFile(filename, mdata) + char *filename; +@@ -141,17 +149,21 @@ + mdata->type = XPMFILE; + } else { + #ifndef NO_ZPIPE +- int len = strlen(filename); ++ size_t len = strlen(filename); ++ ++ if(len == 0 || ++ filename[len-1] == '/') ++ return(XpmOpenFailed); + if ((len > 2) && !strcmp(".Z", filename + (len - 2))) { + mdata->type = XPMPIPE; +- sprintf(buf, "uncompress -c \"%s\"", filename); +- if (!(mdata->stream.file = popen(buf, "r"))) ++ snprintf(buf, sizeof(buf), "uncompress -c \"%s\"", filename); ++ if (!(mdata->stream.file = s_popen(buf, "r"))) + return (XpmOpenFailed); + + } else if ((len > 3) && !strcmp(".gz", filename + (len - 3))) { + mdata->type = XPMPIPE; +- sprintf(buf, "gunzip -qc \"%s\"", filename); +- if (!(mdata->stream.file = popen(buf, "r"))) ++ snprintf(buf, sizeof(buf), "gunzip -qc \"%s\"", filename); ++ if (!(mdata->stream.file = s_popen(buf, "r"))) + return (XpmOpenFailed); + + } else { +@@ -159,19 +171,19 @@ + if (!(compressfile = (char *) XpmMalloc(len + 4))) + return (XpmNoMemory); + +- sprintf(compressfile, "%s.Z", filename); ++ snprintf(compressfile, len+4, "%s.Z", filename); + if (!stat(compressfile, &status)) { +- sprintf(buf, "uncompress -c \"%s\"", compressfile); +- if (!(mdata->stream.file = popen(buf, "r"))) { ++ snprintf(buf, sizeof(buf), "uncompress -c \"%s\"", compressfile); ++ if (!(mdata->stream.file = s_popen(buf, "r"))) { + XpmFree(compressfile); + return (XpmOpenFailed); + } + mdata->type = XPMPIPE; + } else { +- sprintf(compressfile, "%s.gz", filename); ++ snprintf(compressfile, len+4, "%s.gz", filename); + if (!stat(compressfile, &status)) { +- sprintf(buf, "gunzip -c \"%s\"", compressfile); +- if (!(mdata->stream.file = popen(buf, "r"))) { ++ snprintf(buf, sizeof(buf), "gunzip -c \"%s\"", compressfile); ++ if (!(mdata->stream.file = s_popen(buf, "r"))) { + XpmFree(compressfile); + return (XpmOpenFailed); + } +@@ -217,7 +229,7 @@ + break; + #ifndef NO_ZPIPE + case XPMPIPE: +- pclose(mdata->stream.file); ++ fclose(mdata->stream.file); + break; + #endif + } +Index: extras/Xpm/lib/WrFFrBuf.c +=================================================================== +RCS file: /cvs/XF4/xc/extras/Xpm/lib/WrFFrBuf.c,v +retrieving revision 1.1.1.1 +diff -u -r1.1.1.1 WrFFrBuf.c +--- xc/extras/Xpm/lib/WrFFrBuf.c 2001/02/15 07:59:10 1.1.1.1 ++++ xc/extras/Xpm/lib/WrFFrBuf.c 2004/11/01 15:49:20 +@@ -32,6 +32,8 @@ + * Developed by Arnaud Le Hors * + \*****************************************************************************/ + ++/* October 2004, source code review by Thomas Biege <thomas@suse.de> */ ++ + #include "XpmI.h" + + int +@@ -49,7 +51,7 @@ + fcheck = fwrite(buffer, len, 1, fp); + fclose(fp); + if (fcheck != 1) +- return XpmOpenFailed; ++ return XpmOpenFailed; /* maybe use a better return value */ + + return XpmSuccess; + } +Index: extras/Xpm/lib/WrFFrI.c +=================================================================== +RCS file: /cvs/XF4/xc/extras/Xpm/lib/WrFFrI.c,v +retrieving revision 1.2 +diff -u -r1.2 WrFFrI.c +--- xc/extras/Xpm/lib/WrFFrI.c 2004/09/01 21:01:33 1.2 ++++ xc/extras/Xpm/lib/WrFFrI.c 2004/11/01 15:49:24 +@@ -38,6 +38,8 @@ + * Lorens Younes (d93-hyo@nada.kth.se) 4/96 + */ + ++/* October 2004, source code review by Thomas Biege <thomas@suse.de> */ ++ + #include "XpmI.h" + #if !defined(NO_ZPIPE) && defined(WIN32) + # define popen _popen +@@ -98,7 +100,7 @@ + XpmInfo *info; + { + xpmData mdata; +- char *name, *dot, *s, new_name[BUFSIZ]; ++ char *name, *dot, *s, new_name[BUFSIZ] = {0}; + int ErrorStatus; + + /* open file to write */ +@@ -121,7 +123,8 @@ + #endif + /* let's try to make a valid C syntax name */ + if (index(name, '.')) { +- strcpy(new_name, name); ++ strncpy(new_name, name, sizeof(new_name)); ++ new_name[sizeof(new_name)-1] = 0; + /* change '.' to '_' */ + name = s = new_name; + while ((dot = index(s, '.'))) { +@@ -131,7 +134,8 @@ + } + if (index(name, '-')) { + if (name != new_name) { +- strcpy(new_name, name); ++ strncpy(new_name, name, sizeof(new_name)); ++ new_name[sizeof(new_name)-1] = 0; + name = new_name; + } + /* change '-' to '_' */ +@@ -248,7 +252,7 @@ + unsigned int x, y, h; + + h = height - 1; +- if (cpp != 0 && width >= (SIZE_MAX - 3)/cpp) ++ if (cpp != 0 && width >= (UINT_MAX - 3)/cpp) + return XpmNoMemory; + p = buf = (char *) XpmMalloc(width * cpp + 3); + if (!buf) +@@ -300,6 +304,11 @@ + /* + * open the given file to be written as an xpmData which is returned + */ ++#ifndef NO_ZPIPE ++ FILE *s_popen(char *cmd, const char *type); ++#else ++# define s_popen popen ++#endif + static int + OpenWriteFile(filename, mdata) + char *filename; +@@ -315,16 +324,23 @@ + mdata->type = XPMFILE; + } else { + #ifndef NO_ZPIPE +- int len = strlen(filename); ++ size_t len = strlen(filename); ++ ++ if(len == 0 || ++ filename[0] == '/' || ++ strstr(filename, "../") != NULL || ++ filename[len-1] == '/') ++ return(XpmOpenFailed); ++ + if (len > 2 && !strcmp(".Z", filename + (len - 2))) { +- sprintf(buf, "compress > \"%s\"", filename); +- if (!(mdata->stream.file = popen(buf, "w"))) ++ snprintf(buf, sizeof(buf), "compress > \"%s\"", filename); ++ if (!(mdata->stream.file = s_popen(buf, "w"))) + return (XpmOpenFailed); + + mdata->type = XPMPIPE; + } else if (len > 3 && !strcmp(".gz", filename + (len - 3))) { +- sprintf(buf, "gzip -q > \"%s\"", filename); +- if (!(mdata->stream.file = popen(buf, "w"))) ++ snprintf(buf, sizeof(buf), "gzip -q > \"%s\"", filename); ++ if (!(mdata->stream.file = s_popen(buf, "w"))) + return (XpmOpenFailed); + + mdata->type = XPMPIPE; +@@ -355,7 +371,7 @@ + break; + #ifndef NO_ZPIPE + case XPMPIPE: +- pclose(mdata->stream.file); ++ fclose(mdata->stream.file); + break; + #endif + } +Index: extras/Xpm/lib/XpmI.h +=================================================================== +RCS file: /cvs/XF4/xc/extras/Xpm/lib/XpmI.h,v +retrieving revision 1.7 +diff -u -r1.7 XpmI.h +--- xc/extras/Xpm/lib/XpmI.h 2004/09/01 21:01:33 1.7 ++++ xc/extras/Xpm/lib/XpmI.h 2004/11/01 15:49:28 +@@ -49,8 +49,10 @@ + * lets try to solve include files + */ + ++#include <sys/types.h> + #include <stdio.h> + #include <stdlib.h> ++#include <limits.h> + /* stdio.h doesn't declare popen on a Sequent DYNIX OS */ + #ifdef sequent + extern FILE *popen(); +Index: extras/Xpm/lib/create.c +=================================================================== +RCS file: /cvs/XF4/xc/extras/Xpm/lib/create.c,v +retrieving revision 1.4 +diff -u -r1.4 create.c +--- xc/extras/Xpm/lib/create.c 2004/09/01 21:01:33 1.4 ++++ xc/extras/Xpm/lib/create.c 2004/11/01 15:50:06 +@@ -45,6 +45,8 @@ + * Lorens Younes (d93-hyo@nada.kth.se) 4/96 + */ + ++/* October 2004, source code review by Thomas Biege <thomas@suse.de> */ ++ + #include "XpmI.h" + #include <ctype.h> + +@@ -586,7 +588,7 @@ + */ + } else { + #endif +- int i; ++ unsigned int i; + + #ifndef AMIGA + ncols = visual->map_entries; +@@ -746,12 +748,14 @@ + + + /* function call in case of error */ ++ + #undef RETURN + #define RETURN(status) \ ++do \ + { \ + ErrorStatus = status; \ + goto error; \ +-} ++} while(0) + + int + XpmCreateImageFromXpmImage(display, image, +@@ -817,7 +821,7 @@ + + ErrorStatus = XpmSuccess; + +- if (image->ncolors >= SIZE_MAX / sizeof(Pixel)) ++ if (image->ncolors >= UINT_MAX / sizeof(Pixel)) + return (XpmNoMemory); + + /* malloc pixels index tables */ +@@ -992,9 +996,13 @@ + return (XpmNoMemory); + + #if !defined(FOR_MSW) && !defined(AMIGA) +- if (height != 0 && (*image_return)->bytes_per_line >= SIZE_MAX / height) ++ if (height != 0 && (*image_return)->bytes_per_line >= INT_MAX / height) { ++ XDestroyImage(*image_return); + return XpmNoMemory; ++ } + /* now that bytes_per_line must have been set properly alloc data */ ++ if((*image_return)->bytes_per_line == 0 || height == 0) ++ return XpmNoMemory; + (*image_return)->data = + (char *) XpmMalloc((*image_return)->bytes_per_line * height); + +@@ -1023,7 +1031,7 @@ + LFUNC(_putbits, void, (register char *src, int dstoffset, + register int numbits, register char *dst)); + +-LFUNC(_XReverse_Bytes, int, (register unsigned char *bpt, register int nb)); ++LFUNC(_XReverse_Bytes, int, (register unsigned char *bpt, register unsigned int nb)); + + static unsigned char Const _reverse_byte[0x100] = { + 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, +@@ -1063,12 +1071,12 @@ + static int + _XReverse_Bytes(bpt, nb) + register unsigned char *bpt; +- register int nb; ++ register unsigned int nb; + { + do { + *bpt = _reverse_byte[*bpt]; + bpt++; +- } while (--nb > 0); ++ } while (--nb > 0); /* is nb user-controled? */ + return 0; + } + +@@ -1207,7 +1215,7 @@ + register char *src; + register char *dst; + register unsigned int *iptr; +- register int x, y, i; ++ register unsigned int x, y, i; + register char *data; + Pixel pixel, px; + int nbytes, depth, ibu, ibpp; +@@ -1217,8 +1225,8 @@ + depth = image->depth; + if (depth == 1) { + ibu = image->bitmap_unit; +- for (y = 0; y < height; y++) +- for (x = 0; x < width; x++, iptr++) { ++ for (y = 0; y < height; y++) /* how can we trust height */ ++ for (x = 0; x < width; x++, iptr++) { /* how can we trust width */ + pixel = pixels[*iptr]; + for (i = 0, px = pixel; i < sizeof(unsigned long); + i++, px >>= 8) +@@ -1293,12 +1301,12 @@ + { + unsigned char *data; + unsigned int *iptr; +- int y; ++ unsigned int y; + Pixel pixel; + + #ifdef WITHOUT_SPEEDUPS + +- int x; ++ unsigned int x; + unsigned char *addr; + + data = (unsigned char *) image->data; +@@ -1335,7 +1343,7 @@ + + #else /* WITHOUT_SPEEDUPS */ + +- int bpl = image->bytes_per_line; ++ unsigned int bpl = image->bytes_per_line; + unsigned char *data_ptr, *max_data; + + data = (unsigned char *) image->data; +@@ -1403,11 +1411,11 @@ + { + unsigned char *data; + unsigned int *iptr; +- int y; ++ unsigned int y; + + #ifdef WITHOUT_SPEEDUPS + +- int x; ++ unsigned int x; + unsigned char *addr; + + data = (unsigned char *) image->data; +@@ -1431,7 +1439,7 @@ + + Pixel pixel; + +- int bpl = image->bytes_per_line; ++ unsigned int bpl = image->bytes_per_line; + unsigned char *data_ptr, *max_data; + + data = (unsigned char *) image->data; +@@ -1484,11 +1492,11 @@ + { + char *data; + unsigned int *iptr; +- int y; ++ unsigned int y; + + #ifdef WITHOUT_SPEEDUPS + +- int x; ++ unsigned int x; + + data = image->data; + iptr = pixelindex; +@@ -1498,7 +1506,7 @@ + + #else /* WITHOUT_SPEEDUPS */ + +- int bpl = image->bytes_per_line; ++ unsigned int bpl = image->bytes_per_line; + char *data_ptr, *max_data; + + data = image->data; +@@ -1533,12 +1541,12 @@ + PutImagePixels(image, width, height, pixelindex, pixels); + else { + unsigned int *iptr; +- int y; ++ unsigned int y; + char *data; + + #ifdef WITHOUT_SPEEDUPS + +- int x; ++ unsigned int x; + + data = image->data; + iptr = pixelindex; +@@ -1761,6 +1769,9 @@ + Pixel px; + int nbytes; + ++ if(x < 0 || y < 0) ++ return 0; ++ + for (i=0, px=pixel; i<sizeof(unsigned long); i++, px>>=8) + ((unsigned char *)&pixel)[i] = px; + src = &ximage->data[XYINDEX(x, y, ximage)]; +@@ -1791,7 +1802,10 @@ + register char *dst; + register int i; + Pixel px; +- int nbytes, ibpp; ++ unsigned int nbytes, ibpp; ++ ++ if(x < 0 || y < 0) ++ return 0; + + ibpp = ximage->bits_per_pixel; + if (ximage->depth == 4) +@@ -1825,6 +1839,9 @@ + { + unsigned char *addr; + ++ if(x < 0 || y < 0) ++ return 0; ++ + addr = &((unsigned char *)ximage->data) [ZINDEX32(x, y, ximage)]; + *((unsigned long *)addr) = pixel; + return 1; +@@ -1840,6 +1857,9 @@ + { + unsigned char *addr; + ++ if(x < 0 || y < 0) ++ return 0; ++ + addr = &((unsigned char *)ximage->data) [ZINDEX32(x, y, ximage)]; + addr[0] = pixel >> 24; + addr[1] = pixel >> 16; +@@ -1857,6 +1877,9 @@ + { + unsigned char *addr; + ++ if(x < 0 || y < 0) ++ return 0; ++ + addr = &((unsigned char *)ximage->data) [ZINDEX32(x, y, ximage)]; + addr[3] = pixel >> 24; + addr[2] = pixel >> 16; +@@ -1874,6 +1897,9 @@ + { + unsigned char *addr; + ++ if(x < 0 || y < 0) ++ return 0; ++ + addr = &((unsigned char *)ximage->data) [ZINDEX16(x, y, ximage)]; + addr[0] = pixel >> 8; + addr[1] = pixel; +@@ -1889,6 +1915,9 @@ + { + unsigned char *addr; + ++ if(x < 0 || y < 0) ++ return 0; ++ + addr = &((unsigned char *)ximage->data) [ZINDEX16(x, y, ximage)]; + addr[1] = pixel >> 8; + addr[0] = pixel; +@@ -1902,6 +1931,9 @@ + int y; + unsigned long pixel; + { ++ if(x < 0 || y < 0) ++ return 0; ++ + ximage->data[ZINDEX8(x, y, ximage)] = pixel; + return 1; + } +@@ -1913,6 +1945,9 @@ + int y; + unsigned long pixel; + { ++ if(x < 0 || y < 0) ++ return 0; ++ + if (pixel & 1) + ximage->data[ZINDEX1(x, y, ximage)] |= 0x80 >> (x & 7); + else +@@ -1927,6 +1962,9 @@ + int y; + unsigned long pixel; + { ++ if(x < 0 || y < 0) ++ return 0; ++ + if (pixel & 1) + ximage->data[ZINDEX1(x, y, ximage)] |= 1 << (x & 7); + else +@@ -2061,8 +2099,8 @@ + xpmGetCmt(data, &colors_cmt); + + /* malloc pixels index tables */ +- if (ncolors >= SIZE_MAX / sizeof(Pixel)) +- return XpmNoMemory; ++ if (ncolors >= UINT_MAX / sizeof(Pixel)) ++ RETURN(XpmNoMemory); + + image_pixels = (Pixel *) XpmMalloc(sizeof(Pixel) * ncolors); + if (!image_pixels) +@@ -2174,7 +2212,7 @@ + * free the hastable + */ + if (ErrorStatus != XpmSuccess) +- RETURN(ErrorStatus) ++ RETURN(ErrorStatus); + else if (USE_HASHTABLE) + xpmHashTableFree(&hashtable); + +@@ -2366,11 +2404,11 @@ + + /* array of pointers malloced by need */ + unsigned short *cidx[256]; +- int char1; ++ unsigned int char1; + + bzero((char *)cidx, 256 * sizeof(unsigned short *)); /* init */ + for (a = 0; a < ncolors; a++) { +- char1 = colorTable[a].string[0]; ++ char1 = (unsigned char) colorTable[a].string[0]; + if (cidx[char1] == NULL) { /* get new memory */ + cidx[char1] = (unsigned short *) + XpmCalloc(256, sizeof(unsigned short)); +Index: extras/Xpm/lib/data.c +=================================================================== +RCS file: /cvs/XF4/xc/extras/Xpm/lib/data.c,v +retrieving revision 1.2 +diff -u -r1.2 data.c +--- xc/extras/Xpm/lib/data.c 2004/09/01 21:01:33 1.2 ++++ xc/extras/Xpm/lib/data.c 2004/11/01 15:50:10 +@@ -33,6 +33,8 @@ + \*****************************************************************************/ + /* $XFree86: xc/extras/Xpm/lib/data.c,v 1.4 2002/01/07 19:40:49 dawes Exp $ */ + ++/* October 2004, source code review by Thomas Biege <thomas@suse.de> */ ++ + #ifndef CXPMPROG + #if 0 + /* Official version number */ +@@ -262,7 +264,7 @@ + } + Ungetc(data, c, file); + } +- return (n); ++ return (n); /* this returns bytes read + 1 */ + } + + /* +@@ -375,8 +377,9 @@ + { + if (!data->type) + *cmt = NULL; +- else if (data->CommentLength != 0 && data->CommentLength < SIZE_MAX - 1) { +- *cmt = (char *) XpmMalloc(data->CommentLength + 1); ++ else if (data->CommentLength != 0 && data->CommentLength < UINT_MAX - 1) { ++ if( (*cmt = (char *) XpmMalloc(data->CommentLength + 1)) == NULL) ++ return XpmNoMemory; + strncpy(*cmt, data->Comment, data->CommentLength); + (*cmt)[data->CommentLength] = '\0'; + data->CommentLength = 0; +@@ -400,7 +403,7 @@ + xpmParseHeader(data) + xpmData *data; + { +- char buf[BUFSIZ]; ++ char buf[BUFSIZ+1] = {0}; + int l, n = 0; + + if (data->type) { +Index: extras/Xpm/lib/hashtab.c +=================================================================== +RCS file: /cvs/XF4/xc/extras/Xpm/lib/hashtab.c,v +retrieving revision 1.2 +diff -u -r1.2 hashtab.c +--- xc/extras/Xpm/lib/hashtab.c 2004/09/01 21:01:33 1.2 ++++ xc/extras/Xpm/lib/hashtab.c 2004/11/01 15:50:14 +@@ -138,13 +138,13 @@ + unsigned int size = table->size; + xpmHashAtom *t, *p; + int i; +- int oldSize = size; ++ unsigned int oldSize = size; + + t = atomTable; + HASH_TABLE_GROWS + table->size = size; + table->limit = size / 3; +- if (size >= SIZE_MAX / sizeof(*atomTable)) ++ if (size >= UINT_MAX / sizeof(*atomTable)) + return (XpmNoMemory); + atomTable = (xpmHashAtom *) XpmMalloc(size * sizeof(*atomTable)); + if (!atomTable) +@@ -206,7 +206,7 @@ + table->size = INITIAL_HASH_SIZE; + table->limit = table->size / 3; + table->used = 0; +- if (table->size >= SIZE_MAX / sizeof(*atomTable)) ++ if (table->size >= UINT_MAX / sizeof(*atomTable)) + return (XpmNoMemory); + atomTable = (xpmHashAtom *) XpmMalloc(table->size * sizeof(*atomTable)); + if (!atomTable) +Index: extras/Xpm/lib/misc.c +=================================================================== +RCS file: /cvs/XF4/xc/extras/Xpm/lib/misc.c,v +retrieving revision 1.1.1.1 +diff -u -r1.1.1.1 misc.c +--- xc/extras/Xpm/lib/misc.c 2001/02/15 07:59:10 1.1.1.1 ++++ xc/extras/Xpm/lib/misc.c 2004/11/01 15:50:14 +@@ -44,7 +44,7 @@ + char *s1; + { + char *s2; +- int l = strlen(s1) + 1; ++ size_t l = strlen(s1) + 1; + + if (s2 = (char *) XpmMalloc(l)) + strcpy(s2, s1); +Index: extras/Xpm/lib/parse.c +=================================================================== +RCS file: /cvs/XF4/xc/extras/Xpm/lib/parse.c,v +retrieving revision 1.2 +diff -u -r1.2 parse.c +--- xc/extras/Xpm/lib/parse.c 2004/09/01 21:01:33 1.2 ++++ xc/extras/Xpm/lib/parse.c 2004/11/01 15:50:28 +@@ -41,26 +41,28 @@ + * HeDu (hedu@cul-ipn.uni-kiel.de) 4/94 + */ + ++/* October 2004, source code review by Thomas Biege <thomas@suse.de> */ ++ + #include "XpmI.h" + #include <ctype.h> + #include <string.h> + + #ifdef HAS_STRLCAT +-# define STRLCAT(dst, src, dstsize) { \ ++# define STRLCAT(dst, src, dstsize) do { \ + if (strlcat(dst, src, dstsize) >= (dstsize)) \ +- return (XpmFileInvalid); } +-# define STRLCPY(dst, src, dstsize) { \ ++ return (XpmFileInvalid); } while(0) ++# define STRLCPY(dst, src, dstsize) do { \ + if (strlcpy(dst, src, dstsize) >= (dstsize)) \ +- return (XpmFileInvalid); } ++ return (XpmFileInvalid); } while(0) + #else +-# define STRLCAT(dst, src, dstsize) { \ ++# define STRLCAT(dst, src, dstsize) do { \ + if ((strlen(dst) + strlen(src)) < (dstsize)) \ + strcat(dst, src); \ +- else return (XpmFileInvalid); } +-# define STRLCPY(dst, src, dstsize) { \ ++ else return (XpmFileInvalid); } while(0) ++# define STRLCPY(dst, src, dstsize) do { \ + if (strlen(src) < (dstsize)) \ + strcpy(dst, src); \ +- else return (XpmFileInvalid); } ++ else return (XpmFileInvalid); } while(0) + #endif + + LFUNC(ParsePixels, int, (xpmData *data, unsigned int width, +@@ -205,7 +207,7 @@ + char **defaults; + int ErrorStatus; + +- if (ncolors >= SIZE_MAX / sizeof(XpmColor)) ++ if (ncolors >= UINT_MAX / sizeof(XpmColor)) + return (XpmNoMemory); + colorTable = (XpmColor *) XpmCalloc(ncolors, sizeof(XpmColor)); + if (!colorTable) +@@ -218,7 +220,7 @@ + /* + * read pixel value + */ +- if (cpp >= SIZE_MAX - 1) { ++ if (cpp >= UINT_MAX - 1) { + xpmFreeColorTable(colorTable, ncolors); + return (XpmNoMemory); + } +@@ -277,9 +279,9 @@ + return (XpmFileInvalid); + } + if (!lastwaskey) +- STRLCAT(curbuf, " ", sizeof(curbuf)); /* append space */ ++ STRLCAT(curbuf, " ", sizeof(curbuf));/* append space */ + buf[l] = '\0'; +- STRLCAT(curbuf, buf, sizeof(curbuf));/* append buf */ ++ STRLCAT(curbuf, buf, sizeof(curbuf)); /* append buf */ + lastwaskey = 0; + } + } +@@ -287,7 +289,7 @@ + xpmFreeColorTable(colorTable, ncolors); + return (XpmFileInvalid); + } +- len = strlen(curbuf) + 1; ++ len = strlen(curbuf) + 1; /* integer overflow just theoretically possible */ + s = defaults[curkey] = (char *) XpmMalloc(len); + if (!s) { + xpmFreeColorTable(colorTable, ncolors); +@@ -306,7 +308,7 @@ + /* + * read pixel value + */ +- if (cpp >= SIZE_MAX - 1) { ++ if (cpp >= UINT_MAX - 1) { + xpmFreeColorTable(colorTable, ncolors); + return (XpmNoMemory); + } +@@ -351,7 +353,7 @@ + memcpy(s, curbuf, len); + color->c_color = s; + *curbuf = '\0'; /* reset curbuf */ +- if (a < ncolors - 1) ++ if (a < ncolors - 1) /* can we trust ncolors -> leave data's bounds */ + xpmNextString(data); /* get to the next string */ + } + } +@@ -370,11 +372,11 @@ + xpmHashTable *hashtable; + unsigned int **pixels; + { +- unsigned int *iptr, *iptr2; ++ unsigned int *iptr, *iptr2 = NULL; /* found by Egbert Eich */ + unsigned int a, x, y; + +- if ((height > 0 && width >= SIZE_MAX / height) || +- width * height >= SIZE_MAX / sizeof(unsigned int)) ++ if ((height > 0 && width >= UINT_MAX / height) || ++ width * height >= UINT_MAX / sizeof(unsigned int)) + return XpmNoMemory; + #ifndef FOR_MSW + iptr2 = (unsigned int *) XpmMalloc(sizeof(unsigned int) * width * height); +@@ -399,8 +401,10 @@ + { + unsigned short colidx[256]; + +- if (ncolors > 256) ++ if (ncolors > 256) { ++ XpmFree(iptr2); /* found by Egbert Eich */ + return (XpmFileInvalid); ++ } + + bzero((char *)colidx, 256 * sizeof(short)); + for (a = 0; a < ncolors; a++) +@@ -427,16 +431,20 @@ + { + + /* free all allocated pointers at all exits */ +-#define FREE_CIDX {int f; for (f = 0; f < 256; f++) \ +-if (cidx[f]) XpmFree(cidx[f]);} ++#define FREE_CIDX \ ++do \ ++{ \ ++ int f; for (f = 0; f < 256; f++) \ ++ if (cidx[f]) XpmFree(cidx[f]); \ ++} while(0) + + /* array of pointers malloced by need */ + unsigned short *cidx[256]; +- int char1; ++ unsigned int char1; + + bzero((char *)cidx, 256 * sizeof(unsigned short *)); /* init */ + for (a = 0; a < ncolors; a++) { +- char1 = colorTable[a].string[0]; ++ char1 = (unsigned char) colorTable[a].string[0]; + if (cidx[char1] == NULL) { /* get new memory */ + cidx[char1] = (unsigned short *) + XpmCalloc(256, sizeof(unsigned short)); +@@ -480,8 +488,10 @@ + char *s; + char buf[BUFSIZ]; + +- if (cpp >= sizeof(buf)) ++ if (cpp >= sizeof(buf)) { ++ XpmFree(iptr2); /* found by Egbert Eich */ + return (XpmFileInvalid); ++ } + + buf[cpp] = '\0'; + if (USE_HASHTABLE) { +@@ -491,7 +501,7 @@ + xpmNextString(data); + for (x = 0; x < width; x++, iptr++) { + for (a = 0, s = buf; a < cpp; a++, s++) +- *s = xpmGetC(data); ++ *s = xpmGetC(data); /* int assigned to char, not a problem here */ + slot = xpmHashSlot(hashtable, buf); + if (!*slot) { /* no color matches */ + XpmFree(iptr2); +@@ -505,7 +515,7 @@ + xpmNextString(data); + for (x = 0; x < width; x++, iptr++) { + for (a = 0, s = buf; a < cpp; a++, s++) +- *s = xpmGetC(data); ++ *s = xpmGetC(data); /* int assigned to char, not a problem here */ + for (a = 0; a < ncolors; a++) + if (!strcmp(colorTable[a].string, buf)) + break; +@@ -560,7 +570,7 @@ + while (!notstart && notend) { + /* there starts an extension */ + ext = (XpmExtension *) +- XpmRealloc(exts, (num + 1) * sizeof(XpmExtension)); ++ XpmRealloc(exts, (num + 1) * sizeof(XpmExtension)); /* can the loop be forced to iterate often enough to make "(num + 1) * sizeof(XpmExtension)" wrapping? */ + if (!ext) { + XpmFree(string); + XpmFreeExtensions(exts, num); +@@ -597,7 +607,7 @@ + while ((notstart = strncmp("XPMEXT", string, 6)) + && (notend = strncmp("XPMENDEXT", string, 9))) { + sp = (char **) +- XpmRealloc(ext->lines, (nlines + 1) * sizeof(char *)); ++ XpmRealloc(ext->lines, (nlines + 1) * sizeof(char *)); /* can we iterate enough for a wrapping? */ + if (!sp) { + XpmFree(string); + ext->nlines = nlines; +@@ -637,9 +647,9 @@ + /* function call in case of error */ + #undef RETURN + #define RETURN(status) \ +-{ \ ++do { \ + goto error; \ +-} ++} while(0) + + /* + * This function parses an Xpm file or data and store the found informations +Index: extras/Xpm/lib/s_popen.c +=================================================================== +RCS file: s_popen.c +diff -N s_popen.c +--- /dev/null Sat Aug 30 18:16:59 1997 ++++ xc/extras/Xpm/lib/s_popen.c Mon Nov 1 15:50:32 2004 +@@ -0,0 +1,181 @@ ++/* ++ * Copyright (C) 2004 The X.Org fundation ++ * ++ * Permission is hereby granted, free of charge, to any person ++ * obtaining a copy of this software and associated documentation ++ * files (the "Software"), to deal in the Software without ++ * restriction, including without limitation the rights to use, copy, ++ * modify, merge, publish, distribute, sublicense, and/or sell copies ++ * of the Software, and to permit persons to whom the Software is fur- ++ * nished to do so, subject to the following conditions: ++ * ++ * The above copyright notice and this permission notice shall be ++ * included in all copies or substantial portions of the Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ++ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ++ * NONINFRINGEMENT. IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ++ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF ++ * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION ++ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ++ * ++ * Except as contained in this notice, the name of the X.Org fundation ++ * shall not be used in advertising or otherwise to promote the sale, ++ * use or other dealings in this Software without prior written ++ * authorization from the X.Org fundation. ++ */ ++ ++/* ++** This is a secure but NOT 100% compatible replacement for popen() ++** Note: - don't use pclose() use fclose() for closing the returned ++** filedesc.!!! ++** ++** Known Bugs: - unable to use i/o-redirection like > or < ++** Author: - Thomas Biege <thomas@suse.de> ++** Credits: - Andreas Pfaller <a.pfaller@pop.gun.de> for fixing a SEGV when ++** calling strtok() ++*/ ++ ++#include <sys/types.h> ++#include <sys/wait.h> ++#include <stdio.h> ++#include <stdlib.h> ++#include <unistd.h> ++#include <string.h> ++ ++#define __SEC_POPEN_TOKEN " " ++ ++FILE *s_popen(char *cmd, const char *type) ++{ ++ pid_t pid; ++ int pfd[2]; ++ int rpipe = 0, wpipe = 0, i; ++ char **argv; ++ char *ptr; ++ char *cmdcpy; ++ ++ ++ if(cmd == NULL || cmd == "") ++ return(NULL); ++ ++ if(type[0] != 'r' && type[0] != 'w') ++ return(NULL); ++ ++ if ((cmdcpy = strdup(cmd)) == NULL) ++ return(NULL); ++ ++ argv = NULL; ++ if( (ptr = strtok(cmdcpy, __SEC_POPEN_TOKEN)) == NULL) ++ { ++ free(cmdcpy); ++ return(NULL); ++ } ++ ++ for(i = 0;; i++) ++ { ++ if( ( argv = (char **) realloc(argv, (i+1) * sizeof(char *)) ) == NULL) ++ { ++ free(cmdcpy); ++ return(NULL); ++ } ++ ++ if( (*(argv+i) = (char *) malloc((strlen(ptr)+1) * sizeof(char))) == NULL) ++ { ++ free(cmdcpy); ++ return(NULL); ++ } ++ ++ strcpy(argv[i], ptr); ++ ++ if( (ptr = strtok(NULL, __SEC_POPEN_TOKEN)) == NULL) ++ { ++ if( ( argv = (char **) realloc(argv, (i+2) * sizeof(char *))) == NULL) ++ { ++ free(cmdcpy); ++ return(NULL); ++ } ++ argv[i+1] = NULL; ++ break; ++ } ++ } ++ ++ ++ if(type[0] == 'r') ++ rpipe = 1; ++ else ++ wpipe = 1; ++ ++ if (pipe(pfd) < 0) ++ { ++ free(cmdcpy); ++ return(NULL); ++ } ++ ++ if((pid = fork()) < 0) ++ { ++ close(pfd[0]); ++ close(pfd[1]); ++ free(cmdcpy); ++ return(NULL); ++ } ++ ++ if(pid == 0) /* child */ ++ { ++ if((pid = fork()) < 0) ++ { ++ close(pfd[0]); ++ close(pfd[1]); ++ free(cmdcpy); ++ return(NULL); ++ } ++ if(pid > 0) ++ { ++ exit(0); /* child nr. 1 exits */ ++ } ++ ++ /* child nr. 2 */ ++ if(rpipe) ++ { ++ close(pfd[0]); /* close reading end, we don't need it */ ++ dup2(STDOUT_FILENO, STDERR_FILENO); ++ if (pfd[1] != STDOUT_FILENO) ++ dup2(pfd[1], STDOUT_FILENO); /* redirect stdout to writing end of pipe */ ++ } ++ else ++ { ++ close(pfd[1]); /* close writing end, we don't need it */ ++ if (pfd[0] != STDIN_FILENO) ++ dup2(pfd[0], STDIN_FILENO); /* redirect stdin to reading end of pipe */ ++ } ++ ++ if(strchr(argv[0], '/') == NULL) ++ execvp(argv[0], argv); /* search in $PATH */ ++ else ++ execv(argv[0], argv); ++ ++ close(pfd[0]); ++ close(pfd[1]); ++ free(cmdcpy); ++ return(NULL); /* exec failed.. ooops! */ ++ } ++ else /* parent */ ++ { ++ waitpid(pid, NULL, 0); /* wait for child nr. 1 */ ++ ++ if(rpipe) ++ { ++ close(pfd[1]); ++ free(cmdcpy); ++ return(fdopen(pfd[0], "r")); ++ } ++ else ++ { ++ close(pfd[0]); ++ free(cmdcpy); ++ return(fdopen(pfd[1], "w")); ++ } ++ ++ } ++} ++ +Index: extras/Xpm/lib/scan.c +=================================================================== +RCS file: /cvs/XF4/xc/extras/Xpm/lib/scan.c,v +retrieving revision 1.2 +diff -u -r1.2 scan.c +--- xc/extras/Xpm/lib/scan.c 2004/09/01 21:01:33 1.2 ++++ xc/extras/Xpm/lib/scan.c 2004/11/01 15:50:44 +@@ -43,6 +43,8 @@ + * Lorens Younes (d93-hyo@nada.kth.se) 4/96 + */ + ++/* October 2004, source code review by Thomas Biege <thomas@suse.de> */ ++ + #include "XpmI.h" + + #define MAXPRINTABLE 92 /* number of printable ascii chars +@@ -172,10 +174,10 @@ + /* function call in case of error */ + #undef RETURN + #define RETURN(status) \ +-{ \ ++do { \ + ErrorStatus = status; \ + goto error; \ +-} ++} while(0) + + /* + * This function scans the given image and stores the found informations in +@@ -233,15 +235,15 @@ + else + cpp = 0; + +- if ((height > 0 && width >= SIZE_MAX / height) || +- width * height >= SIZE_MAX / sizeof(unsigned int)) ++ if ((height > 0 && width >= UINT_MAX / height) || ++ width * height >= UINT_MAX / sizeof(unsigned int)) + RETURN(XpmNoMemory); + pmap.pixelindex = + (unsigned int *) XpmCalloc(width * height, sizeof(unsigned int)); + if (!pmap.pixelindex) + RETURN(XpmNoMemory); + +- if (pmap.size >= SIZE_MAX / sizeof(Pixel)) ++ if (pmap.size >= UINT_MAX / sizeof(Pixel)) + RETURN(XpmNoMemory); + + pmap.pixels = (Pixel *) XpmMalloc(sizeof(Pixel) * pmap.size); +@@ -308,7 +310,7 @@ + * get rgb values and a string of char, and possibly a name for each + * color + */ +- if (pmap.ncolors >= SIZE_MAX / sizeof(XpmColor)) ++ if (pmap.ncolors >= UINT_MAX / sizeof(XpmColor)) + RETURN(XpmNoMemory); + colorTable = (XpmColor *) XpmCalloc(pmap.ncolors, sizeof(XpmColor)); + if (!colorTable) +@@ -368,7 +370,7 @@ + + /* first get a character string */ + a = 0; +- if (cpp >= SIZE_MAX - 1) ++ if (cpp >= UINT_MAX - 1) + return (XpmNoMemory); + if (!(s = color->string = (char *) XpmMalloc(cpp + 1))) + return (XpmNoMemory); +@@ -461,7 +463,7 @@ + } + + /* first get character strings and rgb values */ +- if (ncolors >= SIZE_MAX / sizeof(XColor) || cpp >= SIZE_MAX - 1) ++ if (ncolors >= UINT_MAX / sizeof(XColor) || cpp >= UINT_MAX - 1) + return (XpmNoMemory); + xcolors = (XColor *) XpmMalloc(sizeof(XColor) * ncolors); + if (!xcolors) +@@ -619,7 +621,7 @@ + char *dst; + unsigned int *iptr; + char *data; +- int x, y, i; ++ unsigned int x, y, i; + int bits, depth, ibu, ibpp, offset; + unsigned long lbt; + Pixel pixel, px; +@@ -721,7 +723,7 @@ + unsigned char *addr; + unsigned char *data; + unsigned int *iptr; +- int x, y; ++ unsigned int x, y; + unsigned long lbt; + Pixel pixel; + int depth; +@@ -786,7 +788,7 @@ + unsigned char *addr; + unsigned char *data; + unsigned int *iptr; +- int x, y; ++ unsigned int x, y; + unsigned long lbt; + Pixel pixel; + int depth; +@@ -831,7 +833,7 @@ + { + unsigned int *iptr; + unsigned char *data; +- int x, y; ++ unsigned int x, y; + unsigned long lbt; + Pixel pixel; + int depth; +@@ -864,7 +866,7 @@ + storeFuncPtr storeFunc; + { + unsigned int *iptr; +- int x, y; ++ unsigned int x, y; + char *data; + Pixel pixel; + int xoff, yoff, offset, bpl; +@@ -900,11 +902,11 @@ + # else /* AMIGA */ + + #define CLEAN_UP(status) \ +-{\ ++do {\ + if (pixels) XpmFree (pixels);\ + if (tmp_img) FreeXImage (tmp_img);\ + return (status);\ +-} ++} while(0) + + static int + AGetImagePixels ( +@@ -925,7 +927,7 @@ + + tmp_img = AllocXImage ((((width+15)>>4)<<4), 1, image->rp->BitMap->Depth); + if (tmp_img == NULL) +- CLEAN_UP (XpmNoMemory) ++ CLEAN_UP (XpmNoMemory); + + iptr = pmap->pixelindex; + for (y = 0; y < height; ++y) +@@ -934,11 +936,11 @@ + for (x = 0; x < width; ++x, ++iptr) + { + if ((*storeFunc) (pixels[x], pmap, iptr)) +- CLEAN_UP (XpmNoMemory) ++ CLEAN_UP (XpmNoMemory); + } + } + +- CLEAN_UP (XpmSuccess) ++ CLEAN_UP (XpmSuccess); + } + + #undef CLEAN_UP +Index: extras/Xpm/lib/xpm.h +=================================================================== +RCS file: /cvs/XF4/xc/extras/Xpm/lib/xpm.h,v +retrieving revision 1.1.1.3 +diff -u -r1.1.1.3 xpm.h +--- xc/extras/Xpm/lib/xpm.h 2004/02/13 21:41:55 1.1.1.3 ++++ xc/extras/Xpm/lib/xpm.h 2004/11/01 15:51:02 +@@ -377,7 +377,7 @@ + FUNC(XpmAttributesSize, int, (void)); + FUNC(XpmFreeAttributes, void, (XpmAttributes *attributes)); + FUNC(XpmFreeExtensions, void, (XpmExtension *extensions, +- int nextensions)); ++ unsigned int nextensions)); + + FUNC(XpmFreeXpmImage, void, (XpmImage *image)); + FUNC(XpmFreeXpmInfo, void, (XpmInfo *info)); +Index: lib/Xpm/Imakefile +=================================================================== +RCS file: /cvs/XF4/xc/lib/Xpm/Imakefile,v +retrieving revision 1.2 +diff -u -r1.2 Imakefile +--- xc/lib/Xpm/Imakefile 2004/09/01 21:01:42 1.2 ++++ xc/lib/Xpm/Imakefile 2004/11/01 15:51:02 +@@ -46,12 +46,20 @@ + STRLCATDEF = -DHAS_STRLCAT + #endif + ++#if HasSnprintf ++SNPRINTFDEF = -DHAS_SNPRINTF ++#else ++SNPRINTFDEF = -Dsnprintf=_XpmSnprintf ++SNPRINTFSRCS = snprintf.c ++SNPRINTFOBJS = snprintf.o ++#endif ++ + #if defined(Win32Architecture) + ZPIPEDEF = -DNO_ZPIPE + #endif + + DEFINES = $(STRDUPDEF) $(STRCASECMPDEF) $(SPRINTFDEF) $(STRLCATDEF) \ +- $(ZPIPEDEF) $(ZFILEDEF) ++ $(SNPRINTFDEF) $(ZPIPEDEF) $(ZFILEDEF) + + HEADERS = xpm.h + +@@ -59,13 +67,15 @@ + CrBufFrI.c CrDatFrP.c CrPFrBuf.c RdFToI.c WrFFrI.c \ + CrBufFrP.c CrIFrBuf.c CrPFrDat.c RdFToP.c WrFFrP.c \ + CrDatFrI.c CrIFrDat.c RdFToDat.c WrFFrDat.c \ +- Attrib.c CrIFrP.c CrPFrI.c Image.c Info.c RdFToBuf.c WrFFrBuf.c ++ Attrib.c CrIFrP.c CrPFrI.c Image.c Info.c RdFToBuf.c WrFFrBuf.c \ ++ s_popen.c $(SNPRINTFSRCS) + + OBJS = data.o create.o misc.o rgb.o scan.o parse.o hashtab.o \ + CrBufFrI.o CrDatFrP.o CrPFrBuf.o RdFToI.o WrFFrI.o \ + CrBufFrP.o CrIFrBuf.o CrPFrDat.o RdFToP.o WrFFrP.o \ + CrDatFrI.o CrIFrDat.o RdFToDat.o WrFFrDat.o \ +- Attrib.o CrIFrP.o CrPFrI.o Image.o Info.o RdFToBuf.o WrFFrBuf.o ++ Attrib.o CrIFrP.o CrPFrI.o Image.o Info.o RdFToBuf.o WrFFrBuf.o \ ++ s_popen.o $(SNPRINTFOBJS) + + XPMDIR = $(TOP)/extras/Xpm + XPMLIBDIR = $(TOP)/extras/Xpm/lib +@@ -104,5 +114,10 @@ + LinkSourceFile(RdFToBuf.c,$(XPMLIBDIR)) + LinkSourceFile(WrFFrBuf.c,$(XPMLIBDIR)) + LinkSourceFile(xpm.h,$(XPMLIBDIR)) ++LinkSourceFile(s_popen.c,$(XPMLIBDIR)) ++ ++#if !HasSnprintf ++LinkSourceFile(snprintf.c,$(LIBSRC)/misc) ++#endif + + DependTarget() diff --git a/x11-base/xfree/xfree-4.3.0-r8.ebuild b/x11-base/xfree/xfree-4.3.0-r8.ebuild new file mode 100644 index 000000000000..064b40c2b39c --- /dev/null +++ b/x11-base/xfree/xfree-4.3.0-r8.ebuild @@ -0,0 +1,1258 @@ +# Copyright 1999-2004 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-x86/x11-base/xfree/xfree-4.3.0-r8.ebuild,v 1.1 2004/11/17 17:36:28 spyderous Exp $ + +inherit eutils flag-o-matic toolchain-funcs x11 + +# Make sure Portage does _NOT_ strip symbols. We will do it later and make sure +# that only we only strip stuff that are safe to strip ... +RESTRICT="nostrip" + +IUSE="3dfx sse mmx 3dnow xml2 truetype nls cjk doc ipv6 debug static pam sdk bindist" + +filter-flags "-funroll-loops" + +ALLOWED_FLAGS="-fstack-protector -march -mcpu -O -O1 -O2 -O3 -pipe" + +# Recently there has been a lot of stability problem in Gentoo-land. Many +# things can be the cause to this, but I believe that it is due to gcc3 +# still having issues with optimizations, or with it not filtering bad +# combinations (protecting the user maybe from themselves) yet. +# +# This can clearly be seen in large builds like glibc, where too aggressive +# CFLAGS cause the tests to fail miserbly. +# +# Quote from Nick Jones <carpaski@gentoo.org>, who in my opinion +# knows what he is talking about: +# +# People really shouldn't force code-specific options on... It's a +# bad idea. The -march options aren't just to look pretty. They enable +# options that are sensible (and include sse,mmx,3dnow when apropriate). +# +# The next command strips CFLAGS and CXXFLAGS from nearly all flags. If +# you do not like it, comment it, but do not bugreport if you run into +# problems. +# +# <azarah@gentoo.org> (13 Oct 2002) +strip-flags + +# Configure for SYNAPTICS support +if [ "${ARCH}" = "x86" ] +then + if [ -z "${SYNAPTICS}" ] + then + SYNAPTICS="yes" + fi +else + unset SYNAPTICS +fi + +# Are we using a snapshot ? +USE_SNAPSHOT="no" + +PATCH_VER="2.1.25.8" +FT2_VER="2.1.3" +XCUR_VER="0.3.1" +SISDRV_VER="311003-1" +SAVDRV_VER="1.1.27t" +MGADRV_VER="1_3_0beta" +VIADRV_VER="0.1" +SYNDRV_VER="0.12.0" + +BASE_PV="${PV}" +MY_SV="${BASE_PV//\.}" +S="${WORKDIR}/xc" +SYNDIR="${WORKDIR}/synaptics" +SRC_PATH="mirror://xfree/${BASE_PV}/source" +HOMEPAGE="http://www.xfree.org" + +# Misc patches we may need to fetch .. +X_PATCHES="http://dev.gentoo.org/~spyderous/xfree/patchsets/${PV}/XFree86-${PV}-patches-${PATCH_VER}.tar.bz2 + http://www.cpbotha.net/files/dri_resume/xfree86-dri-resume-v8.patch" + +X_DRIVERS="http://people.mandrakesoft.com/~flepied/projects/wacom/xf86Wacom.c.gz + http://www.probo.com/timr/savage-${SAVDRV_VER}.zip + http://www.winischhofer.net/sis/sis_drv_src_${SISDRV_VER}.tar.gz + http://w1.894.telia.com/~u89404340/touchpad/files/synaptics-${SYNDRV_VER}.tar.bz2" +# mirror://gentoo/XFree86-4.3.0-drivers-via-${VIADRV_VER}.tar.bz2" +# ftp://ftp.matrox.com/pub/mga/archive/linux/2001/beta_1_3_0/mga-${MGADRV_VER}.tgz" +# 3dfx? ( mirror://gentoo/glide3-headers.tar.bz2 )" +# Updated Wacom driver: http://people.mandrakesoft.com/~flepied/projects/wacom/ +# Latest Savaga drivers: http://www.probo.com/timr/savage40.html +# Latest SIS drivers: http://www.winischhofer.net/ +# Glide headers for compiling the tdfx modules + +# For the MS Core fonts .. +MS_COREFONTS="./andale32.exe ./arial32.exe + ./arialb32.exe ./comic32.exe + ./courie32.exe ./georgi32.exe + ./impact32.exe ./times32.exe + ./trebuc32.exe ./verdan32.exe + ./webdin32.exe" +# ./IELPKTH.CAB" +# Need windows license to use Tahoma font +MS_FONT_URLS="${MS_COREFONTS//\.\//mirror://sourceforge/corefonts/}" + +SRC_URI="${SRC_PATH}/X${MY_SV}src-1.tgz + ${SRC_PATH}/X${MY_SV}src-2.tgz + ${SRC_PATH}/X${MY_SV}src-3.tgz + ${SRC_PATH}/X${MY_SV}src-4.tgz + ${SRC_PATH}/X${MY_SV}src-5.tgz + doc? ( ${SRC_PATH}/X${MY_SV}src-6.tgz + ${SRC_PATH}/X${MY_SV}src-7.tgz )" + +SRC_URI="${SRC_URI} + ${X_PATCHES} + ${X_DRIVERS} + nls? ( mirror://gentoo/gemini-koi8-u.tar.bz2 ) + mirror://gentoo/eurofonts-X11.tar.bz2 + mirror://gentoo/xfsft-encodings.tar.bz2 + mirror://gentoo/XFree86-compose.dir-0.1.bz2 + mirror://gentoo/XFree86-en_US.UTF-8.old.bz2 + mirror://gentoo/XFree86-locale.alias.bz2 + mirror://gentoo/XFree86-locale.dir.bz2 + mirror://gentoo/gentoo-cursors-tad-${XCUR_VER}.tar.bz2 + truetype? ( !bindist? ( ${MS_FONT_URLS} ) )" + +# http://www.xfree86.org/4.3.0/LICENSE.html +LICENSE="Adobe-X CID DEC DEC-2 IBM-X NVIDIA-X NetBSD SGI UCB-LBL XC-2 + bigelow-holmes-urw-gmbh-luxi christopher-g-demetriou national-semiconductor + nokia tektronix the-open-group todd-c-miller x-truetype xfree86-1.0 + MIT SGI-B BSD || ( FTL GPL-2 ) MSttfEULA" +SLOT="0" +KEYWORDS="x86 alpha" + +DEPEND=">=sys-apps/portage-2.0.50_pre9 + >=sys-libs/ncurses-5.1 + >=sys-libs/zlib-1.1.3-r2 + >=sys-devel/flex-2.5.4a-r5 + >=dev-libs/expat-1.95.3 + >=media-libs/freetype-${FT2_VER}-r2 + >=media-libs/fontconfig-2.1-r1 + >=x11-base/opengl-update-1.4 + >=x11-misc/ttmkfdir-3.0.4 + >=sys-apps/sed-4 + >=sys-devel/patch-2.5.9 + sys-apps/util-linux + dev-lang/perl + media-libs/libpng + app-arch/unzip + pam? ( >=sys-libs/pam-0.75 ) + truetype? ( !bindist? ( app-arch/cabextract ) ) + !virtual/x11 + !x11-base/xorg-x11 + !x11-libs/xft" + +#RDEPEND="$DEPEND" +# unzip - needed for savage driver (version 1.1.27t) +# x11-libs/xft -- blocked because of interference with xfree's + +PDEPEND="x86? ( 3dfx? ( >=media-libs/glide-v3-3.10 ) )" + +PROVIDE="virtual/x11 + virtual/opengl + virtual/glu + virtual/xft" + +DESCRIPTION="XFree86: free X server" + +PATCH_DIR=${WORKDIR}/patch + +pkg_setup() { + # A static build disallows building the SDK. + # See config/xf86.rules. + if use static + then + if use sdk + then + die "The static USE flag is incompatible with the sdk USE flag." + fi + fi + + # Check for existence of $CC, we use it later + if [ -z "${CC}" ] + then + die "Please set the CC variable to your compiler. export CC=gcc." + fi +} + +src_unpack() { + + # Unpack source and patches + unpack X${MY_SV}src-{1,2,3,4,5}.tgz + if use doc + then + unpack X${MY_SV}src-{6,7}.tgz + fi + + unpack XFree86-${PV}-patches-${PATCH_VER}.tar.bz2 + + # Unpack TaD's gentoo cursors + unpack gentoo-cursors-tad-${XCUR_VER}.tar.bz2 + + # Unpack extra fonts stuff from Mandrake + if use nls + then + unpack gemini-koi8-u.tar.bz2 + fi + unpack eurofonts-X11.tar.bz2 + unpack xfsft-encodings.tar.bz2 + + # Remove bum encoding + rm -f ${WORKDIR}/usr/X11R6/lib/X11/fonts/encodings/urdunaqsh-0.enc + + # Update the Savage Driver + # savage driver 1.1.27t is a .zip and contains a savage directory + # (that's why we have to be in drivers, not in savage subdir). + # Could be USE flag based + + ebegin "Updating Savage driver" + cd ${S}/programs/Xserver/hw/xfree86/drivers + unpack savage-${SAVDRV_VER}.zip > /dev/null + ln -s ${S}/programs/Xserver/hw/xfree86/vbe/vbe.h \ + ${S}/programs/Xserver/hw/xfree86/drivers/savage + cd ${S} + eend 0 + + ebegin "Updating SiS driver" + cd ${S}/programs/Xserver/hw/xfree86/drivers/sis + unpack sis_drv_src_${SISDRV_VER}.tar.gz > /dev/null + ln -s ${S}/programs/Xserver/hw/xfree86/vbe/vbe.h \ + ${S}/programs/Xserver/hw/xfree86/drivers/sis + cd ${S} + eend 0 + + if [ "${SYNAPTICS}" = "yes" ] + then + ebegin "Adding Synaptics touchpad driver" + cd ${WORKDIR} + unpack synaptics-${SYNDRV_VER}.tar.bz2 > /dev/null + eend 0 + fi + cd ${S} + +# ebegin "Adding VIA driver" +# cd ${WORKDIR} +# unpack XFree86-${PV}-drivers-via-${VIADRV_VER}.tar.bz2 +# cd ${S} +# eend 0 + +# ebegin "Updating Matrox HAL driver" +# unpack mga-${MGADRV_VER}.tgz +# touch ${WORKDIR}/mga/HALlib/mgaHALlib.a +# mv ${WORKDIR}/mga/HALlib/mgaHALlib.a \ +# #{S}/programs/Xserver/hw/xfree86/drivers/mga/HALlib +# eend 0 + + if [ "`gcc-version`" = "2.95" ] + then + # Do not apply this patch for gcc-2.95.3, as it cause compile to fail, + # closing bug #10146. + mv -f ${PATCH_DIR}/0138_all_4.2.1-gcc32-internal-compiler-error.patch \ + ${PATCH_DIR}/excluded + + mv -f ${PATCH_DIR}/0260_ia64_4.2.99.1-gcc3.1.patch \ + ${PATCH_DIR}/excluded + fi + + # We dont have an implementation for S/390's yet... + if [ ! "${ARCH}" = "s390" ] + then + mv -f ${PATCH_DIR}/7500* ${PATCH_DIR}/excluded + fi + + # 9017 fixes many 64-bit issues with non-PIC libs + # patch 9017 overlaps 9015 and 9016 and is applied instead + if [ "${ARCH}" = "amd64" ] + then + mv -f ${PATCH_DIR}/9015* ${PATCH_DIR}/excluded + mv -f ${PATCH_DIR}/9016* ${PATCH_DIR}/excluded + fi + + # This was formerly applied if USE=debug, but it causes builds + # to randomly die (spyderous). + mv -f ${PATCH_DIR}/0120* ${PATCH_DIR}/excluded + + # This is splite's ia64 patch. Is it necessary, + # now that 0262 is applied? (spyderous) + mv -f ${PATCH_DIR}/0261* ${PATCH_DIR}/excluded + + if use debug + then + mv -f ${PATCH_DIR}/5901* ${PATCH_DIR}/excluded + fi +# FIXME: bug #19812, 075 should be deprecated by 076, left as +# TDFX_RISKY for feedback (put in -r3 if no problems) + if use 3dfx && [ "${TDFX_RISKY}" = "yes" ] + then + mv -f ${PATCH_DIR}/5850* ${PATCH_DIR}/excluded + else + mv -f ${PATCH_DIR}/5851* ${PATCH_DIR}/excluded + fi + + if ! use ipv6 + then + mv -f ${PATCH_DIR}/200* ${PATCH_DIR}/excluded + mv -f ${PATCH_DIR}/9921* ${PATCH_DIR}/excluded + else + mv -f ${PATCH_DIR}/9920* ${PATCH_DIR}/excluded + if ! use doc + then + mv -f ${PATCH_DIR}/2001* ${PATCH_DIR}/excluded + fi + fi + + # Various Patches from all over + EPATCH_SUFFIX="patch" epatch ${PATCH_DIR} + + unset EPATCH_EXCLUDE + + epatch ${FILESDIR}/xpm-secfix-thomas.diff + + # Fix DRI related problems + cd ${S}/programs/Xserver/hw/xfree86/ + epatch ${DISTDIR}/xfree86-dri-resume-v8.patch + + # Update Wacom Driver, hopefully resolving bug #1632 + # The kernel driver should prob also be updated, this can be + # found at: + # + # http://people.mandrakesoft.com/~flepied/projects/wacom/ + # + if ( [ -e "${ROOT}/usr/src/linux" ] && \ + [ ! `is_kernel "2" "2"` ] ) || \ + [ "`uname -r | cut -d. -f1,2`" != "2.2" ] + then + ebegin "Updating Wacom USB Driver" + gzip -dc ${DISTDIR}/xf86Wacom.c.gz > \ + ${S}/programs/Xserver/hw/xfree86/input/wacom/xf86Wacom.c || die + eend 0 + fi + + # Unpack the MS fonts + if use truetype && use !bindist + then + einfo "Unpacking MS Core Fonts..." + mkdir -p ${WORKDIR}/truetype; cd ${WORKDIR}/truetype + for x in ${MS_COREFONTS} + do + if [ -f ${DISTDIR}/${x} ] + then + einfo " ${x/\.\/}..." + cabextract --lowercase ${DISTDIR}/${x} > /dev/null || die + fi + done + ebegin "Done unpacking Core Fonts"; eend 0 + fi + + ebegin "Setting up config/cf/host.def" + cd ${S}; cp ${FILESDIR}/${PV}/site.def config/cf/host.def || die + echo "#define XVendorString \"Gentoo Linux (XFree86 ${PV}, revision ${PR})\"" \ + >> config/cf/host.def + + # We're using Xwrapper instead -- so that nothing else needs to be + # set uid any more. + echo "#define InstallXserverSetUID NO" >> config/cf/host.def + echo "#define BuildServersOnly NO" >> config/cf/host.def + + # Bug #12775 .. fails with -Os. + replace-flags "-Os" "-O2" + + if [ "`gcc-version`" != "2.95" ] + then + # Should fix bug #4189. gcc-3.x have problems with -march=pentium4 + # and -march=athlon-tbird + replace-flags "-march=pentium4" "-march=pentium3" + replace-flags "-march=athlon-tbird" "-march=athlon" + + # Without this, modules breaks with gcc3 + if [ "`gcc-version`" = "3.1" ] + then + append-flags "-fno-merge-constants" + append-flags "-fno-merge-constants" + fi + fi + + if ( [ -e "${ROOT}/usr/src/linux" ] && \ + [ ! `is_kernel "2" "2"` ] ) || \ + [ "`uname -r | cut -d. -f1,2`" != "2.2" ] + then + echo "#define HasLinuxInput YES" >> config/cf/host.def + fi + + # this is needed for ./configure and runtime linking and building not to fall into falsely believing + # that there are some headers and functions for builtin video drivers or font libraries present + + echo "#define CcCmd ${CC}" >> config/cf/host.def + echo "#define OptimizedCDebugFlags ${CFLAGS}" >> config/cf/host.def + echo "#define OptimizedCplusplusDebugFlags ${CXXFLAGS}" >> config/cf/host.def + + if use static + then + echo "#define DoLoadableServer NO" >>config/cf/host.def + fi + + if use debug + then + echo "#define XFree86Devel YES" >> config/cf/host.def + else + echo "#define ExtraXInputDrivers acecad" >> config/cf/host.def + # use less ram .. got this from Spider's makeedit.eclass :) + echo "#define GccWarningOptions -Wno-return-type -w" \ + >> config/cf/host.def + fi + + if use pam + then + # If you want to have optional pam support, do it properly ... + echo "#define HasPam YES" >> config/cf/host.def + echo "#define HasPamMisc YES" >> config/cf/host.def + else + echo "#define HasPam NO" >> config/cf/host.def + echo "#define HasPamMisc NO" >> config/cf/host.def + fi + + if use nls + then + echo "#define XtermWithI18N YES" >> config/cf/host.def + fi + + if [ "${ARCH}" = "x86" ] + then + # optimize Mesa for architecture + if use mmx + then + echo "#define HasMMXSupport YES" >> config/cf/host.def + echo "#define MesaUseMMX YES" >> config/cf/host.def + else + echo "#define HasMMXSupport NO" >> config/cf/host.def + echo "#define MesaUseMMX NO" >> config/cf/host.def + fi + + if use 3dnow + then + echo "#define Has3DNowSupport YES" >> config/cf/host.def + echo "#define MesaUse3DNow YES" >> config/cf/host.def + else + echo "#define Has3DNowSupport NO" >> config/cf/host.def + echo "#define MesaUse3DNow NO" >> config/cf/host.def + fi + if use sse + then + echo "#define HasKatmaiSupport YES" >> config/cf/host.def + echo "#define MesaUseKatmai YES" >> config/cf/host.def + else + echo "#define HasKatmaiSupport NO" >> config/cf/host.def + echo "#define MesaUseKatmai NO" >> config/cf/host.def + fi + + # build with glide3 support? (build the tdfx_dri.o module) + if use 3dfx + then + echo "#define HasGlide3 YES" >> config/cf/host.def + fi + + # Compile the VIA driver +# echo "#define XF86ExtraCardDrivers via" >> config/cf/host.def + fi + + if [ "${ARCH}" = "hppa" ] + then + echo "#define DoLoadableServer NO" >> config/cf/host.def + fi + + if [ "${ARCH}" = "alpha" ] + then + echo "#define XF86CardDrivers mga nv tga s3virge sis rendition \ + i740 tdfx cirrus tseng fbdev \ + ati vga v4l glint" >> config/cf/host.def + fi + + if [ "${ARCH}" = "ppc" ] + then + echo "#define XF86CardDrivers mga glint s3virge sis savage trident \ + chips tdfx fbdev ati DevelDrivers vga nv imstt \ + XF86OSCardDrivers XF86ExtraCardDrivers" >> config/cf/host.def + fi + + if [ "${ARCH}" = "sparc" ] + then + echo "#define XF86CardDrivers sunffb sunleo suncg6 suncg3 suncg14 \ + suntcx sunbw2 glint mga tdfx ati savage vesa vga fbdev \ + XF86OSCardDrivers XF86ExtraCardDrivers \ + DevelDrivers" >> config/cf/host.def + fi + + if [ "${ARCH}" = "amd64" ] + then + # the built-in zlib doesnt build in amd64 because of -fPIC issues + grep -v HasZlib config/cf/host.def > ${T}/host.def + mv ${T}/host.def config/cf/host.def + echo "#define HasZlib YES" >> config/cf/host.def + fi + + if use xml2 + then + echo "#define HasLibxml2 YES" >> config/cf/host.def + fi + + # The definitions for fontconfig + echo "#define UseFontconfig YES" >> config/cf/host.def + echo "#define HasFontconfig YES" >> config/cf/host.def + + # Use the xfree Xft2 lib + echo "#define SharedLibXft YES" >> config/cf/host.def + + # disable docs if doc not in USE + if ! use doc + then + echo "#define BuildLinuxDocText NO" >> config/cf/host.def + echo "#define BuildLinuxDocHtml NO" >> config/cf/host.def + echo "#define BuildLinuxDocPS NO" >> config/cf/host.def + echo "#define BuildSpecsDocs NO" >> config/cf/host.def + fi + + # enable Japanese docs, optionally + if use cjk && use doc + then + echo "#define InstallJapaneseDocs YES" >> config/cf/host.def + fi + + # Native Language Support Fonts + if ! use nls + then + echo "#define BuildCyrillicFonts NO" >> config/cf/host.def + echo "#define BuildArabicFonts NO" >> config/cf/host.def + echo "#define BuildGreekFonts NO" >> config/cf/host.def + echo "#define BuildHebrewFonts NO" >> config/cf/host.def + echo "#define BuildThaiFonts NO" >> config/cf/host.def + + if ! use cjk + then + echo "#define BuildCIDFonts NO" >> config/cf/host.def + echo "#define BuildJapaneseFonts NO" >> config/cf/host.def + echo "#define BuildKoreanFonts NO" >> config/cf/host.def + echo "#define BuildChineseFonts NO" >> config/cf/host.def + fi + fi + + if use ipv6 + then + echo "#define HasIPv6 YES" >> config/cf/host.def + fi + +# # Build with the binary MatroxHAL driver +# echo "#define HaveMatroxHal YES" >> config/cf/host.def +# echo "#define UseMatroxHal YES" >> config/cf/host.def + +# Will uncomment this after kde, qt, and *box ebuilds are alterered to use +# it +# if use xinerama +# then +# echo "#define BuildXinerama YES" >> config/cf/host.def +# echo "#define BuildXineramaLibrary YES" >> config/cf/host.def +# fi + + # End the host.def definitions here + eend 0 + + cd ${S} + bzcat ${DISTDIR}/XFree86-compose.dir-0.1.bz2 > nls/compose.dir + bzcat ${DISTDIR}/XFree86-locale.alias.bz2 > nls/locale.alias + bzcat ${DISTDIR}/XFree86-locale.dir.bz2 > nls/locale.dir + bzcat ${DISTDIR}/XFree86-en_US.UTF-8.old.bz2 > nls/Compose/en_US.UTF-8 + + if use doc + then + # These are not included anymore as they are obsolete + rm -rf ${S}/doc/hardcopy/{XIE,PEX5} + for x in ${S}/programs/Xserver/hw/xfree86/{XF98Conf.cpp,XF98Config} + do + if [ -f ${x} ] + then + cp ${x} ${x}.orig + grep -iv 'Load[[:space:]]*"\(pex5\|xie\)"' ${x}.orig > ${x} + rm -f ${x}.orig + fi + done + fi +} + +src_compile() { + + # Set MAKEOPTS to have proper -j? option .. + get_number_of_jobs + + # Compile ucs2any C implementation (patch #9142) + ebegin "Compiling ucs2any C implementation" + cd ${S}/fonts/util + $(tc-getCC) -Wall -o ucs2any ucs2any.c + [ ! -d ../../exports/bin/ ] && mkdir -p ../../exports/bin/ + mv ucs2any ../../exports/bin/ + ls ${S}/exports/bin/ + cd ${S} + eend 0 + + # If a user defines the MAKE_OPTS variable in /etc/make.conf instead of + # MAKEOPTS, they'll redefine an internal XFree86 Makefile variable and the + # xfree build will silently die. This is tricky to track down, so I'm + # adding a preemptive fix for this issue by making sure that MAKE_OPTS is + # unset. (drobbins, 08 Mar 2003) + unset MAKE_OPTS + + einfo "Building XFree86..." + cd ${S} + FAST=1 emake World || die + + if use nls + then + cd ${S}/nls + make || die + cd ${S} + fi + + if [ "${SYNAPTICS}" = "yes" ] + then + ebegin "Building Synaptics driver..." + cd ${SYNDIR} + make + eend 0 + fi + +} + +src_install() { + + unset MAKE_OPTS + + einfo "Installing XFree86..." + # gcc3 related fix. Do this during install, so that our + # whole build will not be compiled without mmx instructions. + if [ "`gcc-version`" != "2.95" ] && [ "${ARCH}" = "x86" ] + then + make install DESTDIR=${D} || \ + make CDEBUGFLAGS="${CDEBUGFLAGS} -mno-mmx" \ + CXXDEBUGFLAGS="${CXXDEBUGFLAGS} -mno-mmx" \ + install DESTDIR=${D} || die + else + make install DESTDIR=${D} || die + fi + + if use sdk + then + einfo "Installing XFree86 SDK..." + make install.sdk DESTDIR=${D} || die + fi + + # We do not want these, so remove them ... + rm -rf ${D}/usr/X11R6/include/fontconfig + rm -f ${D}/usr/X11R6/lib/libfontconfig.* + rm -f ${D}/usr/X11R6/bin/{fontconfig-config,fc-cache,fc-list} + rm -f ${D}/usr/X11R6/man/man3/fontconfig.3x* + rm -rf ${D}/etc/fonts/ + + # This one needs to be in /usr/lib + insinto /usr/lib/pkgconfig + doins ${D}/usr/X11R6/lib/pkgconfig/{xcursor,xft}.pc + # Now remove the invalid xft.pc, and co ... + rm -rf ${D}/usr/X11R6/lib/pkgconfig + + einfo "Installing man pages..." + make install.man DESTDIR=${D} || die + einfo "Compressing man pages..." + prepman /usr/X11R6 + + if use nls + then + cd ${S}/nls + make DESTDIR=${D} install || die + fi + + # Make sure the user running xterm can only write to utmp. + fowners root:utmp /usr/X11R6/bin/xterm + fperms 2755 /usr/X11R6/bin/xterm + + # Fix permissions on locale/common/*.so + for x in ${D}/usr/X11R6/lib/X11/locale/lib/common/*.so* + do + if [ -f ${x} ] + then + fperms 0755 `echo ${x} | sed -e "s|${D}||"` + fi + done + + # Fix permissions on modules ... + for x in $(find ${D}/usr/X11R6/lib/modules -name '*.o') \ + $(find ${D}/usr/X11R6/lib/modules -name '*.so') + do + if [ -f ${x} ] + then + fperms 0755 `echo ${x} | sed -e "s|${D}||"` + fi + done + + # We zap our CFLAGS in the host.def file, as hardcoded CFLAGS can + # mess up other things that use xmkmf + ebegin "Fixing lib/X11/config/host.def" + cp ${D}/usr/X11R6/lib/X11/config/host.def ${T} + awk '!/OptimizedCDebugFlags|OptimizedCplusplusDebugFlags|GccWarningOptions/ {print $0}' \ + ${T}/host.def > ${D}/usr/X11R6/lib/X11/config/host.def + # theoretically, /usr/X11R6/lib/X11/config is a possible candidate for + # config file management. If we find that people really worry about imake + # stuff, we may add it. But for now, we leave the dir unprotected. + eend 0 + + insinto /etc/X11 + # We still use freetype for now ... + doins ${FILESDIR}/${PV}/XftConfig + newins ${FILESDIR}/${PV}/XftConfig XftConfig.new + # This is if we are using Fontconfig only ... + #newins ${S}/lib/Xft1/XftConfig-OBSOLETE XftConfig + dosym ../../../../etc/X11/XftConfig /usr/X11R6/lib/X11/XftConfig + + # Install example config file + newins ${S}/programs/Xserver/hw/xfree86/XF86Config XF86Config.example + + # Install MS fonts. + if use truetype && use !bindist + then + ebegin "Installing MS Core Fonts" + dodir /usr/X11R6/lib/X11/fonts/truetype + cp -af ${WORKDIR}/truetype/*.ttf ${D}/usr/X11R6/lib/X11/fonts/truetype + eend 0 + fi + + # EURO support + ebegin "Euro Support..." + LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${D}/usr/X11R6/lib" \ + ${D}/usr/X11R6/bin/bdftopcf -t ${WORKDIR}/Xlat9-8x14.bdf | \ + gzip -9 > ${D}/usr/X11R6/lib/X11/fonts/misc/Xlat9-8x14-lat9.pcf.gz + LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${D}/usr/X11R6/lib" \ + ${D}/usr/X11R6/bin/bdftopcf -t ${WORKDIR}/Xlat9-9x16.bdf | \ + gzip -9 > ${D}/usr/X11R6/lib/X11/fonts/misc/Xlat9-9x16-lat9.pcf.gz + eend 0 + + # Standard symlinks + dodir /usr/{bin,include,lib} + dosym ../X11R6/bin /usr/bin/X11 + dosym ../X11R6/include/X11 /usr/include/X11 + dosym ../X11R6/include/DPS /usr/include/DPS + dosym ../X11R6/include/GL /usr/include/GL + dosym ../X11R6/lib/X11 /usr/lib/X11 + dosym ../../usr/X11R6/lib/X11/xkb /etc/X11/xkb + + # Some critical directories + keepdir /var/lib/xdm + dosym ../../../var/lib/xdm /etc/X11/xdm/authdir + + # Remove invalid symlinks + rm -f ${D}/usr/lib/libGL.* + # Create required symlinks + dosym libGL.so.1.2 /usr/X11R6/lib/libGL.so + dosym libGL.so.1.2 /usr/X11R6/lib/libGL.so.1 + dosym libGL.so.1.2 /usr/X11R6/lib/libMesaGL.so + # We move libGLU to /usr/lib now + dosym libGLU.so.1.3 /usr/lib/libMesaGLU.so + + # .la files for libtool support + insinto /usr/X11R6/lib + doins ${FILESDIR}/${PV}/lib/*.la + + # Remove libz.a, as it causes problems (bug #4777) + rm -f ${D}/usr/X11R6/lib/libz.a + # And do not forget the includes (bug #9470) + rm -f ${D}/usr/X11R6/include/{zconf.h,zlib.h} + + # Use the Xwrapper as the X binary + rm -f ${D}/usr/X11R6/bin/X + dosym Xwrapper /usr/X11R6/bin/X + dosym ../../usr/X11R6/bin/XFree86 /etc/X11/X + + # Fix perms + fperms 755 /usr/X11R6/lib/X11/xkb/geometry/sgi + fperms 755 /usr/X11R6/bin/dga + + # Hack from Mandrake (update ours that just created Compose files for + # all locales) + for x in $(find ${D}/usr/X11R6/lib/X11/locale/ -mindepth 1 -type d) + do + # make empty Compose files for some locales + # CJK must not have that file (otherwise XIM don't works some times) + case `basename ${x}` in + C|microsoft-*|iso8859-*|koi8-*) + if [ ! -f ${x}/Compose ] + then + touch ${x}/Compose + fi + ;; + ja*|ko*|zh*) + if [ -r ${x}/Compose ] + then + rm -f ${x}/Compose + fi + ;; + esac + done + + # Another hack from Mandrake -- to fix dead + space for the us + # international keyboard + for i in ${D}/usr/X11R6/lib/X11/locale/*/Compose + do + sed -i \ + -e 's/\(<dead_diaeresis> <space>\).*$/\1 : "\\"" quotedbl/' \ + -e "s/\(<dead_acute> <space>\).*$/\1 : \"'\" apostrophe/" \ + ${i} + done + + # Yet more Mandrake + ebegin "Encoding files for xfsft font server..." + dodir /usr/X11R6/lib/X11/fonts/encodings + cp -a ${WORKDIR}/usr/X11R6/lib/X11/fonts/encodings/* \ + ${D}/usr/X11R6/lib/X11/fonts/encodings + + for x in ${D}/usr/X11R6/lib/X11/fonts/encodings/{.,large}/*.enc + do + [ -f "${x}" ] && gzip -9 -f ${x} + done + eend 0 + + if use nls + then + ebegin "gemini-koi8 fonts..." + cd ${WORKDIR}/ukr + gunzip *.Z + gzip -9 *.pcf + cd ${S} + cp -a ${WORKDIR}/ukr ${D}/usr/X11R6/lib/X11/fonts + eend 0 + fi + + exeinto /etc/X11 + # new session management script + doexe ${FILESDIR}/${PV}/chooser.sh + # new display manager script + doexe ${FILESDIR}/${PV}/startDM.sh + exeinto /etc/X11/Sessions + for x in ${FILESDIR}/${PV}/Sessions/* + do + [ -f ${x} ] && doexe ${x} + done + insinto /etc/env.d + doins ${FILESDIR}/${PV}/10xfree + insinto /etc/X11/xinit + doins ${FILESDIR}/${PV}/xinitrc + exeinto /etc/X11/xdm + doexe ${FILESDIR}/${PV}/Xsession ${FILESDIR}/${PV}/Xsetup_0 + insinto /etc/X11/fs + newins ${FILESDIR}/${PV}/xfs.config config + + if use pam + then + insinto /etc/pam.d + newins ${FILESDIR}/${PV}/xdm.pamd xdm + # Need to fix console permissions first + newins ${FILESDIR}/${PV}/xserver.pamd xserver + fi + + exeinto /etc/init.d + newexe ${FILESDIR}/${PV}/xdm.start xdm + newexe ${FILESDIR}/${PV}/xfs.start xfs + insinto /etc/conf.d + newins ${FILESDIR}/${PV}/xfs.conf.d xfs + + # we want libGLU.so* in /usr/lib + mv ${D}/usr/X11R6/lib/libGLU.* ${D}/usr/lib + + # next section is to setup the dynamic libGL stuff + ebegin "Moving libGL and friends for dynamic switching" + dodir /usr/lib/opengl/xfree/{lib,extensions,include} + local x="" + for x in ${D}/usr/X11R6/lib/libGL.so* \ + ${D}/usr/X11R6/lib/libGL.la \ + ${D}/usr/X11R6/lib/libGL.a \ + ${D}/usr/X11R6/lib/libMesaGL.so + do + if [ -f ${x} -o -L ${x} ] + then + # libGL.a cause problems with tuxracer, etc + mv -f ${x} ${D}/usr/lib/opengl/xfree/lib + fi + done + for x in ${D}/usr/X11R6/lib/modules/extensions/libglx* + do + if [ -f ${x} -o -L ${x} ] + then + mv -f ${x} ${D}/usr/lib/opengl/xfree/extensions + fi + done + for x in ${D}/usr/X11R6/include/GL/{gl.h,glx.h,glxtokens.h} + do + if [ -f ${x} -o -L ${x} ] + then + mv -f ${x} ${D}/usr/lib/opengl/xfree/include + fi + done + eend 0 + + # Make the core cursor the default. People seem not to like whiteglass + # for some reason. + dosed 's:whiteglass:core:' /usr/share/cursors/xfree/default/index.theme + + einfo "Striping binaries and libraries..." + # This bit I got from Redhat ... strip binaries and drivers .. + # NOTE: We do NOT want to strip the drivers, modules or DRI modules! + for x in $(find ${D}/ -type f -perm +0111 -exec file {} \; | \ + grep -v ' shared object,' | \ + sed -n -e 's/^\(.*\):[ ]*ELF.*, not stripped/\1/p') + do + if [ -f ${x} ] + then + # Dont do the modules ... + if [ "${x/\/usr\/X11R6\/lib\/modules}" = "${x}" ] + then + echo "`echo ${x} | sed -e "s|${D}||"`" + strip ${x} || : + fi + fi + done + # Now do the libraries ... + for x in ${D}/usr/{lib,lib/opengl/xfree/lib}/*.so.* \ + ${D}/usr/X11R6/{lib,lib/X11/locale/lib/common}/*.so.* + do + if [ -f ${x} ] + then + echo "`echo ${x} | sed -e "s|${D}||"`" + strip --strip-debug ${x} || : + fi + done + + # Install TaD's gentoo cursors + insinto /usr/share/cursors/xfree/gentoo/cursors + doins ${WORKDIR}/cursors/gentoo/cursors/* + insinto /usr/share/cursors/xfree/gentoo-blue/cursors + doins ${WORKDIR}/cursors/gentoo-blue/cursors/* + insinto /usr/share/cursors/xfree/gentoo-silver/cursors + doins ${WORKDIR}/cursors/gentoo-silver/cursors/* + + if [ "${SYNAPTICS}" = "yes" ] + then + # Install Synaptics touchpad driver and docs + insinto /usr/X11R6/lib/modules/input + doins ${SYNDIR}/synaptics_drv.o + exeinto /usr/X11R6/bin + doexe ${SYNDIR}/synclient + docinto synaptics + dodoc ${SYNDIR}/{COMPATIBILITY,FEATURES,FILES,INSTALL,INSTALL.DE,LICENSE,NEWS,PARAMETER,TODO,VERSION} + fi +} + +pkg_preinst() { + + # These changed from a directory/file to a symlink and reverse + if [ ! -L ${ROOT}/usr/X11R6/lib/X11/XftConfig ] && \ + [ -f ${ROOT}/usr/X11R6/lib/X11/XftConfig ] + then + rm -rf ${ROOT}/usr/X11R6/lib/X11/XftConfig + fi + + if [ -L ${ROOT}/etc/X11/app-defaults ] + then + rm -f ${ROOT}/etc/X11/app-defaults + fi + + if [ ! -L ${ROOT}/usr/X11R6/lib/X11/app-defaults ] && \ + [ -d ${ROOT}/usr/X11R6/lib/X11/app-defaults ] + then + if [ ! -d ${ROOT}/etc/X11/app-defaults ] + then + mkdir -p ${ROOT}/etc/X11/app-defaults + fi + + mv -f ${ROOT}/usr/X11R6/lib/X11/app-defaults ${ROOT}/etc/X11 + fi + + if [ -L ${ROOT}/usr/X11R6/lib/X11/xkb ] + then + rm -f ${ROOT}/usr/X11R6/lib/X11/xkb + fi + + if [ ! -L ${ROOT}/etc/X11/xkb ] && \ + [ -d ${ROOT}/etc/X11/xkb ] + then + if [ ! -d ${ROOT}/usr/X11R6/lib/X11/xkb ] + then + mkdir -p ${ROOT}/usr/X11R6/lib/X11 + fi + + mv -f ${ROOT}/etc/X11/xkb ${ROOT}/usr/X11R6/lib/X11 + fi + + # clean the dinamic libGL stuff's home to ensure + # we dont have stale libs floating around + if [ -d ${ROOT}/usr/lib/opengl/xfree ] + then + rm -rf ${ROOT}/usr/lib/opengl/xfree/* + fi + + # clean out old fonts.* and encodings.dir files, as we + # will regenerate them + local G_FONTDIR + # Not Speedo or CID, as their fonts.scale files are "real" + local G_FONTDIRS="100dpi 75dpi TTF Type1 encodings local misc util" + for G_FONTDIR in ${G_FONTDIRS} + do + find ${ROOT}/usr/X11R6/lib/X11/fonts/${G_FONTDIR} -type f -name 'fonts.*' \ + -exec rm -f {} \; + find ${ROOT}/usr/X11R6/lib/X11/fonts/${G_FONTDIR} -type f -name 'encodings.dir' \ + -exec rm -f {} \; + done + + # make sure we do not have any stale files lying round + # that could break things. + rm -f ${ROOT}/usr/X11R6/lib/libGL* +} + +update_XftConfig() { + + if [ "${ROOT}" = "/" ] + then + local CHECK1="f901d29ec6e3cbb0a5b0fd5cbdd9ff33" + local CHECK2="$(md5sum ${ROOT}/etc/X11/XftConfig | cut -d ' ' -f1)" + + if [ "${CHECK1}" = "${CHECK2}" ] + then + echo + ewarn "Due to an invalid /etc/X11/XftConfig from x11-base/xfree-4.2.1," + ewarn "/etc/X11/XftConfig is being updated automatically. Your old" + ewarn "version of /etc/X11/XftConfig will be backed up as:" + ewarn + ewarn " ${ROOT}etc/X11/XftConfig.bak" + echo + + cp -a ${ROOT}/etc/X11/XftConfig \ + ${ROOT}/etc/X11/XftConfig.bak + mv -f ${ROOT}/etc/X11/XftConfig.new \ + ${ROOT}/etc/X11/XftConfig + rm -f ${ROOT}/etc/X11/._cfg????_XftConfig + else + rm -f ${ROOT}/etc/X11/XftConfig.new + fi + fi +} + + +pkg_postinst() { + + env-update + + if [ "${ROOT}" = "/" ] + then + local x="" + + umask 022 + + # This one cause ttmkfdir to segfault :/ + #rm -f ${ROOT}/usr/X11R6/lib/X11/fonts/encodings/large/gbk-0.enc.gz + + # ******************************************************************** + # A note about fonts and needed files: + # + # 1) Create /usr/X11R6/lib/X11/fonts/encodings/encodings.dir + # + # 2) Create font.scale for TrueType fonts (need to do this before + # we create fonts.dir files, else fonts.dir files will be + # invalid for TrueType fonts...) + # + # 3) Now Generate fonts.dir files. + # + # CID fonts is a bit more involved, but as we do not install any, + # thus I am not going to bother. + # + # <azarah@gentoo.org> (20 Oct 2002) + # + # ******************************************************************** + + ebegin "Generating encodings.dir..." + # Create the encodings.dir in /usr/X11R6/lib/X11/fonts/encodings + LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${ROOT}/usr/X11R6/lib" \ + ${ROOT}/usr/X11R6/bin/mkfontdir -n \ + -e ${ROOT}/usr/X11R6/lib/X11/fonts/encodings \ + -e ${ROOT}/usr/X11R6/lib/X11/fonts/encodings/large \ + -- ${ROOT}/usr/X11R6/lib/X11/fonts/encodings + eend 0 + + if [ -x ${ROOT}/usr/X11R6/bin/ttmkfdir ] + then + ebegin "Creating fonts.scale files..." + for x in $(find ${ROOT}/usr/X11R6/lib/X11/fonts/* -type d -maxdepth 1) + do + [ -z "$(ls ${x}/)" ] && continue + [ "$(ls ${x}/)" = "fonts.cache-1" ] && continue + + # Only generate .scale files if truetype, opentype or type1 + # fonts are present ... + + # First truetype (ttf,ttc) + # NOTE: ttmkfdir does NOT work on type1 fonts (#53753) + # Also, there is no way to regenerate Speedo/CID fonts.scale + # <spyderous@gentoo.org> 2 August 2004 + if [ "${x/encodings}" = "${x}" -a \ + -n "$(find ${x} -iname '*.tt[cf]' -print)" ] + then + LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${ROOT}/usr/X11R6/lib" \ + ${ROOT}/usr/X11R6/bin/ttmkfdir -x 2 \ + -e ${ROOT}/usr/X11R6/lib/X11/fonts/encodings/encodings.dir \ + -o ${x}/fonts.scale -d ${x} + # Next type1 and opentype (pfa,pfb,otf,otc) + elif [ "${x/encodings}" = "${x}" -a \ + -n "$(find ${x} -iname '*.[po][ft][abcf]' -print)" ] + then + LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${ROOT}/usr/X11R6/lib" \ + ${ROOT}/usr/X11R6/bin/mkfontscale \ + -a ${ROOT}/usr/X11R6/lib/X11/fonts/encodings/encodings.dir \ + -- ${x} + fi + done + eend 0 + fi + + ebegin "Generating fonts.dir files..." + for x in $(find ${ROOT}/usr/X11R6/lib/X11/fonts/* -type d -maxdepth 1) + do + [ -z "$(ls ${x}/)" ] && continue + [ "$(ls ${x}/)" = "fonts.cache-1" ] && continue + + if [ "${x/encodings}" = "${x}" ] + then + LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${ROOT}/usr/X11R6/lib" \ + ${ROOT}/usr/X11R6/bin/mkfontdir \ + -e ${ROOT}/usr/X11R6/lib/X11/fonts/encodings \ + -e ${ROOT}/usr/X11R6/lib/X11/fonts/encodings/large \ + -- ${x} + fi + done + eend 0 + + ebegin "Generating Xft Cache..." + for x in $(find ${ROOT}/usr/X11R6/lib/X11/fonts/* -type d -maxdepth 1) + do + [ -z "$(ls ${x}/)" ] && continue + [ "$(ls ${x}/)" = "fonts.cache-1" ] && continue + + # Only generate XftCache files if there are truetype + # fonts present ... + if [ "${x/encodings}" = "${x}" -a \ + -n "$(find ${x} -iname '*.[otps][pft][cfad]' -print)" ] + then + LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${ROOT}/usr/X11R6/lib" \ + ${ROOT}/usr/X11R6/bin/xftcache ${x} &> /dev/null + fi + done + eend 0 + + ebegin "Fixing permissions..." + find ${ROOT}/usr/X11R6/lib/X11/fonts/ -type f -name 'font.*' \ + -exec chmod 0644 {} \; + eend 0 + + # danarmak found out that fc-cache should be run AFTER all the above + # stuff, as otherwise the cache is invalid, and has to be run again + # as root anyway + if [ -x ${ROOT}/usr/bin/fc-cache ] + then + ebegin "Creating FC font cache..." + HOME="/root" ${ROOT}/usr/bin/fc-cache + eend 0 + fi + + # Switch to the xfree implementation. + # Use new opengl-update that will not reset user selected + # OpenGL interface ... + echo; ${ROOT}/usr/sbin/opengl-update --use-old xfree + fi + + for x in $(find ${ROOT}/usr/X11R6/lib/X11/locale/ -mindepth 1 -type d) + do + # Remove old compose files we might have created incorrectly + # CJK must not have that file (otherwise XIM don't works some times) + case `basename ${x}` in + ja*|ko*|zh*) + if [ -r "${x}/Compose" ] + then + rm -f ${x}/Compose + fi + ;; + esac + done + + # Update /etc/X11/XftConfig if its the one from Xft1.2, as its + # invalid for Xft1.1 .... + # NOTE: This should not be needed for xfree-4.2.99 or later, + # but lets not take chances with people that may downgrade + # at a later stage .... + update_XftConfig + + # These need to be owned by root and the correct permissions + # (bug #8281) + for x in ${ROOT}/tmp/.{ICE,X11}-unix + do + if [ ! -d ${x} ] + then + mkdir -p ${x} + fi + + chown root:root ${x} + chmod 1777 ${x} + done + + if use 3dfx + then + echo + einfo "If using a 3DFX card, and you had \"3dfx\" in your USE flags," + einfo "please merge media-libs/glide-v3 if you have not done so yet" + einfo "by doing:" + einfo + einfo " # emerge media-libs/glide-v3" + echo + fi + echo + ewarn "BEWARE 1:" + ewarn "This version of XFree won't work with ati-drivers-2.5.1-r1" + ewarn "if you are using them please unmerge ati-drivers" + ewarn " and emerge xfree-drm" + echo + ewarn "BEWARE 2:" + ewarn "If you experience font corruption on OpenOffice.org or similar" + ewarn "glitches please remake your XF86Config" + echo + + einfo "Please note that the xcursors are in /usr/share/cursors/xfree" + einfo "Any custom cursor sets should be placed in that directory" + einfo "This is different from the previous versions of 4.3 and" + einfo "the 4.2.99 series." + einfo + ewarn "New in this release: if you wish to set system-wide default" + ewarn "cursors, please set them in /usr/local/share/cursors/xfree" + ewarn "so that future emerges will not overwrite those settings" + einfo + einfo "To use the Synaptics touchpad driver, check the installed" + einfo "documentation in /usr/share/doc/xfree, as well as" + einfo "http://tuxmobil.org/touchpad_driver.html and" + einfo "http://w1.894.telia.com/~u89404340/touchpad/." + einfo + ewarn "Listening on tcp is disabled by default with startx." + ewarn "To enable it, edit /usr/X11R6/bin/startx." +} + +pkg_postrm() { + + # Fix problematic links + if [ -x ${ROOT}/usr/X11R6/bin/XFree86 ] + then + ln -snf ../X11R6/bin ${ROOT}/usr/bin/X11 + ln -snf ../X11R6/include/X11 ${ROOT}/usr/include/X11 + ln -snf ../X11R6/include/DPS ${ROOT}/usr/include/DPS + ln -snf ../X11R6/include/GL ${ROOT}/usr/include/GL + ln -snf ../X11R6/lib/X11 ${ROOT}/usr/lib/X11 + fi +} |