1
0
mirror of https://git.FreeBSD.org/ports.git synced 2025-01-12 07:27:57 +00:00

- import securitry patches

- update FixPix4xv.patch
PR:		72382
Approved by:	portmgr (linimon) and shige
Obtained from:	SuSe
This commit is contained in:
Dirk Meyer 2004-10-11 04:03:13 +00:00
parent 7feb6fb594
commit f3d70b63ab
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=118604
5 changed files with 1134 additions and 61 deletions

View File

@ -7,7 +7,7 @@
PORTNAME= xv
PORTVERSION= 3.10a
PORTREVISION= 3
PORTREVISION= 4
CATEGORIES+= graphics
MASTER_SITES= ftp://ftp.cis.upenn.edu/pub/xv/ \
${MASTER_SITE_LOCAL} \
@ -25,8 +25,6 @@ DISTFILES= ${DISTNAME}${EXTRACT_SUFX} \
DIST_SUBDIR= ${PORTNAME}
EXTRACT_ONLY= ${DISTFILES:N*patch}
FORBIDDEN= http://vuxml.freebsd.org/fffacc93-16cb-11d9-bc4a-000c41e2cdad.html
PATCH_SITES= ftp://ftp.cis.upenn.edu/pub/xv/ \
ftp://ftp.trilon.com/pub/xv/patches/
# Note: xpm.patch appears to already be in xvdir.c

View File

