]> granicus.if.org Git - python/commitdiff
Issue #3782: os.write() must not accept unicode strings
authorAntoine Pitrou <solipsis@pitrou.net>
Mon, 15 Sep 2008 23:02:56 +0000 (23:02 +0000)
committerAntoine Pitrou <solipsis@pitrou.net>
Mon, 15 Sep 2008 23:02:56 +0000 (23:02 +0000)
Lib/pty.py
Lib/test/test_asyncore.py
Lib/test/test_os.py
Lib/test/test_pty.py
Lib/test/test_subprocess.py
Lib/test/test_tempfile.py
Lib/test/tf_inherit_check.py
Misc/NEWS
Modules/posixmodule.c

index 487382725e21a32e6c3d99adc10bdf19b13bfd24..810ebd82281a33745bb2518efda65d8806f70c34 100644 (file)
@@ -129,7 +129,7 @@ def fork():
 
 def _writen(fd, data):
     """Write all the data to a descriptor."""
-    while data != '':
+    while data:
         n = os.write(fd, data)
         data = data[n:]
 
index 12ef247a0e3035b2d42d28c32df141f46dbc407f..940b45e336d68700717201c23f7a03540f011bd0 100644 (file)
@@ -381,8 +381,8 @@ class DispatcherWithSendTests_UsePoll(DispatcherWithSendTests):
 if hasattr(asyncore, 'file_wrapper'):
     class FileWrapperTest(unittest.TestCase):
         def setUp(self):
-            self.d = "It's not dead, it's sleeping!"
-            open(TESTFN, 'w').write(self.d)
+            self.d = b"It's not dead, it's sleeping!"
+            open(TESTFN, 'wb').write(self.d)
 
         def tearDown(self):
             unlink(TESTFN)
@@ -400,8 +400,8 @@ if hasattr(asyncore, 'file_wrapper'):
             self.assertRaises(OSError, w.read, 1)
 
         def test_send(self):
-            d1 = "Come again?"
-            d2 = "I want to buy some cheese."
+            d1 = b"Come again?"
+            d2 = b"I want to buy some cheese."
             fd = os.open(TESTFN, os.O_WRONLY | os.O_APPEND)
             w = asyncore.file_wrapper(fd)
             os.close(fd)
@@ -409,7 +409,7 @@ if hasattr(asyncore, 'file_wrapper'):
             w.write(d1)
             w.send(d2)
             w.close()
-            self.assertEqual(open(TESTFN).read(), self.d + d1 + d2)
+            self.assertEqual(open(TESTFN, 'rb').read(), self.d + d1 + d2)
 
 
 def test_main():
index 50b583162ed2c95507cfbe50a690cdcd9c086cc4..f58aaf7911b46fdba08d026a8912f30a7c304372 100644 (file)
@@ -41,7 +41,7 @@ class FileTests(unittest.TestCase):
             os.close(second)
         # close a fd that is open, and one that isn't
         os.closerange(first, first + 2)
-        self.assertRaises(OSError, os.write, first, "a")
+        self.assertRaises(OSError, os.write, first, b"a")
 
     def test_rename(self):
         path = support.TESTFN
@@ -50,6 +50,28 @@ class FileTests(unittest.TestCase):
         new = sys.getrefcount(path)
         self.assertEqual(old, new)
 
+    def test_read(self):
+        with open(support.TESTFN, "w+b") as fobj:
+            fobj.write(b"spam")
+            fobj.flush()
+            fd = fobj.fileno()
+            os.lseek(fd, 0, 0)
+            s = os.read(fd, 4)
+            self.assertEqual(type(s), bytes)
+            self.assertEqual(s, b"spam")
+
+    def test_write(self):
+        # os.write() accepts bytes- and buffer-like objects but not strings
+        fd = os.open(support.TESTFN, os.O_CREAT | os.O_WRONLY)
+        self.assertRaises(TypeError, os.write, fd, "beans")
+        os.write(fd, b"bacon\n")
+        os.write(fd, bytearray(b"eggs\n"))
+        os.write(fd, memoryview(b"spam\n"))
+        os.close(fd)
+        with open(support.TESTFN, "rb") as fobj:
+            self.assertEqual(fobj.read(), b"bacon\neggs\nspam\n")
+
+
 class TemporaryFileTests(unittest.TestCase):
     def setUp(self):
         self.files = []
index f62fc99fba49c18a89e8e90851ac3235177f5973..ec52f9ffbc63fd43c988e02bc72772be584adf3b 100644 (file)
@@ -7,8 +7,8 @@ import signal
 from test.support import verbose, TestSkipped, run_unittest
 import unittest
 
-TEST_STRING_1 = "I wish to buy a fish license.\n"
-TEST_STRING_2 = "For my pet fish, Eric.\n"
+TEST_STRING_1 = b"I wish to buy a fish license.\n"
+TEST_STRING_2 = b"For my pet fish, Eric.\n"
 
 if verbose:
     def debug(msg):
