pkgsrc-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[pkgsrc/trunk]: pkgsrc/lang/php5 Add patch to check byte sequence more strict...
details: https://anonhg.NetBSD.org/pkgsrc/rev/9724b111bba5
branches: trunk
changeset: 400563:9724b111bba5
user: taca <taca%pkgsrc.org@localhost>
date: Thu Oct 22 14:49:06 2009 +0000
description:
Add patch to check byte sequence more strictly in htmlspecialchars().
http://bugs.php.net/bug.php?id=49785
These are patch refrects r289411, r289554, r289565, r289567 and r289605
in PHP svn repositry.
Bump PKGREVISION.
diffstat:
lang/php5/Makefile | 3 +-
lang/php5/distinfo | 3 +-
lang/php5/patches/patch-az | 368 +++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 372 insertions(+), 2 deletions(-)
diffs (truncated from 398 to 300 lines):
diff -r 9e76df7da33d -r 9724b111bba5 lang/php5/Makefile
--- a/lang/php5/Makefile Thu Oct 22 14:41:32 2009 +0000
+++ b/lang/php5/Makefile Thu Oct 22 14:49:06 2009 +0000
@@ -1,6 +1,7 @@
-# $NetBSD: Makefile,v 1.72 2009/06/09 15:15:07 sketch Exp $
+# $NetBSD: Makefile,v 1.73 2009/10/22 14:49:06 taca Exp $
PKGNAME= php-${PHP_BASE_VERS}
+PKGREVISION= 1
CATEGORIES= lang
HOMEPAGE= http://www.php.net/
COMMENT= PHP Hypertext Preprocessor version 5
diff -r 9e76df7da33d -r 9724b111bba5 lang/php5/distinfo
--- a/lang/php5/distinfo Thu Oct 22 14:41:32 2009 +0000
+++ b/lang/php5/distinfo Thu Oct 22 14:49:06 2009 +0000
@@ -1,4 +1,4 @@
-$NetBSD: distinfo,v 1.68 2009/10/22 14:37:47 taca Exp $
+$NetBSD: distinfo,v 1.69 2009/10/22 14:49:06 taca Exp $
SHA1 (php-5.2.11/php-5.2.11.tar.bz2) = 819c853ce657ef260d4a73b5a21f961115b97eef
RMD160 (php-5.2.11/php-5.2.11.tar.bz2) = 6aad53dee864ab89f794a9d3c2aa32d435ed5654
@@ -17,3 +17,4 @@
SHA1 (patch-ar) = 2d74ec926cc00bfbb67d16210af78c33ad9ac38d
SHA1 (patch-as) = f7ce5caffe2acdd1f8e9fc8ae6c7ba1d8c6a25c1
SHA1 (patch-ay) = c2667dd398c1c58e55f459f2df02613dc028e9cc
+SHA1 (patch-az) = ebdd76b8a5e6cf853b467a67fc6c8948a91d822a
diff -r 9e76df7da33d -r 9724b111bba5 lang/php5/patches/patch-az
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lang/php5/patches/patch-az Thu Oct 22 14:49:06 2009 +0000
@@ -0,0 +1,368 @@
+$NetBSD$
+
+* Fix for htmlspecialchars(): r289411, r289554, r289565, r289567, r289605.
+
+--- ext/standard/html.c.orig 2008-12-31 20:17:49.000000000 +0900
++++ ext/standard/html.c
+@@ -484,15 +484,31 @@ struct basic_entities_dec {
+ } \
+ mbseq[mbpos++] = (mbchar); }
+
+-#define CHECK_LEN(pos, chars_need) \
+- if((str_len - (pos)) < chars_need) { \
+- *status = FAILURE; \
+- return 0; \
++/* skip one byte and return */
++#define MB_FAILURE(pos) do { \
++ *newpos = pos + 1; \
++ *status = FAILURE; \
++ return 0; \
++ } while (0)
++
++#define CHECK_LEN(pos, chars_need) \
++ if (chars_need < 1) { \
++ if((str_len - (pos)) < chars_need) { \
++ *newpos = pos; \
++ *status = FAILURE; \
++ return 0; \
++ } \
++ } else { \
++ if((str_len - (pos)) < chars_need) { \
++ *newpos = pos + 1; \
++ *status = FAILURE; \
++ return 0; \
++ } \
+ }
+
+ /* {{{ get_next_char
+ */
+-inline static unsigned short get_next_char(enum entity_charset charset,
++inline static unsigned int get_next_char(enum entity_charset charset,
+ unsigned char * str,
+ int str_len,
+ int * newpos,
+@@ -503,205 +519,189 @@ inline static unsigned short get_next_ch
+ int pos = *newpos;
+ int mbpos = 0;
+ int mbspace = *mbseqlen;
+- unsigned short this_char = str[pos++];
++ unsigned int this_char = 0;
+ unsigned char next_char;
+
+ *status = SUCCESS;
+-
++
+ if (mbspace <= 0) {
+ *mbseqlen = 0;
+- return this_char;
++ CHECK_LEN(pos, 1);
++ *newpos = pos + 1;
++ *newpos = pos + 1;
+ }
+-
+- MB_WRITE((unsigned char)this_char);
+-
++
+ switch (charset) {
+ case cs_utf_8:
+ {
+- unsigned long utf = 0;
+- int stat = 0;
+- int more = 1;
+-
+- /* unpack utf-8 encoding into a wide char.
+- * Code stolen from the mbstring extension */
+-
+- do {
+- if (this_char < 0x80) {
+- more = 0;
+- if(stat) {
+- /* we didn't finish the UTF sequence correctly */
+- *status = FAILURE;
+- }
+- break;
+- } else if (this_char < 0xc0) {
+- switch (stat) {
+- case 0x10: /* 2, 2nd */
+- case 0x21: /* 3, 3rd */
+- case 0x32: /* 4, 4th */
+- case 0x43: /* 5, 5th */
+- case 0x54: /* 6, 6th */
+- /* last byte in sequence */
+- more = 0;
+- utf |= (this_char & 0x3f);
+- this_char = (unsigned short)utf;
+- break;
+- case 0x20: /* 3, 2nd */
+- case 0x31: /* 4, 3rd */
+- case 0x42: /* 5, 4th */
+- case 0x53: /* 6, 5th */
+- /* penultimate char */
+- utf |= ((this_char & 0x3f) << 6);
+- stat++;
+- break;
+- case 0x30: /* 4, 2nd */
+- case 0x41: /* 5, 3rd */
+- case 0x52: /* 6, 4th */
+- utf |= ((this_char & 0x3f) << 12);
+- stat++;
+- break;
+- case 0x40: /* 5, 2nd */
+- case 0x51:
+- utf |= ((this_char & 0x3f) << 18);
+- stat++;
+- break;
+- case 0x50: /* 6, 2nd */
+- utf |= ((this_char & 0x3f) << 24);
+- stat++;
+- break;
+- default:
+- /* invalid */
+- *status = FAILURE;
+- more = 0;
+- }
+- }
+- /* lead byte */
+- else if (this_char < 0xe0) {
+- stat = 0x10; /* 2 byte */
+- utf = (this_char & 0x1f) << 6;
+- CHECK_LEN(pos, 1);
+- } else if (this_char < 0xf0) {
+- stat = 0x20; /* 3 byte */
+- utf = (this_char & 0xf) << 12;
+- CHECK_LEN(pos, 2);
+- } else if (this_char < 0xf8) {
+- stat = 0x30; /* 4 byte */
+- utf = (this_char & 0x7) << 18;
+- CHECK_LEN(pos, 3);
+- } else if (this_char < 0xfc) {
+- stat = 0x40; /* 5 byte */
+- utf = (this_char & 0x3) << 24;
+- CHECK_LEN(pos, 4);
+- } else if (this_char < 0xfe) {
+- stat = 0x50; /* 6 byte */
+- utf = (this_char & 0x1) << 30;
+- CHECK_LEN(pos, 5);
+- } else {
+- /* invalid; bail */
+- more = 0;
+- *status = FAILURE;
+- break;
++ unsigned char c;
++ CHECK_LEN(pos, 1);
++ c = str[pos];
++ if (c < 0x80) {
++ MB_WRITE(c);
++ this_char = c;
++ pos++;
++ } else if (c < 0xc0) {
++ MB_FAILURE(pos);
++ } else if (c < 0xe0) {
++ CHECK_LEN(pos, 2);
++ if (str[pos + 1] < 0x80 || str[pos + 1] > 0xbf) {
++ MB_FAILURE(pos);
+ }
+-
+- if (more) {
+- this_char = str[pos++];
+- MB_WRITE((unsigned char)this_char);
++ this_char = ((c & 0x1f) << 6) | (str[pos + 1] & 0x3f);
++ if (this_char < 0x80) {
++ MB_FAILURE(pos);
+ }
+- } while (more);
++ MB_WRITE((unsigned char)c);
++ MB_WRITE((unsigned char)str[pos + 1]);
++ pos += 2;
++ } else if (c < 0xf0) {
++ CHECK_LEN(pos, 3);
++ if (str[pos + 1] < 0x80 || str[pos + 1] > 0xbf) {
++ MB_FAILURE(pos);
++ }
++ if (str[pos + 2] < 0x80 || str[pos + 2] > 0xbf) {
++ MB_FAILURE(pos);
++ }
++ this_char = ((c & 0x0f) << 12) | ((str[pos + 1] & 0x3f) << 6) | (str[pos + 2] & 0x3f);
++ if (this_char < 0x800) {
++ MB_FAILURE(pos);
++ }
++ MB_WRITE((unsigned char)c);
++ MB_WRITE((unsigned char)str[pos + 1]);
++ MB_WRITE((unsigned char)str[pos + 2]);
++ pos += 3;
++ } else if (c < 0xf8) {
++ CHECK_LEN(pos, 4);
++ if (str[pos + 1] < 0x80 || str[pos + 1] > 0xbf) {
++ MB_FAILURE(pos);
++ }
++ if (str[pos + 2] < 0x80 || str[pos + 2] > 0xbf) {
++ MB_FAILURE(pos);
++ }
++ if (str[pos + 3] < 0x80 || str[pos + 3] > 0xbf) {
++ MB_FAILURE(pos);
++ }
++ this_char = ((c & 0x07) << 18) | ((str[pos + 1] & 0x3f) << 12) | ((str[pos + 2] & 0x3f) << 6) | (str[pos + 3] & 0x3f);
++ if (this_char < 0x10000) {
++ MB_FAILURE(pos);
++ }
++ MB_WRITE((unsigned char)c);
++ MB_WRITE((unsigned char)str[pos + 1]);
++ MB_WRITE((unsigned char)str[pos + 2]);
++ MB_WRITE((unsigned char)str[pos + 3]);
++ pos += 4;
++ } else {
++ MB_FAILURE(pos);
++ }
+ }
+ break;
+ case cs_big5:
+ case cs_gb2312:
+ case cs_big5hkscs:
+ {
++ CHECK_LEN(pos, 1);
++ this_char = str[pos++];
+ /* check if this is the first of a 2-byte sequence */
+- if (this_char >= 0xa1 && this_char <= 0xfe) {
++ if (this_char >= 0x81 && this_char <= 0xfe) {
+ /* peek at the next char */
+ CHECK_LEN(pos, 1);
+- next_char = str[pos];
++ next_char = str[pos++];
+ if ((next_char >= 0x40 && next_char <= 0x7e) ||
+ (next_char >= 0xa1 && next_char <= 0xfe)) {
+ /* yes, this a wide char */
+- this_char <<= 8;
++ MB_WRITE(this_char);
+ MB_WRITE(next_char);
+- this_char |= next_char;
+- pos++;
++ this_char = (this_char << 8) | next_char;
++ } else {
++ MB_FAILURE(pos);
+ }
+-
++ } else {
++ MB_WRITE(this_char);
+ }
+- break;
+ }
++ break;
+ case cs_sjis:
+ {
++ CHECK_LEN(pos, 1);
++ this_char = str[pos++];
+ /* check if this is the first of a 2-byte sequence */
+- if ( (this_char >= 0x81 && this_char <= 0x9f) ||
+- (this_char >= 0xe0 && this_char <= 0xef)
+- ) {
++ if ((this_char >= 0x81 && this_char <= 0x9f) ||
++ (this_char >= 0xe0 && this_char <= 0xfc)) {
+ /* peek at the next char */
+ CHECK_LEN(pos, 1);
+- next_char = str[pos];
++ next_char = str[pos++];
+ if ((next_char >= 0x40 && next_char <= 0x7e) ||
+ (next_char >= 0x80 && next_char <= 0xfc))
+ {
+ /* yes, this a wide char */
+- this_char <<= 8;
++ MB_WRITE(this_char);
+ MB_WRITE(next_char);
Home |
Main Index |
Thread Index |
Old Index