]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.6] bpo-32304: Fix distutils upload for tar files ending with b'\r' (GH-5264) ...
authorBo Bayles <bbayles@gmail.com>
Sat, 27 Jan 2018 02:18:58 +0000 (20:18 -0600)
committerÉric Araujo <merwok@netwok.org>
Sat, 27 Jan 2018 02:18:58 +0000 (21:18 -0500)
Patch by Bo Bayles.

Doc/whatsnew/3.6.rst
Lib/distutils/command/upload.py
Lib/distutils/tests/test_upload.py
Misc/NEWS.d/next/Library/2018-01-21-16-33-53.bpo-32304.TItrNv.rst [new file with mode: 0644]

index f83508c9250cc773c4e19ad9e3fe6a8d0fa3d5de..59329fa70694085d58cabee3e45134c44784971b 100644 (file)
@@ -1016,6 +1016,11 @@ attribute defaults to ``['gztar']``. Although not anticipated,
 any code relying on the presence of ``default_format`` may
 need to be adapted. See :issue:`27819` for more details.
 
+The ``upload`` command now longer tries to change CR end-of-line characters
+to CRLF.  This fixes a corruption issue with sdists that ended with a byte
+equivalent to CR.
+(Contributed by Bo Bayles in :issue:`32304`.)
+
 
 email
 -----
index 1fd574a9f15b54bf9fdc3643a34137a52859efb4..f7752f9d12c74fc203da0db61d084e9896e323fc 100644 (file)
@@ -159,8 +159,6 @@ class upload(PyPIRCCommand):
                 body.write(title.encode('utf-8'))
                 body.write(b"\r\n\r\n")
                 body.write(value)
-                if value and value[-1:] == b'\r':
-                    body.write(b'\n')  # write an extra newline (lurve Macs)
         body.write(end_boundary)
         body = body.getvalue()
 
index 2cb2f6ce93864b6a855d880c5319d725a059f4e4..c17d8e7d54e98c24c4eaf9278a3233f1d508676e 100644 (file)
@@ -143,6 +143,32 @@ class uploadTestCase(BasePyPIRCCommandTestCase):
         results = self.get_logs(INFO)
         self.assertEqual(results[-1], 75 * '-' + '\nxyzzy\n' + 75 * '-')
 
+    # bpo-32304: archives whose last byte was b'\r' were corrupted due to
+    # normalization intended for Mac OS 9.
+    def test_upload_correct_cr(self):
+        # content that ends with \r should not be modified.
+        tmp = self.mkdtemp()
+        path = os.path.join(tmp, 'xxx')
+        self.write_file(path, content='yy\r')
+        command, pyversion, filename = 'xxx', '2.6', path
+        dist_files = [(command, pyversion, filename)]
+        self.write_file(self.rc, PYPIRC_LONG_PASSWORD)
+
+        # other fields that ended with \r used to be modified, now are
+        # preserved.
+        pkg_dir, dist = self.create_dist(
+            dist_files=dist_files,
+            description='long description\r'
+        )
+        cmd = upload(dist)
+        cmd.show_response = 1
+        cmd.ensure_finalized()
+        cmd.run()
+
+        headers = dict(self.last_open.req.headers)
+        self.assertEqual(headers['Content-length'], '2172')
+        self.assertIn(b'long description\r', self.last_open.req.data)
+
     def test_upload_fails(self):
         self.next_msg = "Not Found"
         self.next_code = 404
diff --git a/Misc/NEWS.d/next/Library/2018-01-21-16-33-53.bpo-32304.TItrNv.rst b/Misc/NEWS.d/next/Library/2018-01-21-16-33-53.bpo-32304.TItrNv.rst
new file mode 100644 (file)
index 0000000..c199a64
--- /dev/null
@@ -0,0 +1,2 @@
+distutils' upload command no longer corrupts tar files ending with a CR byte,
+and no longer tries to convert CR to CRLF in any of the upload text fields.