@ -1,11 +1,28 @@
--- xvimage.c~ Fri Jan 13 18:11:36 1995
+++ xvimage.c Tue Oct 15 16:41:47 1996
@@ -46,6 +46,274 @@
--- xvimage.c
+++ xvimage.c Wed Jan 12 15:10:24 2000
@@ -29,40 +29,302 @@
static void flipSel PARM((int));
static void do_zoom PARM((int, int));
static void compute_zoom_rect PARM((int, int, int*, int*, int*, int*));
static void do_unzoom PARM((void));
static void do_pan PARM((int, int));
static void do_pan_calc PARM((int, int, int *, int *));
static void crop1 PARM((int, int, int, int, int));
static int doAutoCrop24 PARM((void));
static void floydDitherize1 PARM((XImage *, byte *, int, int, int,
byte *, byte *,byte *));
static int highbit PARM((unsigned long));
static int doPadSolid PARM((char *, int, int, int, int));
static int doPadBggen PARM((char *, int, int, int, int));
static int doPadLoad PARM((char *, int, int, int, int));
static int doPadPaste PARM((byte *, int, int, int, int));
static int ReadImageFile1 PARM((char *, PICINFO *));
+/* The following array represents the pixel values for each shade of
+ * the primary color components.
+/* The following array represents the pixel values for each shade
+ * of the primary color components.
+ * If 'p' is a pointer to a source image rgb-byte-triplet, we can
+ * construct the output pixel value simply by 'oring' together
+ * the corresponding components:
@ -20,7 +37,7 @@
+ * This is both efficient and generic, since the only assumption
+ * is that the primary color components have separate bits.
+ * The order and distribution of bits does not matter, and we
+ * don't need additional vaiables and shifting/masking code.
+ * don't need additional variables and shifting/masking code.
+ * The array size is 3 KBytes total and thus very reasonable.
+ */
+
@ -42,21 +59,14 @@
+ * The method is to draw points in a pixmap with the specified shades
+ * of primary colors and then get the corresponding XImage pixel
+ * representation.
+ * Thus we can get away with any Bit-order/Byte-Order dependencies.
+ * Thus we can get away with any Bit-order/Byte-order dependencies.
+ *
+ * The routine uses some global X variables: theDisp, theScreen,
+ * and dispDEEP. Adapt these to your application as necessary.
+ * The routine uses some global X variables:
+ * theDisp, theScreen, dispDEEP, and theCmap.
+ * Adapt these to your application as necessary.
+ * I've not passed them in as parameters, since for other platforms
+ * than X these may be different (see vfixpix.c), and so the
+ * screen_init() interface is unique.
+ *
+ * BUG: I've read in the "Xlib Programming Manual" from O'Reilly &
+ * Associates, that the DefaultColormap in TrueColor might not
+ * provide the full shade representation in XAllocColor.
+ * In this case one had to provide a 'best' colormap instead.
+ * However, my tests with Xaccel on a Linux-Box with a Mach64
+ * card were fully successful, so I leave that potential problem
+ * to you at the moment and would appreciate any suggestions...
+ */
+
+static void screen_init()
@ -73,43 +83,45 @@
+
+ check_map = XCreatePixmap(theDisp, RootWindow(theDisp,theScreen),
+ 1, 1, dispDEEP);
+ check_gc = XCreateGC(theDisp, RootWindow(theDisp,theScreen), 0, NULL);
+ check_gc = XCreateGC(theDisp, check_map, 0, NULL);
+ for (ci = 0; ci < 3; ci++) {
+ for (i = 0; i < 256; i++) {
+ check_col.flags = DoRed | DoGreen | DoBlue;
+ check_col.red = 0;
+ check_col.green = 0;
+ check_col.blue = 0;
+ /* Do proper upscaling from unsigned 8 bit (image data values)
+ to unsigned 16 bit (X color representation). */
+ ((unsigned short *)&check_col.red)[ci] = (unsigned short)((i << 8) | i);
+ if (!XAllocColor(theDisp, DefaultColormap(theDisp,theScreen), &check_col))
+ FatalError("XAllocColor in screen_init() failed"); /* shouldn't happen */
+ if (theVisual->class == TrueColor)
+ XAllocColor(theDisp, theCmap, &check_col);
+ else
+ xvAllocColor(theDisp, theCmap, &check_col);
+ screen_set[ci][i] =
+ (((unsigned short *)&check_col.red)[ci] >> 8) & 0xff;
+ XSetForeground(theDisp, check_gc, check_col.pixel);
+ XDrawPoint(theDisp, check_map, check_gc, 0, 0);
+ check_image = XGetImage(theDisp, check_map, 0, 0, 1, 1,
+ AllPlanes, ZPixmap);
+ if (!check_image) FatalError("XGetImage in screen_init() failed");
+ switch (check_image->bits_per_pixel) {
+ case 8:
+ screen_rgb[ci][i] = *(CARD8 *)check_image->data;
+ break;
+ case 16:
+ screen_rgb[ci][i] = *(CARD16 *)check_image->data;
+ break;
+ case 24:
+ screen_rgb[ci][i] =
+ ((unsigned long)*(CARD8 *)check_image->data << 16) |
+ ((unsigned long)*(CARD8 *)(check_image->data + 1) << 8) |
+ (unsigned long)*(CARD8 *)(check_image->data + 2);
+ break;
+ case 32:
+ screen_rgb[ci][i] = *(CARD32 *)check_image->data;
+ break;
+ if (check_image) {
+ switch (check_image->bits_per_pixel) {
+ case 8:
+ screen_rgb[ci][i] = *(CARD8 *)check_image->data;
+ break;
+ case 16:
+ screen_rgb[ci][i] = *(CARD16 *)check_image->data;
+ break;
+ case 24:
+ screen_rgb[ci][i] =
+ ((unsigned long)*(CARD8 *)check_image->data << 16) |
+ ((unsigned long)*(CARD8 *)(check_image->data + 1) << 8) |
+ (unsigned long)*(CARD8 *)(check_image->data + 2);
+ break;
+ case 32:
+ screen_rgb[ci][i] = *(CARD32 *)check_image->data;
+ break;
+ }
+ XDestroyImage(check_image);
+ }
+ XDestroyImage(check_image);
+ }
+ }
+ XFreeGC(theDisp, check_gc);
@ -156,7 +168,6 @@
+ * current column. (If we are lucky, those variables are in registers, but
+ * even if not, they're probably cheaper to access than array elements are.)
+ *
+ * The fserrors[] array is indexed [component#][position].
+ * We provide (#columns + 2) entries per component; the extra entry at each
+ * end saves us from special-casing the first and last pixels.
+ */
@ -275,7 +286,41 @@
#define DO_CROP 0
#define DO_ZOOM 1
@@ -1883,33 +2151,17 @@
/***********************************/
void Resize(w,h)
int w,h;
{
RANGE(w,1,maxWIDE); RANGE(h,1,maxHIGH);
if (HaveSelection()) DrawSelection(0); /* turn off old rect */
if (psUp) PSResize(); /* if PSDialog is open, mention size change */
/* if same size, and Ximage created, do nothing */
if (w==eWIDE && h==eHIGH && theImage!=NULL) return;
if (DEBUG) fprintf(stderr,"Resize(%d,%d) eSIZE=%d,%d cSIZE=%d,%d\n",
w,h,eWIDE,eHIGH,cWIDE,cHIGH);
@@ -1866,156 +2128,145 @@
if (!xim) FatalError("couldn't create xim!");
imagedata = (byte *) malloc((size_t) (xim->bytes_per_line * high));
if (!imagedata) FatalError("couldn't malloc imagedata");
xim->data = (char *) imagedata;
floydDitherize1(xim, pic24,PIC24, (int) wide, (int) high, NULL,NULL,NULL);
return xim;
}
if (theVisual->class == TrueColor || theVisual->class == DirectColor) {
/************************************************************************/
/* Non-ColorMapped Visuals: TrueColor, DirectColor */
/************************************************************************/
@ -311,7 +356,13 @@
imagedata = (byte *) malloc((size_t) (high * bperline));
if (!imagedata) FatalError("couldn't malloc imagedata");
@@ -1923,82 +2175,87 @@
xim->data = (char *) imagedata;
if (bperpix != 8 && bperpix != 16 && bperpix != 24 && bperpix != 32) {
char buf[128];
sprintf(buf,"Sorry, no code written to handle %d-bit %s",
bperpix, "TrueColor/DirectColor displays!");
FatalError(buf);
}
@ -363,19 +414,6 @@
- *ip++ = (xcol>>8) & 0xff;
- *ip++ = (xcol>>16) & 0xff;
- *ip++ = (xcol>>24) & 0xff;
- }
- }
-
- else if (bperpix == 24) {
- if (border == MSBFirst) {
- *ip++ = (xcol>>16) & 0xff;
- *ip++ = (xcol>>8) & 0xff;
- *ip++ = xcol & 0xff;
- }
- else { /* LSBFirst */
- *ip++ = xcol & 0xff;
- *ip++ = (xcol>>8) & 0xff;
- *ip++ = (xcol>>16) & 0xff;
+#ifdef DO_FIXPIX_SMOOTH
+#if 0
+ /* If we wouldn't have to save the original pic24 image data,
@ -396,7 +434,6 @@
+ * dithering/rendering in a loop using a temporary line buffer.
+ */
+ if (bperpix < 24) {
+ int alldone = 0;
+ FSBUF *fs = fs2_init(wide);
+ if (fs) {
+ byte *row_buf = malloc((size_t)wide * 3);
@ -422,12 +459,25 @@
+ }
+ }
}
+ alldone = 1;
- }
+ free(row_buf);
+ free(fs);
- else if (bperpix == 24) {
- if (border == MSBFirst) {
- *ip++ = (xcol>>16) & 0xff;
- *ip++ = (xcol>>8) & 0xff;
- *ip++ = xcol & 0xff;
- }
- else { /* LSBFirst */
- *ip++ = xcol & 0xff;
- *ip++ = (xcol>>8) & 0xff;
- *ip++ = (xcol>>16) & 0xff;
- }
+ return xim;
}
+ free(fs);
+ }
+ if (alldone) return xim;
+ }
+#endif
+#endif
@ -470,3 +520,20 @@
}
}
}
}
else {
/************************************************************************/
/* CMapped Visuals: PseudoColor, GrayScale, StaticGray, StaticColor... */
/************************************************************************/
byte *pic8;
int bwdith;
/* in all cases, make an 8-bit version of the image, either using
'black' and 'white', or the stdcmap */
bwdith = 0;
if (ncols == 0 && dispDEEP != 1) { /* do 'black' and 'white' dither */

View File

@ -0,0 +1,675 @@
--- xv.c
+++ xv.c 2003-01-27 00:03:36.000000000 +0100
@@ -146,9 +146,7 @@
rmodeset, gamset, cgamset, perfect, owncmap, rwcolor, stdcmap;
int nodecor;
double gamval, rgamval, ggamval, bgamval;
-
-
-
+winRepositionningInfoST winRepositionningInfo = { 0, 0};
/*******************************************/
int main(argc, argv)
@@ -2125,6 +2145,7 @@
/* if the file is STDIN, write it out to a temp file */
if (strcmp(filename,STDINSTR)==0) {
+ int tmpfd;
FILE *fp;
#ifndef VMS
@@ -2135,11 +2156,15 @@
mktemp(filename);
clearerr(stdin);
- fp = fopen(filename,"w");
+ tmpfd = open(filename,O_WRONLY|O_CREAT|O_EXCL,S_IRWUSR);
+ if (tmpfd < 0) FatalError("openPic(): can't create temporary file");
+ fp = fdopen(tmpfd,"w");
if (!fp) FatalError("openPic(): can't write temporary file");
while ( (i=getchar()) != EOF) putc(i,fp);
+ fflush(fp);
fclose(fp);
+ close(tmpfd);
/* and remove it from list, since we can never reload from stdin */
if (strcmp(namelist[0], STDINSTR)==0) deleteFromList(0);
@@ -2672,7 +2697,11 @@
to generate the correct exposes (particularly with 'BitGravity' turned
on */
- if (mainW && !useroot) GenExpose(mainW, 0, 0, (u_int) eWIDE, (u_int) eHIGH);
+ /*Brian T. Schellenberger: fix for X 4.2 refresh problem*/
+ if (mainW && !useroot) {
+ XSync(theDisp, False);
+ GenExpose(mainW, 0, 0, (u_int) eWIDE, (u_int) eHIGH);
+ }
return 1;
@@ -2812,7 +2846,8 @@
#ifdef GS_PATH
else if (strncmp((char *) magicno, "%!", (size_t) 2)==0 ||
- strncmp((char *) magicno, "\004%!", (size_t) 3)==0) rv = RFT_PS;
+ strncmp((char *) magicno, "\004%!", (size_t) 3)==0 ||
+ strncmp((char *) magicno, "%PDF", (size_t) 4)==0) rv = RFT_PS;
#endif
#ifdef HAVE_MAG
@@ -2959,6 +2998,7 @@
returns '0' on failure */
char namez[128], *fname, buf[512];
+ int tmpfd;
fname = name;
namez[0] = '\0';
@@ -3047,15 +3090,18 @@
char *src, *dst;
{
char tmpname[128], buffer[8192]; /* XXX */
- int n, eof;
+ int n, eof, tmpfd;
FILE *sfp, *dfp;
sprintf(dst, "%s/xvmXXXXXX", tmpdir);
mktemp(dst);
+ tmpfd = open(dst,O_WRONLY|O_CREAT|O_EXCL,S_IRWUSR);
+ if (tmpfd < 0) FatalError("RemoveMacbinary(): can't create temporary file");
+
SetISTR(ISTR_INFO, "Removing MacBinary...");
sfp = xv_fopen(src, "r");
- dfp = xv_fopen(dst, "w");
+ dfp = fdopen(tmpfd, "w");
if (!sfp || !dfp) {
SetISTR(ISTR_INFO, "Unable to remove a InfoFile header form '%s'.", src);
Warning();
@@ -3067,7 +3113,9 @@
if (eof = feof(sfp))
fwrite(buffer, 1, n, dfp);
fclose(sfp);
+ fflush(dfp);
fclose(dfp);
+ close(tmpfd);
if (!eof) {
SetISTR(ISTR_INFO, "Unable to remove a InfoFile header form '%s'.", src);
Warning();
@@ -3199,7 +3247,7 @@
*/
char fullcmd[512], tmpname[64], str[512];
- int i;
+ int i, tmpfd;
if (!cmd || (strlen(cmd) < (size_t) 2)) return 1;
@@ -3210,6 +3258,9 @@
ErrPopUp(str, "\nHow unlikely!");
return 1;
}
+ tmpfd = open(tmpname,O_WRONLY|O_CREAT|O_EXCL,S_IRWUSR);
+ if (tmpfd < 0) FatalError("openPic(): can't create temporary file");
+ close(tmpfd);
/* build command */
strcpy(fullcmd, cmd+1); /* skip the leading '!' character in cmd */
--- xv.h
+++ xv.h 2003-01-27 00:03:36.000000000 +0100
@@ -310,7 +294,9 @@
# endif
#endif
-
+#ifndef S_IRWUSR
+# define S_IRWUSR (S_IRUSR|S_IWRITE)
+#endif
#ifndef MAXPATHLEN
# define MAXPATHLEN 256
@@ -813,6 +811,13 @@
#define WHERE
#endif
+/* Needed for repositionning with negative geometries */
+typedef struct {
+ int negativeX;
+ int negativeY;
+} winRepositionningInfoST;
+extern winRepositionningInfoST winRepositionningInfo;
+
typedef unsigned char byte;
typedef struct scrl {
--- xvdir.c
+++ xvdir.c 2003-01-27 00:03:36.000000000 +0100
@@ -80,7 +83,7 @@
"PIC",
#endif /* HAVE_PIC */
#ifdef HAVE_MAKI
- "MAKI",
+ "MAKI (640x400 only)",
#endif /* HAVE_MAKI */
#ifdef HAVE_PI
"PI",
--- xvevent.c
+++ xvevent.c 2003-01-27 00:03:36.000000000 +0100
@@ -64,6 +64,8 @@
static void annotatePic PARM((void));
+static int debkludge_offx;
+static int debkludge_offy;
/****************/
int EventLoop()
@@ -676,6 +694,29 @@
p_offy = xwa.y;
}
+ /* Gather info to keep right border inside */
+ {
+ Window current;
+ Window root_r;
+ Window parent_r;
+ Window *children_r;
+ int nchildren_r;
+ XWindowAttributes xwa;
+
+ parent_r=mainW;
+ current=mainW;
+ do {
+ current=parent_r;
+ XQueryTree(theDisp, current, &root_r, &parent_r,
+ &children_r, &nchildren_r);
+ if (children_r!=NULL) {
+ XFree(children_r);
+ }
+ } while(parent_r!=root_r);
+ XGetWindowAttributes(theDisp, current, &xwa);
+ debkludge_offx=eWIDE-xwa.width+p_offx;
+ debkludge_offy=eHIGH-xwa.height+p_offy;
+ }
/* move window around a bit... */
{
@@ -2078,6 +2127,26 @@
if (xwa->width < dispWIDE && xwc.x < p_offx) xwc.x = p_offx;
if (xwa->height < dispHIGH && xwc.y < p_offy) xwc.y = p_offy;
+ /* Try to keep bottom right decorations inside */
+ if (xwc.x+eWIDE-debkludge_offx>dispWIDE) {
+ xwc.x=dispWIDE-eWIDE+debkludge_offx;
+ if (xwc.x<0) xwc.x=0;
+ }
+ if (xwc.y+eHIGH-debkludge_offy>dispHIGH) {
+ xwc.y=dispHIGH-eHIGH+debkludge_offy;
+ if (xwc.y<0) xwc.y=0;
+ }
+
+ /* In case of negative offset for first image */
+ if (winRepositionningInfo.negativeX) {
+ xwc.x+=winRepositionningInfo.negativeX;
+ winRepositionningInfo.negativeX=0;
+ }
+ if (winRepositionningInfo.negativeY) {
+ xwc.y+=winRepositionningInfo.negativeY;
+ winRepositionningInfo.negativeY=0;
+ }
+
xwc.width = xwa->width;
xwc.height = xwa->height;
--- xvfits.c
+++ xvfits.c 2003-01-27 00:03:36.000000000 +0100
@@ -14,7 +14,7 @@
* provided "as is" without express or implied warranty.
*/
-
+#define NEEDSDIR /* for S_IRUSR|S_IWUSR */
#include "xv.h"
#define NCARDS (36)
@@ -223,7 +223,7 @@
* If there was a problem writing files, then a error message will be set.
*/
- int i, np=nx * ny, ioerror, nwrt;
+ int i, np=nx * ny, ioerror, nwrt, tmpfd;
FILE *fp;
char *error;
byte *work;
@@ -246,7 +246,12 @@
for (i=0; i < nz && !error; i++) {
sprintf(filename, "%s%d", basename, i+1);
- fp = xv_fopen(filename, "w");
+ tmpfd = open(filename,O_WRONLY|O_CREAT|O_EXCL,S_IRWUSR);
+ if (tmpfd < 0) {
+ error = "Unable to open temporary file";
+ break;
+ }
+ fp = fdopen(tmpfd, "w");
if (!fp) {
error = "Unable to open temporary file";
break;
@@ -254,13 +259,17 @@
if (wrheader(fp, nx, ny, comment)) {
error = "I/O error writing temporary file";
+ fflush(fp);
fclose(fp);
+ close(tmpfd);
unlink(filename);
break;
}
nwrt = fwrite(image+i*np, sizeof(byte), (size_t) np, fp);
+ fflush(fp);
fclose(fp);
+ close(tmpfd);
if (nwrt == 0) { /* failed to write any data */
error = "I/O error writing temporary file";
--- xvimage.c
+++ xvimage.c 2003-01-27 00:03:36.000000000 +0100
@@ -21,6 +21,7 @@
* int LoadPad(pinfo, fname);
*/
+#define NEEDSDIR /* for S_IRUSR|S_IWUSR */
#include "copyright.h"
#include "xv.h"
@@ -2927,7 +2930,7 @@
char *str;
int wide, high, opaque,omode;
{
- int i;
+ int i, tmpfd;
byte *bgpic24;
char syscmd[512], fname[128], errstr[512];
PICINFO pinfo;
@@ -2949,6 +2952,13 @@
strcpy(fname, "Sys$Disk:[]xvuXXXXXX");
#endif
mktemp(fname);
+ tmpfd = open(fname, O_WRONLY|O_CREAT|O_EXCL,S_IRWUSR);
+ if (tmpfd < 0) {
+ sprintf(errstr, "Error: can't create temporary file %s", fname);
+ ErrPopUp(errstr, "\nDoh!");
+ return 0;
+ }
+ close(tmpfd);
/* run bggen to generate the background */
sprintf(syscmd, "bggen -g %dx%d %s > %s", wide, high, str, fname);
--- xvmaki.c
+++ xvmaki.c 2003-01-27 00:03:36.000000000 +0100
@@ -355,8 +355,12 @@
return -1;
}
- if(w != 640 || h != 400)
+ if(w != 640 || h != 400) {
+ char str[512];
+ sprintf(str,"MAKI: %s Should be 640x400", maki_msgs[MAKI_SIZE]);
+ ErrPopUp(str, "\nBummer!");
maki_error(mi, MAKI_SIZE);
+ }
maki.fp = fp;
maki.width = w;
@@ -669,6 +673,7 @@
static void maki_init_info(mi)
struct maki_info *mi;
{
+ xvbzero((char *)mi, sizeof(struct maki_info));
mi->fp = NULL;
mi->fsize = 0;
mi->x0 = mi->y0 = mi->x1 = mi->y1 = 0;
--- xvpds.c
+++ xvpds.c 2003-01-27 00:03:36.000000000 +0100
@@ -102,7 +102,7 @@
* This software is provided "as is" without any express or implied warranty.
*/
-
+#define NEEDSDIR /* for S_IRUSR|S_IWUSR */
#include "xv.h"
#ifdef HAVE_PDS
@@ -250,7 +250,7 @@
{
/* returns '1' on success, '0' on failure */
- int tempnum;
+ int tempnum, tmpfd;
FILE *zf;
static int isfixed,teco,i,j,itype,vaxbyte,
recsize,hrecsize,irecsize,isimage,labelrecs,labelsofar,
@@ -690,6 +690,12 @@
#ifndef VMS
sprintf(pdsuncompfname,"%s/xvhuffXXXXXX", tmpdir);
mktemp(pdsuncompfname);
+ tmpfd = open(pdsuncompfname,O_WRONLY|O_CREAT|O_EXCL,S_IRWUSR);
+ if (tmpfd < 0) {
+ SetISTR(ISTR_WARNING,"Unable to create temporarly file.");
+ return 0;
+ }
+ close(tmpfd);
sprintf(scanbuff,"%s %s - 4 >%s",PDSUNCOMP,fname,pdsuncompfname);
#else
strcpy(pdsuncompfname,"sys$disk:[]xvhuffXXXXXX");
--- xvps.c
+++ xvps.c 2003-01-27 00:03:36.000000000 +0100
@@ -1564,7 +1564,7 @@
/* build command string */
#ifndef VMS /* VMS needs quotes around mixed case command lines */
- sprintf(tmp, "%s -sDEVICE=%s -r%d -q -dNOPAUSE -sOutputFile=%s%%d ",
+ sprintf(tmp, "%s -sDEVICE=%s -r%d -q -dSAFER -dNOPAUSE -sOutputFile=%s%%d ",
GS_PATH, gsDev, gsRes, tmpname);
#else
sprintf(tmp,
--- xvtiff.c
+++ xvtiff.c 2003-01-27 00:03:36.000000000 +0100
@@ -5,6 +5,7 @@
* LoadTIFF(fname, numcols, quick) - load a TIFF file
*/
+#define NEEDSDIR /* for S_IRUSR|S_IWUSR */
#ifndef va_start
# define NEEDSARGS
#endif
@@ -56,7 +89,7 @@
return 0;
}
- fseek(fp, 0L, 2);
+ fseek(fp, 0L, SEEK_END);
filesize = ftell(fp);
fclose(fp);
@@ -1065,7 +1308,7 @@
int fromskew, toskew;
{
while (h-- > 0) {
- UNROLL8(w,0, *cp++ = PALmap[*pp++][0]);
+ UNROLL8(w,, *cp++ = PALmap[*pp++][0]);
cp += toskew;
pp += fromskew;
}
@@ -1262,7 +1504,7 @@
}
} else {
while (h-- > 0) {
- UNROLL8(w,0,
+ UNROLL8(w,,
*cp++ = pp[0];
*cp++ = pp[1];
*cp++ = pp[2];
@@ -1335,7 +1577,7 @@
}
} else {
while (h-- > 0) {
- UNROLL8(w,0,
+ UNROLL8(w,,
*cp++ = *r++;
*cp++ = *g++;
*cp++ = *b++;
--- xvtiffwr.c
+++ xvtiffwr.c 2003-01-27 00:03:36.000000000 +0100
@@ -78,6 +78,9 @@
TIFFSetField(tif, TIFFTAG_GROUP3OPTIONS,
GROUP3OPT_2DENCODING+GROUP3OPT_FILLBITS);
+ if (comp == COMPRESSION_LZW)
+ TIFFSetField(tif, TIFFTAG_PREDICTOR, 2);
+
TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 1);
TIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);
--- xvvd.c
+++ xvvd.c 2003-01-27 00:03:36.000000000 +0100
@@ -793,7 +794,7 @@
returns '0' on failure */
char namez[128], *fname, buf[512], tmp[HEADERSIZE];
- int n;
+ int n, tmpfd;
FILE *pfp, *tfp;
fname = name;
@@ -834,10 +835,17 @@
Warning();
return 0;
}
- if ((tfp = fopen(uncompname, "w")) == NULL) {
+ if ((tmpfd = open(uncompname,O_WRONLY|O_CREAT|O_EXCL,S_IRWUSR)) < 0) {
+ SetISTR(ISTR_INFO, "Unable to create temporarly file.",
+ BaseName(uncompname));
+ Warning();
+ pclose(pfp);
+ }
+ if ((tfp = fdopen(tmpfd, "w")) == NULL) {
SetISTR(ISTR_INFO, "Unable to create temporarly file.",
BaseName(uncompname));
Warning();
+ close(tmpfd);
pclose(pfp);
return 0;
}
@@ -846,11 +854,15 @@
BaseName(fname));
Warning();
pclose(pfp);
+ fflush(tfp);
fclose(tfp);
+ close(tmpfd);
return 0;
}
fwrite(tmp, 1, n, tfp);
+ fflush(tfp);
fclose(tfp);
+ close(tmpfd);
pclose(pfp);
/* if we renamed the file to end with a .Z for the sake of 'uncompress',
--- xvxpm.c
+++ xvxpm.c 2003-01-27 00:03:36.000000000 +0100
@@ -77,96 +77,104 @@
hentry *clmp; /* colormap hash-table */
hentry *c_sptr; /* cmap hash-table search pointer*/
XColor col;
-
+
bname = BaseName(fname);
fp = fopen(fname, "r");
if (!fp)
return (XpmLoadError(bname, "couldn't open file"));
-
+
if (DEBUG)
printf("LoadXPM(): Loading xpm from %s\n", fname);
-
+
fseek(fp, 0L, 2);
filesize = ftell(fp);
fseek(fp, 0L, 0);
-
+
bufchar = -2;
in_quote = FALSE;
-
+
/* Read in the values line. It is the first string in the
* xpm, and contains four numbers. w, h, num_colors, and
* chars_per_pixel. */
-
+
/* First, get to the first string */
while (((c = XpmGetc(fp))!=EOF) && (c != '"')) ;
line_pos = 0;
-
+
/* Now, read in the string */
while (((c = XpmGetc(fp))!=EOF) && (line_pos < VALUES_LEN) && (c != '"')) {
values[line_pos++] = c;
}
if (c != '"')
return (XpmLoadError(bname, "error parsing values line"));
-
+
values[line_pos] = '\0';
sscanf(values, "%d%d%d%d", &w, &h, &nc, &cpp);
if (nc <= 0 || cpp <= 0)
return (XpmLoadError(bname, "No colours in Xpm?"));
-
+
if (nc > 256)
pinfo->type = PIC24;
else
pinfo->type = PIC8;
-
+
if (DEBUG)
printf("LoadXPM(): reading a %dx%d image (%d colors)\n", w, h, nc);
-
+
/* We got this far... */
WaitCursor();
-
+
if (!hash_init(nc))
return (XpmLoadError(bname, "Not enough memory to hash colormap"));
-
+
clmp = (hentry *) malloc(nc * sizeof(hentry)); /* Holds the colormap */
if (pinfo->type == PIC8) pic = (byte *) malloc((size_t) (w*h));
else pic = (byte *) malloc((size_t) (w*h*3));
-
+
if (!clmp || !pic)
return (XpmLoadError(bname, "Not enough memory to load pixmap"));
-
+
c_sptr = clmp;
i_sptr = pic;
-
+
/* initialize the 'hex' array for zippy ASCII-hex -> int conversion */
-
+
for (i = 0 ; i < 256 ; i++) hex[i] = 0;
for (i = '0'; i <= '9' ; i++) hex[i] = i - '0';
for (i = 'a'; i <= 'f' ; i++) hex[i] = i - 'a' + 10;
for (i = 'A'; i <= 'F' ; i++) hex[i] = i - 'A' + 10;
-
+
/* Again, we've made progress. */
WaitCursor();
-
+
/* Now, we need to read the colormap. */
pinfo->colType = F_BWDITHER;
for (i = 0 ; i < nc ; i++) {
while (((c = XpmGetc(fp))!=EOF) && (c != '"')) ;
if (c != '"')
return (XpmLoadError(bname, "Error reading colormap"));
-
+
for (j = 0 ; j < cpp ; j++)
c_sptr->token[j] = XpmGetc(fp);
c_sptr->token[j] = '\0';
-
+
while (((c = XpmGetc(fp))!=EOF) && ((c == ' ') || (c == '\t'))) ;
if (c == EOF) /* The failure condition of getc() */
return (XpmLoadError(bname, "Error parsing colormap line"));
-
+
do {
char key[3];
- char color[40]; /* Need to figure a good size for this... */
+ char color[80]; /* Need to figure a good size for this... */
short hd; /* Hex digits per R, G, or B */
-
+
+/*
+ * Problem with spaces in color names
+ *
+ * X s Color Name m Other Name c Last Name
+ *
+ * ... this parser doesn't find `Any Name'
+ */
+
for (j=0; j<2 && (c != ' ') && (c != '\t') && (c != EOF); j++) {
key[j] = c;
c = XpmGetc(fp);
@@ -177,7 +185,7 @@
if (c == EOF) /* The failure condition of getc() */
return (XpmLoadError(bname, "Error parsing colormap line"));
- for (j=0; j<39 && (c!=' ') && (c!='\t') && (c!='"') && c!=EOF; j++) {
+ for (j=0; j<79 && (c!=' ') && (c!='\t') && (c!='"') && c!=EOF; j++) {
color[j] = c;
c = XpmGetc(fp);
}
@@ -236,13 +244,13 @@
else { /* 'None' or unrecognized color spec */
int rgb;
- if (strcmp(color, "None") == 0) rgb = 0xb2c0dc; /* infobg */
+ if (strcasecmp(color, "None") == 0) rgb = 0xb2c0dc; /* infobg */
else {
SetISTR(ISTR_INFO, "%s: unknown color spec '%s'", bname, color);
Timer(1000);
rgb = 0x808080;
}
-
+
if (pinfo->type == PIC8) {
pinfo->r[i] = (rgb>>16) & 0xff;
pinfo->g[i] = (rgb>> 8) & 0xff;
@@ -309,28 +317,29 @@
*i_sptr++ = mapentry->cv_rgb[2];
}
} /* for ( j < w ) */
- (void)XpmGetc(fp); /* Throw away the close " */
-
+ while (((c = XpmGetc(fp))!=EOF) && /* Throw away the close " and */
+ (c != '"')) ; /* erase all remaining pixels */
+
if (!(i%7)) WaitCursor();
} /* for ( i < h ) */
-
+
pinfo->pic = pic;
pinfo->normw = pinfo->w = w;
pinfo->normh = pinfo->h = h;
pinfo->frmType = F_XPM;
if (DEBUG) printf("LoadXPM(): pinfo->colType is %d\n", pinfo->colType);
-
+
sprintf(pinfo->fullInfo, "Xpm v3 Pixmap (%ld bytes)", filesize);
sprintf(pinfo->shrtInfo, "%dx%d Xpm.", w, h);
pinfo->comment = (char *)NULL;
-
+
hash_destroy();
free(clmp);
-
+
if (fp != stdin)
fclose(fp);
-
+
return(1);
}

View File

@ -0,0 +1,195 @@
--- xvbmp.c
+++ xvbmp.c Wed Jul 28 15:16:05 2004
@@ -32,7 +32,7 @@
static int loadBMP1 PARM((FILE *, byte *, u_int, u_int));
static int loadBMP4 PARM((FILE *, byte *, u_int, u_int, u_int));
static int loadBMP8 PARM((FILE *, byte *, u_int, u_int, u_int));
-static int loadBMP24 PARM((FILE *, byte *, u_int, u_int));
+static int loadBMP24 PARM((FILE *, byte *, u_int, u_int, u_int));
static u_int getshort PARM((FILE *));
static u_int getint PARM((FILE *));
static void putshort PARM((FILE *, int));
@@ -127,7 +127,8 @@
/* error checking */
- if ((biBitCount!=1 && biBitCount!=4 && biBitCount!=8 && biBitCount!=24) ||
+ if ((biBitCount!=1 && biBitCount!=4 && biBitCount!=8 &&
+ biBitCount!=24 && biBitCount!=32) ||
biPlanes!=1 || biCompression>BI_RLE4) {
sprintf(buf,"Bogus BMP File! (bitCount=%d, Planes=%d, Compression=%d)",
@@ -137,7 +138,8 @@
goto ERROR;
}
- if (((biBitCount==1 || biBitCount==24) && biCompression != BI_RGB) ||
+ if (((biBitCount==1 || biBitCount==24 || biBitCount==32)
+ && biCompression != BI_RGB) ||
(biBitCount==4 && biCompression==BI_RLE8) ||
(biBitCount==8 && biCompression==BI_RLE4)) {
@@ -159,7 +161,7 @@
}
/* load up colormap, if any */
- if (biBitCount!=24) {
+ if (biBitCount!=24 && biBitCount!=32) {
int i, cmaplen;
cmaplen = (biClrUsed) ? biClrUsed : 1 << biBitCount;
@@ -197,7 +199,7 @@
/* create pic8 or pic24 */
- if (biBitCount==24) {
+ if (biBitCount==24 || biBitCount==32) {
pic24 = (byte *) calloc((size_t) biWidth * biHeight * 3, (size_t) 1);
if (!pic24) return (bmpError(bname, "couldn't malloc 'pic24'"));
}
@@ -212,16 +214,18 @@
if (biBitCount == 1) rv = loadBMP1(fp,pic8,biWidth,biHeight);
else if (biBitCount == 4) rv = loadBMP4(fp,pic8,biWidth,biHeight,
biCompression);
- else if (biBitCount == 8) rv = loadBMP8(fp,pic8,biWidth,biHeight,
+ else if (biBitCount == 8) rv = loadBMP8(fp,pic8,biWidth,biHeight,
biCompression);
- else rv = loadBMP24(fp,pic24,biWidth,biHeight);
+ else rv = loadBMP24(fp,pic24,biWidth,biHeight,
+ biBitCount);
+
if (rv) bmpError(bname, "File appears truncated. Winging it.\n");
fclose(fp);
- if (biBitCount == 24) {
+ if (biBitCount == 24 || biBitCount == 32) {
pinfo->pic = pic24;
pinfo->type = PIC24;
}
@@ -264,12 +268,13 @@
u_int w,h;
{
int i,j,c,bitnum,padw;
- byte *pp;
+ byte *pp = pic8 + ((h - 1) * w);
+ size_t l = w*h;
c = 0;
padw = ((w + 31)/32) * 32; /* 'w', padded to be a multiple of 32 */
- for (i=h-1; i>=0; i--) {
+ for (i=h-1; i>=0 && (pp - pic8 <= l); i--) {
pp = pic8 + (i * w);
if ((i&0x3f)==0) WaitCursor();
for (j=bitnum=0; j<padw; j++,bitnum++) {
@@ -298,8 +303,8 @@
u_int w,h,comp;
{
int i,j,c,c1,x,y,nybnum,padw,rv;
- byte *pp;
-
+ byte *pp = pic8 + ((h - 1) * w);
+ size_t l = w*h;
rv = 0;
c = c1 = 0;
@@ -307,7 +312,7 @@
if (comp == BI_RGB) { /* read uncompressed data */
padw = ((w + 7)/8) * 8; /* 'w' padded to a multiple of 8pix (32 bits) */
- for (i=h-1; i>=0; i--) {
+ for (i=h-1; i>=0 && (pp - pic8 <= l); i--) {
pp = pic8 + (i * w);
if ((i&0x3f)==0) WaitCursor();
@@ -335,7 +340,7 @@
if (c) { /* encoded mode */
c1 = getc(fp);
- for (i=0; i<c; i++,x++,pp++)
+ for (i=0; i<c && (pp - pic8 <= l); i++,x++,pp++)
*pp = (i&1) ? (c1 & 0x0f) : ((c1>>4)&0x0f);
}
@@ -355,7 +360,7 @@
}
else { /* absolute mode */
- for (i=0; i<c; i++, x++, pp++) {
+ for (i=0; i<c && (pp - pic8 <= l); i++, x++, pp++) {
if ((i&1) == 0) c1 = getc(fp);
*pp = (i&1) ? (c1 & 0x0f) : ((c1>>4)&0x0f);
}
@@ -384,14 +389,15 @@
u_int w,h,comp;
{
int i,j,c,c1,padw,x,y,rv;
- byte *pp;
+ byte *pp = pic8 + ((h - 1) * w);
+ size_t l = w*h;
rv = 0;
if (comp == BI_RGB) { /* read uncompressed data */
padw = ((w + 3)/4) * 4; /* 'w' padded to a multiple of 4pix (32 bits) */
- for (i=h-1; i>=0; i--) {
+ for (i=h-1; i>=0 && (pp - pic8 <= l); i--) {
pp = pic8 + (i * w);
if ((i&0x3f)==0) WaitCursor();
@@ -412,7 +418,7 @@
if (c) { /* encoded mode */
c1 = getc(fp);
- for (i=0; i<c; i++,x++,pp++) *pp = c1;
+ for (i=0; i<c && (pp - pic8 <= l); i++,x++,pp++) *pp = c1;
}
else { /* c==0x00 : escape codes */
@@ -431,7 +437,7 @@
}
else { /* absolute mode */
- for (i=0; i<c; i++, x++, pp++) {
+ for (i=0; i<c && (pp - pic8 <= l); i++, x++, pp++) {
c1 = getc(fp);
*pp = c1;
}
@@ -454,19 +460,21 @@
/*******************************************/
-static int loadBMP24(fp, pic24, w, h)
+static int loadBMP24(fp, pic24, w, h, bits)
FILE *fp;
byte *pic24;
- u_int w,h;
+ u_int w,h, bits;
{
int i,j,padb,rv;
- byte *pp;
+ byte *pp = pic24 + ((h - 1) * w * 3);
+ size_t l = w*h*3;
rv = 0;
padb = (4 - ((w*3) % 4)) & 0x03; /* # of pad bytes to read at EOscanline */
+ if (bits==32) padb = 0;
- for (i=h-1; i>=0; i--) {
+ for (i=h-1; i>=0 && (pp - pic24 <= l); i--) {
pp = pic24 + (i * w * 3);
if ((i&0x3f)==0) WaitCursor();
@@ -474,6 +482,7 @@
pp[2] = getc(fp); /* blue */
pp[1] = getc(fp); /* green */
pp[0] = getc(fp); /* red */
+ if (bits==32) getc(fp);
pp += 3;
}

View File

@ -0,0 +1,138 @@
--- xvbmp.c
+++ xvbmp.c Tue Aug 24 12:42:52 2004
@@ -129,7 +129,9 @@
/* error checking */
if ((biBitCount!=1 && biBitCount!=4 && biBitCount!=8 &&
biBitCount!=24 && biBitCount!=32) ||
- biPlanes!=1 || biCompression>BI_RLE4) {
+ biPlanes!=1 || biCompression>BI_RLE4 ||
+ biWidth<= 0 || biHeight <= 0 ||
+ (biClrUsed && biClrUsed > (1 << biBitCount))) {
sprintf(buf,"Bogus BMP File! (bitCount=%d, Planes=%d, Compression=%d)",
biBitCount, biPlanes, biCompression);
@@ -159,6 +161,9 @@
bPad = bfOffBits - (biSize + 14);
}
+
+ if (biClrUsed > (1 << biBitCount))
+ biClrUsed = (1 << biBitCount);
/* load up colormap, if any */
if (biBitCount!=24 && biBitCount!=32) {
--- xviris.c
+++ xviris.c Tue Aug 24 13:01:42 2004
@@ -267,6 +267,12 @@
rlebuflen = 2 * xsize + 10;
tablen = ysize * zsize;
+
+ if (rlebuflen <= 0 || tablen <= 0 || (tablen * sizeof(long)) < 0) {
+ loaderr = "Bogus IRIS File!";
+ return (byte *)NULL;
+ }
+
starttab = (u_long *) malloc((size_t) tablen * sizeof(long));
lengthtab = (u_long *) malloc((size_t) tablen * sizeof(long));
rledat = (byte *) malloc((size_t) rlebuflen);
--- xvpcx.c
+++ xvpcx.c Tue Aug 24 13:12:15 2004
@@ -222,7 +222,14 @@
byte *image;
/* note: overallocation to make life easier... */
- image = (byte *) malloc((size_t) (pinfo->h + 1) * pinfo->w + 16);
+ int count = (pinfo->h + 1) * pinfo->w + 16;
+
+ if (count <= 0 || pinfo->h <= 0 || pinfo->w <= 0) {
+ pcxError(fname, "Bogus PCX file!!");
+ return (0);
+ }
+
+ image = (byte *) malloc((size_t) count);
if (!image) FatalError("Can't alloc 'image' in pcxLoadImage8()");
xvbzero((char *) image, (size_t) ((pinfo->h+1) * pinfo->w + 16));
@@ -250,17 +257,25 @@
{
byte *pix, *pic24, scale[256];
int c, i, j, w, h, maxv, cnt, planes, bperlin, nbytes;
+ int count;
w = pinfo->w; h = pinfo->h;
planes = (int) hdr[PCX_PLANES];
bperlin = hdr[PCX_BPRL] + ((int) hdr[PCX_BPRH]<<8);
+ count = w*h*planes;
+
+ if (count <= 0 || planes <= 0 || w <= 0 || h <= 0) {
+ pcxError(fname, "Bogus PCX file!!");
+ return (0);
+ }
+
/* allocate 24-bit image */
- pic24 = (byte *) malloc((size_t) w*h*planes);
+ pic24 = (byte *) malloc((size_t) count);
if (!pic24) FatalError("couldn't malloc 'pic24'");
- xvbzero((char *) pic24, (size_t) w*h*planes);
+ xvbzero((char *) pic24, (size_t) count);
maxv = 0;
pix = pinfo->pic = pic24;
@@ -268,6 +283,12 @@
j = 0; /* bytes per line, in this while loop */
nbytes = bperlin*h*planes;
+ if (nbytes < 0) {
+ pcxError(fname, "Bogus PCX file!!");
+ free(pic24);
+ return (0);
+ }
+
while (nbytes > 0 && (c = getc(fp)) != EOF) {
if ((c & 0xC0) == 0xC0) { /* have a rep. count */
cnt = c & 0x3F;
--- xvpm.c
+++ xvpm.c Tue Aug 24 13:16:43 2004
@@ -119,6 +119,9 @@
isize = pm_isize(&thePic);
+ if (isize <= 0)
+ return pmError(bname, "Bogus PM file!!");
+
if (DEBUG)
fprintf(stderr,"%s: LoadPM() - loading a %dx%d %s pic, %d planes\n",
cmd, w, h, (thePic.pm_form==PM_I) ? "PM_I" : "PM_C",
@@ -135,6 +138,8 @@
return( pmError(bname, "file read error") );
}
+ if (thePic.pm_cmtsize+1 <= 0)
+ return pmError(bname, "Bogus PM file!!");
/* alloc and read in comment, if any */
if (thePic.pm_cmtsize>0) {
@@ -155,6 +160,9 @@
int *intptr;
byte *pic24, *picptr;
+ if (w <= 0 || h <= 0 || w*h*3 <= 0)
+ return pmError(bname, "Bogus PM file!!");
+
if ((pic24 = (byte *) malloc((size_t) w*h*3))==NULL) {
if (thePic.pm_cmt) free(thePic.pm_cmt);
return( pmError(bname, "unable to malloc 24-bit picture") );
@@ -189,6 +197,9 @@
else if (thePic.pm_form == PM_C && thePic.pm_np>1) {
byte *pic24, *picptr, *rptr, *gptr, *bptr;
+
+ if (w <= 0 || h <= 0 || w*h*3 <= 0)
+ return pmError(bname, "Bogus PM file!!");
if ((pic24 = (byte *) malloc((size_t) w*h*3))==NULL) {
if (thePic.pm_cmt) free(thePic.pm_cmt);