1*4882a593SmuzhiyunFrom cca32f0d4f3dd2bd73d044bd6991ab3c764fc718 Mon Sep 17 00:00:00 2001 2*4882a593SmuzhiyunFrom: Su_Laus <sulau@freenet.de> 3*4882a593SmuzhiyunDate: Sun, 6 Feb 2022 17:53:53 +0100 4*4882a593SmuzhiyunSubject: [PATCH] tiffcrop.c: This update fixes also issues #350 and #351. 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun Issue 350 is fixed by checking for not allowed zone input cases like -Z 0:0 7*4882a593Smuzhiyun in getCropOffsets(). 8*4882a593Smuzhiyun 9*4882a593SmuzhiyunCVE: CVE-2022-2867 10*4882a593Smuzhiyun 11*4882a593SmuzhiyunUpstream-Status: Backport 12*4882a593Smuzhiyun[https://gitlab.com/libtiff/libtiff/-/commit/7d7bfa4416366ec64068ac389414241ed4730a54?merge_request_iid=294] 13*4882a593Smuzhiyun 14*4882a593SmuzhiyunSigned-off-by: Teoh Jay Shen <jay.shen.teoh@intel.com> 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun--- 17*4882a593Smuzhiyun tools/tiffcrop.c | 58 +++++++++++++++++++++++++++++++++--------------- 18*4882a593Smuzhiyun 1 file changed, 40 insertions(+), 18 deletions(-) 19*4882a593Smuzhiyun 20*4882a593Smuzhiyundiff --git a/tools/tiffcrop.c b/tools/tiffcrop.c 21*4882a593Smuzhiyunindex 4a4ace8..0ef5bb2 100644 22*4882a593Smuzhiyun--- a/tools/tiffcrop.c 23*4882a593Smuzhiyun+++ b/tools/tiffcrop.c 24*4882a593Smuzhiyun@@ -5194,20 +5194,33 @@ computeInputPixelOffsets(struct crop_mask *crop, struct image_data *image, 25*4882a593Smuzhiyun y1 = _TIFFClampDoubleToUInt32(crop->corners[i].Y1); 26*4882a593Smuzhiyun y2 = _TIFFClampDoubleToUInt32(crop->corners[i].Y2); 27*4882a593Smuzhiyun } 28*4882a593Smuzhiyun- /* region needs to be within image sizes 0.. width-1; 0..length-1 29*4882a593Smuzhiyun- * - be aware x,y are already casted to (uint32_t) and avoid (0 - 1) 30*4882a593Smuzhiyun+ /* a) Region needs to be within image sizes 0.. width-1; 0..length-1 31*4882a593Smuzhiyun+ * b) Corners are expected to be submitted as top-left to bottom-right. 32*4882a593Smuzhiyun+ * Therefore, check that and reorder input. 33*4882a593Smuzhiyun+ * (be aware x,y are already casted to (uint32_t) and avoid (0 - 1) ) 34*4882a593Smuzhiyun */ 35*4882a593Smuzhiyun- if (x1 > image->width - 1) 36*4882a593Smuzhiyun+ uint32_t aux; 37*4882a593Smuzhiyun+ if (x1 > x2) { 38*4882a593Smuzhiyun+ aux = x1; 39*4882a593Smuzhiyun+ x1 = x2; 40*4882a593Smuzhiyun+ x2 = aux; 41*4882a593Smuzhiyun+ } 42*4882a593Smuzhiyun+ if (y1 > y2) { 43*4882a593Smuzhiyun+ aux = y1; 44*4882a593Smuzhiyun+ y1 = y2; 45*4882a593Smuzhiyun+ y2 = aux; 46*4882a593Smuzhiyun+ } 47*4882a593Smuzhiyun+ if (x1 > image->width - 1) 48*4882a593Smuzhiyun crop->regionlist[i].x1 = image->width - 1; 49*4882a593Smuzhiyun- else if (x1 > 0) 50*4882a593Smuzhiyun- crop->regionlist[i].x1 = (uint32_t) (x1 - 1); 51*4882a593Smuzhiyun+ else if (x1 > 0) 52*4882a593Smuzhiyun+ crop->regionlist[i].x1 = (uint32_t)(x1 - 1); 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun- if (x2 > image->width - 1) 55*4882a593Smuzhiyun- crop->regionlist[i].x2 = image->width - 1; 56*4882a593Smuzhiyun- else if (x2 > 0) 57*4882a593Smuzhiyun- crop->regionlist[i].x2 = (uint32_t)(x2 - 1); 58*4882a593Smuzhiyun+ if (x2 > image->width - 1) 59*4882a593Smuzhiyun+ crop->regionlist[i].x2 = image->width - 1; 60*4882a593Smuzhiyun+ else if (x2 > 0) 61*4882a593Smuzhiyun+ crop->regionlist[i].x2 = (uint32_t)(x2 - 1); 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun- zwidth = crop->regionlist[i].x2 - crop->regionlist[i].x1 + 1; 64*4882a593Smuzhiyun+ zwidth = crop->regionlist[i].x2 - crop->regionlist[i].x1 + 1; 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun if (y1 > image->length - 1) 67*4882a593Smuzhiyun crop->regionlist[i].y1 = image->length - 1; 68*4882a593Smuzhiyun@@ -5219,8 +5232,7 @@ computeInputPixelOffsets(struct crop_mask *crop, struct image_data *image, 69*4882a593Smuzhiyun else if (y2 > 0) 70*4882a593Smuzhiyun crop->regionlist[i].y2 = (uint32_t)(y2 - 1); 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun- zlength = crop->regionlist[i].y2 - crop->regionlist[i].y1 + 1; 73*4882a593Smuzhiyun- 74*4882a593Smuzhiyun+ zlength = crop->regionlist[i].y2 - crop->regionlist[i].y1 + 1; 75*4882a593Smuzhiyun if (zwidth > max_width) 76*4882a593Smuzhiyun max_width = zwidth; 77*4882a593Smuzhiyun if (zlength > max_length) 78*4882a593Smuzhiyun@@ -5250,7 +5262,7 @@ computeInputPixelOffsets(struct crop_mask *crop, struct image_data *image, 79*4882a593Smuzhiyun } 80*4882a593Smuzhiyun } 81*4882a593Smuzhiyun return (0); 82*4882a593Smuzhiyun- } 83*4882a593Smuzhiyun+ } /* crop_mode == CROP_REGIONS */ 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun /* Convert crop margins into offsets into image 86*4882a593Smuzhiyun * Margins are expressed as pixel rows and columns, not bytes 87*4882a593Smuzhiyun@@ -5286,7 +5298,7 @@ computeInputPixelOffsets(struct crop_mask *crop, struct image_data *image, 88*4882a593Smuzhiyun bmargin = (uint32_t) 0; 89*4882a593Smuzhiyun return (-1); 90*4882a593Smuzhiyun } 91*4882a593Smuzhiyun- } 92*4882a593Smuzhiyun+ } /* crop_mode == CROP_MARGINS */ 93*4882a593Smuzhiyun else 94*4882a593Smuzhiyun { /* no margins requested */ 95*4882a593Smuzhiyun tmargin = (uint32_t) 0; 96*4882a593Smuzhiyun@@ -5494,10 +5506,17 @@ getCropOffsets(struct image_data *image, struct crop_mask *crop, struct dump_opt 97*4882a593Smuzhiyun else 98*4882a593Smuzhiyun crop->selections = crop->zones; 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun- for (i = 0; i < crop->zones; i++) 101*4882a593Smuzhiyun+ /* Initialize regions iterator i */ 102*4882a593Smuzhiyun+ i = 0; 103*4882a593Smuzhiyun+ for (int j = 0; j < crop->zones; j++) 104*4882a593Smuzhiyun { 105*4882a593Smuzhiyun- seg = crop->zonelist[i].position; 106*4882a593Smuzhiyun- total = crop->zonelist[i].total; 107*4882a593Smuzhiyun+ seg = crop->zonelist[j].position; 108*4882a593Smuzhiyun+ total = crop->zonelist[j].total; 109*4882a593Smuzhiyun+ 110*4882a593Smuzhiyun+ /* check for not allowed zone cases like 0:0; 4:3; etc. and skip that input */ 111*4882a593Smuzhiyun+ if (seg == 0 || total == 0 || seg > total) { 112*4882a593Smuzhiyun+ continue; 113*4882a593Smuzhiyun+ } 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun switch (crop->edge_ref) 116*4882a593Smuzhiyun { 117*4882a593Smuzhiyun@@ -5626,8 +5645,11 @@ getCropOffsets(struct image_data *image, struct crop_mask *crop, struct dump_opt 118*4882a593Smuzhiyun i + 1, zwidth, zlength, 119*4882a593Smuzhiyun crop->regionlist[i].x1, crop->regionlist[i].x2, 120*4882a593Smuzhiyun crop->regionlist[i].y1, crop->regionlist[i].y2); 121*4882a593Smuzhiyun+ /* increment regions iterator */ 122*4882a593Smuzhiyun+ i++; 123*4882a593Smuzhiyun } 124*4882a593Smuzhiyun- 125*4882a593Smuzhiyun+ /* set number of generated regions out of given zones */ 126*4882a593Smuzhiyun+ crop->selections = i; 127*4882a593Smuzhiyun return (0); 128*4882a593Smuzhiyun } /* end getCropOffsets */ 129*4882a593Smuzhiyun 130