SOURCES: python-bug-1557232.patch (NEW), python-bug-1572832.patch ...

arekm arekm at pld-linux.org
Mon Jan 8 11:51:15 CET 2007


Author: arekm                        Date: Mon Jan  8 10:51:15 2007 GMT
Module: SOURCES                       Tag: HEAD
---- Log message:
- three segfault fixes

---- Files affected:
SOURCES:
   python-bug-1557232.patch (NONE -> 1.1)  (NEW), python-bug-1572832.patch (NONE -> 1.1)  (NEW), python-segfault-onwarn.patch (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: SOURCES/python-bug-1557232.patch
diff -u /dev/null SOURCES/python-bug-1557232.patch:1.1
--- /dev/null	Mon Jan  8 11:51:15 2007
+++ SOURCES/python-bug-1557232.patch	Mon Jan  8 11:51:10 2007
@@ -0,0 +1,158 @@
+Index: Python/ast.c
+===================================================================
+--- Python/ast.c	(wersja 51998)
++++ Python/ast.c	(wersja 51999)
+@@ -566,10 +566,17 @@
+     if (!args)
+         return NULL;
+ 
++    /* fpdef: NAME | '(' fplist ')'
++       fplist: fpdef (',' fpdef)* [',']
++    */
+     REQ(n, fplist);
+     for (i = 0; i < len; i++) {
+-        const node *child = CHILD(CHILD(n, 2*i), 0);
++        const node *fpdef_node = CHILD(n, 2*i);
++        const node *child;
+         expr_ty arg;
++set_name:
++        /* fpdef_node is either a NAME or an fplist */
++        child = CHILD(fpdef_node, 0);
+         if (TYPE(child) == NAME) {
+     		if (!strcmp(STR(child), "None")) {
+ 	    		ast_error(child, "assignment to None");
+@@ -579,7 +586,17 @@
+                        child->n_col_offset, c->c_arena);
+ 	    }
+         else {
+-            arg = compiler_complex_args(c, CHILD(CHILD(n, 2*i), 1));
++            assert(TYPE(fpdef_node) == fpdef);
++            /* fpdef_node[0] is not a name, so it must be a '(', get CHILD[1] */
++            child = CHILD(fpdef_node, 1);
++            assert(TYPE(child) == fplist);
++            /* NCH == 1 means we have (x), we need to elide the extra parens */
++            if (NCH(child) == 1) {
++                fpdef_node = CHILD(child, 0);
++                assert(TYPE(fpdef_node) == fpdef);
++                goto set_name;
++            }
++            arg = compiler_complex_args(c, child);
+         }
+         asdl_seq_SET(args, i, arg);
+     }
+@@ -637,6 +654,7 @@
+ 	ch = CHILD(n, i);
+ 	switch (TYPE(ch)) {
+             case fpdef:
++            handle_fpdef:
+                 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
+                    anything other than EQUAL or a comma? */
+                 /* XXX Should NCH(n) check be made a separate check? */
+@@ -662,7 +680,11 @@
+ 			asdl_seq_SET(args, k++, compiler_complex_args(c, ch));
+ 		    } else {
+ 			/* def foo((x)): setup for checking NAME below. */
++			/* Loop because there can be many parens and tuple
++			   upacking mixed in. */
+ 			ch = CHILD(ch, 0);
++			assert(TYPE(ch) == fpdef);
++			goto handle_fpdef;
+ 		    }
+                 }
+                 if (TYPE(CHILD(ch, 0)) == NAME) {
+Index: Lib/test/test_complex_args.py
+===================================================================
+--- Lib/test/test_complex_args.py	(wersja 0)
++++ Lib/test/test_complex_args.py	(wersja 51999)
+@@ -0,0 +1,91 @@
++
++import unittest
++from test import test_support
++
++class ComplexArgsTestCase(unittest.TestCase):
++
++    def check(self, func, expected, *args):
++        self.assertEqual(func(*args), expected)
++
++    # These functions are tested below as lambdas too.  If you add a function test,
++    # also add a similar lambda test.
++
++    def test_func_parens_no_unpacking(self):
++        def f(((((x))))): return x
++        self.check(f, 1, 1)
++        # Inner parens are elided, same as: f(x,)
++        def f(((x)),): return x
++        self.check(f, 2, 2)
++
++    def test_func_1(self):
++        def f(((((x),)))): return x
++        self.check(f, 3, (3,))
++        def f(((((x)),))): return x
++        self.check(f, 4, (4,))
++        def f(((((x))),)): return x
++        self.check(f, 5, (5,))
++        def f(((x),)): return x
++        self.check(f, 6, (6,))
++
++    def test_func_2(self):
++        def f(((((x)),),)): return x
++        self.check(f, 2, ((2,),))
++
++    def test_func_3(self):
++        def f((((((x)),),),)): return x
++        self.check(f, 3, (((3,),),))
++
++    def test_func_complex(self):
++        def f((((((x)),),),), a, b, c): return x, a, b, c
++        self.check(f, (3, 9, 8, 7), (((3,),),), 9, 8, 7)
++
++        def f(((((((x)),)),),), a, b, c): return x, a, b, c
++        self.check(f, (3, 9, 8, 7), (((3,),),), 9, 8, 7)
++
++        def f(a, b, c, ((((((x)),)),),)): return a, b, c, x
++        self.check(f, (9, 8, 7, 3), 9, 8, 7, (((3,),),))
++
++    # Duplicate the tests above, but for lambda.  If you add a lambda test,
++    # also add a similar function test above.
++
++    def test_lambda_parens_no_unpacking(self):
++        f = lambda (((((x))))): x
++        self.check(f, 1, 1)
++        # Inner parens are elided, same as: f(x,)
++        f = lambda ((x)),: x
++        self.check(f, 2, 2)
++
++    def test_lambda_1(self):
++        f = lambda (((((x),)))): x
++        self.check(f, 3, (3,))
++        f = lambda (((((x)),))): x
++        self.check(f, 4, (4,))
++        f = lambda (((((x))),)): x
++        self.check(f, 5, (5,))
++        f = lambda (((x),)): x
++        self.check(f, 6, (6,))
++
++    def test_lambda_2(self):
++        f = lambda (((((x)),),)): x
++        self.check(f, 2, ((2,),))
++
++    def test_lambda_3(self):
++        f = lambda ((((((x)),),),)): x
++        self.check(f, 3, (((3,),),))
++
++    def test_lambda_complex(self):
++        f = lambda (((((x)),),),), a, b, c: (x, a, b, c)
++        self.check(f, (3, 9, 8, 7), (((3,),),), 9, 8, 7)
++
++        f = lambda ((((((x)),)),),), a, b, c: (x, a, b, c)
++        self.check(f, (3, 9, 8, 7), (((3,),),), 9, 8, 7)
++
++        f = lambda a, b, c, ((((((x)),)),),): (a, b, c, x)
++        self.check(f, (9, 8, 7, 3), 9, 8, 7, (((3,),),))
++
++
++def test_main():
++    test_support.run_unittest(ComplexArgsTestCase)
++
++if __name__ == "__main__":
++    test_main()

================================================================
Index: SOURCES/python-bug-1572832.patch
diff -u /dev/null SOURCES/python-bug-1572832.patch:1.1
--- /dev/null	Mon Jan  8 11:51:15 2007
+++ SOURCES/python-bug-1572832.patch	Mon Jan  8 11:51:10 2007
@@ -0,0 +1,89 @@
+Index: Lib/test/test_multibytecodec.py
+===================================================================
+--- Lib/test/test_multibytecodec.py	(wersja 52224)
++++ Lib/test/test_multibytecodec.py	(wersja 52225)
+@@ -208,6 +208,16 @@
+             e = u'\u3406'.encode(encoding)
+             self.failIf(filter(lambda x: x >= '\x80', e))
+ 
++    def test_bug1572832(self):
++        if sys.maxunicode >= 0x10000:
++            myunichr = unichr
++        else:
++            myunichr = lambda x: unichr(0xD7C0+(x>>10)) + unichr(0xDC00+(x&0x3FF))
++
++        for x in xrange(0x10000, 0x110000):
++            # Any ISO 2022 codec will cause the segfault
++            myunichr(x).encode('iso_2022_jp', 'ignore')
++
+ def test_main():
+     suite = unittest.TestSuite()
+     suite.addTest(unittest.makeSuite(Test_MultibyteCodec))
+Index: Modules/cjkcodecs/_codecs_iso2022.c
+===================================================================
+--- Modules/cjkcodecs/_codecs_iso2022.c	(wersja 52224)
++++ Modules/cjkcodecs/_codecs_iso2022.c	(wersja 52225)
+@@ -592,9 +592,11 @@
+ {
+ 	DBCHAR coded;
+ 	assert(*length == 1);
+-	TRYMAP_ENC(cp949, coded, *data)
+-		if (!(coded & 0x8000))
+-			return coded;
++	if (*data < 0x10000) {
++		TRYMAP_ENC(cp949, coded, *data)
++			if (!(coded & 0x8000))
++				return coded;
++	}
+ 	return MAP_UNMAPPABLE;
+ }
+ 
+@@ -628,11 +630,13 @@
+ {
+ 	DBCHAR coded;
+ 	assert(*length == 1);
+-	if (*data == 0xff3c) /* F/W REVERSE SOLIDUS */
+-		return 0x2140;
+-	else TRYMAP_ENC(jisxcommon, coded, *data) {
+-		if (!(coded & 0x8000))
+-			return coded;
++	if (*data < 0x10000) {
++		if (*data == 0xff3c) /* F/W REVERSE SOLIDUS */
++			return 0x2140;
++		else TRYMAP_ENC(jisxcommon, coded, *data) {
++			if (!(coded & 0x8000))
++				return coded;
++		}
+ 	}
+ 	return MAP_UNMAPPABLE;
+ }
+@@ -665,9 +669,11 @@
+ {
+ 	DBCHAR coded;
+ 	assert(*length == 1);
+-	TRYMAP_ENC(jisxcommon, coded, *data) {
+-		if (coded & 0x8000)
+-			return coded & 0x7fff;
++	if (*data < 0x10000) {
++		TRYMAP_ENC(jisxcommon, coded, *data) {
++			if (coded & 0x8000)
++				return coded & 0x7fff;
++		}
+ 	}
+ 	return MAP_UNMAPPABLE;
+ }
+@@ -970,9 +976,11 @@
+ {
+ 	DBCHAR coded;
+ 	assert(*length == 1);
+-	TRYMAP_ENC(gbcommon, coded, *data) {
+-		if (!(coded & 0x8000))
+-			return coded;
++	if (*data < 0x10000) {
++		TRYMAP_ENC(gbcommon, coded, *data) {
++			if (!(coded & 0x8000))
++				return coded;
++		}
+ 	}
+ 	return MAP_UNMAPPABLE;
+ }

================================================================
Index: SOURCES/python-segfault-onwarn.patch
diff -u /dev/null SOURCES/python-segfault-onwarn.patch:1.1
--- /dev/null	Mon Jan  8 11:51:15 2007
+++ SOURCES/python-segfault-onwarn.patch	Mon Jan  8 11:51:10 2007
@@ -0,0 +1,15 @@
+Index: Python/errors.c
+===================================================================
+--- Python/errors.c	(wersja 53255)
++++ Python/errors.c	(wersja 53256)
+@@ -640,7 +640,8 @@
+ 
+ 	if (warnings_module != NULL) {
+ 		dict = PyModule_GetDict(warnings_module);
+-		func = PyDict_GetItemString(dict, "warn");
++		if (dict != NULL)
++			func = PyDict_GetItemString(dict, "warn");
+ 	}
+ 	if (func == NULL) {
+ 		PySys_WriteStderr("warning: %s\n", message);
+
================================================================


More information about the pld-cvs-commit mailing list