Add some sanity checking in XV. Patches from Marcus Meissner

adapted by rohee@ by way of millert@

while here, adapt patches to regular naming scheme
This commit is contained in:
sturm 2004-09-21 18:46:03 +00:00
parent 7982d4d3e5
commit 06cb6c48c0
26 changed files with 923 additions and 949 deletions

View File

@ -1,6 +1,6 @@
--- Imakefile.orig Fri Jan 13 12:24:01 1995
+++ Imakefile Sat Aug 22 21:40:57 1998
@@ -6,13 +6,22 @@
--- Imakefile.orig Fri Jan 13 21:24:01 1995
+++ Imakefile Tue Sep 21 06:50:27 2004
@@ -6,15 +6,24 @@
/* if, for whatever reason, you're unable to get the JPEG library to compile
* on your machine, *COMMENT OUT* the following line
*/
@ -15,17 +15,19 @@
-#define HaveTiff
+/* #define HaveTiff */
+#define UseInstalledTiff
+
+
+/* if, for whatever reason, you're unable to get the NNG library to compile
+ * on your machine, *COMMENT OUT* the following line
+ */
+/* #define HavePng */
+#define UseInstalledPng
+
+
/* if, for whatever reason, you're unable to get the PDS/VICAR support
@@ -119,16 +128,44 @@
* to compile (xvpds.c, and vdcomp.c), *COMMENT OUT* the following line
*/
@@ -119,16 +128,44 @@ SGI = -Dsgi
JPEG = -DDOJPEG
JPEGDIR = jpeg
LIBJPEG = $(JPEGDIR)/libjpeg.a
@ -70,7 +72,7 @@
#ifdef HavePDS
PDS = -DDOPDS
#endif
@@ -138,18 +175,18 @@
@@ -138,18 +175,18 @@ PDS = -DDOPDS
SCO= -Dsco -DPOSIX -DNO_RANDOM
SYS_LIBRARIES= -lm -lc -lx
#else
@ -94,7 +96,7 @@
SRCS1 = xv.c xvevent.c xvroot.c xvmisc.c xvimage.c xvcolor.c xvsmooth.c \
xv24to8.c xvgif.c xvpm.c xvinfo.c xvctrl.c xvscrl.c xvalg.c \
@@ -157,7 +194,7 @@
@@ -157,7 +194,7 @@ SRCS1 = xv.c xvevent.c xvroot.c xvmisc.c
xvdial.c xvgraf.c xvsunras.c xvjpeg.c xvps.c xvpopup.c xvdflt.c \
xvtiff.c xvtiffwr.c xvpds.c xvrle.c xviris.c xvgrab.c vprintf.c \
xvbrowse.c xvtext.c xvpcx.c xviff.c xvtarga.c xvxpm.c xvcut.c \
@ -103,7 +105,7 @@
OBJS1 = xv.o xvevent.o xvroot.o xvmisc.o xvimage.o xvcolor.o xvsmooth.o \
xv24to8.o xvgif.o xvpm.o xvinfo.o xvctrl.o xvscrl.o xvalg.o \
@@ -165,7 +202,7 @@
@@ -165,7 +202,7 @@ OBJS1 = xv.o xvevent.o xvroot.o xvmisc.o
xvdial.o xvgraf.o xvsunras.o xvjpeg.o xvps.o xvpopup.o xvdflt.o \
xvtiff.o xvtiffwr.o xvpds.o xvrle.o xviris.o xvgrab.o vprintf.o \
xvbrowse.o xvtext.o xvpcx.o xviff.o xvtarga.o xvxpm.o xvcut.o \
@ -112,7 +114,7 @@
SRCS2= bggen.c
OBJS2= bggen.o
@@ -233,6 +270,18 @@
@@ -233,7 +270,19 @@ clean::
#endif
@ -126,12 +128,13 @@
+ ( cd $(PNGDIR) ; $(MAKE) clean )
+ @echo ""
+#endif
+
+
+
+
SRCS = $(SRCS1) $(SRCS2) $(SRCS3) $(SRCS4)
@@ -268,5 +317,5 @@
AllTarget($(PROGRAMS))
@@ -268,5 +317,5 @@ InstallManPageLong(docs/vdcomp,$(MANDIR)
tar:
tar cf xv.tar Makefile* Imakefile *.c *.h bits docs \

View File

@ -1,80 +0,0 @@
*** vdcomp.c.orig Thu Dec 22 14:34:47 1994
--- vdcomp.c Sat Jan 31 22:54:41 1998
***************
*** 108,114 ****
!defined(bsd43) && \
!defined(aux) && \
!defined(__bsdi__) && \
! !defined(sequent)
# if defined(hp300) || defined(hp800) || defined(NeXT)
# include <sys/malloc.h> /* it's in 'sys' on HPs and NeXT */
--- 108,116 ----
!defined(bsd43) && \
!defined(aux) && \
!defined(__bsdi__) && \
! !defined(sequent) && \
! !defined(__FreeBSD__) && \
! !defined(__OpenBSD__)
# if defined(hp300) || defined(hp800) || defined(NeXT)
# include <sys/malloc.h> /* it's in 'sys' on HPs and NeXT */
***************
*** 429,438 ****
{
short shortint;
typedef long off_t;
if (inname[0] == ' ') {
printf("\nEnter name of file to be decompressed: ");
! gets (inname);
}
if (host == 1 | host == 2) {
--- 431,443 ----
{
short shortint;
typedef long off_t;
+ char *s;
if (inname[0] == ' ') {
printf("\nEnter name of file to be decompressed: ");
! fgets (inname, sizeof(inname), stdin);
! if ((s = strchr(inname, '\n')) != NULL)
! *s = '\0';
}
if (host == 1 | host == 2) {
***************
*** 474,486 ****
printf("\n 3. VICAR format.");
printf("\n 4. Unlabelled binary array.\n");
printf("\n Enter format number:");
! gets(inname);
output_format = atoi(inname);
} while (output_format < 1 || output_format > 4);
if (outname[0] == ' ') {
printf("\nEnter name of uncompressed output file: ");
! gets (outname);
}
return(host);
--- 479,495 ----
printf("\n 3. VICAR format.");
printf("\n 4. Unlabelled binary array.\n");
printf("\n Enter format number:");
! fgets (inname, sizeof(inname), stdin);
! if ((s = strchr(inname, '\n')) != NULL)
! *s = '\0';
output_format = atoi(inname);
} while (output_format < 1 || output_format > 4);
if (outname[0] == ' ') {
printf("\nEnter name of uncompressed output file: ");
! fgets (outname, sizeof(outname), stdin);
! if ((s = strchr(outname, '\n')) != NULL)
! *s = '\0';
}
return(host);

View File

@ -1,521 +0,0 @@
*** xvimage.c.orig Fri Jan 13 19:11:36 1995
--- xvimage.c Sat Apr 25 20:09:26 1998
***************
*** 46,51 ****
--- 46,319 ----
static int ReadImageFile1 PARM((char *, PICINFO *));
+ /* 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:
+ *
+ * unsigned char *p;
+ * unsigned long pixval;
+ *
+ * pixval = screen_rgb[0][*p++];
+ * pixval |= screen_rgb[1][*p++];
+ * pixval |= screen_rgb[2][*p++];
+ *
+ * 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.
+ * The array size is 3 KBytes total and thus very reasonable.
+ */
+
+ static unsigned long screen_rgb[3][256];
+
+ /* The following array holds the exact color representations
+ * reported by the system.
+ * This is useful for less than 24 bit deep displays as a base
+ * for additional dithering to get smoother output.
+ */
+
+ static byte screen_set[3][256];
+
+ /* The following routine initializes the screen_rgb and screen_set
+ * arrays.
+ * Since it is executed only once per program run, it does not need
+ * to be super-efficient.
+ *
+ * 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.
+ *
+ * The routine uses some global X variables: theDisp, theScreen,
+ * and dispDEEP. 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()
+ {
+ static int init_flag; /* assume auto-init as 0 */
+ Pixmap check_map;
+ GC check_gc;
+ XColor check_col;
+ XImage *check_image;
+ int ci, i;
+
+ if (init_flag) return;
+ init_flag = 1;
+
+ check_map = XCreatePixmap(theDisp, RootWindow(theDisp,theScreen),
+ 1, 1, dispDEEP);
+ check_gc = XCreateGC(theDisp, RootWindow(theDisp,theScreen), 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 */
+ 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;
+ }
+ XDestroyImage(check_image);
+ }
+ }
+ XFreeGC(theDisp, check_gc);
+ XFreePixmap(theDisp, check_map);
+ }
+
+
+ /* The following switch should better be provided at runtime for
+ * comparison purposes.
+ * At the moment it's only compile time, unfortunately.
+ * Who can make adaptions for use as a runtime switch by a menu option?
+ */
+
+ #define DO_FIXPIX_SMOOTH
+
+ #ifdef DO_FIXPIX_SMOOTH
+
+ /* The following code is based in part on:
+ *
+ * jquant1.c
+ *
+ * Copyright (C) 1991-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains 1-pass color quantization (color mapping) routines.
+ * These routines provide mapping to a fixed color map using equally spaced
+ * color values. Optional Floyd-Steinberg or ordered dithering is available.
+ */
+
+ /* Declarations for Floyd-Steinberg dithering.
+ *
+ * Errors are accumulated into the array fserrors[], at a resolution of
+ * 1/16th of a pixel count. The error at a given pixel is propagated
+ * to its not-yet-processed neighbors using the standard F-S fractions,
+ * ... (here) 7/16
+ * 3/16 5/16 1/16
+ * We work left-to-right on even rows, right-to-left on odd rows.
+ *
+ * We can get away with a single array (holding one row's worth of errors)
+ * by using it to store the current row's errors at pixel columns not yet
+ * processed, but the next row's errors at columns already processed. We
+ * need only a few extra variables to hold the errors immediately around the
+ * 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.
+ */
+
+ typedef INT16 FSERROR; /* 16 bits should be enough */
+ typedef int LOCFSERROR; /* use 'int' for calculation temps */
+
+ typedef struct { byte *colorset;
+ FSERROR *fserrors;
+ } FSBUF;
+
+ /* Floyd-Steinberg initialization function.
+ *
+ * It is called 'fs2_init' since it's specialized for our purpose and
+ * could be embedded in a more general FS-package.
+ *
+ * Returns a malloced FSBUF pointer which has to be passed as first
+ * parameter to subsequent 'fs2_dither' calls.
+ * The FSBUF structure does not need to be referenced by the calling
+ * application, it can be treated from the app like a void pointer.
+ *
+ * The current implementation does only require to free() this returned
+ * pointer after processing.
+ *
+ * Returns NULL if malloc fails.
+ *
+ * NOTE: The FSBUF structure is designed to allow the 'fs2_dither'
+ * function to work with an *arbitrary* number of color components
+ * at runtime! This is an enhancement over the IJG code base :-).
+ * Only fs2_init() specifies the (maximum) number of components.
+ */
+
+ static FSBUF *fs2_init(width)
+ int width;
+ {
+ FSBUF *fs;
+ FSERROR *p;
+
+ fs = (FSBUF *)
+ malloc(sizeof(FSBUF) * 3 + ((size_t)width + 2) * sizeof(FSERROR) * 3);
+ if (fs == 0) return fs;
+
+ fs[0].colorset = screen_set[0];
+ fs[1].colorset = screen_set[1];
+ fs[2].colorset = screen_set[2];
+
+ p = (FSERROR *)(fs + 3);
+ memset(p, 0, ((size_t)width + 2) * sizeof(FSERROR) * 3);
+
+ fs[0].fserrors = p;
+ fs[1].fserrors = p + 1;
+ fs[2].fserrors = p + 2;
+
+ return fs;
+ }
+
+ /* Floyd-Steinberg dithering function.
+ *
+ * NOTE:
+ * (1) The image data referenced by 'ptr' is *overwritten* (input *and*
+ * output) to allow more efficient implementation.
+ * (2) Alternate FS dithering is provided by the sign of 'nc'. Pass in
+ * a negative value for right-to-left processing. The return value
+ * provides the right-signed value for subsequent calls!
+ * (3) This particular implementation assumes *no* padding between lines!
+ * Adapt this if necessary.
+ */
+
+ static int fs2_dither(fs, ptr, nc, num_rows, num_cols)
+ FSBUF *fs;
+ byte *ptr;
+ int nc, num_rows, num_cols;
+ {
+ int abs_nc, ci, row, col;
+ LOCFSERROR delta, cur, belowerr, bpreverr;
+ byte *dataptr, *colsetptr;
+ FSERROR *errorptr;
+
+ if ((abs_nc = nc) < 0) abs_nc = -abs_nc;
+ for (row = 0; row < num_rows; row++) {
+ for (ci = 0; ci < abs_nc; ci++, ptr++) {
+ dataptr = ptr;
+ colsetptr = fs[ci].colorset;
+ errorptr = fs[ci].fserrors;
+ if (nc < 0) {
+ dataptr += (num_cols - 1) * abs_nc;
+ errorptr += (num_cols + 1) * abs_nc;
+ }
+ cur = belowerr = bpreverr = 0;
+ for (col = 0; col < num_cols; col++) {
+ cur += errorptr[nc];
+ cur += 8; cur >>= 4;
+ if ((cur += *dataptr) < 0) cur = 0;
+ else if (cur > 255) cur = 255;
+ *dataptr = cur & 0xff;
+ cur -= colsetptr[cur];
+ delta = cur << 1; cur += delta;
+ bpreverr += cur; cur += delta;
+ belowerr += cur; cur += delta;
+ errorptr[0] = (FSERROR)bpreverr;
+ bpreverr = belowerr;
+ belowerr = delta >> 1;
+ dataptr += nc;
+ errorptr += nc;
+ }
+ errorptr[0] = (FSERROR)bpreverr;
+ }
+ ptr += (num_cols - 1) * abs_nc;
+ nc = -nc;
+ }
+ return nc;
+ }
+
+ #endif /* DO_FIXPIX_SMOOTH */
+
#define DO_CROP 0
#define DO_ZOOM 1
***************
*** 1883,1915 ****
/* Non-ColorMapped Visuals: TrueColor, DirectColor */
/************************************************************************/
! unsigned long r, g, b, rmask, gmask, bmask, xcol;
! int rshift, gshift, bshift, bperpix, bperline, border, cshift;
! int maplen;
byte *imagedata, *lip, *ip, *pp;
- /* compute various shifting constants that we'll need... */
-
- rmask = theVisual->red_mask;
- gmask = theVisual->green_mask;
- bmask = theVisual->blue_mask;
-
- rshift = 7 - highbit(rmask);
- gshift = 7 - highbit(gmask);
- bshift = 7 - highbit(bmask);
-
- maplen = theVisual->map_entries;
- if (maplen>256) maplen=256;
- cshift = 7 - highbit((u_long) (maplen-1));
-
xim = XCreateImage(theDisp, theVisual, dispDEEP, ZPixmap, 0, NULL,
wide, high, 32, 0);
if (!xim) FatalError("couldn't create X image!");
bperline = xim->bytes_per_line;
bperpix = xim->bits_per_pixel;
- border = xim->byte_order;
imagedata = (byte *) malloc((size_t) (high * bperline));
if (!imagedata) FatalError("couldn't malloc imagedata");
--- 2151,2167 ----
/* Non-ColorMapped Visuals: TrueColor, DirectColor */
/************************************************************************/
! unsigned long xcol;
! int bperpix, bperline;
byte *imagedata, *lip, *ip, *pp;
xim = XCreateImage(theDisp, theVisual, dispDEEP, ZPixmap, 0, NULL,
wide, high, 32, 0);
if (!xim) FatalError("couldn't create X image!");
bperline = xim->bytes_per_line;
bperpix = xim->bits_per_pixel;
imagedata = (byte *) malloc((size_t) (high * bperline));
if (!imagedata) FatalError("couldn't malloc imagedata");
***************
*** 1923,2004 ****
FatalError(buf);
}
! lip = imagedata; pp = pic24;
! for (i=0; i<high; i++, lip+=bperline) {
! for (j=0, ip=lip; j<wide; j++) {
! r = *pp++; g = *pp++; b = *pp++;
!
! /* shift r,g,b so that high bit of 8-bit color specification is
! * aligned with high bit of r,g,b-mask in visual,
! * AND each component with its mask,
! * and OR the three components together
! */
!
! if (theVisual->class == DirectColor) {
! r = (u_long) directConv[(r>>cshift) & 0xff] << cshift;
! g = (u_long) directConv[(g>>cshift) & 0xff] << cshift;
! b = (u_long) directConv[(b>>cshift) & 0xff] << cshift;
! }
!
!
! /* shift the bits around */
! if (rshift<0) r = r << (-rshift);
! else r = r >> rshift;
!
! if (gshift<0) g = g << (-gshift);
! else g = g >> gshift;
!
! if (bshift<0) b = b << (-bshift);
! else b = b >> bshift;
!
! r = r & rmask;
! g = g & gmask;
! b = b & bmask;
!
! xcol = r | g | b;
!
! if (bperpix == 32) {
! if (border == MSBFirst) {
! *ip++ = (xcol>>24) & 0xff;
! *ip++ = (xcol>>16) & 0xff;
! *ip++ = (xcol>>8) & 0xff;
! *ip++ = xcol & 0xff;
! }
! else { /* LSBFirst */
! *ip++ = xcol & 0xff;
! *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;
}
}
! else if (bperpix == 16) {
! if (border == MSBFirst) {
! *ip++ = (xcol>>8) & 0xff;
! *ip++ = xcol & 0xff;
! }
! else { /* LSBFirst */
! *ip++ = xcol & 0xff;
! *ip++ = (xcol>>8) & 0xff;
! }
! }
! else if (bperpix == 8) {
! *ip++ = xcol & 0xff;
}
}
}
--- 2175,2261 ----
FatalError(buf);
}
+ screen_init();
! #ifdef DO_FIXPIX_SMOOTH
! #if 0
! /* If we wouldn't have to save the original pic24 image data,
! * the following code would do the dither job by overwriting
! * the image data, and the normal render code would then work
! * without any change on that data.
! * Unfortunately, this approach would hurt the xv assumptions...
! */
! if (bperpix < 24) {
! FSBUF *fs = fs2_init(wide);
! if (fs) {
! fs2_dither(fs, pic24, 3, high, wide);
! free(fs);
! }
! }
! #else
! /* ...so we have to take a different approach with linewise
! * 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);
! if (row_buf) {
! int nc = 3;
! byte *picp = pic24; lip = imagedata;
! for (i=0; i<high; i++, lip+=bperline, picp+=(size_t)wide*3) {
! memcpy(row_buf, picp, (size_t)wide * 3);
! nc = fs2_dither(fs, row_buf, nc, 1, wide);
! for (j=0, ip=lip, pp=row_buf; j<wide; j++) {
!
! xcol = screen_rgb[0][*pp++];
! xcol |= screen_rgb[1][*pp++];
! xcol |= screen_rgb[2][*pp++];
!
! switch (bperpix) {
! case 8:
! *ip++ = xcol & 0xff;
! break;
! case 16:
! *((CARD16 *)ip)++ = (CARD16)xcol;
! break;
! }
! }
}
+ alldone = 1;
+ free(row_buf);
}
+ free(fs);
+ }
+ if (alldone) return xim;
+ }
+ #endif
+ #endif
! lip = imagedata; pp = pic24;
! for (i=0; i<high; i++, lip+=bperline) {
! for (j=0, ip=lip; j<wide; j++) {
! xcol = screen_rgb[0][*pp++];
! xcol |= screen_rgb[1][*pp++];
! xcol |= screen_rgb[2][*pp++];
!
! switch (bperpix) {
! case 8:
! *ip++ = xcol & 0xff;
! break;
! case 16:
! *((CARD16 *)ip)++ = (CARD16)xcol;
! break;
! case 24:
! *ip++ = (xcol >> 16) & 0xff;
! *ip++ = (xcol >> 8) & 0xff;
! *ip++ = xcol & 0xff;
! break;
! case 32:
! *((CARD32 *)ip)++ = (CARD32)xcol;
! break;
}
}
}
***************
*** 2697,2703 ****
#else
strcpy(fname, "Sys$Disk:[]xvuXXXXXX");
#endif
! mktemp(fname);
/* run bggen to generate the background */
sprintf(syscmd, "bggen -g %dx%d %s > %s", wide, high, str, fname);
--- 2954,2960 ----
#else
strcpy(fname, "Sys$Disk:[]xvuXXXXXX");
#endif
! close(mkstemp(fname));
/* run bggen to generate the background */
sprintf(syscmd, "bggen -g %dx%d %s > %s", wide, high, str, fname);

