Compare commits
88 Commits
Author | SHA256 | Date | |
---|---|---|---|
dc2622e3f9 | |||
c92a103129 | |||
11b7e4b95a | |||
ce17a8111c | |||
d75ee26429 | |||
3cf400580a | |||
3799c65698 | |||
5bf090d7ef | |||
6b2ca0649e | |||
0d138f00f9 | |||
0c9c9afe8c | |||
53b782d3a6 | |||
35294a40a4 | |||
66dec9ba75 | |||
940abe7147 | |||
9a13683c02 | |||
324e027d67 | |||
b12a4b472c | |||
79e939b48a | |||
7e8729c910 | |||
288d337519 | |||
a4883c39a6 | |||
70a5881572 | |||
041db29d48 | |||
5397122a9a | |||
8f9bb7c680 | |||
d5f7289dc9 | |||
b22a5b6895 | |||
fb2d2de9c8 | |||
219d04a564 | |||
bcecd415f0 | |||
00c73b878c | |||
ffa51c1d70 | |||
bd8190196b | |||
ce7b31e84c | |||
2dd8922f18 | |||
0b9e0525eb | |||
8ed89cbb85 | |||
4a9e333027 | |||
e3c6266f22 | |||
4a7c0d6f4d | |||
a14458a112 | |||
c92dd19832 | |||
5b45f7d9c2 | |||
5e9c8316a3 | |||
3ed435649a | |||
f52da509da | |||
b459adb683 | |||
67f03bbbc0 | |||
35eb81a93f | |||
aa6f469fcc | |||
d5816cb839 | |||
8659ae7c2d | |||
b3baeedca9 | |||
fb6c6692db | |||
8b94bc8090 | |||
666a05a468 | |||
b7a4629611 | |||
1f2a8a5568 | |||
5305209e15 | |||
27c84829c0 | |||
b4a03c8ca5 | |||
fce5013011 | |||
c7164168dc | |||
0596163e48 | |||
809f944b62 | |||
9d574d767b | |||
5478a684d8 | |||
7561ffd453 | |||
bad4db9a6e | |||
ec6360c6b5 | |||
c070616633 | |||
fff9b66773 | |||
a15f7b0fad | |||
3f3cf2ab15 | |||
3a5dd04770 | |||
a7b3239561 | |||
8bad2f513e | |||
a0ad707487 | |||
a07e4323d1 | |||
80e1e18481 | |||
194f2f3598 | |||
9eb4265634 | |||
2ccc1ee586 | |||
90379ac38c | |||
d3604bc82f | |||
7bbbc4808d | |||
28ba05e717 |
@@ -1,480 +0,0 @@
|
|||||||
From 3a939ff2298d147459116f98a09549d0f1954039 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Serhiy Storchaka <storchaka@gmail.com>
|
|
||||||
Date: Tue, 4 Feb 2025 11:44:39 +0200
|
|
||||||
Subject: Fix use-after-free in the unicode-escape decoder with error handler
|
|
||||||
|
|
||||||
If the error handler is used, a new bytes object is created to set as
|
|
||||||
the object attribute of UnicodeDecodeError, and that bytes object then
|
|
||||||
replaces the original data. A pointer to the decoded data will became invalid
|
|
||||||
after destroying that temporary bytes object. So we need other way to return
|
|
||||||
the first invalid escape from _PyUnicode_DecodeUnicodeEscapeInternal().
|
|
||||||
|
|
||||||
_PyBytes_DecodeEscape() does not have such issue, because it does not
|
|
||||||
use the error handlers registry, but it should be changed for compatibility
|
|
||||||
with _PyUnicode_DecodeUnicodeEscapeInternal().
|
|
||||||
---
|
|
||||||
Include/internal/pycore_bytesobject.h | 5
|
|
||||||
Include/internal/pycore_unicodeobject.h | 12 +-
|
|
||||||
Lib/test/test_codeccallbacks.py | 39 +++++++
|
|
||||||
Lib/test/test_codecs.py | 52 ++++++++--
|
|
||||||
Misc/NEWS.d/next/Security/2025-05-09-20-22-54.gh-issue-133767.kN2i3Q.rst | 2
|
|
||||||
Objects/bytesobject.c | 41 ++++---
|
|
||||||
Objects/unicodeobject.c | 46 +++++---
|
|
||||||
Parser/string_parser.c | 26 +++--
|
|
||||||
8 files changed, 160 insertions(+), 63 deletions(-)
|
|
||||||
|
|
||||||
Index: Python-3.14.0b1/Include/internal/pycore_bytesobject.h
|
|
||||||
===================================================================
|
|
||||||
--- Python-3.14.0b1.orig/Include/internal/pycore_bytesobject.h 2025-05-06 15:33:52.000000000 +0000
|
|
||||||
+++ Python-3.14.0b1/Include/internal/pycore_bytesobject.h 2025-05-17 06:44:53.614667081 +0000
|
|
||||||
@@ -20,8 +20,9 @@
|
|
||||||
|
|
||||||
// Helper for PyBytes_DecodeEscape that detects invalid escape chars.
|
|
||||||
// Export for test_peg_generator.
|
|
||||||
-PyAPI_FUNC(PyObject*) _PyBytes_DecodeEscape(const char *, Py_ssize_t,
|
|
||||||
- const char *, const char **);
|
|
||||||
+PyAPI_FUNC(PyObject*) _PyBytes_DecodeEscape2(const char *, Py_ssize_t,
|
|
||||||
+ const char *,
|
|
||||||
+ int *, const char **);
|
|
||||||
|
|
||||||
|
|
||||||
// Substring Search.
|
|
||||||
Index: Python-3.14.0b1/Include/internal/pycore_unicodeobject.h
|
|
||||||
===================================================================
|
|
||||||
--- Python-3.14.0b1.orig/Include/internal/pycore_unicodeobject.h 2025-05-06 15:33:52.000000000 +0000
|
|
||||||
+++ Python-3.14.0b1/Include/internal/pycore_unicodeobject.h 2025-05-17 06:44:53.614817134 +0000
|
|
||||||
@@ -139,14 +139,18 @@
|
|
||||||
// Helper for PyUnicode_DecodeUnicodeEscape that detects invalid escape
|
|
||||||
// chars.
|
|
||||||
// Export for test_peg_generator.
|
|
||||||
-PyAPI_FUNC(PyObject*) _PyUnicode_DecodeUnicodeEscapeInternal(
|
|
||||||
+PyAPI_FUNC(PyObject*) _PyUnicode_DecodeUnicodeEscapeInternal2(
|
|
||||||
const char *string, /* Unicode-Escape encoded string */
|
|
||||||
Py_ssize_t length, /* size of string */
|
|
||||||
const char *errors, /* error handling */
|
|
||||||
Py_ssize_t *consumed, /* bytes consumed */
|
|
||||||
- const char **first_invalid_escape); /* on return, points to first
|
|
||||||
- invalid escaped char in
|
|
||||||
- string. */
|
|
||||||
+ int *first_invalid_escape_char, /* on return, if not -1, contain the first
|
|
||||||
+ invalid escaped char (<= 0xff) or invalid
|
|
||||||
+ octal escape (> 0xff) in string. */
|
|
||||||
+ const char **first_invalid_escape_ptr); /* on return, if not NULL, may
|
|
||||||
+ point to the first invalid escaped
|
|
||||||
+ char in string.
|
|
||||||
+ May be NULL if errors is not NULL. */
|
|
||||||
|
|
||||||
/* --- Raw-Unicode-Escape Codecs ---------------------------------------------- */
|
|
||||||
|
|
||||||
Index: Python-3.14.0b1/Lib/test/test_codeccallbacks.py
|
|
||||||
===================================================================
|
|
||||||
--- Python-3.14.0b1.orig/Lib/test/test_codeccallbacks.py 2025-05-17 06:44:47.673341939 +0000
|
|
||||||
+++ Python-3.14.0b1/Lib/test/test_codeccallbacks.py 2025-05-17 06:44:53.615018793 +0000
|
|
||||||
@@ -2,6 +2,7 @@
|
|
||||||
import codecs
|
|
||||||
import html.entities
|
|
||||||
import itertools
|
|
||||||
+import re
|
|
||||||
import sys
|
|
||||||
import unicodedata
|
|
||||||
import unittest
|
|
||||||
@@ -1125,7 +1126,7 @@
|
|
||||||
text = 'abc<def>ghi'*n
|
|
||||||
text.translate(charmap)
|
|
||||||
|
|
||||||
- def test_mutatingdecodehandler(self):
|
|
||||||
+ def test_mutating_decode_handler(self):
|
|
||||||
baddata = [
|
|
||||||
("ascii", b"\xff"),
|
|
||||||
("utf-7", b"++"),
|
|
||||||
@@ -1160,6 +1161,42 @@
|
|
||||||
for (encoding, data) in baddata:
|
|
||||||
self.assertEqual(data.decode(encoding, "test.mutating"), "\u4242")
|
|
||||||
|
|
||||||
+ def test_mutating_decode_handler_unicode_escape(self):
|
|
||||||
+ decode = codecs.unicode_escape_decode
|
|
||||||
+ def mutating(exc):
|
|
||||||
+ if isinstance(exc, UnicodeDecodeError):
|
|
||||||
+ r = data.get(exc.object[:exc.end])
|
|
||||||
+ if r is not None:
|
|
||||||
+ exc.object = r[0] + exc.object[exc.end:]
|
|
||||||
+ return ('\u0404', r[1])
|
|
||||||
+ raise AssertionError("don't know how to handle %r" % exc)
|
|
||||||
+
|
|
||||||
+ codecs.register_error('test.mutating2', mutating)
|
|
||||||
+ data = {
|
|
||||||
+ br'\x0': (b'\\', 0),
|
|
||||||
+ br'\x3': (b'xxx\\', 3),
|
|
||||||
+ br'\x5': (b'x\\', 1),
|
|
||||||
+ }
|
|
||||||
+ def check(input, expected, msg):
|
|
||||||
+ with self.assertWarns(DeprecationWarning) as cm:
|
|
||||||
+ self.assertEqual(decode(input, 'test.mutating2'), (expected, len(input)))
|
|
||||||
+ self.assertIn(msg, str(cm.warning))
|
|
||||||
+
|
|
||||||
+ check(br'\x0n\z', '\u0404\n\\z', r'"\z" is an invalid escape sequence')
|
|
||||||
+ check(br'\x0n\501', '\u0404\n\u0141', r'"\501" is an invalid octal escape sequence')
|
|
||||||
+ check(br'\x0z', '\u0404\\z', r'"\z" is an invalid escape sequence')
|
|
||||||
+
|
|
||||||
+ check(br'\x3n\zr', '\u0404\n\\zr', r'"\z" is an invalid escape sequence')
|
|
||||||
+ check(br'\x3zr', '\u0404\\zr', r'"\z" is an invalid escape sequence')
|
|
||||||
+ check(br'\x3z5', '\u0404\\z5', r'"\z" is an invalid escape sequence')
|
|
||||||
+ check(memoryview(br'\x3z5x')[:-1], '\u0404\\z5', r'"\z" is an invalid escape sequence')
|
|
||||||
+ check(memoryview(br'\x3z5xy')[:-2], '\u0404\\z5', r'"\z" is an invalid escape sequence')
|
|
||||||
+
|
|
||||||
+ check(br'\x5n\z', '\u0404\n\\z', r'"\z" is an invalid escape sequence')
|
|
||||||
+ check(br'\x5n\501', '\u0404\n\u0141', r'"\501" is an invalid octal escape sequence')
|
|
||||||
+ check(br'\x5z', '\u0404\\z', r'"\z" is an invalid escape sequence')
|
|
||||||
+ check(memoryview(br'\x5zy')[:-1], '\u0404\\z', r'"\z" is an invalid escape sequence')
|
|
||||||
+
|
|
||||||
# issue32583
|
|
||||||
def test_crashing_decode_handler(self):
|
|
||||||
# better generating one more character to fill the extra space slot
|
|
||||||
Index: Python-3.14.0b1/Lib/test/test_codecs.py
|
|
||||||
===================================================================
|
|
||||||
--- Python-3.14.0b1.orig/Lib/test/test_codecs.py 2025-05-17 06:44:47.696604117 +0000
|
|
||||||
+++ Python-3.14.0b1/Lib/test/test_codecs.py 2025-05-17 06:44:53.615449954 +0000
|
|
||||||
@@ -1196,23 +1196,39 @@
|
|
||||||
check(br"[\1010]", b"[A0]")
|
|
||||||
check(br"[\x41]", b"[A]")
|
|
||||||
check(br"[\x410]", b"[A0]")
|
|
||||||
+
|
|
||||||
+ def test_warnings(self):
|
|
||||||
+ decode = codecs.escape_decode
|
|
||||||
+ check = coding_checker(self, decode)
|
|
||||||
for i in range(97, 123):
|
|
||||||
b = bytes([i])
|
|
||||||
if b not in b'abfnrtvx':
|
|
||||||
- with self.assertWarns(DeprecationWarning):
|
|
||||||
+ with self.assertWarnsRegex(DeprecationWarning,
|
|
||||||
+ r'"\\%c" is an invalid escape sequence' % i):
|
|
||||||
check(b"\\" + b, b"\\" + b)
|
|
||||||
- with self.assertWarns(DeprecationWarning):
|
|
||||||
+ with self.assertWarnsRegex(DeprecationWarning,
|
|
||||||
+ r'"\\%c" is an invalid escape sequence' % (i-32)):
|
|
||||||
check(b"\\" + b.upper(), b"\\" + b.upper())
|
|
||||||
- with self.assertWarns(DeprecationWarning):
|
|
||||||
+ with self.assertWarnsRegex(DeprecationWarning,
|
|
||||||
+ r'"\\8" is an invalid escape sequence'):
|
|
||||||
check(br"\8", b"\\8")
|
|
||||||
with self.assertWarns(DeprecationWarning):
|
|
||||||
check(br"\9", b"\\9")
|
|
||||||
- with self.assertWarns(DeprecationWarning):
|
|
||||||
+ with self.assertWarnsRegex(DeprecationWarning,
|
|
||||||
+ r'"\\\xfa" is an invalid escape sequence') as cm:
|
|
||||||
check(b"\\\xfa", b"\\\xfa")
|
|
||||||
for i in range(0o400, 0o1000):
|
|
||||||
- with self.assertWarns(DeprecationWarning):
|
|
||||||
+ with self.assertWarnsRegex(DeprecationWarning,
|
|
||||||
+ r'"\\%o" is an invalid octal escape sequence' % i):
|
|
||||||
check(rb'\%o' % i, bytes([i & 0o377]))
|
|
||||||
|
|
||||||
+ with self.assertWarnsRegex(DeprecationWarning,
|
|
||||||
+ r'"\\z" is an invalid escape sequence'):
|
|
||||||
+ self.assertEqual(decode(br'\x\z', 'ignore'), (b'\\z', 4))
|
|
||||||
+ with self.assertWarnsRegex(DeprecationWarning,
|
|
||||||
+ r'"\\501" is an invalid octal escape sequence'):
|
|
||||||
+ self.assertEqual(decode(br'\x\501', 'ignore'), (b'A', 6))
|
|
||||||
+
|
|
||||||
def test_errors(self):
|
|
||||||
decode = codecs.escape_decode
|
|
||||||
self.assertRaises(ValueError, decode, br"\x")
|
|
||||||
@@ -2661,24 +2677,40 @@
|
|
||||||
check(br"[\x410]", "[A0]")
|
|
||||||
check(br"\u20ac", "\u20ac")
|
|
||||||
check(br"\U0001d120", "\U0001d120")
|
|
||||||
+
|
|
||||||
+ def test_decode_warnings(self):
|
|
||||||
+ decode = codecs.unicode_escape_decode
|
|
||||||
+ check = coding_checker(self, decode)
|
|
||||||
for i in range(97, 123):
|
|
||||||
b = bytes([i])
|
|
||||||
if b not in b'abfnrtuvx':
|
|
||||||
- with self.assertWarns(DeprecationWarning):
|
|
||||||
+ with self.assertWarnsRegex(DeprecationWarning,
|
|
||||||
+ r'"\\%c" is an invalid escape sequence' % i):
|
|
||||||
check(b"\\" + b, "\\" + chr(i))
|
|
||||||
if b.upper() not in b'UN':
|
|
||||||
- with self.assertWarns(DeprecationWarning):
|
|
||||||
+ with self.assertWarnsRegex(DeprecationWarning,
|
|
||||||
+ r'"\\%c" is an invalid escape sequence' % (i-32)):
|
|
||||||
check(b"\\" + b.upper(), "\\" + chr(i-32))
|
|
||||||
- with self.assertWarns(DeprecationWarning):
|
|
||||||
+ with self.assertWarnsRegex(DeprecationWarning,
|
|
||||||
+ r'"\\8" is an invalid escape sequence'):
|
|
||||||
check(br"\8", "\\8")
|
|
||||||
with self.assertWarns(DeprecationWarning):
|
|
||||||
check(br"\9", "\\9")
|
|
||||||
- with self.assertWarns(DeprecationWarning):
|
|
||||||
+ with self.assertWarnsRegex(DeprecationWarning,
|
|
||||||
+ r'"\\\xfa" is an invalid escape sequence') as cm:
|
|
||||||
check(b"\\\xfa", "\\\xfa")
|
|
||||||
for i in range(0o400, 0o1000):
|
|
||||||
- with self.assertWarns(DeprecationWarning):
|
|
||||||
+ with self.assertWarnsRegex(DeprecationWarning,
|
|
||||||
+ r'"\\%o" is an invalid octal escape sequence' % i):
|
|
||||||
check(rb'\%o' % i, chr(i))
|
|
||||||
|
|
||||||
+ with self.assertWarnsRegex(DeprecationWarning,
|
|
||||||
+ r'"\\z" is an invalid escape sequence'):
|
|
||||||
+ self.assertEqual(decode(br'\x\z', 'ignore'), ('\\z', 4))
|
|
||||||
+ with self.assertWarnsRegex(DeprecationWarning,
|
|
||||||
+ r'"\\501" is an invalid octal escape sequence'):
|
|
||||||
+ self.assertEqual(decode(br'\x\501', 'ignore'), ('\u0141', 6))
|
|
||||||
+
|
|
||||||
def test_decode_errors(self):
|
|
||||||
decode = codecs.unicode_escape_decode
|
|
||||||
for c, d in (b'x', 2), (b'u', 4), (b'U', 4):
|
|
||||||
Index: Python-3.14.0b1/Misc/NEWS.d/next/Security/2025-05-09-20-22-54.gh-issue-133767.kN2i3Q.rst
|
|
||||||
===================================================================
|
|
||||||
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
||||||
+++ Python-3.14.0b1/Misc/NEWS.d/next/Security/2025-05-09-20-22-54.gh-issue-133767.kN2i3Q.rst 2025-05-17 06:44:53.615887918 +0000
|
|
||||||
@@ -0,0 +1,2 @@
|
|
||||||
+Fix use-after-free in the "unicode-escape" decoder with a non-"strict" error
|
|
||||||
+handler.
|
|
||||||
Index: Python-3.14.0b1/Objects/bytesobject.c
|
|
||||||
===================================================================
|
|
||||||
--- Python-3.14.0b1.orig/Objects/bytesobject.c 2025-05-06 15:33:52.000000000 +0000
|
|
||||||
+++ Python-3.14.0b1/Objects/bytesobject.c 2025-05-17 06:44:53.616354335 +0000
|
|
||||||
@@ -1075,10 +1075,11 @@
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Unescape a backslash-escaped string. */
|
|
||||||
-PyObject *_PyBytes_DecodeEscape(const char *s,
|
|
||||||
+PyObject *_PyBytes_DecodeEscape2(const char *s,
|
|
||||||
Py_ssize_t len,
|
|
||||||
const char *errors,
|
|
||||||
- const char **first_invalid_escape)
|
|
||||||
+ int *first_invalid_escape_char,
|
|
||||||
+ const char **first_invalid_escape_ptr)
|
|
||||||
{
|
|
||||||
int c;
|
|
||||||
char *p;
|
|
||||||
@@ -1092,7 +1093,8 @@
|
|
||||||
return NULL;
|
|
||||||
writer.overallocate = 1;
|
|
||||||
|
|
||||||
- *first_invalid_escape = NULL;
|
|
||||||
+ *first_invalid_escape_char = -1;
|
|
||||||
+ *first_invalid_escape_ptr = NULL;
|
|
||||||
|
|
||||||
end = s + len;
|
|
||||||
while (s < end) {
|
|
||||||
@@ -1130,9 +1132,10 @@
|
|
||||||
c = (c<<3) + *s++ - '0';
|
|
||||||
}
|
|
||||||
if (c > 0377) {
|
|
||||||
- if (*first_invalid_escape == NULL) {
|
|
||||||
- *first_invalid_escape = s-3; /* Back up 3 chars, since we've
|
|
||||||
- already incremented s. */
|
|
||||||
+ if (*first_invalid_escape_char == -1) {
|
|
||||||
+ *first_invalid_escape_char = c;
|
|
||||||
+ /* Back up 3 chars, since we've already incremented s. */
|
|
||||||
+ *first_invalid_escape_ptr = s - 3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*p++ = c;
|
|
||||||
@@ -1173,9 +1176,10 @@
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
- if (*first_invalid_escape == NULL) {
|
|
||||||
- *first_invalid_escape = s-1; /* Back up one char, since we've
|
|
||||||
- already incremented s. */
|
|
||||||
+ if (*first_invalid_escape_char == -1) {
|
|
||||||
+ *first_invalid_escape_char = (unsigned char)s[-1];
|
|
||||||
+ /* Back up one char, since we've already incremented s. */
|
|
||||||
+ *first_invalid_escape_ptr = s - 1;
|
|
||||||
}
|
|
||||||
*p++ = '\\';
|
|
||||||
s--;
|
|
||||||
@@ -1195,18 +1199,19 @@
|
|
||||||
Py_ssize_t Py_UNUSED(unicode),
|
|
||||||
const char *Py_UNUSED(recode_encoding))
|
|
||||||
{
|
|
||||||
- const char* first_invalid_escape;
|
|
||||||
- PyObject *result = _PyBytes_DecodeEscape(s, len, errors,
|
|
||||||
- &first_invalid_escape);
|
|
||||||
+ int first_invalid_escape_char;
|
|
||||||
+ const char *first_invalid_escape_ptr;
|
|
||||||
+ PyObject *result = _PyBytes_DecodeEscape2(s, len, errors,
|
|
||||||
+ &first_invalid_escape_char,
|
|
||||||
+ &first_invalid_escape_ptr);
|
|
||||||
if (result == NULL)
|
|
||||||
return NULL;
|
|
||||||
- if (first_invalid_escape != NULL) {
|
|
||||||
- unsigned char c = *first_invalid_escape;
|
|
||||||
- if ('4' <= c && c <= '7') {
|
|
||||||
+ if (first_invalid_escape_char != -1) {
|
|
||||||
+ if (first_invalid_escape_char > 0xff) {
|
|
||||||
if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
|
|
||||||
- "b\"\\%.3s\" is an invalid octal escape sequence. "
|
|
||||||
+ "b\"\\%o\" is an invalid octal escape sequence. "
|
|
||||||
"Such sequences will not work in the future. ",
|
|
||||||
- first_invalid_escape) < 0)
|
|
||||||
+ first_invalid_escape_char) < 0)
|
|
||||||
{
|
|
||||||
Py_DECREF(result);
|
|
||||||
return NULL;
|
|
||||||
@@ -1216,7 +1221,7 @@
|
|
||||||
if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
|
|
||||||
"b\"\\%c\" is an invalid escape sequence. "
|
|
||||||
"Such sequences will not work in the future. ",
|
|
||||||
- c) < 0)
|
|
||||||
+ first_invalid_escape_char) < 0)
|
|
||||||
{
|
|
||||||
Py_DECREF(result);
|
|
||||||
return NULL;
|
|
||||||
Index: Python-3.14.0b1/Objects/unicodeobject.c
|
|
||||||
===================================================================
|
|
||||||
--- Python-3.14.0b1.orig/Objects/unicodeobject.c 2025-05-06 15:33:52.000000000 +0000
|
|
||||||
+++ Python-3.14.0b1/Objects/unicodeobject.c 2025-05-17 06:44:53.617547540 +0000
|
|
||||||
@@ -6621,13 +6621,15 @@
|
|
||||||
/* --- Unicode Escape Codec ----------------------------------------------- */
|
|
||||||
|
|
||||||
PyObject *
|
|
||||||
-_PyUnicode_DecodeUnicodeEscapeInternal(const char *s,
|
|
||||||
+_PyUnicode_DecodeUnicodeEscapeInternal2(const char *s,
|
|
||||||
Py_ssize_t size,
|
|
||||||
const char *errors,
|
|
||||||
Py_ssize_t *consumed,
|
|
||||||
- const char **first_invalid_escape)
|
|
||||||
+ int *first_invalid_escape_char,
|
|
||||||
+ const char **first_invalid_escape_ptr)
|
|
||||||
{
|
|
||||||
const char *starts = s;
|
|
||||||
+ const char *initial_starts = starts;
|
|
||||||
_PyUnicodeWriter writer;
|
|
||||||
const char *end;
|
|
||||||
PyObject *errorHandler = NULL;
|
|
||||||
@@ -6635,7 +6637,8 @@
|
|
||||||
_PyUnicode_Name_CAPI *ucnhash_capi;
|
|
||||||
|
|
||||||
// so we can remember if we've seen an invalid escape char or not
|
|
||||||
- *first_invalid_escape = NULL;
|
|
||||||
+ *first_invalid_escape_char = -1;
|
|
||||||
+ *first_invalid_escape_ptr = NULL;
|
|
||||||
|
|
||||||
if (size == 0) {
|
|
||||||
if (consumed) {
|
|
||||||
@@ -6723,9 +6726,12 @@
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (ch > 0377) {
|
|
||||||
- if (*first_invalid_escape == NULL) {
|
|
||||||
- *first_invalid_escape = s-3; /* Back up 3 chars, since we've
|
|
||||||
- already incremented s. */
|
|
||||||
+ if (*first_invalid_escape_char == -1) {
|
|
||||||
+ *first_invalid_escape_char = ch;
|
|
||||||
+ if (starts == initial_starts) {
|
|
||||||
+ /* Back up 3 chars, since we've already incremented s. */
|
|
||||||
+ *first_invalid_escape_ptr = s - 3;
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
WRITE_CHAR(ch);
|
|
||||||
@@ -6820,9 +6826,12 @@
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
default:
|
|
||||||
- if (*first_invalid_escape == NULL) {
|
|
||||||
- *first_invalid_escape = s-1; /* Back up one char, since we've
|
|
||||||
- already incremented s. */
|
|
||||||
+ if (*first_invalid_escape_char == -1) {
|
|
||||||
+ *first_invalid_escape_char = c;
|
|
||||||
+ if (starts == initial_starts) {
|
|
||||||
+ /* Back up one char, since we've already incremented s. */
|
|
||||||
+ *first_invalid_escape_ptr = s - 1;
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
WRITE_ASCII_CHAR('\\');
|
|
||||||
WRITE_CHAR(c);
|
|
||||||
@@ -6867,19 +6876,20 @@
|
|
||||||
const char *errors,
|
|
||||||
Py_ssize_t *consumed)
|
|
||||||
{
|
|
||||||
- const char *first_invalid_escape;
|
|
||||||
- PyObject *result = _PyUnicode_DecodeUnicodeEscapeInternal(s, size, errors,
|
|
||||||
+ int first_invalid_escape_char;
|
|
||||||
+ const char *first_invalid_escape_ptr;
|
|
||||||
+ PyObject *result = _PyUnicode_DecodeUnicodeEscapeInternal2(s, size, errors,
|
|
||||||
consumed,
|
|
||||||
- &first_invalid_escape);
|
|
||||||
+ &first_invalid_escape_char,
|
|
||||||
+ &first_invalid_escape_ptr);
|
|
||||||
if (result == NULL)
|
|
||||||
return NULL;
|
|
||||||
- if (first_invalid_escape != NULL) {
|
|
||||||
- unsigned char c = *first_invalid_escape;
|
|
||||||
- if ('4' <= c && c <= '7') {
|
|
||||||
+ if (first_invalid_escape_char != -1) {
|
|
||||||
+ if (first_invalid_escape_char > 0xff) {
|
|
||||||
if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
|
|
||||||
- "\"\\%.3s\" is an invalid octal escape sequence. "
|
|
||||||
+ "\"\\%o\" is an invalid octal escape sequence. "
|
|
||||||
"Such sequences will not work in the future. ",
|
|
||||||
- first_invalid_escape) < 0)
|
|
||||||
+ first_invalid_escape_char) < 0)
|
|
||||||
{
|
|
||||||
Py_DECREF(result);
|
|
||||||
return NULL;
|
|
||||||
@@ -6889,7 +6899,7 @@
|
|
||||||
if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
|
|
||||||
"\"\\%c\" is an invalid escape sequence. "
|
|
||||||
"Such sequences will not work in the future. ",
|
|
||||||
- c) < 0)
|
|
||||||
+ first_invalid_escape_char) < 0)
|
|
||||||
{
|
|
||||||
Py_DECREF(result);
|
|
||||||
return NULL;
|
|
||||||
Index: Python-3.14.0b1/Parser/string_parser.c
|
|
||||||
===================================================================
|
|
||||||
--- Python-3.14.0b1.orig/Parser/string_parser.c 2025-05-06 15:33:52.000000000 +0000
|
|
||||||
+++ Python-3.14.0b1/Parser/string_parser.c 2025-05-17 06:44:53.618734552 +0000
|
|
||||||
@@ -196,15 +196,18 @@
|
|
||||||
len = (size_t)(p - buf);
|
|
||||||
s = buf;
|
|
||||||
|
|
||||||
- const char *first_invalid_escape;
|
|
||||||
- v = _PyUnicode_DecodeUnicodeEscapeInternal(s, (Py_ssize_t)len, NULL, NULL, &first_invalid_escape);
|
|
||||||
+ int first_invalid_escape_char;
|
|
||||||
+ const char *first_invalid_escape_ptr;
|
|
||||||
+ v = _PyUnicode_DecodeUnicodeEscapeInternal2(s, (Py_ssize_t)len, NULL, NULL,
|
|
||||||
+ &first_invalid_escape_char,
|
|
||||||
+ &first_invalid_escape_ptr);
|
|
||||||
|
|
||||||
// HACK: later we can simply pass the line no, since we don't preserve the tokens
|
|
||||||
// when we are decoding the string but we preserve the line numbers.
|
|
||||||
- if (v != NULL && first_invalid_escape != NULL && t != NULL) {
|
|
||||||
- if (warn_invalid_escape_sequence(parser, s, first_invalid_escape, t) < 0) {
|
|
||||||
- /* We have not decref u before because first_invalid_escape points
|
|
||||||
- inside u. */
|
|
||||||
+ if (v != NULL && first_invalid_escape_ptr != NULL && t != NULL) {
|
|
||||||
+ if (warn_invalid_escape_sequence(parser, s, first_invalid_escape_ptr, t) < 0) {
|
|
||||||
+ /* We have not decref u before because first_invalid_escape_ptr
|
|
||||||
+ points inside u. */
|
|
||||||
Py_XDECREF(u);
|
|
||||||
Py_DECREF(v);
|
|
||||||
return NULL;
|
|
||||||
@@ -217,14 +220,17 @@
|
|
||||||
static PyObject *
|
|
||||||
decode_bytes_with_escapes(Parser *p, const char *s, Py_ssize_t len, Token *t)
|
|
||||||
{
|
|
||||||
- const char *first_invalid_escape;
|
|
||||||
- PyObject *result = _PyBytes_DecodeEscape(s, len, NULL, &first_invalid_escape);
|
|
||||||
+ int first_invalid_escape_char;
|
|
||||||
+ const char *first_invalid_escape_ptr;
|
|
||||||
+ PyObject *result = _PyBytes_DecodeEscape2(s, len, NULL,
|
|
||||||
+ &first_invalid_escape_char,
|
|
||||||
+ &first_invalid_escape_ptr);
|
|
||||||
if (result == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
- if (first_invalid_escape != NULL) {
|
|
||||||
- if (warn_invalid_escape_sequence(p, s, first_invalid_escape, t) < 0) {
|
|
||||||
+ if (first_invalid_escape_ptr != NULL) {
|
|
||||||
+ if (warn_invalid_escape_sequence(p, s, first_invalid_escape_ptr, t) < 0) {
|
|
||||||
Py_DECREF(result);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
@@ -1,3 +0,0 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
|
||||||
oid sha256:3e464b0cbb7535e2db34262fd19a0a393d0e62be0f43b1513ed98379b054ead4
|
|
||||||
size 22613224
|
|
@@ -1 +0,0 @@
|
|||||||
{"mediaType": "application/vnd.dev.sigstore.bundle.v0.3+json", "verificationMaterial": {"certificate": {"rawBytes": "MIICzTCCAlOgAwIBAgIUXNqbdBZJ9fps7cdl20sumJAq9qYwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjQxMDE1MjMwNDE2WhcNMjQxMDE1MjMxNDE2WjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEcg+1tju2Qlwd/FxtfGT0xvTr74Z2Y4BSc2TvaDBBmRA/PtimxzlSdMhGDsfqHQLGi+b8OuTFW3Zox2aqHpqDCaOCAXIwggFuMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUVSMKNgZVgAfm3Hd9XuRrKl5zt40wHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wHQYDVR0RAQH/BBMwEYEPaHVnb0BweXRob24ub3JnMCwGCisGAQQBg78wAQEEHmh0dHBzOi8vZ2l0aHViLmNvbS9sb2dpbi9vYXV0aDAuBgorBgEEAYO/MAEIBCAMHmh0dHBzOi8vZ2l0aHViLmNvbS9sb2dpbi9vYXV0aDCBiQYKKwYBBAHWeQIEAgR7BHkAdwB1AN09MGrGxxEyYxkeHJlnNwKiSl643jyt/4eKcoAvKe6OAAABkpJsy7QAAAQDAEYwRAIgfOwKhNkvL09iC5/uS5iTGmnIQbXjbUM1woNbLOSYA8sCIEb2hbK7hH+jGAxJQEG9OUlqHb9GwD7TVMxHdVMzpmoOMAoGCCqGSM49BAMDA2gAMGUCMCBvcdz/4awBy5UdMRubMhvQD3eF8sdlrEhkk1ymjVZzJW2gD1KQdzIxHNK/7F9hegIxAJ+lw+fOlGvkIB+txzmL6pg9Pcsf2x9DVpisHPW4WUUbB7VORIamogW8OSAuQsZ6tQ=="}, "tlogEntries": [{"logIndex": "140392200", "logId": {"keyId": "wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="}, "kindVersion": {"kind": "hashedrekord", "version": "0.0.1"}, "integratedTime": "1729033456", "inclusionPromise": {"signedEntryTimestamp": "MEUCIEXI2s1U7Sve7CZ/p571004SLB9u5/ZT3Hf4tW9plQL/AiEAvvOg7se8XhZ+UNi7Qujx6bQxP0nHTrORgbP0Rg+xLGQ="}, "inclusionProof": {"logIndex": "18487938", "rootHash": "hSjsoi7BjBrhzW7Ceq8eDHavGqCXfJDqV1uLCH43rP0=", "treeSize": "18487939", "hashes": ["u79/W8pLop367cAKW1nkrasjLkk950s+chPOGd+YM7g=", "6/AN6/VWkeVC6ibK0wOaJWLDgeGYUPzGu++z5+WRpLw=", "XDRVudeM0USBGv0wfrkbUFLX5UPIMbXd7Jn+1FaHfXw=", "scHEQm8K7oRERzNSJaNlqN0E1OdiAscc4j9riGrA62g=", "/mosl9RAejdUfiMbl+lvD5kTT8EMHe3G8ceEh5ZmcAs=", "DPPCrptvLQKGtAJAKyVPBnf+K6vDmh24s1GP202TKto=", "dXjYLwyHqcxTI9MyukBet+9OyYvXCMvvLJJl9sIYKyA=", "rAAfgmPXo8TJp1LmkVDhAYrf0WzE4X4/mDuW1pwVM3Y=", "gf+9m552B3PnkWnO0o4KdVvjcT3WVHLrCbf1DoVYKFw="], "checkpoint": {"envelope": "rekor.sigstore.dev - 1193050959916656506\n18487939\nhSjsoi7BjBrhzW7Ceq8eDHavGqCXfJDqV1uLCH43rP0=\n\n\u2014 rekor.sigstore.dev wNI9ajBGAiEAgDgD5PWqYAJ4/g3gd2iOpEzZI/0I/WH5zpJyi9r4DcECIQC+1ibcP0dHlJ6v7Jd7rq8ojgP5eTKxsEv7tTU8erfyTQ==\n"}}, "canonicalizedBody": "eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiIzZTQ2NGIwY2JiNzUzNWUyZGIzNDI2MmZkMTlhMGEzOTNkMGU2MmJlMGY0M2IxNTEzZWQ5ODM3OWIwNTRlYWQ0In19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FUUNJQVRMMFNVQnVnWW5NSFZjbzYrcGtPTTkxSVd3cHQ3bis3VTdmZlNCeXU1WUFpQXU0RkxJSzJiU1puSmxranFkOUgwV3hBdnE3NmVPeFZ4L21JZytxN0N0NkE9PSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVTjZWRU5EUVd4UFowRjNTVUpCWjBsVldFNXhZbVJDV2tvNVpuQnpOMk5rYkRJd2MzVnRTa0Z4T1hGWmQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFJlRTFFUlRGTmFrMTNUa1JGTWxkb1kwNU5hbEY0VFVSRk1VMXFUWGhPUkVVeVYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZqWnlzeGRHcDFNbEZzZDJRdlJuaDBaa2RVTUhoMlZISTNORm95V1RSQ1UyTXlWSFlLWVVSQ1FtMVNRUzlRZEdsdGVIcHNVMlJOYUVkRWMyWnhTRkZNUjJrcllqaFBkVlJHVnpOYWIzZ3lZWEZJY0hGRVEyRlBRMEZZU1hkblowWjFUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlZXVTAxTENrNW5XbFpuUVdadE0waGtPVmgxVW5KTGJEVjZkRFF3ZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDBoUldVUldVakJTUVZGSUwwSkNUWGRGV1VWUVlVaFdibUl3UW5kbFdGSnZZakkwZFdJelNtNU5RM2RIUTJselIwRlJVVUpuTnpoM1FWRkZSUXBJYldnd1pFaENlazlwT0haYU1td3dZVWhXYVV4dFRuWmlVemx6WWpKa2NHSnBPWFpaV0ZZd1lVUkJkVUpuYjNKQ1owVkZRVmxQTDAxQlJVbENRMEZOQ2todGFEQmtTRUo2VDJrNGRsb3liREJoU0ZacFRHMU9kbUpUT1hOaU1tUndZbWs1ZGxsWVZqQmhSRU5DYVZGWlMwdDNXVUpDUVVoWFpWRkpSVUZuVWpjS1FraHJRV1IzUWpGQlRqQTVUVWR5UjNoNFJYbFplR3RsU0Vwc2JrNTNTMmxUYkRZME0ycDVkQzgwWlV0amIwRjJTMlUyVDBGQlFVSnJjRXB6ZVRkUlFRcEJRVkZFUVVWWmQxSkJTV2RtVDNkTGFFNXJka3d3T1dsRE5TOTFVelZwVkVkdGJrbFJZbGhxWWxWTk1YZHZUbUpNVDFOWlFUaHpRMGxGWWpKb1lrczNDbWhJSzJwSFFYaEtVVVZIT1U5VmJIRklZamxIZDBRM1ZGWk5lRWhrVmsxNmNHMXZUMDFCYjBkRFEzRkhVMDAwT1VKQlRVUkJNbWRCVFVkVlEwMURRbllLWTJSNkx6UmhkMEo1TlZWa1RWSjFZazFvZGxGRU0yVkdPSE5rYkhKRmFHdHJNWGx0YWxaYWVrcFhNbWRFTVV0UlpIcEplRWhPU3k4M1JqbG9aV2RKZUFwQlNpdHNkeXRtVDJ4SGRtdEpRaXQwZUhwdFREWndaemxRWTNObU1uZzVSRlp3YVhOSVVGYzBWMVZWWWtJM1ZrOVNTV0Z0YjJkWE9FOVRRWFZSYzFvMkNuUlJQVDBLTFMwdExTMUZUa1FnUTBWU1ZFbEdTVU5CVkVVdExTMHRMUW89In19fX0="}]}, "messageSignature": {"messageDigest": {"algorithm": "SHA2_256", "digest": "PkZLDLt1NeLbNCYv0ZoKOT0OYr4PQ7FRPtmDebBU6tQ="}, "signature": "MEQCIATL0SUBugYnMHVco6+pkOM91IWwpt7n+7U7ffSByu5YAiAu4FLIK2bSZnJlkjqd9H0WxAvq76eOxVx/mIg+q7Ct6A=="}}
|
|
@@ -1,3 +0,0 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
|
||||||
oid sha256:2ff9e10147342b3efd69f5cd9cc06ec46250f2a046587599d18e2cac69c05920
|
|
||||||
size 22696948
|
|
File diff suppressed because one or more lines are too long
@@ -1,3 +0,0 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
|
||||||
oid sha256:94349df207456a575a8867c20b4ca434f870e1920dcdcc8fdf797e1af49abe90
|
|
||||||
size 22749680
|
|
@@ -1 +0,0 @@
|
|||||||
{"mediaType": "application/vnd.dev.sigstore.bundle.v0.3+json", "verificationMaterial": {"certificate": {"rawBytes": "MIICzjCCAlWgAwIBAgIUDuq8kxtpL3by1SpAOIOeKKlsrjYwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjQxMjE3MTYwNzI2WhcNMjQxMjE3MTYxNzI2WjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEbmMPLFZSDjmfOKJGlOu6KqXbfARpxcurVugL1gOpPciVb/cVrPk9lP7V6B8zpnMK5ax2CbG3otAfweTtDWrnjqOCAXQwggFwMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUDct7Hl3MxAxfP1dhgpDF6PSlUuMwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wHQYDVR0RAQH/BBMwEYEPaHVnb0BweXRob24ub3JnMCwGCisGAQQBg78wAQEEHmh0dHBzOi8vZ2l0aHViLmNvbS9sb2dpbi9vYXV0aDAuBgorBgEEAYO/MAEIBCAMHmh0dHBzOi8vZ2l0aHViLmNvbS9sb2dpbi9vYXV0aDCBiwYKKwYBBAHWeQIEAgR9BHsAeQB3AN09MGrGxxEyYxkeHJlnNwKiSl643jyt/4eKcoAvKe6OAAABk9Vfz7QAAAQDAEgwRgIhALGA/GkNojAPK5EODrVG03RxOEr/0bFyv5wxxxx9otO0AiEAt8SElgsdc7QW/vevYc0lQ6aA1BmxAsjG6O333PTx2hwwCgYIKoZIzj0EAwMDZwAwZAIwd8VqF3+Jxkb1Un90vEsxZAHErNq4ed7BStBPTL+z9ngwBpNcR2NySohOZxgBZuP0AjA5hXuw9WbV15D9do4x4gSiOpCe5AMpgoU/ld0YZfbwN0v/h2rIF64Cp2J04V1RYkw="}, "tlogEntries": [{"logIndex": "156043087", "logId": {"keyId": "wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="}, "kindVersion": {"kind": "hashedrekord", "version": "0.0.1"}, "integratedTime": "1734451646", "inclusionPromise": {"signedEntryTimestamp": "MEUCIQD1bn+1BlbnvdMGTX8cRvOVMdhE9Imcz9FMgKSDo4q3yAIgJT+Nibv1h0auGmm6in89ane7DKqcH1e6JxT4sXHO1bQ="}, "inclusionProof": {"logIndex": "34138825", "rootHash": "7Qt+3ioEkHd/WQ+ZF4zkdbZ1JExMNGx/pF6U2cmtM/Q=", "treeSize": "34138826", "hashes": ["460W3n1CZaOKfLd1/YSC0H5L84wbbSFUNol1ZwDndoM=", "y7NhKWl4yggGf0GhUE9xHzlnejEw3Hip+npVOBmV31I=", "dV++dwKBz/zC/+rg8FF5eQt3qeYLLCBeALXUFzUUDvk=", "Fxn6iOFXoaUrdLXwrSYOGfimcHgNjfjb9TnhpIjuaCc=", "BkTein2wmT1o/gL3lyKvg06L/h4CKSyJUadCatxLBTI=", "M1nIbSb6tTZeslPr6Qyo3LT16Jr+lJ+fgJD3il4tqkc=", "dvMxr6G8Mnh7ppC7ZlLdoid1OKb+1L5aNmhT6oEy3og=", "NTLDQYFQUNEJKfKO4iPdERTA3qiw5W+1lj7tBj6ucO0=", "KSSbh1+IusMZKVSTJMSjnahGEacBezafZFvtTDmdcng=", "oj35HyCM3EqQ5Lil2RUr9boiRWZlouxLnqNA7z28Glc=", "vemyaMj0Na1LMjbB/9Dmkq8T+jAb3o+yCESgAayUABU="], "checkpoint": {"envelope": "rekor.sigstore.dev - 1193050959916656506\n34138826\n7Qt+3ioEkHd/WQ+ZF4zkdbZ1JExMNGx/pF6U2cmtM/Q=\n\n\u2014 rekor.sigstore.dev wNI9ajBEAiAk3Vso0Awrs2GLdUg8Ol1Ck4ChMQGcLf/nLMpOmTHQ3AIgIGkpE6mkns2HjIewM4H4D+BPv0UWGBaEYuDx9NXJ5Tg=\n"}}, "canonicalizedBody": "eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiI5NDM0OWRmMjA3NDU2YTU3NWE4ODY3YzIwYjRjYTQzNGY4NzBlMTkyMGRjZGNjOGZkZjc5N2UxYWY0OWFiZTkwIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FUUNJRGRodWh6cmtJOHZrZjVVSlNiOGRIT0w5OEtpWXIvd1NwWjFVK3JNd2tQbEFpQTVCbXZjamNNaTNPMlMyak56bDVzd20zVXpXTysxSGk1VnpqTGM5bVlKcFE9PSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVTjZha05EUVd4WFowRjNTVUpCWjBsVlJIVnhPR3Q0ZEhCTU0ySjVNVk53UVU5SlQyVkxTMnh6Y21wWmQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFJlRTFxUlROTlZGbDNUbnBKTWxkb1kwNU5hbEY0VFdwRk0wMVVXWGhPZWtreVYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZpYlUxUVRFWmFVMFJxYldaUFMwcEhiRTkxTmt0eFdHSm1RVkp3ZUdOMWNsWjFaMHdLTVdkUGNGQmphVlppTDJOV2NsQnJPV3hRTjFZMlFqaDZjRzVOU3pWaGVESkRZa2N6YjNSQlpuZGxWSFJFVjNKdWFuRlBRMEZZVVhkblowWjNUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlZFWTNRM0NraHNNMDE0UVhobVVERmthR2R3UkVZMlVGTnNWWFZOZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDBoUldVUldVakJTUVZGSUwwSkNUWGRGV1VWUVlVaFdibUl3UW5kbFdGSnZZakkwZFdJelNtNU5RM2RIUTJselIwRlJVVUpuTnpoM1FWRkZSUXBJYldnd1pFaENlazlwT0haYU1td3dZVWhXYVV4dFRuWmlVemx6WWpKa2NHSnBPWFpaV0ZZd1lVUkJkVUpuYjNKQ1owVkZRVmxQTDAxQlJVbENRMEZOQ2todGFEQmtTRUo2VDJrNGRsb3liREJoU0ZacFRHMU9kbUpUT1hOaU1tUndZbWs1ZGxsWVZqQmhSRU5DYVhkWlMwdDNXVUpDUVVoWFpWRkpSVUZuVWprS1FraHpRV1ZSUWpOQlRqQTVUVWR5UjNoNFJYbFplR3RsU0Vwc2JrNTNTMmxUYkRZME0ycDVkQzgwWlV0amIwRjJTMlUyVDBGQlFVSnJPVlptZWpkUlFRcEJRVkZFUVVWbmQxSm5TV2hCVEVkQkwwZHJUbTlxUVZCTE5VVlBSSEpXUnpBelVuaFBSWEl2TUdKR2VYWTFkM2g0ZUhnNWIzUlBNRUZwUlVGME9GTkZDbXhuYzJSak4xRlhMM1psZGxsak1HeFJObUZCTVVKdGVFRnpha2MyVHpNek0xQlVlREpvZDNkRFoxbEpTMjlhU1hwcU1FVkJkMDFFV25kQmQxcEJTWGNLWkRoV2NVWXpLMHA0YTJJeFZXNDVNSFpGYzNoYVFVaEZjazV4TkdWa04wSlRkRUpRVkV3cmVqbHVaM2RDY0U1alVqSk9lVk52YUU5YWVHZENXblZRTUFwQmFrRTFhRmgxZHpsWFlsWXhOVVE1Wkc4MGVEUm5VMmxQY0VObE5VRk5jR2R2VlM5c1pEQlpXbVppZDA0d2RpOW9NbkpKUmpZMFEzQXlTakEwVmpGU0NsbHJkejBLTFMwdExTMUZUa1FnUTBWU1ZFbEdTVU5CVkVVdExTMHRMUW89In19fX0="}]}, "messageSignature": {"messageDigest": {"algorithm": "SHA2_256", "digest": "lDSd8gdFaldaiGfCC0ykNPhw4ZINzcyP33l+GvSavpA="}, "signature": "MEQCIDdhuhzrkI8vkf5UJSb8dHOL98KiYr/wSpZ1U+rMwkPlAiA5BmvcjcMi3O2S2jNzl5swm3UzWO+1Hi5VzjLc9mYJpQ=="}}
|
|
@@ -1,3 +0,0 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
|
||||||
oid sha256:c24f07881873c1d460228795ca6ca8c99130e30c773c91463d30d7ea8ff0e70b
|
|
||||||
size 22798932
|
|
@@ -1 +0,0 @@
|
|||||||
{"mediaType": "application/vnd.dev.sigstore.bundle.v0.3+json", "verificationMaterial": {"certificate": {"rawBytes": "MIICzzCCAlWgAwIBAgIUTNqrmr/M2mihtEwN8O2FyM2q1q4wCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjUwMTE0MTYwMTUwWhcNMjUwMTE0MTYxMTUwWjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEXFyDvDOdj/YAUw6VwCbccPuaGXVlONd/+yU2w6pjOucN7XNrKQzRc2p0B87e6fBJNtrvoQskKm5g5RZRNIaTraOCAXQwggFwMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQU+FemmqqSGkLeHpehmVT+O/2VD1MwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wHQYDVR0RAQH/BBMwEYEPaHVnb0BweXRob24ub3JnMCwGCisGAQQBg78wAQEEHmh0dHBzOi8vZ2l0aHViLmNvbS9sb2dpbi9vYXV0aDAuBgorBgEEAYO/MAEIBCAMHmh0dHBzOi8vZ2l0aHViLmNvbS9sb2dpbi9vYXV0aDCBiwYKKwYBBAHWeQIEAgR9BHsAeQB3AN09MGrGxxEyYxkeHJlnNwKiSl643jyt/4eKcoAvKe6OAAABlGWMvxkAAAQDAEgwRgIhAMdC5GErGZYgWadLhCcmCxR3wAZ8jSVhTikA8HyIMUjKAiEAjZQMpnwoXgxNEXGAs8J/Myxxp5Lky719397l9nhdPk8wCgYIKoZIzj0EAwMDaAAwZQIxAMcST1Hx0VxHs8dH4fVNnJHRqHV70g4gWXOUahXOh86pLbvOOsGqM3w8o3kUhjO7oAIwRCZiVhDjDq59iDX6/IO7mG/gwNXBVqKSPdcYRS6l/SxM3JRORz8QCQK3HtM5TPvm"}, "tlogEntries": [{"logIndex": "162324179", "logId": {"keyId": "wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="}, "kindVersion": {"kind": "hashedrekord", "version": "0.0.1"}, "integratedTime": "1736870510", "inclusionPromise": {"signedEntryTimestamp": "MEQCIAXgFU1gThdT0mhc6q0AXzD3bBXTiacgiLtvj81gdZF4AiBN9qUrwxowhsD9xRkTFuRk/l7pkEkkF84mJouMltHlqw=="}, "inclusionProof": {"logIndex": "40419917", "rootHash": "sQcmJqkpVAfxguDGAn46H0Jx7wI/seLoX5hw8YAhpzE=", "treeSize": "40419918", "hashes": ["qjl0o9LTqPs1qAydDqJeuEjAe7m0r28edbu6YhwigVs=", "ld8TM/ZFyvOEsuFo6tzdkPMu1WXFFF7FkLeePNxTZgQ=", "msMDMUPWOxenW8+fKcA9KtYwJh+qOm8eJ6hD6qMLxgo=", "HB3n8ruKgQ4/hsnPPqqgZqgqrIY+bil6MZEN48iQf5o=", "s4485wmLHDIJ3Uz0cZtlQJMaGl/NcoVYyRSxf8iaGF0=", "ipeSaii1joKqXMjR8vQt0JqN3F2T64mYFe55cZTSE7k=", "Zh8tfYPsaKKLrwZBF7ddhto+2SATy+XV9dtLPctNAlU=", "GVSyTNVOEKppJTUqz+nM5IM0FJ34fKBEIv5VAyJ7Dv4=", "tlaG/ckV5gypfBxP4OGlhhoLQ/VcEe+s4IdoNM+5CJk=", "LxTVSFPuriQ2RUI8Dbu2hz4wzAG1G271/Jivqrd1etw=", "vemyaMj0Na1LMjbB/9Dmkq8T+jAb3o+yCESgAayUABU="], "checkpoint": {"envelope": "rekor.sigstore.dev - 1193050959916656506\n40419918\nsQcmJqkpVAfxguDGAn46H0Jx7wI/seLoX5hw8YAhpzE=\n\n\u2014 rekor.sigstore.dev wNI9ajBGAiEAv+PVAciPszI4zlpSunN4bfTvMqVTy5p62XGhyX7jQwACIQCNHJdBqkgiBk7OICiGqlcnklnK9wf4okEYP4iC2UpSUQ==\n"}}, "canonicalizedBody": "eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiJjMjRmMDc4ODE4NzNjMWQ0NjAyMjg3OTVjYTZjYThjOTkxMzBlMzBjNzczYzkxNDYzZDMwZDdlYThmZjBlNzBiIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FVUNJUUROejA2OHVmUE1tRUNZL3JldUdNSGRBbUhoazc1MHNaNHdTKytsY1g1Z0xRSWdLdzN1S1oydm9Jd2FMSWk1dFl3d2JBOUZUaFVHK05NUDViYmwyS0xSYXZjPSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVTjZla05EUVd4WFowRjNTVUpCWjBsVlZFNXhjbTF5TDAweWJXbG9kRVYzVGpoUE1rWjVUVEp4TVhFMGQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFZkMDFVUlRCTlZGbDNUVlJWZDFkb1kwNU5hbFYzVFZSRk1FMVVXWGhOVkZWM1YycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZZUm5sRWRrUlBaR292V1VGVmR6WldkME5pWTJOUWRXRkhXRlpzVDA1a0x5dDVWVElLZHpad2FrOTFZMDQzV0U1eVMxRjZVbU15Y0RCQ09EZGxObVpDU2s1MGNuWnZVWE5yUzIwMVp6VlNXbEpPU1dGVWNtRlBRMEZZVVhkblowWjNUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlVyUm1WdENtMXhjVk5IYTB4bFNIQmxhRzFXVkN0UEx6SldSREZOZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDBoUldVUldVakJTUVZGSUwwSkNUWGRGV1VWUVlVaFdibUl3UW5kbFdGSnZZakkwZFdJelNtNU5RM2RIUTJselIwRlJVVUpuTnpoM1FWRkZSUXBJYldnd1pFaENlazlwT0haYU1td3dZVWhXYVV4dFRuWmlVemx6WWpKa2NHSnBPWFpaV0ZZd1lVUkJkVUpuYjNKQ1owVkZRVmxQTDAxQlJVbENRMEZOQ2todGFEQmtTRUo2VDJrNGRsb3liREJoU0ZacFRHMU9kbUpUT1hOaU1tUndZbWs1ZGxsWVZqQmhSRU5DYVhkWlMwdDNXVUpDUVVoWFpWRkpSVUZuVWprS1FraHpRV1ZSUWpOQlRqQTVUVWR5UjNoNFJYbFplR3RsU0Vwc2JrNTNTMmxUYkRZME0ycDVkQzgwWlV0amIwRjJTMlUyVDBGQlFVSnNSMWROZG5oclFRcEJRVkZFUVVWbmQxSm5TV2hCVFdSRE5VZEZja2RhV1dkWFlXUk1hRU5qYlVONFVqTjNRVm80YWxOV2FGUnBhMEU0U0hsSlRWVnFTMEZwUlVGcVdsRk5DbkJ1ZDI5WVozaE9SVmhIUVhNNFNpOU5lWGg0Y0RWTWEzazNNVGt6T1Rkc09XNW9aRkJyT0hkRFoxbEpTMjlhU1hwcU1FVkJkMDFFWVVGQmQxcFJTWGdLUVUxalUxUXhTSGd3Vm5oSWN6aGtTRFJtVms1dVNraFNjVWhXTnpCbk5HZFhXRTlWWVdoWVQyZzRObkJNWW5aUFQzTkhjVTB6ZHpodk0ydFZhR3BQTndwdlFVbDNVa05hYVZab1JHcEVjVFU1YVVSWU5pOUpUemR0Unk5bmQwNVlRbFp4UzFOUVpHTlpVbE0yYkM5VGVFMHpTbEpQVW5vNFVVTlJTek5JZEUwMUNsUlFkbTBLTFMwdExTMUZUa1FnUTBWU1ZFbEdTVU5CVkVVdExTMHRMUW89In19fX0="}]}, "messageSignature": {"messageDigest": {"algorithm": "SHA2_256", "digest": "wk8HiBhzwdRgIoeVymyoyZEw4wx3PJFGPTDX6o/w5ws="}, "signature": "MEUCIQDNz068ufPMmECY/reuGMHdAmHhk750sZ4wS++lcX5gLQIgKw3uKZ2voIwaLIi5tYwwbA9FThUG+NMP5bbl2KLRavc="}}
|
|
@@ -1,3 +0,0 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
|
||||||
oid sha256:71adbcec3ac9edf93308e55cfb4184f2eb4b16fda2bb0a5a382929ed29c8386d
|
|
||||||
size 23015952
|
|
@@ -1 +0,0 @@
|
|||||||
{"mediaType": "application/vnd.dev.sigstore.bundle.v0.3+json", "verificationMaterial": {"certificate": {"rawBytes": "MIICzjCCAlSgAwIBAgIUDwqRiJH4afgF7PkW1Qo6rr2v0lkwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjUwNDA4MTQxMDA1WhcNMjUwNDA4MTQyMDA1WjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEZMgeduxSbRvf4+rxh9JLHe0ESc4Xexly0NaNWHeiTHLmdg+PRLNa5wLOEMZnjbZejU7znxttN65MnOzV5cOcoKOCAXMwggFvMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUJQXlBvRXJEBKte20LxybMfGrT6YwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wHQYDVR0RAQH/BBMwEYEPaHVnb0BweXRob24ub3JnMCwGCisGAQQBg78wAQEEHmh0dHBzOi8vZ2l0aHViLmNvbS9sb2dpbi9vYXV0aDAuBgorBgEEAYO/MAEIBCAMHmh0dHBzOi8vZ2l0aHViLmNvbS9sb2dpbi9vYXV0aDCBigYKKwYBBAHWeQIEAgR8BHoAeAB2AN09MGrGxxEyYxkeHJlnNwKiSl643jyt/4eKcoAvKe6OAAABlhW8oHwAAAQDAEcwRQIhALZwxAQ5nnFRozZP8YRDJAl6S1kWfYD5oV7AEPrj0s5CAiA5CY5C5cBFEcjroS+wQAWg1LW4HqvRZ0KVR99kcb4a/TAKBggqhkjOPQQDAwNoADBlAjAHbpNPV8nJ2q37EdYR8NElF7p7qVBSdT9VzBLh0X0WL0Df0ub0LiBPYPNELQ/n0rQCMQDd2OPfzn42qBrwT/TUP2yR0/0h9nsqGOsinLhLH/euLXXJ+xK0iHMRLfk4cABvoFs="}, "tlogEntries": [{"logIndex": "193881744", "logId": {"keyId": "wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="}, "kindVersion": {"kind": "hashedrekord", "version": "0.0.1"}, "integratedTime": "1744121405", "inclusionPromise": {"signedEntryTimestamp": "MEUCIQDZCZJVW+h+35nY12Z9y9tOkwStyIEVZmXSPx7mQUy0DwIgYWnL18yNoypHlLRSb2WIkcRxcD589pZdPORUS442MhU="}, "inclusionProof": {"logIndex": "71977482", "rootHash": "5SzvaU4/6U0MtwYjXGh0z1gIbnBbXfoMCLyL7PyEzE8=", "treeSize": "71977483", "hashes": ["+kSGTHFAaROPxw/+007Kwz3MXdUvY3V+rrY6sn3rTWc=", "gArlaOWkPW1lG6zUi9fwcxm6cyXspC+A2q3O5EzUI28=", "9TNwbV6fOnLuQ0CrvdKWO4n2fooZCvdCTwrFZCo6a8E=", "phHq2powa3InqGTI+IN0To1CKFgq/QLjjjUOmMz73pU=", "3tDvwrpMz/XYloigErVZuQZphUjJ7mX16wnR7tq2tMY=", "QReFEOB9XSZtDKsjRtA0fGnYGMYD2Z7qn50auG1YlWo=", "K26LG80DXyb+bC58c4Nw00WigG52v0PCsZGY3ExGsts=", "WEm5OgPzJpYROv+4CcrieexCYyQKrLUH3hbxmcQQ+DM=", "7v8qPHNDLerpduaMx06eb/MwgoQwczTn/cYGKX/9wZ4="], "checkpoint": {"envelope": "rekor.sigstore.dev - 1193050959916656506\n71977483\n5SzvaU4/6U0MtwYjXGh0z1gIbnBbXfoMCLyL7PyEzE8=\n\n\u2014 rekor.sigstore.dev wNI9ajBFAiEAxksfGmVyE0Zi4wa9fM67aL5JUeJSsJUyWeU2jqqH/yoCIHfCdL/guuSIxD8tEK6/qQoRdbugANBBjI6gG96bkluH\n"}}, "canonicalizedBody": "eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiI3MWFkYmNlYzNhYzllZGY5MzMwOGU1NWNmYjQxODRmMmViNGIxNmZkYTJiYjBhNWEzODI5MjllZDI5YzgzODZkIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FVUNJUUR3U3lCQ2swa2t3NytBNDlSL0UxVmdrRUtORXhKYUt4ejU3SjYzUWdTSlhBSWdMdUVpNGNqMnMvTFZ1VEdaaThGMkxZZVhzOUJtYXA0cnVyU3NWWHI5L21VPSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVTjZha05EUVd4VFowRjNTVUpCWjBsVlJIZHhVbWxLU0RSaFptZEdOMUJyVnpGUmJ6WnljakoyTUd4cmQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFZkMDVFUVRSTlZGRjRUVVJCTVZkb1kwNU5hbFYzVGtSQk5FMVVVWGxOUkVFeFYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZhVFdkbFpIVjRVMkpTZG1ZMEszSjRhRGxLVEVobE1FVlRZelJZWlhoc2VUQk9ZVTRLVjBobGFWUklURzFrWnl0UVVreE9ZVFYzVEU5RlRWcHVhbUphWldwVk4zcHVlSFIwVGpZMVRXNVBlbFkxWTA5amIwdFBRMEZZVFhkblowWjJUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlZLVVZoc0NrSjJVbGhLUlVKTGRHVXlNRXg0ZVdKTlprZHlWRFpaZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDBoUldVUldVakJTUVZGSUwwSkNUWGRGV1VWUVlVaFdibUl3UW5kbFdGSnZZakkwZFdJelNtNU5RM2RIUTJselIwRlJVVUpuTnpoM1FWRkZSUXBJYldnd1pFaENlazlwT0haYU1td3dZVWhXYVV4dFRuWmlVemx6WWpKa2NHSnBPWFpaV0ZZd1lVUkJkVUpuYjNKQ1owVkZRVmxQTDAxQlJVbENRMEZOQ2todGFEQmtTRUo2VDJrNGRsb3liREJoU0ZacFRHMU9kbUpUT1hOaU1tUndZbWs1ZGxsWVZqQmhSRU5DYVdkWlMwdDNXVUpDUVVoWFpWRkpSVUZuVWpnS1FraHZRV1ZCUWpKQlRqQTVUVWR5UjNoNFJYbFplR3RsU0Vwc2JrNTNTMmxUYkRZME0ycDVkQzgwWlV0amIwRjJTMlUyVDBGQlFVSnNhRmM0YjBoM1FRcEJRVkZFUVVWamQxSlJTV2hCVEZwM2VFRlJOVzV1UmxKdmVscFFPRmxTUkVwQmJEWlRNV3RYWmxsRU5XOVdOMEZGVUhKcU1ITTFRMEZwUVRWRFdUVkRDalZqUWtaRlkycHliMU1yZDFGQlYyY3hURmMwU0hGMlVsb3dTMVpTT1RsclkySTBZUzlVUVV0Q1oyZHhhR3RxVDFCUlVVUkJkMDV2UVVSQ2JFRnFRVWdLWW5CT1VGWTRia295Y1RNM1JXUlpVamhPUld4R04zQTNjVlpDVTJSVU9WWjZRa3hvTUZnd1Ywd3dSR1l3ZFdJd1RHbENVRmxRVGtWTVVTOXVNSEpSUXdwTlVVUmtNazlRWm5wdU5ESnhRbkozVkM5VVZWQXllVkl3THpCb09XNXpjVWRQYzJsdVRHaE1TQzlsZFV4WVdFb3JlRXN3YVVoTlVreG1helJqUVVKMkNtOUdjejBLTFMwdExTMUZUa1FnUTBWU1ZFbEdTVU5CVkVVdExTMHRMUW89In19fX0="}]}, "messageSignature": {"messageDigest": {"algorithm": "SHA2_256", "digest": "ca287DrJ7fkzCOVc+0GE8utLFv2iuwpaOCkp7SnIOG0="}, "signature": "MEUCIQDwSyBCk0kkw7+A49R/E1VgkEKNExJaKxz57J63QgSJXAIgLuEi4cj2s/LVuTGZi8F2LYeXs9Bmap4rurSsVXr9/mU="}}
|
|
@@ -1,3 +0,0 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
|
||||||
oid sha256:2ddd30a77c9f62e065ce648664a254b9b0c011bcdaa8c1c2787087e644cbeb39
|
|
||||||
size 23358200
|
|
File diff suppressed because one or more lines are too long
@@ -1,3 +0,0 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
|
||||||
oid sha256:7ac9e84844bbc0a5a8f1f79a37a68b3b8caf2a58b4aa5999c49227cb36e70ea6
|
|
||||||
size 23579860
|
|
File diff suppressed because one or more lines are too long
@@ -1,3 +0,0 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
|
||||||
oid sha256:c6f48bf51f01f50d87007a445dd7afe4a4c7a87ab482570be924c1ddfd0d3682
|
|
||||||
size 23626928
|
|
File diff suppressed because one or more lines are too long
@@ -1,3 +0,0 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
|
||||||
oid sha256:15e123e056abebba6de5e73cfa304459a8c82cafa85d4fc7fc6de80e6a3e1b39
|
|
||||||
size 23641472
|
|
File diff suppressed because one or more lines are too long
@@ -1,40 +0,0 @@
|
|||||||
---
|
|
||||||
Lib/test/test_urllib2.py | 9 +++++++++
|
|
||||||
1 file changed, 9 insertions(+)
|
|
||||||
|
|
||||||
--- a/Lib/test/test_urllib2.py
|
|
||||||
+++ b/Lib/test/test_urllib2.py
|
|
||||||
@@ -1,3 +1,4 @@
|
|
||||||
+import logging
|
|
||||||
import unittest
|
|
||||||
from test import support
|
|
||||||
from test.support import os_helper
|
|
||||||
@@ -29,6 +30,10 @@ import http.client
|
|
||||||
|
|
||||||
support.requires_working_socket(module=True)
|
|
||||||
|
|
||||||
+logging.basicConfig(format='%(levelname)s:%(funcName)s:%(message)s',
|
|
||||||
+ level=logging.DEBUG)
|
|
||||||
+log = logging.getLogger()
|
|
||||||
+
|
|
||||||
# XXX
|
|
||||||
# Request
|
|
||||||
# CacheFTPHandler (hard to write)
|
|
||||||
@@ -731,6 +736,9 @@ def sanepathname2url(path):
|
|
||||||
|
|
||||||
class HandlerTests(unittest.TestCase):
|
|
||||||
|
|
||||||
+ def setUp(self):
|
|
||||||
+ log.debug('Is network available: {}'.format(support.is_resource_enabled('network')))
|
|
||||||
+
|
|
||||||
def test_ftp(self):
|
|
||||||
class MockFTPWrapper:
|
|
||||||
def __init__(self, data):
|
|
||||||
@@ -794,6 +802,7 @@ class HandlerTests(unittest.TestCase):
|
|
||||||
self.assertEqual(headers.get("Content-type"), mimetype)
|
|
||||||
self.assertEqual(int(headers["Content-length"]), len(data))
|
|
||||||
|
|
||||||
+ @support.requires_resource('network')
|
|
||||||
def test_ftp_error(self):
|
|
||||||
class ErrorFTPHandler(urllib.request.FTPHandler):
|
|
||||||
def __init__(self, exception):
|
|
@@ -1,34 +0,0 @@
|
|||||||
---
|
|
||||||
Lib/test/test_ctypes/test_generated_structs.py | 7 +++++++
|
|
||||||
1 file changed, 7 insertions(+)
|
|
||||||
|
|
||||||
--- a/Lib/test/test_ctypes/test_generated_structs.py
|
|
||||||
+++ b/Lib/test/test_ctypes/test_generated_structs.py
|
|
||||||
@@ -12,6 +12,7 @@ Run this module to regenerate the files:
|
|
||||||
import unittest
|
|
||||||
from test.support import import_helper
|
|
||||||
import re
|
|
||||||
+import sys
|
|
||||||
from dataclasses import dataclass
|
|
||||||
from functools import cached_property
|
|
||||||
|
|
||||||
@@ -21,6 +22,11 @@ from ctypes import sizeof, alignment, po
|
|
||||||
_ctypes_test = import_helper.import_module("_ctypes_test")
|
|
||||||
|
|
||||||
|
|
||||||
+def is_32bit():
|
|
||||||
+ # or alternatively (slightly slower)
|
|
||||||
+ # (struct.calcsize("P") * 8) == 32
|
|
||||||
+ return not (sys.maxsize > 2**32)
|
|
||||||
+
|
|
||||||
# ctypes erases the difference between `c_int` and e.g.`c_int16`.
|
|
||||||
# To keep it, we'll use custom subclasses with the C name stashed in `_c_name`:
|
|
||||||
class c_bool(ctypes.c_bool):
|
|
||||||
@@ -415,6 +421,7 @@ class AnonBitfields(Structure):
|
|
||||||
|
|
||||||
|
|
||||||
class GeneratedTest(unittest.TestCase):
|
|
||||||
+ @unittest.skipIf(is_32bit(), 'fails on 32bit platform (gh#python/cpython#121938)')
|
|
||||||
def test_generated_data(self):
|
|
||||||
"""Check that a ctypes struct/union matches its C equivalent.
|
|
||||||
|
|
@@ -1,37 +0,0 @@
|
|||||||
From 091fd6240c6b263d848e8a5d20da042258f648b5 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Jonathan Protzenko <protz@microsoft.com>
|
|
||||||
Date: Thu, 10 Oct 2024 11:59:06 +0200
|
|
||||||
Subject: [PATCH 1/2] Try for Debian x86
|
|
||||||
|
|
||||||
---
|
|
||||||
Misc/sbom.spdx.json | 4 ++--
|
|
||||||
Modules/_hacl/libintvector.h | 2 +-
|
|
||||||
2 files changed, 3 insertions(+), 3 deletions(-)
|
|
||||||
|
|
||||||
--- a/Misc/sbom.spdx.json
|
|
||||||
+++ b/Misc/sbom.spdx.json
|
|
||||||
@@ -804,11 +804,11 @@
|
|
||||||
"checksums": [
|
|
||||||
{
|
|
||||||
"algorithm": "SHA1",
|
|
||||||
- "checksumValue": "d5d85ee8f0bd52781fe470d0bf73ec388ddb3999"
|
|
||||||
+ "checksumValue": "f4a33ad535768b860362ab0bd033a70da0b524b7"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"algorithm": "SHA256",
|
|
||||||
- "checksumValue": "9a421b998add98fe366374641c4edb27617ff539a59f0963879f345065d3d39d"
|
|
||||||
+ "checksumValue": "433cdf4ba80bc72e0cea5d4b420ff18676baeafdb5ba19adf5b7fb33e90b424b"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"fileName": "Modules/_hacl/libintvector.h"
|
|
||||||
--- a/Modules/_hacl/libintvector.h
|
|
||||||
+++ b/Modules/_hacl/libintvector.h
|
|
||||||
@@ -19,7 +19,7 @@
|
|
||||||
|
|
||||||
#define Lib_IntVector_Intrinsics_bit_mask64(x) -((x) & 1)
|
|
||||||
|
|
||||||
-#if defined(__x86_64__) || defined(_M_X64)
|
|
||||||
+#if defined(__x86_64__) || defined(_M_X64) || defined(__i386__) || defined(_M_IX86)
|
|
||||||
|
|
||||||
#if defined(HACL_CAN_COMPILE_VEC128)
|
|
||||||
|
|
Reference in New Issue
Block a user