freebsd-ports/graphics/xv/files/patch-suse-2003-01-27
Dirk Meyer f3d70b63ab - import securitry patches
- update FixPix4xv.patch
PR:		72382
Approved by:	portmgr (linimon) and shige
Obtained from:	SuSe
2004-10-11 04:03:13 +00:00

675 lines
17 KiB
Text

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