Skip to content

Commit da0b022

Browse files
authored
Merge branch '3.13' into backport-c39ae89-3.13
2 parents 5be338e + f502c8f commit da0b022

File tree

10 files changed

+210
-6
lines changed

10 files changed

+210
-6
lines changed

.github/workflows/reusable-windows.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ env:
2424
2525
jobs:
2626
build:
27-
name: 'build and test (${{ inputs.arch }})'
27+
name: ${{ inputs.arch == 'arm64' && 'build' || 'build and test' }} (${{ inputs.arch }})
2828
runs-on: ${{ inputs.os }}
2929
timeout-minutes: 60
3030
env:

Doc/library/errno.rst

Lines changed: 165 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -665,6 +665,171 @@ defined by the module. The specific list of defined symbols is available as
665665

666666
.. versionadded:: 3.11
667667

668+
669+
.. data:: ENOMEDIUM
670+
671+
No medium found
672+
673+
674+
.. data:: EMEDIUMTYPE
675+
676+
Wrong medium type
677+
678+
679+
.. data:: ENOKEY
680+
681+
Required key not available
682+
683+
684+
.. data:: EKEYEXPIRED
685+
686+
Key has expired
687+
688+
689+
.. data:: EKEYREVOKED
690+
691+
Key has been revoked
692+
693+
694+
.. data:: EKEYREJECTED
695+
696+
Key was rejected by service
697+
698+
699+
.. data:: ERFKILL
700+
701+
Operation not possible due to RF-kill
702+
703+
704+
.. data:: ELOCKUNMAPPED
705+
706+
Locked lock was unmapped
707+
708+
709+
.. data:: ENOTACTIVE
710+
711+
Facility is not active
712+
713+
714+
.. data:: EAUTH
715+
716+
Authentication error
717+
718+
.. versionadded:: 3.2
719+
720+
721+
.. data:: EBADARCH
722+
723+
Bad CPU type in executable
724+
725+
.. versionadded:: 3.2
726+
727+
728+
.. data:: EBADEXEC
729+
730+
Bad executable (or shared library)
731+
732+
.. versionadded:: 3.2
733+
734+
735+
.. data:: EBADMACHO
736+
737+
Malformed Mach-o file
738+
739+
.. versionadded:: 3.2
740+
741+
742+
.. data:: EDEVERR
743+
744+
Device error
745+
746+
.. versionadded:: 3.2
747+
748+
749+
.. data:: EFTYPE
750+
751+
Inappropriate file type or format
752+
753+
.. versionadded:: 3.2
754+
755+
756+
.. data:: ENEEDAUTH
757+
758+
Need authenticator
759+
760+
.. versionadded:: 3.2
761+
762+
763+
.. data:: ENOATTR
764+
765+
Attribute not found
766+
767+
.. versionadded:: 3.2
768+
769+
770+
.. data:: ENOPOLICY
771+
772+
Policy not found
773+
774+
.. versionadded:: 3.2
775+
776+
777+
.. data:: EPROCLIM
778+
779+
Too many processes
780+
781+
.. versionadded:: 3.2
782+
783+
784+
.. data:: EPROCUNAVAIL
785+
786+
Bad procedure for program
787+
788+
.. versionadded:: 3.2
789+
790+
791+
.. data:: EPROGMISMATCH
792+
793+
Program version wrong
794+
795+
.. versionadded:: 3.2
796+
797+
798+
.. data:: EPROGUNAVAIL
799+
800+
RPC prog. not avail
801+
802+
.. versionadded:: 3.2
803+
804+
805+
.. data:: EPWROFF
806+
807+
Device power is off
808+
809+
.. versionadded:: 3.2
810+
811+
812+
.. data:: EBADRPC
813+
814+
RPC struct is bad
815+
816+
.. versionadded:: 3.2
817+
818+
819+
.. data:: ERPCMISMATCH
820+
821+
RPC version wrong
822+
823+
.. versionadded:: 3.2
824+
825+
826+
.. data:: ESHLIBVERS
827+
828+
Shared library version mismatch
829+
830+
.. versionadded:: 3.2
831+
832+
668833
.. data:: ENOTCAPABLE
669834

670835
Capabilities insufficient. This error is mapped to the exception