View File

@ -1,146 +0,0 @@
*** xv.c.orig Sat Apr 25 20:01:14 1998
--- xv.c Sat Apr 25 20:07:30 1998
***************
*** 1990,1999 ****
#else /* it is VMS */
sprintf(filename, "[]xvXXXXXX");
#endif
! mktemp(filename);
clearerr(stdin);
- fp = fopen(filename,"w");
if (!fp) FatalError("openPic(): can't write temporary file");
while ( (i=getchar()) != EOF) putc(i,fp);
--- 1990,1998 ----
#else /* it is VMS */
sprintf(filename, "[]xvXXXXXX");
#endif
! fp = fdopen(mkstemp(filename), "w");
clearerr(stdin);
if (!fp) FatalError("openPic(): can't write temporary file");
while ( (i=getchar()) != EOF) putc(i,fp);
***************
*** 2755,2761 ****
#ifndef VMS
sprintf(uncompname, "%s/xvuXXXXXX", tmpdir);
! mktemp(uncompname);
sprintf(buf,"%s -c %s >%s", UNCOMPRESS, fname, uncompname);
#else /* it IS VMS */
strcpy(uncompname, "[]xvuXXXXXX");
--- 2754,2760 ----
#ifndef VMS
sprintf(uncompname, "%s/xvuXXXXXX", tmpdir);
! close(mkstemp(uncompname));
sprintf(buf,"%s -c %s >%s", UNCOMPRESS, fname, uncompname);
#else /* it IS VMS */
strcpy(uncompname, "[]xvuXXXXXX");
***************
*** 2930,2937 ****
if (!cmd || (strlen(cmd) < (size_t) 2)) return 1;
sprintf(tmpname,"%s/xvXXXXXX", tmpdir);
! mktemp(tmpname);
! if (tmpname[0] == '\0') { /* mktemp() blew up */
sprintf(str,"Unable to create temporary filename.");
ErrPopUp(str, "\nHow unlikely!");
return 1;
--- 2929,2936 ----
if (!cmd || (strlen(cmd) < (size_t) 2)) return 1;
sprintf(tmpname,"%s/xvXXXXXX", tmpdir);
! close(mkstemp(tmpname));
! if (tmpname[0] == '\0') { /* mkstemp() blew up */
sprintf(str,"Unable to create temporary filename.");
ErrPopUp(str, "\nHow unlikely!");
return 1;
***************
*** 3228,3236 ****
hints.flags = 0;
if ((i&XValue || i&YValue)) hints.flags = USPosition;
! if (i&XValue && i&XNegative) x = vrWIDE - eWIDE - abs(x);
! if (i&YValue && i&YNegative) y = vrHIGH - eHIGH - abs(y);
!
if (x+eWIDE > vrWIDE) x = vrWIDE - eWIDE; /* keep on screen */
if (y+eHIGH > vrHIGH) y = vrHIGH - eHIGH;
--- 3227,3243 ----
hints.flags = 0;
if ((i&XValue || i&YValue)) hints.flags = USPosition;
! hints.win_gravity = NorthWestGravity;
! if (i&XValue && i&XNegative) {
! hints.win_gravity = NorthEastGravity;
! x = vrWIDE - (eWIDE + 2 * bwidth) - abs(x);
! }
! if (i&YValue && i&YNegative) {
! hints.win_gravity = (hints.win_gravity == NorthWestGravity) ?
! SouthWestGravity : SouthEastGravity;
! y = vrHIGH - (eHIGH + 2 * bwidth) - abs(y);
! }
!
if (x+eWIDE > vrWIDE) x = vrWIDE - eWIDE; /* keep on screen */
if (y+eHIGH > vrHIGH) y = vrHIGH - eHIGH;
***************
*** 3249,3255 ****
hints.x = x; hints.y = y;
hints.width = eWIDE; hints.height = eHIGH;
hints.max_width = maxWIDE; hints.max_height = maxHIGH;
! hints.flags |= USSize | PMaxSize;
xswa.bit_gravity = StaticGravity;
xswa.background_pixel = bg;
--- 3256,3262 ----
hints.x = x; hints.y = y;
hints.width = eWIDE; hints.height = eHIGH;
hints.max_width = maxWIDE; hints.max_height = maxHIGH;
! hints.flags |= USSize | PMaxSize | PWinGravity;
xswa.bit_gravity = StaticGravity;
xswa.background_pixel = bg;
***************
*** 3298,3307 ****
}
}
-
- XSetStandardProperties(theDisp,mainW,"","",None,NULL,0,&hints);
- setWinIconNames(name);
-
xwmh.input = True;
xwmh.flags = InputHint;
--- 3305,3310 ----
***************
*** 3326,3337 ****
}
}
}
- XSetWMHints(theDisp, mainW, &xwmh);
classh.res_name = "xv";
classh.res_class = "XVroot";
- XSetClassHint(theDisp, mainW, &classh);
if (nodecor) { /* turn of image window decorations (in MWM) */
Atom mwm_wm_hints;
--- 3329,3340 ----
}
}
}
classh.res_name = "xv";
classh.res_class = "XVroot";
+ XmbSetWMProperties(theDisp, mainW, NULL, NULL, NULL, 0, &hints, &xwmh, &classh);
+ setWinIconNames(name);
if (nodecor) { /* turn of image window decorations (in MWM) */
Atom mwm_wm_hints;

View File

@ -1,21 +0,0 @@
*** xv.h.~1~ Sat Jan 31 22:48:31 1998
--- xv.h Sat Jan 31 22:50:16 1998
***************
*** 159,165 ****
!defined(bsd43) && \
!defined(aux) && \
!defined(__bsdi__) && \
! !defined(sequent)
# if defined(hp300) || defined(hp800) || defined(NeXT)
# include <sys/malloc.h> /* it's in 'sys' on HPs and NeXT */
--- 159,166 ----
!defined(bsd43) && \
!defined(aux) && \
!defined(__bsdi__) && \
! !defined(sequent) && \
! !defined(__OpenBSD__)
# if defined(hp300) || defined(hp800) || defined(NeXT)
# include <sys/malloc.h> /* it's in 'sys' on HPs and NeXT */

View File

@ -1,92 +0,0 @@
$OpenBSD: patch-aj,v 1.2 1999/04/22 19:05:11 rohee Exp $
This patch contains the original patch replacing insecure mktemp()
usage by secure mkstemp() usage in xvdir.c, as well as the Michael
Rausch's patch fixing a string buffer where the program failed to
append '\0'.
See ftp://ftp.trilon.com/pub/xv/patches/longname.patch for the original
patch.
It was less annoying to remake the patch than using his one, since it
isn't ${WRKSRC} relative, and it collides with the original OpenBSD
patch.
--- xvdir.c.reference Wed Apr 21 22:35:43 1999
+++ xvdir.c Wed Apr 21 22:38:14 1999
@@ -1213,6 +1213,7 @@
char *st;
{
strncpy(deffname, st, (size_t) MAXFNLEN-1);
+ deffname[MAXFNLEN-1] = '\0';
setFName(st);
}
@@ -1620,13 +1621,14 @@
#else
strcpy(outFName, "[]xvXXXXXX.lis");
#endif
- mktemp(outFName);
+ fp = fdopen(mkstemp(outFName), "w");
dopipe = 1;
}
/* see if file exists (ie, we're overwriting) */
- if (stat(outFName, &st)==0) { /* stat succeeded, file must exist */
+ if (dopipe == 0 &&
+ stat(outFName, &st)==0) { /* stat succeeded, file must exist */
static char *foo[] = { "\nOk", "\033Cancel" };
char str[512];
@@ -1636,7 +1638,8 @@
/* Open file */
- fp = fopen(outFName, "w");
+ if (dopipe == 0)
+ fp = fopen(outFName, "w");
if (!fp) {
char str[512];
sprintf(str,"Can't write file '%s'\n\n %s.",outFName, ERRSTR(errno));
--- /tmp/xv-3.10a.orig/xvbrowse.c Thu Jan 19 18:49:17 1995
+++ xvbrowse.c Mon Feb 5 23:46:28 1996
@@ -956,6 +956,7 @@
char *str;
{
strncpy(br->dispstr, str, (size_t) 256);
+ br->dispstr[255] = '\0';
drawBrowStr(br);
XFlush(theDisp);
}
@@ -1490,6 +1491,7 @@
if (StringWidth(str) > ISPACE_WIDE-6) {
int dotpos;
strncpy(tmpstr, str, (size_t) 56);
+ tmpstr[56] = '\0'; /* MR: otherwise it dies on long file names */
dotpos = strlen(tmpstr);
strcat(tmpstr,"...");
--- /tmp/xv-3.10a.orig/xvpopup.c Thu Jan 19 19:09:31 1995
+++ xvpopup.c Mon Feb 5 21:50:13 1996
@@ -560,6 +560,7 @@
nams[*lenp] = (char *) malloc((size_t) 32);
if (!nams[*lenp]) { free(vals[*lenp]); continue; }
strncpy(nams[*lenp], vals[*lenp], (size_t) 31);
+ nams[*lenp][31] = '\0';
}
if (strlen(nams[*lenp]) > (size_t) 20) { /* fix long names */
--- /tmp/xv-3.10a.orig/xvtext.c Sat Jan 14 00:46:28 1995
+++ xvtext.c Mon Feb 5 21:50:54 1996
@@ -293,6 +293,7 @@
tv->textlen = len;
tv->freeonclose = freeonclose;
strncpy(tv->title, title, (size_t) TITLELEN-1);
+ tv->title[TITLELEN-1] = '\0';
computeText(tv); /* compute # lines and linestarts array */

View File

@ -1,19 +0,0 @@
*** xvps.c.orig Thu Dec 22 17:34:42 1994
--- xvps.c Sat Apr 25 20:16:26 1998
***************
*** 1552,1558 ****
sprintf(tmpname, "Sys$Scratch:xvpgXXXXXX");
#endif
! mktemp(tmpname);
if (tmpname[0] == '\0') { /* mktemp() blew up */
sprintf(str,"LoadPS: Unable to create temporary filename???");
ErrPopUp(str, "\nHow unlikely!");
--- 1552,1558 ----
sprintf(tmpname, "Sys$Scratch:xvpgXXXXXX");
#endif
! close(mkstemp(tmpname));
if (tmpname[0] == '\0') { /* mktemp() blew up */
sprintf(str,"LoadPS: Unable to create temporary filename???");
ErrPopUp(str, "\nHow unlikely!");

View File

@ -1,19 +0,0 @@
*** xvpds.c.orig Sat Apr 25 20:16:57 1998
--- xvpds.c Sat Apr 25 20:17:09 1998
***************
*** 689,695 ****
#ifndef VMS
sprintf(pdsuncompfname,"%s/xvhuffXXXXXX", tmpdir);
! mktemp(pdsuncompfname);
sprintf(scanbuff,"%s %s - 4 >%s",PDSUNCOMP,fname,pdsuncompfname);
#else
strcpy(pdsuncompfname,"sys$disk:[]xvhuffXXXXXX");
--- 689,695 ----
#ifndef VMS
sprintf(pdsuncompfname,"%s/xvhuffXXXXXX", tmpdir);
! close(mkstemp(pdsuncompfname));
sprintf(scanbuff,"%s %s - 4 >%s",PDSUNCOMP,fname,pdsuncompfname);
#else
strcpy(pdsuncompfname,"sys$disk:[]xvhuffXXXXXX");

View File

@ -1,19 +0,0 @@
*** xvfits.c.orig Sat Apr 25 20:17:28 1998
--- xvfits.c Sat Apr 25 20:18:14 1998
***************
*** 235,241 ****
sprintf(basename, "Sys$Disk:[]xvpgXXXXXX");
#endif
! mktemp(basename);
if (basename[0] == '\0') {
SetISTR(ISTR_WARNING, "%s", "Unable to build temporary filename");
return 1;
--- 235,241 ----
sprintf(basename, "Sys$Disk:[]xvpgXXXXXX");
#endif
! close(mkstemp(basename));
if (basename[0] == '\0') {
SetISTR(ISTR_WARNING, "%s", "Unable to build temporary filename");
return 1;

View File

@ -1,4 +1,4 @@
$OpenBSD: patch-ac,v 1.2 1999/03/24 18:53:39 rohee Exp $
$OpenBSD: patch-config_h,v 1.1 2004/09/21 18:46:04 sturm Exp $
We have gunzip, it's in /usr/bin, and if ghostscript is installed it will be
found.

View File

@ -0,0 +1,49 @@
$OpenBSD: patch-vdcomp_c,v 1.1 2004/09/21 18:46:04 sturm Exp $
--- vdcomp.c.orig Thu Dec 22 23:34:47 1994
+++ vdcomp.c Tue Sep 21 06:50:27 2004
@@ -108,7 +108,9 @@
!defined(bsd43) && \
!defined(aux) && \
!defined(__bsdi__) && \
- !defined(sequent)
+ !defined(sequent) && \
+ !defined(__FreeBSD__) && \
+ !defined(__OpenBSD__)
# if defined(hp300) || defined(hp800) || defined(NeXT)
# include <sys/malloc.h> /* it's in 'sys' on HPs and NeXT */
@@ -429,10 +431,13 @@ int host;
{
short shortint;
typedef long off_t;
+ char *s;
if (inname[0] == ' ') {
printf("\nEnter name of file to be decompressed: ");
- gets (inname);
+ fgets (inname, sizeof(inname), stdin);
+ if ((s = strchr(inname, '\n')) != NULL)
+ *s = '\0';
}
if (host == 1 | host == 2) {
@@ -474,13 +479,17 @@ int host;
printf("\n 3. VICAR format.");
printf("\n 4. Unlabelled binary array.\n");
printf("\n Enter format number:");
- gets(inname);
+ fgets (inname, sizeof(inname), stdin);
+ if ((s = strchr(inname, '\n')) != NULL)
+ *s = '\0';
output_format = atoi(inname);
} while (output_format < 1 || output_format > 4);
if (outname[0] == ' ') {
printf("\nEnter name of uncompressed output file: ");
- gets (outname);
+ fgets (outname, sizeof(outname), stdin);
+ if ((s = strchr(outname, '\n')) != NULL)
+ *s = '\0';
}
return(host);

View File

@ -0,0 +1,91 @@
$OpenBSD: patch-xv_c,v 1.1 2004/09/21 18:46:04 sturm Exp $
--- xv.c.orig Tue Sep 21 06:49:20 2004
+++ xv.c Tue Sep 21 06:50:28 2004
@@ -1990,10 +1990,9 @@ static int openPic(filenum)
#else /* it is VMS */
sprintf(filename, "[]xvXXXXXX");
#endif
- mktemp(filename);
+ fp = fdopen(mkstemp(filename), "w");
clearerr(stdin);
- fp = fopen(filename,"w");
if (!fp) FatalError("openPic(): can't write temporary file");
while ( (i=getchar()) != EOF) putc(i,fp);
@@ -2759,7 +2758,7 @@ int UncompressFile(name, uncompname)
#ifndef VMS
sprintf(uncompname, "%s/xvuXXXXXX", tmpdir);
- mktemp(uncompname);
+ close(mkstemp(uncompname));
sprintf(buf,"%s -c %s >%s", UNCOMPRESS, fname, uncompname);
#else /* it IS VMS */
strcpy(uncompname, "[]xvuXXXXXX");
@@ -2934,8 +2933,8 @@ static int readpipe(cmd, fname)
if (!cmd || (strlen(cmd) < (size_t) 2)) return 1;
sprintf(tmpname,"%s/xvXXXXXX", tmpdir);
- mktemp(tmpname);
- if (tmpname[0] == '\0') { /* mktemp() blew up */
+ close(mkstemp(tmpname));
+ if (tmpname[0] == '\0') { /* mkstemp() blew up */
sprintf(str,"Unable to create temporary filename.");
ErrPopUp(str, "\nHow unlikely!");
return 1;
@@ -3232,9 +3231,17 @@ static void createMainWindow(geom, name)
hints.flags = 0;
if ((i&XValue || i&YValue)) hints.flags = USPosition;
- if (i&XValue && i&XNegative) x = vrWIDE - eWIDE - abs(x);
- if (i&YValue && i&YNegative) y = vrHIGH - eHIGH - abs(y);
-
+ hints.win_gravity = NorthWestGravity;
+ if (i&XValue && i&XNegative) {
+ hints.win_gravity = NorthEastGravity;
+ x = vrWIDE - (eWIDE + 2 * bwidth) - abs(x);
+ }
+ if (i&YValue && i&YNegative) {
+ hints.win_gravity = (hints.win_gravity == NorthWestGravity) ?
+ SouthWestGravity : SouthEastGravity;
+ y = vrHIGH - (eHIGH + 2 * bwidth) - abs(y);
+ }
+
if (x+eWIDE > vrWIDE) x = vrWIDE - eWIDE; /* keep on screen */
if (y+eHIGH > vrHIGH) y = vrHIGH - eHIGH;
@@ -3253,7 +3260,7 @@ static void createMainWindow(geom, name)
hints.x = x; hints.y = y;
hints.width = eWIDE; hints.height = eHIGH;
hints.max_width = maxWIDE; hints.max_height = maxHIGH;
- hints.flags |= USSize | PMaxSize;
+ hints.flags |= USSize | PMaxSize | PWinGravity;
xswa.bit_gravity = StaticGravity;
xswa.background_pixel = bg;
@@ -3302,10 +3309,6 @@ static void createMainWindow(geom, name)
}
}
-
- XSetStandardProperties(theDisp,mainW,"","",None,NULL,0,&hints);
- setWinIconNames(name);
-
xwmh.input = True;
xwmh.flags = InputHint;
@@ -3330,12 +3333,12 @@ static void createMainWindow(geom, name)
}
}
}
- XSetWMHints(theDisp, mainW, &xwmh);
classh.res_name = "xv";
classh.res_class = "XVroot";
- XSetClassHint(theDisp, mainW, &classh);
+ XmbSetWMProperties(theDisp, mainW, NULL, NULL, NULL, 0, &hints, &xwmh, &classh);
+ setWinIconNames(name);
if (nodecor) { /* turn of image window decorations (in MWM) */
Atom mwm_wm_hints;

View File

@ -0,0 +1,13 @@
$OpenBSD: patch-xv_h,v 1.1 2004/09/21 18:46:04 sturm Exp $
--- xv.h.orig Tue Sep 21 06:49:20 2004
+++ xv.h Tue Sep 21 06:50:28 2004
@@ -159,7 +159,8 @@
!defined(bsd43) && \
!defined(aux) && \
!defined(__bsdi__) && \
- !defined(sequent)
+ !defined(sequent) && \
+ !defined(__OpenBSD__)
# if defined(hp300) || defined(hp800) || defined(NeXT)
# include <sys/malloc.h> /* it's in 'sys' on HPs and NeXT */

View File

@ -1,6 +1,9 @@
$OpenBSD: patch-xvbmp_c,v 1.1 2001/03/13 20:27:56 espie Exp $
--- xvbmp.c.orig Tue Mar 13 18:30:52 2001
+++ xvbmp.c Tue Mar 13 19:10:46 2001
$OpenBSD: patch-xvbmp_c,v 1.2 2004/09/21 18:46:04 sturm Exp $
Handle 16 bit depth BMP files and add some sanity checking.
--- xvbmp.c.orig Thu Sep 16 00:06:37 2004
+++ xvbmp.c Thu Sep 16 00:10:44 2004
@@ -18,7 +18,6 @@
not being able to malloc is a Fatal Error. The program is aborted. */
@ -9,7 +12,7 @@ $OpenBSD: patch-xvbmp_c,v 1.1 2001/03/13 20:27:56 espie Exp $
#define BI_RGB 0
#define BI_RLE8 1
#define BI_RLE4 2
@@ -32,6 +31,7 @@ static long filesize;
@@ -32,6 +31,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));
@ -17,16 +20,20 @@ $OpenBSD: patch-xvbmp_c,v 1.1 2001/03/13 20:27:56 espie Exp $
static int loadBMP24 PARM((FILE *, byte *, u_int, u_int, u_int));
static u_int getshort PARM((FILE *));
static u_int getint PARM((FILE *));
@@ -128,7 +128,7 @@ int LoadBMP(fname, pinfo)
@@ -128,8 +128,10 @@
/* error checking */
if ((biBitCount!=1 && biBitCount!=4 && biBitCount!=8 &&
- biBitCount!=24 && biBitCount!=32) ||
- biPlanes!=1 || biCompression>BI_RLE4) {
+ biBitCount!= 16 && 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)",
@@ -138,7 +138,7 @@ int LoadBMP(fname, pinfo)
biBitCount, biPlanes, biCompression);
@@ -138,7 +140,7 @@
goto ERROR;
}
@ -35,16 +42,20 @@ $OpenBSD: patch-xvbmp_c,v 1.1 2001/03/13 20:27:56 espie Exp $
&& biCompression != BI_RGB) ||
(biBitCount==4 && biCompression==BI_RLE8) ||
(biBitCount==8 && biCompression==BI_RLE4)) {
@@ -161,7 +161,7 @@ int LoadBMP(fname, pinfo)
@@ -160,8 +162,11 @@
bPad = bfOffBits - (biSize + 14);
}
+ if (biClrUsed > (1 << biBitCount))
+ biClrUsed = (1 << biBitCount);
+
/* load up colormap, if any */
- if (biBitCount!=24 && biBitCount!=32) {
+ if (biBitCount!=16 && biBitCount!=24 && biBitCount!=32) {
int i, cmaplen;
cmaplen = (biClrUsed) ? biClrUsed : 1 << biBitCount;
@@ -199,7 +199,7 @@ int LoadBMP(fname, pinfo)
@@ -199,7 +204,7 @@
/* create pic8 or pic24 */
@ -53,7 +64,7 @@ $OpenBSD: patch-xvbmp_c,v 1.1 2001/03/13 20:27:56 espie Exp $
pic24 = (byte *) calloc((size_t) biWidth * biHeight * 3, (size_t) 1);
if (!pic24) return (bmpError(bname, "couldn't malloc 'pic24'"));
}
@@ -216,6 +216,7 @@ int LoadBMP(fname, pinfo)
@@ -216,6 +221,7 @@
biCompression);
else if (biBitCount == 8) rv = loadBMP8(fp,pic8,biWidth,biHeight,
biCompression);
@ -61,7 +72,7 @@ $OpenBSD: patch-xvbmp_c,v 1.1 2001/03/13 20:27:56 espie Exp $
else rv = loadBMP24(fp,pic24,biWidth,biHeight,
biBitCount);
@@ -225,7 +226,7 @@ int LoadBMP(fname, pinfo)
@@ -225,7 +231,7 @@
fclose(fp);
@ -70,7 +81,7 @@ $OpenBSD: patch-xvbmp_c,v 1.1 2001/03/13 20:27:56 espie Exp $
pinfo->pic = pic24;
pinfo->type = PIC24;
}
@@ -458,6 +459,43 @@ static int loadBMP8(fp, pic8, w, h, comp
@@ -458,6 +464,43 @@
}

