svn commit: samba r23572 - in branches: SAMBA_3_0/source/lib	SAMBA_3_0_25/source/lib SAMBA_3_0_26/source/lib Author: jra Date: 2007-06-21 17:25:13 +0000 (Thu, 21 Jun 2007) New Revision: 23572 WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=23572 Log: Ensure we obey Unicode consortium restrictions. Code based on patch from MORIYAMA Masayuki . Jeremy. Modified:    branches/SAMBA_3_0/source/lib/iconv.c    branches/SAMBA_3_0_25/source/lib/iconv.c    branches/SAMBA_3_0_26/source/lib/iconv.c Changeset: Modified: branches/SAMBA_3_0/source/lib/iconv.c =================================================================== --- branches/SAMBA_3_0/source/lib/iconv.c	2007-06-21 17:05:59 UTC (rev 23571) +++ branches/SAMBA_3_0/source/lib/iconv.c	2007-06-21 17:25:13 UTC (rev 23572) @@ -544,6 +544,8 @@  	uint8 *uc = (uint8 *)*outbuf;    	while (in_left >= 1 && out_left >= 2) { +		unsigned int codepoint; +  		if ((c[0] & 0x80) == 0) {  			uc[0] = c[0];  			uc[1] = 0; @@ -560,8 +562,14 @@  				errno = EILSEQ;  				goto error;  			} -			uc[1] = (c[0]>>2) & 0x7; -			uc[0] = (c[0]<<6) | (c[1]&0x3f); +			codepoint = (c[1]&0x3f) | ((c[0]&0x1f)<<6); +			if (codepoint < 0x80) { +				/* don't accept UTF-8 characters that are not minimally packed */ +				errno = EILSEQ; +				goto error; +			} +			uc[1] = codepoint >> 8; +			uc[0] = codepoint & 0xff;  			c  += 2;  			in_left  -= 2;  			out_left -= 2; @@ -576,8 +584,14 @@  				errno = EILSEQ;  				goto error;  			} -			uc[1] = ((c[0]&0xF)<<4) | ((c[1]>>2)&0xF); -			uc[0] = (c[1]<<6) | (c[2]&0x3f); +			codepoint = (c[2]&0x3f) | ((c[1]&0x3f)<<6) | ((c[0]&0xf)<<12); +			if (codepoint < 0x800) { +				/* don't accept UTF-8 characters that are not minimally packed */ +				errno = EILSEQ; +				goto error; +			} +			uc[1] = codepoint >> 8; +			uc[0] = codepoint & 0xff;  			c  += 3;  			in_left  -= 3;  			out_left -= 2; @@ -586,7 +600,6 @@  		}    		if ((c[0] & 0xf8) == 0xf0) { -			unsigned int codepoint;  			if (in_left < 4 ||  			    (c[1] & 0xc0) != 0x80 ||   			    (c[2] & 0xc0) != 0x80 || @@ -599,16 +612,10 @@  				((c[2]&0x3f)<<6) |   				((c[1]&0x3f)<<12) |  				((c[0]&0x7)<<18); -			if (codepoint < 0x10000) { -				/* accept UTF-8 characters that are not -				   minimally packed, but pack the result */ -				uc[0] = (codepoint & 0xFF); -				uc[1] = (codepoint >> 8); -				c += 4; -				in_left -= 4; -				out_left -= 2; -				uc += 2; -				continue; +			if (codepoint < 0x10000 || codepoint > 0x10ffff) { +				/* don't accept UTF-8 characters that are not minimally packed */ +				errno = EILSEQ; +				goto error;  			}    			codepoint -= 0x10000; Modified: branches/SAMBA_3_0_25/source/lib/iconv.c =================================================================== --- branches/SAMBA_3_0_25/source/lib/iconv.c	2007-06-21 17:05:59 UTC (rev 23571) +++ branches/SAMBA_3_0_25/source/lib/iconv.c	2007-06-21 17:25:13 UTC (rev 23572) @@ -544,6 +544,8 @@  	uint8 *uc = (uint8 *)*outbuf;    	while (in_left >= 1 && out_left >= 2) { +		unsigned int codepoint; +  		if ((c[0] & 0x80) == 0) {  			uc[0] = c[0];  			uc[1] = 0; @@ -560,8 +562,14 @@  				errno = EILSEQ;  				goto error;  			} -			uc[1] = (c[0]>>2) & 0x7; -			uc[0] = (c[0]<<6) | (c[1]&0x3f); +			codepoint = (c[1]&0x3f) | ((c[0]&0x1f)<<6); +			if (codepoint < 0x80) { +				/* don't accept UTF-8 characters that are not minimally packed */ +				errno = EILSEQ; +				goto error; +			} +			uc[1] = codepoint >> 8; +			uc[0] = codepoint & 0xff;  			c  += 2;  			in_left  -= 2;  			out_left -= 2; @@ -576,8 +584,14 @@  				errno = EILSEQ;  				goto error;  			} -			uc[1] = ((c[0]&0xF)<<4) | ((c[1]>>2)&0xF); -			uc[0] = (c[1]<<6) | (c[2]&0x3f); +			codepoint = (c[2]&0x3f) | ((c[1]&0x3f)<<6) | ((c[0]&0xf)<<12); +			if (codepoint < 0x800) { +				/* don't accept UTF-8 characters that are not minimally packed */ +				errno = EILSEQ; +				goto error; +			} +			uc[1] = codepoint >> 8; +			uc[0] = codepoint & 0xff;  			c  += 3;  			in_left  -= 3;  			out_left -= 2; @@ -586,7 +600,6 @@  		}    		if ((c[0] & 0xf8) == 0xf0) { -			unsigned int codepoint;  			if (in_left < 4 ||  			    (c[1] & 0xc0) != 0x80 ||   			    (c[2] & 0xc0) != 0x80 || @@ -599,16 +612,10 @@  				((c[2]&0x3f)<<6) |   				((c[1]&0x3f)<<12) |  				((c[0]&0x7)<<18); -			if (codepoint < 0x10000) { -				/* accept UTF-8 characters that are not -				   minimally packed, but pack the result */ -				uc[0] = (codepoint & 0xFF); -				uc[1] = (codepoint >> 8); -				c += 4; -				in_left -= 4; -				out_left -= 2; -				uc += 2; -				continue; +			if (codepoint < 0x10000 || codepoint > 0x10ffff) { +				/* don't accept UTF-8 characters that are not minimally packed */ +				errno = EILSEQ; +				goto error;  			}    			codepoint -= 0x10000; Modified: branches/SAMBA_3_0_26/source/lib/iconv.c =================================================================== --- branches/SAMBA_3_0_26/source/lib/iconv.c	2007-06-21 17:05:59 UTC (rev 23571) +++ branches/SAMBA_3_0_26/source/lib/iconv.c	2007-06-21 17:25:13 UTC (rev 23572) @@ -544,6 +544,8 @@  	uint8 *uc = (uint8 *)*outbuf;    	while (in_left >= 1 && out_left >= 2) { +		unsigned int codepoint; +  		if ((c[0] & 0x80) == 0) {  			uc[0] = c[0];  			uc[1] = 0; @@ -560,8 +562,14 @@  				errno = EILSEQ;  				goto error;  			} -			uc[1] = (c[0]>>2) & 0x7; -			uc[0] = (c[0]<<6) | (c[1]&0x3f); +			codepoint = (c[1]&0x3f) | ((c[0]&0x1f)<<6); +			if (codepoint < 0x80) { +				/* don't accept UTF-8 characters that are not minimally packed */ +				errno = EILSEQ; +				goto error; +			} +			uc[1] = codepoint >> 8; +			uc[0] = codepoint & 0xff;  			c  += 2;  			in_left  -= 2;  			out_left -= 2; @@ -576,8 +584,14 @@  				errno = EILSEQ;  				goto error;  			} -			uc[1] = ((c[0]&0xF)<<4) | ((c[1]>>2)&0xF); -			uc[0] = (c[1]<<6) | (c[2]&0x3f); +			codepoint = (c[2]&0x3f) | ((c[1]&0x3f)<<6) | ((c[0]&0xf)<<12); +			if (codepoint < 0x800) { +				/* don't accept UTF-8 characters that are not minimally packed */ +				errno = EILSEQ; +				goto error; +			} +			uc[1] = codepoint >> 8; +			uc[0] = codepoint & 0xff;  			c  += 3;  			in_left  -= 3;  			out_left -= 2; @@ -586,7 +600,6 @@  		}    		if ((c[0] & 0xf8) == 0xf0) { -			unsigned int codepoint;  			if (in_left < 4 ||  			    (c[1] & 0xc0) != 0x80 ||   			    (c[2] & 0xc0) != 0x80 || @@ -599,16 +612,10 @@  				((c[2]&0x3f)<<6) |   				((c[1]&0x3f)<<12) |  				((c[0]&0x7)<<18); -			if (codepoint < 0x10000) { -				/* accept UTF-8 characters that are not -				   minimally packed, but pack the result */ -				uc[0] = (codepoint & 0xFF); -				uc[1] = (codepoint >> 8); -				c += 4; -				in_left -= 4; -				out_left -= 2; -				uc += 2; -				continue; +			if (codepoint < 0x10000 || codepoint > 0x10ffff) { +				/* don't accept UTF-8 characters that are not minimally packed */ +				errno = EILSEQ; +				goto error;  			}    			codepoint -= 0x10000;