summaryrefslogtreecommitdiff
path: root/libtiff-32/tiff-4.0.3-CVE-2013-1960.patch
blob: 1c8dfb7bc65dd992580a233271099db6bb603f4c (plain)
    1 diff -Naur tiff-4.0.3.orig/tools/tiff2pdf.c tiff-4.0.3/tools/tiff2pdf.c
    2 --- tiff-4.0.3.orig/tools/tiff2pdf.c	2012-07-25 22:56:43.000000000 -0400
    3 +++ tiff-4.0.3/tools/tiff2pdf.c	2013-05-02 12:04:49.057090227 -0400
    4 @@ -3341,33 +3341,56 @@
    5  	uint32 height){
    6  
    7  	tsize_t i=0;
    8 -	uint16 ri =0;
    9 -	uint16 v_samp=1;
   10 -	uint16 h_samp=1;
   11 -	int j=0;
   12 -	
   13 -	i++;
   14 -	
   15 -	while(i<(*striplength)){
   16 +
   17 +	while (i < *striplength) {
   18 +		tsize_t datalen;
   19 +		uint16 ri;
   20 +		uint16 v_samp;
   21 +		uint16 h_samp;
   22 +		int j;
   23 +		int ncomp;
   24 +
   25 +		/* marker header: one or more FFs */
   26 +		if (strip[i] != 0xff)
   27 +			return(0);
   28 +		i++;
   29 +		while (i < *striplength && strip[i] == 0xff)
   30 +			i++;
   31 +		if (i >= *striplength)
   32 +			return(0);
   33 +		/* SOI is the only pre-SOS marker without a length word */
   34 +		if (strip[i] == 0xd8)
   35 +			datalen = 0;
   36 +		else {
   37 +			if ((*striplength - i) <= 2)
   38 +				return(0);
   39 +			datalen = (strip[i+1] << 8) | strip[i+2];
   40 +			if (datalen < 2 || datalen >= (*striplength - i))
   41 +				return(0);
   42 +		}
   43  		switch( strip[i] ){
   44 -			case 0xd8:
   45 -				/* SOI - start of image */
   46 +			case 0xd8:	/* SOI - start of image */
   47  				_TIFFmemcpy(&(buffer[*bufferoffset]), &(strip[i-1]), 2);
   48  				*bufferoffset+=2;
   49 -				i+=2;
   50  				break;
   51 -			case 0xc0:
   52 -			case 0xc1:
   53 -			case 0xc3:
   54 -			case 0xc9:
   55 -			case 0xca:
   56 +			case 0xc0:	/* SOF0 */
   57 +			case 0xc1:	/* SOF1 */
   58 +			case 0xc3:	/* SOF3 */
   59 +			case 0xc9:	/* SOF9 */
   60 +			case 0xca:	/* SOF10 */
   61  				if(no==0){
   62 -					_TIFFmemcpy(&(buffer[*bufferoffset]), &(strip[i-1]), strip[i+2]+2);
   63 -					for(j=0;j<buffer[*bufferoffset+9];j++){
   64 -						if( (buffer[*bufferoffset+11+(2*j)]>>4) > h_samp) 
   65 -							h_samp = (buffer[*bufferoffset+11+(2*j)]>>4);
   66 -						if( (buffer[*bufferoffset+11+(2*j)] & 0x0f) > v_samp) 
   67 -							v_samp = (buffer[*bufferoffset+11+(2*j)] & 0x0f);
   68 +					_TIFFmemcpy(&(buffer[*bufferoffset]), &(strip[i-1]), datalen+2);
   69 +					ncomp = buffer[*bufferoffset+9];
   70 +					if (ncomp < 1 || ncomp > 4)
   71 +						return(0);
   72 +					v_samp=1;
   73 +					h_samp=1;
   74 +					for(j=0;j<ncomp;j++){
   75 +						uint16 samp = buffer[*bufferoffset+11+(3*j)];
   76 +						if( (samp>>4) > h_samp) 
   77 +							h_samp = (samp>>4);
   78 +						if( (samp & 0x0f) > v_samp) 
   79 +							v_samp = (samp & 0x0f);
   80  					}
   81  					v_samp*=8;
   82  					h_samp*=8;
   83 @@ -3381,45 +3404,43 @@
   84                                            (unsigned char) ((height>>8) & 0xff);
   85  					buffer[*bufferoffset+6]=
   86                                              (unsigned char) (height & 0xff);
   87 -					*bufferoffset+=strip[i+2]+2;
   88 -					i+=strip[i+2]+2;
   89 -
   90 +					*bufferoffset+=datalen+2;
   91 +					/* insert a DRI marker */
   92  					buffer[(*bufferoffset)++]=0xff;
   93  					buffer[(*bufferoffset)++]=0xdd;
   94  					buffer[(*bufferoffset)++]=0x00;
   95  					buffer[(*bufferoffset)++]=0x04;
   96  					buffer[(*bufferoffset)++]=(ri >> 8) & 0xff;
   97  					buffer[(*bufferoffset)++]= ri & 0xff;
   98 -				} else {
   99 -					i+=strip[i+2]+2;
  100  				}
  101  				break;
  102 -			case 0xc4:
  103 -			case 0xdb:
  104 -				_TIFFmemcpy(&(buffer[*bufferoffset]), &(strip[i-1]), strip[i+2]+2);
  105 -				*bufferoffset+=strip[i+2]+2;
  106 -				i+=strip[i+2]+2;
  107 +			case 0xc4: /* DHT */
  108 +			case 0xdb: /* DQT */
  109 +				_TIFFmemcpy(&(buffer[*bufferoffset]), &(strip[i-1]), datalen+2);
  110 +				*bufferoffset+=datalen+2;
  111  				break;
  112 -			case 0xda:
  113 +			case 0xda: /* SOS */
  114  				if(no==0){
  115 -					_TIFFmemcpy(&(buffer[*bufferoffset]), &(strip[i-1]), strip[i+2]+2);
  116 -					*bufferoffset+=strip[i+2]+2;
  117 -					i+=strip[i+2]+2;
  118 +					_TIFFmemcpy(&(buffer[*bufferoffset]), &(strip[i-1]), datalen+2);
  119 +					*bufferoffset+=datalen+2;
  120  				} else {
  121  					buffer[(*bufferoffset)++]=0xff;
  122  					buffer[(*bufferoffset)++]=
  123                                              (unsigned char)(0xd0 | ((no-1)%8));
  124 -					i+=strip[i+2]+2;
  125  				}
  126 -				_TIFFmemcpy(&(buffer[*bufferoffset]), &(strip[i-1]), (*striplength)-i-1);
  127 -				*bufferoffset+=(*striplength)-i-1;
  128 +				i += datalen + 1;
  129 +				/* copy remainder of strip */
  130 +				_TIFFmemcpy(&(buffer[*bufferoffset]), &(strip[i]), *striplength - i);
  131 +				*bufferoffset+= *striplength - i;
  132  				return(1);
  133  			default:
  134 -				i+=strip[i+2]+2;
  135 +				/* ignore any other marker */
  136 +				break;
  137  		}
  138 +		i += datalen + 1;
  139  	}
  140 -	
  141  
  142 +	/* failed to find SOS marker */
  143  	return(0);
  144  }
  145  #endif

Generated by cgit