diff --git a/pkgs/development/libraries/lesstif/c-bad_integer_cast.patch b/pkgs/development/libraries/lesstif/c-bad_integer_cast.patch new file mode 100644 index 000000000000..620d702f0f03 --- /dev/null +++ b/pkgs/development/libraries/lesstif/c-bad_integer_cast.patch @@ -0,0 +1,13 @@ +--- lesstif2-0.94.4.orig/include/Motif-2.1/XmI/XpmI.h ++++ lesstif2-0.94.4/include/Motif-2.1/XmI/XpmI.h +@@ -217,8 +217,8 @@ + FUNC(xpmHashSlot, xpmHashAtom *, (xpmHashTable *table, char *s)); + FUNC(xpmHashIntern, int, (xpmHashTable *table, char *tag, void *data)); + +-#define HashAtomData(i) ((void *)i) +-#define HashColorIndex(slot) ((unsigned int)((*slot)->data)) ++#define HashAtomData(i) ((void *)(uintptr_t)i) ++#define HashColorIndex(slot) ((uintptr_t)((*slot)->data)) + #define USE_HASHTABLE (cpp > 2 && ncolors > 4) + + /* I/O utility */ diff --git a/pkgs/development/libraries/lesstif/c-missing_xm_h.patch b/pkgs/development/libraries/lesstif/c-missing_xm_h.patch new file mode 100644 index 000000000000..2d298d5f4c4e --- /dev/null +++ b/pkgs/development/libraries/lesstif/c-missing_xm_h.patch @@ -0,0 +1,11 @@ +--- lesstif2-0.94.4.orig/include/Motif-2.1/Xm/XmStrDefs.h ++++ lesstif2-0.94.4/include/Motif-2.1/Xm/XmStrDefs.h +@@ -28,6 +28,8 @@ + + #include + ++#include ++ + #ifdef __cplusplus + extern "C" { + #endif diff --git a/pkgs/development/libraries/lesstif/c-render_table_crash.patch b/pkgs/development/libraries/lesstif/c-render_table_crash.patch new file mode 100644 index 000000000000..1699dbe19084 --- /dev/null +++ b/pkgs/development/libraries/lesstif/c-render_table_crash.patch @@ -0,0 +1,11 @@ +--- lesstif2-0.95.0.orig/lib/Xm-2.1/RenderTable.c ++++ lesstif2-0.95.0/lib/Xm-2.1/RenderTable.c +@@ -465,7 +465,7 @@ + DEBUGOUT(_LtDebug(__FILE__, w, "_XmRenderTableFinaliseTag(%s)\n", tag)); + #if 1 + /* Experimental start */ +- if (r->dpy == 0) ++ if (r->dpy == 0 && w) + r->dpy = XtDisplay(w); + /* Experimental end */ + #endif diff --git a/pkgs/development/libraries/lesstif/c-unsigned_int.patch b/pkgs/development/libraries/lesstif/c-unsigned_int.patch new file mode 100644 index 000000000000..a682d9704c36 --- /dev/null +++ b/pkgs/development/libraries/lesstif/c-unsigned_int.patch @@ -0,0 +1,38 @@ +--- lesstif2-0.94.4.orig/lib/Xm-2.1/Xpmcreate.c ++++ lesstif2-0.94.4/lib/Xm-2.1/Xpmcreate.c +@@ -1265,10 +1265,10 @@ + register char *src; + register char *dst; + register unsigned int *iptr; +- register unsigned int x, y, i; ++ register unsigned int x, y; + register char *data; + Pixel pixel, px; +- int nbytes, depth, ibu, ibpp; ++ int nbytes, depth, ibu, ibpp, i; + + data = image->data; + iptr = pixelindex; +--- lesstif2-0.94.4.orig/lib/Xm-2.1/Xpmscan.c ++++ lesstif2-0.94.4/lib/Xm-2.1/Xpmscan.c +@@ -672,8 +672,8 @@ + char *dst; + unsigned int *iptr; + char *data; +- unsigned int x, y, i; +- int bits, depth, ibu, ibpp, offset; ++ unsigned int x, y; ++ int bits, depth, ibu, ibpp, offset, i; + unsigned long lbt; + Pixel pixel, px; + +@@ -684,6 +684,9 @@ + ibpp = image->bits_per_pixel; + offset = image->xoffset; + ++ if (image->bitmap_unit < 0) ++ return (XpmNoMemory); ++ + if ((image->bits_per_pixel | image->depth) == 1) { + ibu = image->bitmap_unit; + for (y = 0; y < height; y++) diff --git a/pkgs/development/libraries/lesstif/c-xim_chained_list_crash.patch b/pkgs/development/libraries/lesstif/c-xim_chained_list_crash.patch new file mode 100644 index 000000000000..10bdf8d0b973 --- /dev/null +++ b/pkgs/development/libraries/lesstif/c-xim_chained_list_crash.patch @@ -0,0 +1,24 @@ +diff -ru lesstif2-0.94.4-old/lib/Xm-2.1/XmIm.c lesstif2-0.94.4/lib/Xm-2.1/XmIm.c +--- lesstif2-0.94.4-old/lib/Xm-2.1/XmIm.c 2004-10-20 21:32:11.000000000 +0200 ++++ lesstif2-0.94.4/lib/Xm-2.1/XmIm.c 2007-03-28 14:39:27.000000000 +0200 +@@ -133,7 +133,10 @@ + p->next = q->next; + } + +- XtFree((char *)stuff); ++ /* if count!=0 then someone uses the stuff as orig_xim ++ so unlink it but not free it */ ++ if (!stuff->count) ++ XtFree((char *)stuff); + } + + /* +@@ -1060,6 +1063,8 @@ + XCloseIM(stuff->xim); + DEBUGOUT(_LtDebug(__FILE__, w, "XCloseIM(%p)\n", stuff->xim)); + stuff->orig_xim->xim = NULL; ++ /* stuff->orig_xim is now useless */ ++ XtFree(stuff->orig_xim); + } else { + DEBUGOUT(_LtDebug(__FILE__, w, "XmImCloseXIM(%p), count -> %d\n", + stuff->xim, stuff->orig_xim->count)); diff --git a/pkgs/development/libraries/lesstif/c-xpmpipethrough.patch b/pkgs/development/libraries/lesstif/c-xpmpipethrough.patch new file mode 100644 index 000000000000..69f9a2464c6d --- /dev/null +++ b/pkgs/development/libraries/lesstif/c-xpmpipethrough.patch @@ -0,0 +1,381 @@ +Index: lesstif2-0.95.0/lib/Xm-2.1/XpmRdFToI.c +=================================================================== +--- lesstif2-0.95.0.orig/lib/Xm-2.1/XpmRdFToI.c 2004-11-18 22:00:58.000000000 +0100 ++++ lesstif2-0.95.0/lib/Xm-2.1/XpmRdFToI.c 2006-07-11 11:13:29.000000000 +0200 +@@ -44,11 +44,15 @@ + DebugUtil.h! */ + #include + #include ++#include + + #include + #ifdef HAVE_SYS_TYPES_H + #include + #endif ++#ifdef HAVE_SYS_WAIT_H ++#include ++#endif + #ifdef HAVE_SYS_STAT_H + #include + #endif +@@ -87,16 +91,6 @@ + strcpy(dst, src); \ + else return (XpmFileInvalid); } + #endif +-#include +-#if !defined(NO_ZPIPE) && defined(WIN32) +-# define popen _popen +-# define pclose _pclose +-# if defined(STAT_ZFILE) +-# include +-# define stat _stat +-# define fstat _fstat +-# endif +-#endif + + LFUNC(OpenReadFile, int, (char *filename, xpmData *mdata)); + LFUNC(xpmDataClose, void, (xpmData *mdata)); +@@ -173,90 +167,131 @@ + } + #endif /* CXPMPROG */ + +-/* +- * 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 ++/* Do not depend on errno after read_through */ ++FILE* ++xpmPipeThrough(fd, cmd, arg1, mode) ++ int fd; ++ const char* cmd; ++ const char* arg1; ++ const char* mode; ++{ ++ FILE* fp; ++ int status, fds[2], in = 0, out = 1; ++ pid_t pid; ++ if ( 'w' == *mode ) ++ out = 0, in = 1; ++ if ( pipe(fds) < 0 ) ++ return NULL; ++ pid = fork(); ++ if ( pid < 0 ) ++ goto fail1; ++ if ( 0 == pid ) ++ { ++ close(fds[in]); ++ if ( dup2(fds[out], out) < 0 ) ++ goto err; ++ close(fds[out]); ++ if ( dup2(fd, in) < 0 ) ++ goto err; ++ close(fd); ++ pid = fork(); ++ if ( pid < 0 ) ++ goto err; ++ if ( 0 == pid ) ++ { ++ execlp(cmd, cmd, arg1, NULL); ++ perror(cmd); ++ goto err; ++ } ++ _exit(0); ++ err: ++ _exit(1); ++ } ++ close(fds[out]); ++ /* calling process: wait for first child */ ++ while ( waitpid(pid, &status, 0) < 0 && EINTR == errno ) ++ ; ++ if ( WIFSIGNALED(status) || ++ (WIFEXITED(status) && WEXITSTATUS(status) != 0) ) ++ goto fail2; ++ fp = fdopen(fds[in], mode); ++ if ( !fp ) ++ goto fail2; ++ close(fd); /* still open in 2nd child */ ++ return fp; ++fail1: ++ close(fds[out]); ++fail2: ++ close(fds[in]); ++ return NULL; ++} + #endif + ++/* ++ * open the given file to be read as an xpmData which is returned. ++ */ + static int + OpenReadFile(filename, mdata) + char *filename; + xpmData *mdata; + { +-#ifndef NO_ZPIPE +- char buf[BUFSIZ]; +-# ifdef STAT_ZFILE +- char *compressfile; +- struct stat status; +-# endif +-#endif +- + if (!filename) { + mdata->stream.file = (stdin); + mdata->type = XPMFILE; + } else { +-#ifndef NO_ZPIPE +- size_t len = strlen(filename); +- +- if(len == 0 || +- filename[len-1] == '/') +- return(XpmOpenFailed); +- if ((len > 2) && !strcmp(".Z", filename + (len - 2))) { +- mdata->type = XPMPIPE; +- 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; +- snprintf(buf, sizeof(buf), "gunzip -qc \"%s\"", filename); +- if (!(mdata->stream.file = s_popen(buf, "r"))) +- return (XpmOpenFailed); +- +- } else { +-# ifdef STAT_ZFILE +- if (!(compressfile = (char *) XpmMalloc(len + 4))) ++ int fd = open(filename, O_RDONLY); ++#if defined(NO_ZPIPE) ++ if ( fd < 0 ) ++ return XpmOpenFailed; ++#else ++ const char* ext = NULL; ++ if ( fd >= 0 ) ++ ext = strrchr(filename, '.'); ++#ifdef STAT_ZFILE /* searching for z-files if the given name not found */ ++ else ++ { ++ size_t len = strlen(filename); ++ char *compressfile = (char *) XpmMalloc(len + 4); ++ if ( !compressfile ) + return (XpmNoMemory); +- +- snprintf(compressfile, len+4, "%s.Z", filename); +- if (!stat(compressfile, &status)) { +- snprintf(buf, sizeof(buf), "uncompress -c \"%s\"", compressfile); +- if (!(mdata->stream.file = s_popen(buf, "r"))) { ++ strcpy(compressfile, filename); ++ strcpy(compressfile + len, ext = ".Z"); ++ fd = open(compressfile, O_RDONLY); ++ if ( fd < 0 ) ++ { ++ strcpy(compressfile + len, ext = ".gz"); ++ fd = open(compressfile, O_RDONLY); ++ if ( fd < 0 ) ++ { + XpmFree(compressfile); +- return (XpmOpenFailed); +- } +- mdata->type = XPMPIPE; +- } else { +- snprintf(compressfile, len+4, "%s.gz", filename); +- if (!stat(compressfile, &status)) { +- snprintf(buf, sizeof(buf), "gunzip -c \"%s\"", compressfile); +- if (!(mdata->stream.file = s_popen(buf, "r"))) { +- XpmFree(compressfile); +- return (XpmOpenFailed); +- } +- mdata->type = XPMPIPE; +- } else { +-# endif +-#endif +- if (!(mdata->stream.file = fopen(filename, "r"))) { +-#if !defined(NO_ZPIPE) && defined(STAT_ZFILE) +- XpmFree(compressfile); +-#endif +- return (XpmOpenFailed); +- } +- mdata->type = XPMFILE; +-#ifndef NO_ZPIPE +-# ifdef STAT_ZFILE ++ return XpmOpenFailed; + } + } + XpmFree(compressfile); +-# endif + } + #endif ++ if ( ext && !strcmp(ext, ".Z") ) ++ { ++ mdata->type = XPMPIPE; ++ mdata->stream.file = xpmPipeThrough(fd, "uncompress", "-c", "r"); ++ } ++ else if ( ext && !strcmp(ext, ".gz") ) ++ { ++ mdata->type = XPMPIPE; ++ mdata->stream.file = xpmPipeThrough(fd, "gunzip", "-qc", "r"); ++ } ++ else ++#endif /* z-files */ ++ { ++ mdata->type = XPMFILE; ++ mdata->stream.file = fdopen(fd, "r"); ++ } ++ if (!mdata->stream.file) ++ { ++ close(fd); ++ return (XpmOpenFailed); ++ } + } + mdata->CommentLength = 0; + #ifdef CXPMPROG +@@ -273,15 +308,6 @@ + xpmDataClose(mdata) + xpmData *mdata; + { +- switch (mdata->type) { +- case XPMFILE: +- if (mdata->stream.file != (stdin)) +- fclose(mdata->stream.file); +- break; +-#ifndef NO_ZPIPE +- case XPMPIPE: ++ if (mdata->stream.file != (stdin)) + fclose(mdata->stream.file); +- break; +-#endif +- } + } +Index: lesstif2-0.95.0/lib/Xm-2.1/XpmWrFFrI.c +=================================================================== +--- lesstif2-0.95.0.orig/lib/Xm-2.1/XpmWrFFrI.c 2005-04-13 20:03:27.000000000 +0200 ++++ lesstif2-0.95.0/lib/Xm-2.1/XpmWrFFrI.c 2006-07-11 11:13:29.000000000 +0200 +@@ -50,11 +50,15 @@ + DebugUtil.h! */ + #include + #include ++#include + + #include + #ifdef HAVE_SYS_TYPES_H + #include + #endif ++#ifdef HAVE_SYS_WAIT_H ++#include ++#endif + #ifdef HAVE_SYS_STAT_H + #include + #endif +@@ -94,11 +98,6 @@ + else return (XpmFileInvalid); } + #endif + +-#if !defined(NO_ZPIPE) && defined(WIN32) +-# define popen _popen +-# define pclose _pclose +-#endif +- + /* MS Windows define a function called WriteFile @#%#&!!! */ + LFUNC(xpmWriteFile, int, (FILE *file, XpmImage *image, char *name, + XpmInfo *info)); +@@ -354,58 +353,48 @@ + fprintf(file, ",\n\"XPMENDEXT\""); + } + ++ ++#ifndef NO_ZPIPE ++FUNC(xpmPipeThrough, FILE*, (int fd, ++ const char* cmd, ++ const char* arg1, ++ const char* mode)); ++#endif ++ + /* + * 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; + xpmData *mdata; + { +-#ifndef NO_ZPIPE +- char buf[BUFSIZ]; +- +-#endif +- + if (!filename) { + mdata->stream.file = (stdout); + mdata->type = XPMFILE; + } else { + #ifndef NO_ZPIPE +- size_t len = strlen(filename); +- +- if(len == 0 || +- filename[0] == '/' || +- strstr(filename, "../") != NULL || +- filename[len-1] == '/') +- return(XpmOpenFailed); +- ++ size_t len; ++#endif ++ int fd = open(filename, O_WRONLY|O_CREAT|O_TRUNC, 0644); ++ if ( fd < 0 ) ++ return(XpmOpenFailed); ++#ifndef NO_ZPIPE ++ len = strlen(filename); + if (len > 2 && !strcmp(".Z", filename + (len - 2))) { +- snprintf(buf, sizeof(buf), "compress > \"%s\"", filename); +- if (!(mdata->stream.file = s_popen(buf, "w"))) +- return (XpmOpenFailed); +- ++ mdata->stream.file = xpmPipeThrough(fd, "compress", NULL, "w"); + mdata->type = XPMPIPE; + } else if (len > 3 && !strcmp(".gz", filename + (len - 3))) { +- snprintf(buf, sizeof(buf), "gzip -q > \"%s\"", filename); +- if (!(mdata->stream.file = s_popen(buf, "w"))) +- return (XpmOpenFailed); +- ++ mdata->stream.file = xpmPipeThrough(fd, "gzip", "-q", "w"); + mdata->type = XPMPIPE; +- } else { ++ } else + #endif +- if (!(mdata->stream.file = fopen(filename, "w"))) +- return (XpmOpenFailed); +- ++ { ++ mdata->stream.file = fdopen(fd, "w"); + mdata->type = XPMFILE; +-#ifndef NO_ZPIPE + } +-#endif ++ if (!mdata->stream.file) ++ return (XpmOpenFailed); + } + return (XpmSuccess); + } +@@ -417,15 +406,6 @@ + xpmDataClose(mdata) + xpmData *mdata; + { +- switch (mdata->type) { +- case XPMFILE: +- if (mdata->stream.file != (stdout)) +- fclose(mdata->stream.file); +- break; +-#ifndef NO_ZPIPE +- case XPMPIPE: ++ if (mdata->stream.file != (stdout)) + fclose(mdata->stream.file); +- break; +-#endif +- } + } diff --git a/pkgs/development/libraries/lesstif/default.nix b/pkgs/development/libraries/lesstif/default.nix index df98c4244b9b..feeed3c14a63 100644 --- a/pkgs/development/libraries/lesstif/default.nix +++ b/pkgs/development/libraries/lesstif/default.nix @@ -1,12 +1,26 @@ {stdenv, fetchurl, x11, libXp, libXau}: stdenv.mkDerivation { - name = "lesstif-0.95"; + name = "lesstif-0.95-p2"; src = fetchurl { url = mirror://sourceforge/lesstif/lesstif-0.95.0.tar.bz2; md5 = "ab895165c149d7f95843c7584b1c7ad4"; }; buildInputs = [x11]; propagatedBuildInputs = [libXp libXau]; - patches = [./c-linkage.patch]; + + # The last stable release of lesstif was in June 2006. These + # patches fix a number of later issues - in particular the + # render_table_crash shows up in 'arb'. The same patches appear + # in Debian, so we assume they have been sent upstream. + # + patches = [ + ./c-bad_integer_cast.patch + ./c-linkage.patch + ./c-unsigned_int.patch + ./c-missing_xm_h.patch + ./c-xim_chained_list_crash.patch + ./c-render_table_crash.patch + ./c-xpmpipethrough.patch + ]; }