index fe916c2a8511a8bf87a6ffa0a2534256dd4b5eac..f4f1cd5a86d095efdcc149fe2bdc5f9ef980dc87 100644 (file)
@@ -128,7 +128,7 @@ class ProcessTestCase(unittest.TestCase):
         # stdin is set to open file descriptor
         tf = tempfile.TemporaryFile()
         d = tf.fileno()
-        os.write(d, "pear")
+        os.write(d, b"pear")
         os.lseek(d, 0, 0)
         p = subprocess.Popen([sys.executable, "-c",
                          'import sys; sys.exit(sys.stdin.read() == "pear")'],
@@ -237,7 +237,7 @@ class ProcessTestCase(unittest.TestCase):
 
     def test_stdout_filedes_of_stdout(self):
         # stdout is set to 1 (#1531862).
-        cmd = r"import sys, os; sys.exit(os.write(sys.stdout.fileno(), '.\n'))"
+        cmd = r"import sys, os; sys.exit(os.write(sys.stdout.fileno(), b'.\n'))"
         rc = subprocess.call([sys.executable, "-c", cmd], stdout=1)
         self.assertEquals(rc, 2)
 
@@ -548,11 +548,12 @@ class ProcessTestCase(unittest.TestCase):
 
         def test_args_string(self):
             # args is a string
-            f, fname = self.mkstemp()
-            os.write(f, "#!/bin/sh\n")
-            os.write(f, "exec '%s' -c 'import sys; sys.exit(47)'\n" %
-                        sys.executable)
-            os.close(f)
+            fd, fname = self.mkstemp()
+            # reopen in text mode
+            with open(fd, "w") as fobj:
+                fobj.write("#!/bin/sh\n")
+                fobj.write("exec '%s' -c 'import sys; sys.exit(47)'\n" %
+                            sys.executable)
             os.chmod(fname, 0o700)
             p = subprocess.Popen(fname)
             p.wait()
@@ -590,11 +591,12 @@ class ProcessTestCase(unittest.TestCase):
 
         def test_call_string(self):
             # call() function with string argument on UNIX
-            f, fname = self.mkstemp()
-            os.write(f, "#!/bin/sh\n")
-            os.write(f, "exec '%s' -c 'import sys; sys.exit(47)'\n" %
-                        sys.executable)
-            os.close(f)
+            fd, fname = self.mkstemp()
+            # reopen in text mode
+            with open(fd, "w") as fobj:
+                fobj.write("#!/bin/sh\n")
+                fobj.write("exec '%s' -c 'import sys; sys.exit(47)'\n" %
+                            sys.executable)
             os.chmod(fname, 0o700)
             rc = subprocess.call(fname)
             os.remove(fname)
index 5a81455213e4ff60e99523ba3aea89f812b13e1c..0e5cb0f2d1eb17f4e0cd1d6dbdbdca698be36d84 100644 (file)
@@ -252,7 +252,7 @@ class test__mkstemp_inner(TC):
         # _mkstemp_inner can create files in a user-selected directory
         dir = tempfile.mkdtemp()
         try:
-            self.do_create(dir=dir).write("blat")
+            self.do_create(dir=dir).write(b"blat")
         finally:
             os.rmdir(dir)
 
index 0fd108914ef130140ba42864c839fe0bbdd0d31d..92ebd95e5236869ef3a4eabe5f8a170412e7e042 100644 (file)
@@ -10,7 +10,7 @@ try:
     fd = int(sys.argv[2])
 
     try:
-        os.write(fd, "blat")
+        os.write(fd, b"blat")
     except os.error:
         # Success -- could not write to fd.
         sys.exit(0)
index c2734c8b9499fbe4e5bb92b076eed3712cac9090..0024e82f080d7837906558682de09b27d53cd957 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -140,6 +140,8 @@ Library
 Extension Modules
 -----------------
 
+- Issue #3782: os.write() must not accept unicode strings.
+
 - Issue #2975: When compiling several extension modules with Visual Studio 2008
   from the same python interpreter, some environment variables would grow
   without limit.
index 8931ea295fa7039b1e35a3d6eb0718181b725576..f6a4d956a9f369eb5a0c8b126d778c9b86579af2 100644 (file)
@@ -4896,7 +4896,7 @@ posix_write(PyObject *self, PyObject *args)
        int fd;
        Py_ssize_t size;
 
-       if (!PyArg_ParseTuple(args, "is*:write", &fd, &pbuf))
+       if (!PyArg_ParseTuple(args, "iy*:write", &fd, &pbuf))
                return NULL;
        Py_BEGIN_ALLOW_THREADS
        size = write(fd, pbuf.buf, (size_t)pbuf.len);