summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2013-12-08 23:04:09 (GMT)
committerVictor Stinner <victor.stinner@gmail.com>2013-12-08 23:04:09 (GMT)
commit0aba1a2663799a7e6a5582a0d8052df840889016 (patch)
treed1bbfa1ff05057a5394fcf7b29a78c2e908de4db
parent7b83b186794cec6e5d12f43f9c1a6f20bfa4e932 (diff)
parent620c48b7ea7a1ad3af23725afdac1e6a2b3e6cef (diff)
downloadcpython-0aba1a2663799a7e6a5582a0d8052df840889016.zip
cpython-0aba1a2663799a7e6a5582a0d8052df840889016.tar.gz
cpython-0aba1a2663799a7e6a5582a0d8052df840889016.tar.bz2
(Merge 3.3) Issue #17429: platform.linux_distribution() now decodes files from
the UTF-8 encoding with the surrogateescape error handler, instead of decoding from the locale encoding in strict mode. It fixes the function on Fedora 19 which is probably the first major distribution release with a non-ASCII name. Patch written by Toshio Kuratomi.
-rwxr-xr-xLib/platform.py9
-rw-r--r--Lib/test/test_platform.py16
-rw-r--r--Misc/ACKS1
-rw-r--r--Misc/NEWS6
4 files changed, 30 insertions, 2 deletions
diff --git a/Lib/platform.py b/Lib/platform.py
index c3c4b32..ddddff4 100755
--- a/Lib/platform.py
+++ b/Lib/platform.py
@@ -129,6 +129,10 @@ except AttributeError:
# Standard Unix uses /dev/null
DEV_NULL = '/dev/null'
+# Directory to search for configuration information on Unix.
+# Constant used by test_platform to test linux_distribution().
+_UNIXCONFDIR = '/etc'
+
### Platform specific APIs
_libc_search = re.compile(b'(__libc_init)'
@@ -315,7 +319,7 @@ def linux_distribution(distname='', version='', id='',
"""
try:
- etc = os.listdir('/etc')
+ etc = os.listdir(_UNIXCONFDIR)
except OSError:
# Probably not a Unix system
return distname,version,id
@@ -331,7 +335,8 @@ def linux_distribution(distname='', version='', id='',
return _dist_try_harder(distname,version,id)
# Read the first line
- with open('/etc/'+file, 'r') as f:
+ with open(os.path.join(_UNIXCONFDIR, file), 'r',
+ encoding='utf-8', errors='surrogateescape') as f:
firstline = f.readline()
_distname, _version, _id = _parse_release_file(firstline)
diff --git a/Lib/test/test_platform.py b/Lib/test/test_platform.py
index 0dcfe05..8a5408e 100644
--- a/Lib/test/test_platform.py
+++ b/Lib/test/test_platform.py
@@ -1,7 +1,10 @@
+from unittest import mock
+import contextlib
import os
import platform
import subprocess
import sys
+import tempfile
import unittest
import warnings
@@ -295,6 +298,19 @@ class PlatformTest(unittest.TestCase):
returncode = ret >> 8
self.assertEqual(returncode, len(data))
+ def test_linux_distribution_encoding(self):
+ # Issue #17429
+ with tempfile.TemporaryDirectory() as tempdir:
+ filename = os.path.join(tempdir, 'fedora-release')
+ with open(filename, 'w', encoding='utf-8') as f:
+ f.write('Fedora release 19 (Schr\xf6dinger\u2019s Cat)\n')
+
+ with mock.patch('platform._UNIXCONFDIR', tempdir):
+ distname, version, distid = platform.linux_distribution()
+
+ self.assertEqual(distname, 'Fedora')
+ self.assertEqual(version, '19')
+ self.assertEqual(distid, 'Schr\xf6dinger\u2019s Cat')
def test_main():
support.run_unittest(
diff --git a/Misc/ACKS b/Misc/ACKS
index 798aaa0..c002652 100644
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -711,6 +711,7 @@ Steven Kryskalla
Andrew Kuchling
Dave Kuhlman
Jon Kuhn
+Toshio Kuratomi
Vladimir Kushnir
Erno Kuusela
Ross Lagerwall
diff --git a/Misc/NEWS b/Misc/NEWS
index f81db69..351106f 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -21,6 +21,12 @@ Core and Builtins
Library
-------
+- Issue #17429: platform.linux_distribution() now decodes files from the UTF-8
+ encoding with the surrogateescape error handler, instead of decoding from the
+ locale encoding in strict mode. It fixes the function on Fedora 19 which is
+ probably the first major distribution release with a non-ASCII name. Patch
+ written by Toshio Kuratomi.
+
- Issue #19343: Expose FreeBSD-specific APIs in resource module. Original
patch by Koobs.