Prevent overflow beyond the end of string in wtf_parse1()
Bug-Debian: https://github.com/tats/w3m/issues/68
This commit is contained in:
		
							
								
								
									
										42
									
								
								libwc/wtf.c
									
									
									
									
									
								
							
							
						
						
									
										42
									
								
								libwc/wtf.c
									
									
									
									
									
								
							| @@ -391,45 +391,51 @@ wtf_parse1(wc_uchar **p) | ||||
| 	cc.code = *(q++); | ||||
|     } else if (*q > 0xa0) { | ||||
| 	cc.ccs = wtf_gr_ccs; | ||||
| 	if (WC_CCS_IS_WIDE(cc.ccs)) { | ||||
| 	if (WC_CCS_IS_WIDE(cc.ccs) && *(q+1)) { | ||||
| 	    cc.code = ((wc_uint32)*q << 8) | *(q+1); | ||||
| 	    q += 2; | ||||
| 	} else | ||||
| 	    cc.code = *(q++); | ||||
|     } else { | ||||
| 	cc.ccs = (wc_uint32)CCS_MAP[*(q++) - 0x80] << 8; | ||||
| 	cc.ccs = WC_CCS_US_ASCII; | ||||
| 	cc.code = (wc_uint32)' '; | ||||
| 	if (*q) | ||||
| 	    cc.ccs = (wc_uint32)CCS_MAP[*(q++) - 0x80] << 8; | ||||
| 	switch (WC_CCS_TYPE(cc.ccs)) { | ||||
| 	case WC_CCS_A_CS94: | ||||
| 	case WC_CCS_A_CS96: | ||||
| 	case WC_CCS_A_CS942: | ||||
| 	case WC_CCS_A_PCS: | ||||
| 	case WC_CCS_A_UNKNOWN: | ||||
| 	    cc.ccs |= *(q++) & 0x7f; | ||||
| 	    cc.code = *(q++); | ||||
| 	    if (*q && *(q+1)) { | ||||
| 		cc.ccs |= *(q++) & 0x7f; | ||||
| 		cc.code = *(q++); | ||||
| 	    } | ||||
| 	    break; | ||||
| 	case WC_CCS_A_CS94W: | ||||
| 	case WC_CCS_A_CS96W: | ||||
| 	case WC_CCS_A_PCSW: | ||||
| 	    cc.ccs |= *(q++) & 0x7f; | ||||
| 	    cc.code = ((wc_uint32)*q << 8) | *(q+1); | ||||
| 	    q += 2; | ||||
| 	    if (*q && *(q+1) && *(q+2)) { | ||||
| 		cc.ccs |= *(q++) & 0x7f; | ||||
| 		cc.code = ((wc_uint32)*q << 8) | *(q+1); | ||||
| 		q += 2; | ||||
| 	    } | ||||
| 	    break; | ||||
| 	case WC_CCS_A_WCS16: | ||||
| 	case WC_CCS_A_WCS16W: | ||||
| 	    cc.ccs |= (*q & 0x7c) >> 2; | ||||
| 	    cc.code = wtf_to_wcs16(q); | ||||
| 	    q += 3; | ||||
| 	    if (*q && *(q+1) && *(q+2)) { | ||||
| 		cc.ccs |= (*q & 0x7c) >> 2; | ||||
| 		cc.code = wtf_to_wcs16(q); | ||||
| 		q += 3; | ||||
| 	    } | ||||
| 	    break; | ||||
| 	case WC_CCS_A_WCS32: | ||||
| 	case WC_CCS_A_WCS32W: | ||||
| 	    cc.ccs |= (*q & 0x70) >> 4; | ||||
| 	    cc.code = wtf_to_wcs32(q); | ||||
| 	    q += 5; | ||||
| 	    break; | ||||
| 	default: | ||||
| 	/* case 0: */ | ||||
| 	    cc.ccs = WC_CCS_US_ASCII; | ||||
| 	    cc.code = (wc_uint32)' '; | ||||
| 	    if (*q && *(q+1) && *(q+2) && *(q+3) && *(q+4)) { | ||||
| 		cc.ccs |= (*q & 0x70) >> 4; | ||||
| 		cc.code = wtf_to_wcs32(q); | ||||
| 		q += 5; | ||||
| 	    } | ||||
| 	    break; | ||||
| 	} | ||||
|     } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user