freebsd-ports/graphics/xv/files/patch-suse-2004-07-28
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

195 lines
5.5 KiB
Text

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