]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Issue #19969: PyBytes_FromFormatV() now raises an OverflowError if "%c"
authorVictor Stinner <victor.stinner@gmail.com>
Fri, 13 Dec 2013 11:14:44 +0000 (12:14 +0100)
committerVictor Stinner <victor.stinner@gmail.com>
Fri, 13 Dec 2013 11:14:44 +0000 (12:14 +0100)
argument is not in range [0; 255].

Lib/test/test_bytes.py
Misc/NEWS
Objects/bytesobject.c

index 3520e837a17267bca71d99acca702a55dfadb1ac..3c091411849114c85af2c628f014bd249ab4ea06 100644 (file)
@@ -729,6 +729,12 @@ class BytesTest(BaseBytesTest, unittest.TestCase):
         self.assertEqual(PyBytes_FromFormat(b's:%s', c_char_p(b'cstr')),
                          b's:cstr')
 
+        # Issue #19969
+        self.assertRaises(OverflowError,
+                          PyBytes_FromFormat, b'%c', c_int(-1))
+        self.assertRaises(OverflowError,
+                          PyBytes_FromFormat, b'%c', c_int(256))
+
 
 class ByteArrayTest(BaseBytesTest, unittest.TestCase):
     type2test = bytearray
index cd14311aab9cf82857343e3aaa00d6cbf310637f..a66834944dcf21adc19cc02fd56e614a993e84b7 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,9 @@ What's New in Python 3.3.4 release candidate 1?
 Core and Builtins
 -----------------
 
+- Issue #19969: PyBytes_FromFormatV() now raises an OverflowError if "%c"
+  argument is not in range [0; 255].
+
 - Issue #14432: Generator now clears the borrowed reference to the thread
   state. Fix a crash when a generator is created in a C thread that is
   destroyed while the generator is still used. The issue was that a generator
index 47898fe975cfaab06d5e4214062c57d69ff2eacc..9dcb74e8fdb264abbed9a6363c1c30ede4aaf1d3 100644 (file)
@@ -186,8 +186,17 @@ PyBytes_FromFormatV(const char *format, va_list vargs)
 
             switch (*f) {
             case 'c':
-                (void)va_arg(count, int);
-                /* fall through... */
+            {
+                int c = va_arg(count, int);
+                if (c < 0 || c > 255) {
+                    PyErr_SetString(PyExc_OverflowError,
+                                    "PyBytes_FromFormatV(): %c format "
+                                    "expects an integer in range [0; 255]");
+                    return NULL;
+                }
+                n++;
+                break;
+            }
             case '%':
                 n++;
                 break;
@@ -267,8 +276,12 @@ PyBytes_FromFormatV(const char *format, va_list vargs)
 
             switch (*f) {
             case 'c':
-                *s++ = va_arg(vargs, int);
+            {
+                int c = va_arg(vargs, int);
+                /* c has been checked for overflow in the first step */
+                *s++ = (unsigned char)c;
                 break;
+            }
             case 'd':
                 if (longflag)
                     sprintf(s, "%ld", va_arg(vargs, long));