mirror of
https://github.com/python/cpython.git
synced 2025-07-24 03:35:53 +00:00
[3.13] gh-128636: Fix crash in PyREPL when os.environ
is overwritten with an invalid value (GH-128653) (#129186)
gh-128636: Fix crash in PyREPL when `os.environ` is overwritten with an invalid value (GH-128653)
(cherry picked from commit ba9a4b6215
)
Co-authored-by: Tomas R <tomas.roun8@gmail.com>
This commit is contained in:
parent
67971cd605
commit
0b90dc8e89
3 changed files with 22 additions and 5 deletions
|
@ -449,10 +449,12 @@ class UnixConsole(Console):
|
|||
"""
|
||||
try:
|
||||
return int(os.environ["LINES"]), int(os.environ["COLUMNS"])
|
||||
except KeyError:
|
||||
height, width = struct.unpack(
|
||||
"hhhh", ioctl(self.input_fd, TIOCGWINSZ, b"\000" * 8)
|
||||
)[0:2]
|
||||
except (KeyError, TypeError, ValueError):
|
||||
try:
|
||||
size = ioctl(self.input_fd, TIOCGWINSZ, b"\000" * 8)
|
||||
except OSError:
|
||||
return 25, 80
|
||||
height, width = struct.unpack("hhhh", size)[0:2]
|
||||
if not height:
|
||||
return 25, 80
|
||||
return height, width
|
||||
|
@ -468,7 +470,7 @@ class UnixConsole(Console):
|
|||
"""
|
||||
try:
|
||||
return int(os.environ["LINES"]), int(os.environ["COLUMNS"])
|
||||
except KeyError:
|
||||
except (KeyError, TypeError, ValueError):
|
||||
return 25, 80
|
||||
|
||||
def forgetinput(self):
|
||||
|
|
|
@ -1,7 +1,9 @@
|
|||
import itertools
|
||||
import os
|
||||
import sys
|
||||
import unittest
|
||||
from functools import partial
|
||||
from test.support import os_helper
|
||||
from unittest import TestCase
|
||||
from unittest.mock import MagicMock, call, patch, ANY
|
||||
|
||||
|
@ -312,3 +314,14 @@ class TestConsole(TestCase):
|
|||
)
|
||||
console.restore()
|
||||
con.restore()
|
||||
|
||||
def test_getheightwidth_with_invalid_environ(self, _os_write):
|
||||
# gh-128636
|
||||
console = UnixConsole()
|
||||
with os_helper.EnvironmentVarGuard() as env:
|
||||
env["LINES"] = ""
|
||||
self.assertIsInstance(console.getheightwidth(), tuple)
|
||||
env["COLUMNS"] = ""
|
||||
self.assertIsInstance(console.getheightwidth(), tuple)
|
||||
os.environ = []
|
||||
self.assertIsInstance(console.getheightwidth(), tuple)
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
Fix PyREPL failure when :data:`os.environ` is overwritten with an invalid
|
||||
value.
|
Loading…
Add table
Add a link
Reference in a new issue