View File

@ -0,0 +1,19 @@
$OpenBSD: patch-xvbrowse_c,v 1.1 2004/09/21 18:46:04 sturm Exp $
--- xvbrowse.c.orig Tue Sep 21 06:49:17 2004
+++ xvbrowse.c Tue Sep 21 06:50:28 2004
@@ -959,6 +959,7 @@ static void setBrowStr(br, str)
char *str;
{
strncpy(br->dispstr, str, (size_t) 256);
+ br->dispstr[255] = '\0';
drawBrowStr(br);
XFlush(theDisp);
}
@@ -1493,6 +1494,7 @@ static void drawIcon(br, num)
if (StringWidth(str) > ISPACE_WIDE-6) {
int dotpos;
strncpy(tmpstr, str, (size_t) 56);
+ tmpstr[56] = '\0'; /* MR: otherwise it dies on long file names */
dotpos = strlen(tmpstr);
strcat(tmpstr,"...");

View File

@ -0,0 +1,38 @@
$OpenBSD: patch-xvdir_c,v 1.1 2004/09/21 18:46:04 sturm Exp $
--- xvdir.c.orig Tue Sep 21 06:49:17 2004
+++ xvdir.c Tue Sep 21 06:50:28 2004
@@ -1213,6 +1213,7 @@ void SetDirFName(st)
char *st;
{
strncpy(deffname, st, (size_t) MAXFNLEN-1);
+ deffname[MAXFNLEN-1] = '\0';
setFName(st);
}
@@ -1620,13 +1621,14 @@ FILE *OpenOutFile(filename)
#else
strcpy(outFName, "[]xvXXXXXX.lis");
#endif
- mktemp(outFName);
+ fp = fdopen(mkstemp(outFName), "w");
dopipe = 1;
}
/* see if file exists (ie, we're overwriting) */
- if (stat(outFName, &st)==0) { /* stat succeeded, file must exist */
+ if (dopipe == 0 &&
+ stat(outFName, &st)==0) { /* stat succeeded, file must exist */
static char *foo[] = { "\nOk", "\033Cancel" };
char str[512];
@@ -1636,7 +1638,8 @@ FILE *OpenOutFile(filename)
/* Open file */
- fp = fopen(outFName, "w");
+ if (dopipe == 0)
+ fp = fopen(outFName, "w");
if (!fp) {
char str[512];
sprintf(str,"Can't write file '%s'\n\n %s.",outFName, ERRSTR(errno));

View File

@ -0,0 +1,12 @@
$OpenBSD: patch-xvfits_c,v 1.1 2004/09/21 18:46:04 sturm Exp $
--- xvfits.c.orig Wed Dec 28 08:43:29 1994
+++ xvfits.c Tue Sep 21 06:50:29 2004
@@ -235,7 +235,7 @@ static int splitfits(image, comment, nx,
sprintf(basename, "Sys$Disk:[]xvpgXXXXXX");
#endif
- mktemp(basename);
+ close(mkstemp(basename));
if (basename[0] == '\0') {
SetISTR(ISTR_WARNING, "%s", "Unable to build temporary filename");
return 1;

View File

@ -0,0 +1,480 @@
$OpenBSD: patch-xvimage_c,v 1.1 2004/09/21 18:46:04 sturm Exp $
--- xvimage.c.orig Tue Sep 21 06:49:19 2004
+++ xvimage.c Tue Sep 21 06:50:28 2004
@@ -46,7 +46,275 @@ static int doPadPaste PARM((byte
static int ReadImageFile1 PARM((char *, PICINFO *));
+/* 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:
+ *
+ * unsigned char *p;
+ * unsigned long pixval;
+ *
+ * pixval = screen_rgb[0][*p++];
+ * pixval |= screen_rgb[1][*p++];
+ * pixval |= screen_rgb[2][*p++];
+ *
+ * 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.
+ * The array size is 3 KBytes total and thus very reasonable.
+ */
+static unsigned long screen_rgb[3][256];
+
+/* The following array holds the exact color representations
+ * reported by the system.
+ * This is useful for less than 24 bit deep displays as a base
+ * for additional dithering to get smoother output.
+ */
+
+static byte screen_set[3][256];
+
+/* The following routine initializes the screen_rgb and screen_set
+ * arrays.
+ * Since it is executed only once per program run, it does not need
+ * to be super-efficient.
+ *
+ * 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.
+ *
+ * The routine uses some global X variables: theDisp, theScreen,
+ * and dispDEEP. 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()
+{
+ static int init_flag; /* assume auto-init as 0 */
+ Pixmap check_map;
+ GC check_gc;
+ XColor check_col;
+ XImage *check_image;
+ int ci, i;
+
+ if (init_flag) return;
+ init_flag = 1;
+
+ check_map = XCreatePixmap(theDisp, RootWindow(theDisp,theScreen),
+ 1, 1, dispDEEP);
+ check_gc = XCreateGC(theDisp, RootWindow(theDisp,theScreen), 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 */
+ 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;
+ }
+ XDestroyImage(check_image);
+ }
+ }
+ XFreeGC(theDisp, check_gc);
+ XFreePixmap(theDisp, check_map);
+}
+
+
+/* The following switch should better be provided at runtime for
+ * comparison purposes.
+ * At the moment it's only compile time, unfortunately.
+ * Who can make adaptions for use as a runtime switch by a menu option?
+ */
+
+#define DO_FIXPIX_SMOOTH
+
+#ifdef DO_FIXPIX_SMOOTH
+
+/* The following code is based in part on:
+ *
+ * jquant1.c
+ *
+ * Copyright (C) 1991-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains 1-pass color quantization (color mapping) routines.
+ * These routines provide mapping to a fixed color map using equally spaced
+ * color values. Optional Floyd-Steinberg or ordered dithering is available.
+ */
+
+/* Declarations for Floyd-Steinberg dithering.
+ *
+ * Errors are accumulated into the array fserrors[], at a resolution of
+ * 1/16th of a pixel count. The error at a given pixel is propagated
+ * to its not-yet-processed neighbors using the standard F-S fractions,
+ * ... (here) 7/16
+ * 3/16 5/16 1/16
+ * We work left-to-right on even rows, right-to-left on odd rows.
+ *
+ * We can get away with a single array (holding one row's worth of errors)
+ * by using it to store the current row's errors at pixel columns not yet
+ * processed, but the next row's errors at columns already processed. We
+ * need only a few extra variables to hold the errors immediately around the
+ * 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.
+ */
+
+typedef INT16 FSERROR; /* 16 bits should be enough */
+typedef int LOCFSERROR; /* use 'int' for calculation temps */
+
+typedef struct { byte *colorset;
+ FSERROR *fserrors;
+ } FSBUF;
+
+/* Floyd-Steinberg initialization function.
+ *
+ * It is called 'fs2_init' since it's specialized for our purpose and
+ * could be embedded in a more general FS-package.
+ *
+ * Returns a malloced FSBUF pointer which has to be passed as first
+ * parameter to subsequent 'fs2_dither' calls.
+ * The FSBUF structure does not need to be referenced by the calling
+ * application, it can be treated from the app like a void pointer.
+ *
+ * The current implementation does only require to free() this returned
+ * pointer after processing.
+ *
+ * Returns NULL if malloc fails.
+ *
+ * NOTE: The FSBUF structure is designed to allow the 'fs2_dither'
+ * function to work with an *arbitrary* number of color components
+ * at runtime! This is an enhancement over the IJG code base :-).
+ * Only fs2_init() specifies the (maximum) number of components.
+ */
+
+static FSBUF *fs2_init(width)
+int width;
+{
+ FSBUF *fs;
+ FSERROR *p;
+
+ fs = (FSBUF *)
+ malloc(sizeof(FSBUF) * 3 + ((size_t)width + 2) * sizeof(FSERROR) * 3);
+ if (fs == 0) return fs;
+
+ fs[0].colorset = screen_set[0];
+ fs[1].colorset = screen_set[1];
+ fs[2].colorset = screen_set[2];
+
+ p = (FSERROR *)(fs + 3);
+ memset(p, 0, ((size_t)width + 2) * sizeof(FSERROR) * 3);
+
+ fs[0].fserrors = p;
+ fs[1].fserrors = p + 1;
+ fs[2].fserrors = p + 2;
+
+ return fs;
+}
+
+/* Floyd-Steinberg dithering function.
+ *
+ * NOTE:
+ * (1) The image data referenced by 'ptr' is *overwritten* (input *and*
+ * output) to allow more efficient implementation.
+ * (2) Alternate FS dithering is provided by the sign of 'nc'. Pass in
+ * a negative value for right-to-left processing. The return value
+ * provides the right-signed value for subsequent calls!
+ * (3) This particular implementation assumes *no* padding between lines!
+ * Adapt this if necessary.
+ */
+
+static int fs2_dither(fs, ptr, nc, num_rows, num_cols)
+FSBUF *fs;
+byte *ptr;
+int nc, num_rows, num_cols;
+{
+ int abs_nc, ci, row, col;
+ LOCFSERROR delta, cur, belowerr, bpreverr;
+ byte *dataptr, *colsetptr;
+ FSERROR *errorptr;
+
+ if ((abs_nc = nc) < 0) abs_nc = -abs_nc;
+ for (row = 0; row < num_rows; row++) {
+ for (ci = 0; ci < abs_nc; ci++, ptr++) {
+ dataptr = ptr;
+ colsetptr = fs[ci].colorset;
+ errorptr = fs[ci].fserrors;
+ if (nc < 0) {
+ dataptr += (num_cols - 1) * abs_nc;
+ errorptr += (num_cols + 1) * abs_nc;
+ }
+ cur = belowerr = bpreverr = 0;
+ for (col = 0; col < num_cols; col++) {
+ cur += errorptr[nc];
+ cur += 8; cur >>= 4;
+ if ((cur += *dataptr) < 0) cur = 0;
+ else if (cur > 255) cur = 255;
+ *dataptr = cur & 0xff;
+ cur -= colsetptr[cur];
+ delta = cur << 1; cur += delta;
+ bpreverr += cur; cur += delta;
+ belowerr += cur; cur += delta;
+ errorptr[0] = (FSERROR)bpreverr;
+ bpreverr = belowerr;
+ belowerr = delta >> 1;
+ dataptr += nc;
+ errorptr += nc;
+ }
+ errorptr[0] = (FSERROR)bpreverr;
+ }
+ ptr += (num_cols - 1) * abs_nc;
+ nc = -nc;
+ }
+ return nc;
+}
+
+#endif /* DO_FIXPIX_SMOOTH */
+
+
#define DO_CROP 0
#define DO_ZOOM 1
@@ -1885,33 +2153,17 @@ XImage *Pic24ToXImage(pic24, wide, high)
/* Non-ColorMapped Visuals: TrueColor, DirectColor */
/************************************************************************/
- unsigned long r, g, b, rmask, gmask, bmask, xcol;
- int rshift, gshift, bshift, bperpix, bperline, border, cshift;
- int maplen;
+ unsigned long xcol;
+ int bperpix, bperline;
byte *imagedata, *lip, *ip, *pp;
- /* compute various shifting constants that we'll need... */
-
- rmask = theVisual->red_mask;
- gmask = theVisual->green_mask;
- bmask = theVisual->blue_mask;
-
- rshift = 7 - highbit(rmask);
- gshift = 7 - highbit(gmask);
- bshift = 7 - highbit(bmask);
-
- maplen = theVisual->map_entries;
- if (maplen>256) maplen=256;
- cshift = 7 - highbit((u_long) (maplen-1));
-
xim = XCreateImage(theDisp, theVisual, dispDEEP, ZPixmap, 0, NULL,
wide, high, 32, 0);
if (!xim) FatalError("couldn't create X image!");
bperline = xim->bytes_per_line;
bperpix = xim->bits_per_pixel;
- border = xim->byte_order;
imagedata = (byte *) malloc((size_t) (high * bperline));
if (!imagedata) FatalError("couldn't malloc imagedata");
@@ -1925,82 +2177,87 @@ XImage *Pic24ToXImage(pic24, wide, high)
FatalError(buf);
}
+ screen_init();
- lip = imagedata; pp = pic24;
- for (i=0; i<high; i++, lip+=bperline) {
- for (j=0, ip=lip; j<wide; j++) {
- r = *pp++; g = *pp++; b = *pp++;
+#ifdef DO_FIXPIX_SMOOTH
+#if 0
+ /* If we wouldn't have to save the original pic24 image data,
+ * the following code would do the dither job by overwriting
+ * the image data, and the normal render code would then work
+ * without any change on that data.
+ * Unfortunately, this approach would hurt the xv assumptions...
+ */
+ if (bperpix < 24) {
+ FSBUF *fs = fs2_init(wide);
+ if (fs) {
+ fs2_dither(fs, pic24, 3, high, wide);
+ free(fs);
+ }
+ }
+#else
+ /* ...so we have to take a different approach with linewise
+ * 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);
+ if (row_buf) {
+ int nc = 3;
+ byte *picp = pic24; lip = imagedata;
+ for (i=0; i<high; i++, lip+=bperline, picp+=(size_t)wide*3) {
+ memcpy(row_buf, picp, (size_t)wide * 3);
+ nc = fs2_dither(fs, row_buf, nc, 1, wide);
+ for (j=0, ip=lip, pp=row_buf; j<wide; j++) {
- /* shift r,g,b so that high bit of 8-bit color specification is
- * aligned with high bit of r,g,b-mask in visual,
- * AND each component with its mask,
- * and OR the three components together
- */
+ xcol = screen_rgb[0][*pp++];
+ xcol |= screen_rgb[1][*pp++];
+ xcol |= screen_rgb[2][*pp++];
- if (theVisual->class == DirectColor) {
- r = (u_long) directConv[(r>>cshift) & 0xff] << cshift;
- g = (u_long) directConv[(g>>cshift) & 0xff] << cshift;
- b = (u_long) directConv[(b>>cshift) & 0xff] << cshift;
- }
-
-
- /* shift the bits around */
- if (rshift<0) r = r << (-rshift);
- else r = r >> rshift;
-
- if (gshift<0) g = g << (-gshift);
- else g = g >> gshift;
-
- if (bshift<0) b = b << (-bshift);
- else b = b >> bshift;
-
- r = r & rmask;
- g = g & gmask;
- b = b & bmask;
-
- xcol = r | g | b;
-
- if (bperpix == 32) {
- if (border == MSBFirst) {
- *ip++ = (xcol>>24) & 0xff;
- *ip++ = (xcol>>16) & 0xff;
- *ip++ = (xcol>>8) & 0xff;
- *ip++ = xcol & 0xff;
+ switch (bperpix) {
+ case 8:
+ *ip++ = xcol & 0xff;
+ break;
+ case 16:
+ *((CARD16 *)ip)++ = (CARD16)xcol;
+ break;
+ }
+ }
}
- else { /* LSBFirst */
- *ip++ = xcol & 0xff;
- *ip++ = (xcol>>8) & 0xff;
- *ip++ = (xcol>>16) & 0xff;
- *ip++ = (xcol>>24) & 0xff;
- }
+ alldone = 1;
+ free(row_buf);
}
+ free(fs);
+ }
+ if (alldone) return xim;
+ }
+#endif
+#endif
- 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;
- }
- }
+ lip = imagedata; pp = pic24;
+ for (i=0; i<high; i++, lip+=bperline) {
+ for (j=0, ip=lip; j<wide; j++) {
- else if (bperpix == 16) {
- if (border == MSBFirst) {
- *ip++ = (xcol>>8) & 0xff;
- *ip++ = xcol & 0xff;
- }
- else { /* LSBFirst */
- *ip++ = xcol & 0xff;
- *ip++ = (xcol>>8) & 0xff;
- }
- }
+ xcol = screen_rgb[0][*pp++];
+ xcol |= screen_rgb[1][*pp++];
+ xcol |= screen_rgb[2][*pp++];
- else if (bperpix == 8) {
- *ip++ = xcol & 0xff;
+ switch (bperpix) {
+ case 8:
+ *ip++ = xcol & 0xff;
+ break;
+ case 16:
+ *((CARD16 *)ip)++ = (CARD16)xcol;
+ break;
+ case 24:
+ *ip++ = (xcol >> 16) & 0xff;
+ *ip++ = (xcol >> 8) & 0xff;
+ *ip++ = xcol & 0xff;
+ break;
+ case 32:
+ *((CARD32 *)ip)++ = (CARD32)xcol;
+ break;
}
}
}
@@ -2699,7 +2956,7 @@ static int doPadBggen(str, wide, high, o
#else
strcpy(fname, "Sys$Disk:[]xvuXXXXXX");
#endif
- mktemp(fname);
+ close(mkstemp(fname));
/* run bggen to generate the background */
sprintf(syscmd, "bggen -g %dx%d %s > %s", wide, high, str, fname);

View File

@ -0,0 +1,19 @@
$OpenBSD: patch-xviris_c,v 1.1 2004/09/21 18:46:04 sturm Exp $
Add some sanity checking in RLE decoding.
--- xviris.c.orig Thu Sep 16 00:21:14 2004
+++ xviris.c Thu Sep 16 00:22:43 2004
@@ -267,6 +267,12 @@ static byte *getimagedata(fp, img)
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);

View File

@ -1,6 +1,6 @@
--- xvmisc.c.orig Fri Jan 13 23:41:34 1995
+++ xvmisc.c Sat Mar 8 16:05:19 1997
@@ -97,10 +97,18 @@
--- xvmisc.c.orig Tue Sep 21 06:49:20 2004
+++ xvmisc.c Tue Sep 21 06:50:27 2004
@@ -99,10 +99,18 @@ unsigned long fg, bg;
if (!usesize || !(i&WidthValue)) w = defw;
if (!usesize || !(i&HeightValue)) h = defh;
@ -22,7 +22,7 @@
#define VROOT_TRANS
@@ -136,19 +144,18 @@
@@ -138,19 +146,18 @@ unsigned long fg, bg;
if (!win) return(win); /* leave immediately if couldn't create */

View File

@ -0,0 +1,65 @@
$OpenBSD: patch-xvpcx_c,v 1.1 2004/09/21 18:46:04 sturm Exp $
Add some sanity checking.
--- xvpcx.c.orig Thu Sep 16 00:24:40 2004
+++ xvpcx.c Thu Sep 16 00:30:36 2004
@@ -222,7 +222,14 @@ static int pcxLoadImage8(fname, fp, pinf
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,24 +257,38 @@ static int pcxLoadImage24(fname, fp, pin
{
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;
i = 0; /* planes, in this while loop */
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;

View File

@ -0,0 +1,12 @@
$OpenBSD: patch-xvpds_c,v 1.1 2004/09/21 18:46:04 sturm Exp $
--- xvpds.c.orig Tue Jan 3 22:25:52 1995
+++ xvpds.c Tue Sep 21 06:50:28 2004
@@ -689,7 +689,7 @@ int LoadPDS(fname, pinfo)
#ifndef VMS
sprintf(pdsuncompfname,"%s/xvhuffXXXXXX", tmpdir);
- mktemp(pdsuncompfname);
+ close(mkstemp(pdsuncompfname));
sprintf(scanbuff,"%s %s - 4 >%s",PDSUNCOMP,fname,pdsuncompfname);
#else
strcpy(pdsuncompfname,"sys$disk:[]xvhuffXXXXXX");

View File

@ -0,0 +1,45 @@
$OpenBSD: patch-xvpm_c,v 1.1 2004/09/21 18:46:04 sturm Exp $
Add some sanity checking.
--- xvpm.c.orig Thu Sep 16 00:32:09 2004
+++ xvpm.c Thu Sep 16 00:35:29 2004
@@ -119,6 +119,9 @@ int LoadPM(fname, pinfo)
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 @@ int LoadPM(fname, pinfo)
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 LoadPM(fname, pinfo)
int *intptr;
byte *pic24, *picptr;
+ if (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 @@ int LoadPM(fname, pinfo)
else if (thePic.pm_form == PM_C && thePic.pm_np>1) {
byte *pic24, *picptr, *rptr, *gptr, *bptr;
+
+ if (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);

View File

@ -0,0 +1,11 @@
$OpenBSD: patch-xvpopup_c,v 1.1 2004/09/21 18:46:04 sturm Exp $
--- xvpopup.c.orig Tue Sep 21 06:49:18 2004
+++ xvpopup.c Tue Sep 21 06:50:28 2004
@@ -560,6 +560,7 @@ static void build1PadList(typstr, vals,
nams[*lenp] = (char *) malloc((size_t) 32);
if (!nams[*lenp]) { free(vals[*lenp]); continue; }
strncpy(nams[*lenp], vals[*lenp], (size_t) 31);
+ nams[*lenp][31] = '\0';
}
if (strlen(nams[*lenp]) > (size_t) 20) { /* fix long names */

View File

@ -0,0 +1,12 @@
$OpenBSD: patch-xvps_c,v 1.1 2004/09/21 18:46:04 sturm Exp $
--- xvps.c.orig Tue Sep 21 06:49:19 2004
+++ xvps.c Tue Sep 21 06:50:28 2004
@@ -1552,7 +1552,7 @@ int LoadPS(fname, pinfo, quick)
sprintf(tmpname, "Sys$Scratch:xvpgXXXXXX");
#endif
- mktemp(tmpname);
+ close(mkstemp(tmpname));
if (tmpname[0] == '\0') { /* mktemp() blew up */
sprintf(str,"LoadPS: Unable to create temporary filename???");
ErrPopUp(str, "\nHow unlikely!");

View File

@ -0,0 +1,11 @@
$OpenBSD: patch-xvtext_c,v 1.1 2004/09/21 18:46:04 sturm Exp $
--- xvtext.c.orig Sat Jan 14 00:46:28 1995
+++ xvtext.c Tue Sep 21 06:50:28 2004
@@ -293,6 +293,7 @@ void OpenTextView(text, len, title, free
tv->textlen = len;
tv->freeonclose = freeonclose;
strncpy(tv->title, title, (size_t) TITLELEN-1);
+ tv->title[TITLELEN-1] = '\0';
computeText(tv); /* compute # lines and linestarts array */