Lib/http/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ class HTTPMethod:
179179
180180
Methods from the following RFCs are all observed:
181181
182-
* RFF 9110: HTTP Semantics, obsoletes 7231, which obsoleted 2616
182+
* RFC 9110: HTTP Semantics, obsoletes 7231, which obsoleted 2616
183183
* RFC 5789: PATCH Method for HTTP
184184
"""
185185
def __new__(cls, value, description):

Lib/http/client.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -472,7 +472,7 @@ def read(self, amt=None):
472472
if self.chunked:
473473
return self._read_chunked(amt)
474474

475-
if amt is not None:
475+
if amt is not None and amt >= 0:
476476
if self.length is not None and amt > self.length:
477477
# clip the read to the "end of response"
478478
amt = self.length
@@ -590,6 +590,8 @@ def _get_chunk_left(self):
590590

591591
def _read_chunked(self, amt=None):
592592
assert self.chunked != _UNKNOWN
593+
if amt is not None and amt < 0:
594+
amt = None
593595
value = []
594596
try:
595597
while (chunk_left := self._get_chunk_left()) is not None:

Lib/subprocess.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,8 @@
4343
import builtins
4444
import errno
4545
import io
46-
import locale
4746
import os
4847
import time
49-
import signal
5048
import sys
5149
import threading
5250
import warnings
@@ -144,6 +142,8 @@ def __init__(self, returncode, cmd, output=None, stderr=None):
144142

145143
def __str__(self):
146144
if self.returncode and self.returncode < 0:
145+
# Lazy import to improve module import time
146+
import signal
147147
try:
148148
return "Command '%s' died with %r." % (
149149
self.cmd, signal.Signals(-self.returncode))
@@ -381,6 +381,8 @@ def _text_encoding():
381381
if sys.flags.utf8_mode:
382382
return "utf-8"
383383
else:
384+
# Lazy import to improve module import time
385+
import locale
384386
return locale.getencoding()
385387

386388

@@ -1665,6 +1667,9 @@ def send_signal(self, sig):
16651667
# Don't signal a process that we know has already died.
16661668
if self.returncode is not None:
16671669
return
1670+
1671+
# Lazy import to improve module import time
1672+
import signal
16681673
if sig == signal.SIGTERM:
16691674
self.terminate()
16701675
elif sig == signal.CTRL_C_EVENT:
@@ -1766,6 +1771,9 @@ def _posix_spawn(self, args, executable, env, restore_signals, close_fds,
17661771
"""Execute program using os.posix_spawn()."""
17671772
kwargs = {}
17681773
if restore_signals:
1774+
# Lazy import to improve module import time
1775+
import signal
1776+
17691777
# See _Py_RestoreSignals() in Python/pylifecycle.c
17701778
sigset = []
17711779
for signame in ('SIGPIPE', 'SIGXFZ', 'SIGXFSZ'):
@@ -2215,9 +2223,13 @@ def send_signal(self, sig):
22152223
def terminate(self):
22162224
"""Terminate the process with SIGTERM
22172225
"""
2226+
# Lazy import to improve module import time
2227+
import signal
22182228
self.send_signal(signal.SIGTERM)
22192229

22202230
def kill(self):
22212231
"""Kill the process with SIGKILL
22222232
"""
2233+
# Lazy import to improve module import time
2234+
import signal
22232235
self.send_signal(signal.SIGKILL)

Lib/test/test_httplib.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1081,6 +1081,25 @@ def test_chunked(self):
10811081
self.assertEqual(resp.read(), expected)
10821082
resp.close()
10831083

1084+
# Explicit full read
1085+
for n in (-123, -1, None):
1086+
with self.subTest('full read', n=n):
1087+
sock = FakeSocket(chunked_start + last_chunk + chunked_end)
1088+
resp = client.HTTPResponse(sock, method="GET")
1089+
resp.begin()
1090+
self.assertTrue(resp.chunked)
1091+
self.assertEqual(resp.read(n), expected)
1092+
resp.close()
1093+
1094+
# Read first chunk
1095+
with self.subTest('read1(-1)'):
1096+
sock = FakeSocket(chunked_start + last_chunk + chunked_end)
1097+
resp = client.HTTPResponse(sock, method="GET")
1098+
resp.begin()
1099+
self.assertTrue(resp.chunked)
1100+
self.assertEqual(resp.read1(-1), b"hello worl")
1101+
resp.close()
1102+
10841103
# Various read sizes
10851104
for n in range(1, 12):
10861105
sock = FakeSocket(chunked_start + last_chunk + chunked_end)
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fix incorrect handling of negative read sizes in :meth:`HTTPResponse.read
2+
<http.client.HTTPResponse.read>`. Patch by Yury Manushkin.
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Improve import time of :mod:`subprocess` by lazy importing ``locale`` and
2+
``signal``. Patch by Taneli Hukkinen.
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fix an integer overflow in the :mod:`csv` module when writing a data field
2+
larger than 2GB.

Modules/_csv.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1116,7 +1116,7 @@ join_append_data(WriterObj *self, int field_kind, const void *field_data,
11161116
int copy_phase)
11171117
{
11181118
DialectObj *dialect = self->dialect;
1119-
int i;
1119+
Py_ssize_t i;
11201120
Py_ssize_t rec_len;
11211121

11221122
#define INCLEN \

0 commit comments

Comments
 (0)