Skip to content

Commit d5a6284

Browse files
authored
Merge pull request RustPython#5044 from youknowone/rust-1.72
Fix windows SSL failure & Update to Rust 1.72.0
2 parents bdb0c8f + 03f9544 commit d5a6284

File tree

17 files changed

+143
-66
lines changed

17 files changed

+143
-66
lines changed

compiler/codegen/src/compile.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -976,7 +976,7 @@ impl Compiler {
976976
.chain(&args.posonlyargs)
977977
.chain(&args.args)
978978
.map(|arg| arg.as_arg())
979-
.chain(kw_without_defaults.into_iter())
979+
.chain(kw_without_defaults)
980980
.chain(kw_with_defaults.into_iter().map(|(arg, _)| arg));
981981
for name in args_iter {
982982
self.varname(name.arg.as_str())?;

compiler/core/src/marshal.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -484,7 +484,9 @@ impl Write for Vec<u8> {
484484
}
485485

486486
pub(crate) fn write_len<W: Write>(buf: &mut W, len: usize) {
487-
let Ok(len) = len.try_into() else { panic!("too long to serialize") };
487+
let Ok(len) = len.try_into() else {
488+
panic!("too long to serialize")
489+
};
488490
buf.write_u32(len);
489491
}
490492

derive-impl/src/pyclass.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1327,7 +1327,10 @@ impl ItemMeta for SlotItemMeta {
13271327
Some(HashMap::default())
13281328
};
13291329
let (Some(meta_map), None) = (meta_map, nested.next()) else {
1330-
bail_span!(meta_ident, "#[pyslot] must be of the form #[pyslot] or #[pyslot(slot_name)]")
1330+
bail_span!(
1331+
meta_ident,
1332+
"#[pyslot] must be of the form #[pyslot] or #[pyslot(slot_name)]"
1333+
)
13311334
};
13321335
Ok(Self::from_inner(ItemMetaInner {
13331336
item_ident,

derive-impl/src/util.rs

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -167,9 +167,16 @@ impl ItemMetaInner {
167167
pub fn _optional_str(&self, key: &str) -> Result<Option<String>> {
168168
let value = if let Some((_, meta)) = self.meta_map.get(key) {
169169
let Meta::NameValue(syn::MetaNameValue {
170-
lit: syn::Lit::Str(lit), ..
171-
}) = meta else {
172-
bail_span!(meta, "#[{}({} = ...)] must exist as a string", self.meta_name(), key)
170+
lit: syn::Lit::Str(lit),
171+
..
172+
}) = meta
173+
else {
174+
bail_span!(
175+
meta,
176+
"#[{}({} = ...)] must exist as a string",
177+
self.meta_name(),
178+
key
179+
)
173180
};
174181
Some(lit.value())
175182
} else {
@@ -203,7 +210,10 @@ impl ItemMetaInner {
203210
key: &str,
204211
) -> Result<Option<impl std::iter::Iterator<Item = &'_ NestedMeta>>> {
205212
let value = if let Some((_, meta)) = self.meta_map.get(key) {
206-
let Meta::List(syn::MetaList { path: _, nested, .. }) = meta else {
213+
let Meta::List(syn::MetaList {
214+
path: _, nested, ..
215+
}) = meta
216+
else {
207217
bail_span!(meta, "#[{}({}(...))] must be a list", self.meta_name(), key)
208218
};
209219
Some(nested.into_iter())
@@ -445,11 +455,11 @@ impl ExceptionItemMeta {
445455
return Ok({
446456
let type_name = inner.item_name();
447457
let Some(py_name) = type_name.as_str().strip_prefix("Py") else {
448-
bail_span!(
458+
bail_span!(
449459
inner.item_ident,
450460
"#[pyexception] expects its underlying type to be named `Py` prefixed"
451461
)
452-
};
462+
};
453463
py_name.to_string()
454464
})
455465
}

pylib/build.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ fn main() {
99

1010
if cfg!(windows) {
1111
if let Ok(real_path) = std::fs::read_to_string("Lib") {
12-
println!("rustc-env:win_lib_path={real_path:?}");
12+
println!("cargo:rustc-env=win_lib_path={real_path:?}");
1313
}
1414
}
1515
}

src/interpreter.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,6 @@ pub fn init_stdlib(vm: &mut VirtualMachine) {
6666
.push(rustpython_pylib::LIB_PATH.to_owned())
6767
}
6868

69-
settings.path_list.extend(path_list.into_iter());
69+
settings.path_list.extend(path_list);
7070
}
7171
}

stdlib/src/array.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1484,14 +1484,14 @@ mod array {
14841484
_ => false,
14851485
};
14861486
match code {
1487-
0 | 1 => Ok(Self::Int8 { signed }),
1488-
2 | 3 | 4 | 5 => Ok(Self::Int16 { signed, big_endian }),
1489-
6 | 7 | 8 | 9 => Ok(Self::Int32 { signed, big_endian }),
1490-
10 | 11 | 12 | 13 => Ok(Self::Int64 { signed, big_endian }),
1491-
14 | 15 => Ok(Self::Ieee754Float { big_endian }),
1492-
16 | 17 => Ok(Self::Ieee754Double { big_endian }),
1493-
18 | 19 => Ok(Self::Utf16 { big_endian }),
1494-
20 | 21 => Ok(Self::Utf32 { big_endian }),
1487+
0..=1 => Ok(Self::Int8 { signed }),
1488+
2..=5 => Ok(Self::Int16 { signed, big_endian }),
1489+
6..=9 => Ok(Self::Int32 { signed, big_endian }),
1490+
10..=13 => Ok(Self::Int64 { signed, big_endian }),
1491+
14..=15 => Ok(Self::Ieee754Float { big_endian }),
1492+
16..=17 => Ok(Self::Ieee754Double { big_endian }),
1493+
18..=19 => Ok(Self::Utf16 { big_endian }),
1494+
20..=21 => Ok(Self::Utf32 { big_endian }),
14951495
_ => Err(code),
14961496
}
14971497
}

stdlib/src/socket.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -935,7 +935,7 @@ mod _socket {
935935
))
936936
})?;
937937
match tuple.len() {
938-
2 | 3 | 4 => {}
938+
2..=4 => {}
939939
_ => return Err(vm.new_type_error(
940940
"AF_INET6 address must be a tuple (host, port[, flowinfo[, scopeid]])"
941941
.to_owned(),
@@ -1914,7 +1914,7 @@ mod _socket {
19141914
vm: &VirtualMachine,
19151915
) -> Result<(String, String), IoOrPyException> {
19161916
match address.len() {
1917-
2 | 3 | 4 => {}
1917+
2..=4 => {}
19181918
_ => {
19191919
return Err(vm
19201920
.new_type_error("illegal sockaddr argument".to_owned())

stdlib/src/sqlite.rs

Lines changed: 65 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,11 @@ mod _sqlite {
9999
)*
100100
fn setup_module_exceptions(module: &PyObject, vm: &VirtualMachine) {
101101
$(
102-
let exception = [<$x:snake:upper>].get_or_init(
103-
|| vm.ctx.new_exception_type("_sqlite3", stringify!($x), Some(vec![$base(vm).to_owned()])));
102+
#[allow(clippy::redundant_closure_call)]
103+
let exception = [<$x:snake:upper>].get_or_init(|| {
104+
let base = $base(vm);
105+
vm.ctx.new_exception_type("_sqlite3", stringify!($x), Some(vec![base.to_owned()]))
106+
});
104107
module.set_attr(stringify!($x), exception.clone().into_object(), vm).unwrap();
105108
)*
106109
}
@@ -455,7 +458,9 @@ mod _sqlite {
455458
let context = SqliteContext::from(context);
456459
let (_, vm) = (*context.user_data::<Self>()).retrieve();
457460
let instance = context.aggregate_context::<*const PyObject>();
458-
let Some(instance) = (*instance).as_ref() else { return; };
461+
let Some(instance) = (*instance).as_ref() else {
462+
return;
463+
};
459464

460465
Self::callback_result_from_method(context, instance, "finalize", vm);
461466
}
@@ -895,7 +900,7 @@ mod _sqlite {
895900
let cursor = cursor.downcast::<Cursor>().map_err(|x| {
896901
vm.new_type_error(format!("factory must return a cursor, not {}", x.class()))
897902
})?;
898-
unsafe { cursor.row_factory.swap(zelf.row_factory.to_owned()) };
903+
let _ = unsafe { cursor.row_factory.swap(zelf.row_factory.to_owned()) };
899904
cursor
900905
} else {
901906
let row_factory = zelf.row_factory.to_owned();
@@ -1077,7 +1082,17 @@ mod _sqlite {
10771082
};
10781083
let db = self.db_lock(vm)?;
10791084
let Some(data) = CallbackData::new(args.func, vm) else {
1080-
return db.create_function(name.as_ptr(), args.narg, flags, null_mut(), None, None, None, None, vm);
1085+
return db.create_function(
1086+
name.as_ptr(),
1087+
args.narg,
1088+
flags,
1089+
null_mut(),
1090+
None,
1091+
None,
1092+
None,
1093+
None,
1094+
vm,
1095+
);
10811096
};
10821097

10831098
db.create_function(
@@ -1098,7 +1113,17 @@ mod _sqlite {
10981113
let name = args.name.to_cstring(vm)?;
10991114
let db = self.db_lock(vm)?;
11001115
let Some(data) = CallbackData::new(args.aggregate_class, vm) else {
1101-
return db.create_function(name.as_ptr(), args.narg, SQLITE_UTF8, null_mut(), None, None, None, None, vm);
1116+
return db.create_function(
1117+
name.as_ptr(),
1118+
args.narg,
1119+
SQLITE_UTF8,
1120+
null_mut(),
1121+
None,
1122+
None,
1123+
None,
1124+
None,
1125+
vm,
1126+
);
11021127
};
11031128

11041129
db.create_function(
@@ -1125,7 +1150,14 @@ mod _sqlite {
11251150
let db = self.db_lock(vm)?;
11261151
let Some(data) = CallbackData::new(callable.clone(), vm) else {
11271152
unsafe {
1128-
sqlite3_create_collation_v2(db.db, name.as_ptr(), SQLITE_UTF8, null_mut(), None, None);
1153+
sqlite3_create_collation_v2(
1154+
db.db,
1155+
name.as_ptr(),
1156+
SQLITE_UTF8,
1157+
null_mut(),
1158+
None,
1159+
None,
1160+
);
11291161
}
11301162
return Ok(());
11311163
};
@@ -1149,7 +1181,7 @@ mod _sqlite {
11491181
// TODO: replace with Result.inspect_err when stable
11501182
if let Err(exc) = db.check(ret, vm) {
11511183
// create_collation do not call destructor if error occur
1152-
unsafe { Box::from_raw(data) };
1184+
let _ = unsafe { Box::from_raw(data) };
11531185
Err(exc)
11541186
} else {
11551187
Ok(())
@@ -1168,7 +1200,18 @@ mod _sqlite {
11681200
let db = self.db_lock(vm)?;
11691201
let Some(data) = CallbackData::new(aggregate_class, vm) else {
11701202
unsafe {
1171-
sqlite3_create_window_function(db.db, name.as_ptr(), narg, SQLITE_UTF8, null_mut(), None, None, None, None, None)
1203+
sqlite3_create_window_function(
1204+
db.db,
1205+
name.as_ptr(),
1206+
narg,
1207+
SQLITE_UTF8,
1208+
null_mut(),
1209+
None,
1210+
None,
1211+
None,
1212+
None,
1213+
None,
1214+
)
11721215
};
11731216
return Ok(());
11741217
};
@@ -1214,10 +1257,8 @@ mod _sqlite {
12141257
#[pymethod]
12151258
fn set_trace_callback(&self, callable: PyObjectRef, vm: &VirtualMachine) -> PyResult<()> {
12161259
let db = self.db_lock(vm)?;
1217-
let Some(data )= CallbackData::new(callable, vm) else {
1218-
unsafe {
1219-
sqlite3_trace_v2(db.db, SQLITE_TRACE_STMT as u32, None, null_mut())
1220-
};
1260+
let Some(data) = CallbackData::new(callable, vm) else {
1261+
unsafe { sqlite3_trace_v2(db.db, SQLITE_TRACE_STMT as u32, None, null_mut()) };
12211262
return Ok(());
12221263
};
12231264

@@ -1241,7 +1282,7 @@ mod _sqlite {
12411282
vm: &VirtualMachine,
12421283
) -> PyResult<()> {
12431284
let db = self.db_lock(vm)?;
1244-
let Some(data )= CallbackData::new(callable, vm) else {
1285+
let Some(data) = CallbackData::new(callable, vm) else {
12451286
unsafe { sqlite3_progress_handler(db.db, n, None, null_mut()) };
12461287
return Ok(());
12471288
};
@@ -1310,7 +1351,7 @@ mod _sqlite {
13101351
if let Some(val) = &val {
13111352
begin_statement_ptr_from_isolation_level(val, vm)?;
13121353
}
1313-
unsafe { self.isolation_level.swap(val) };
1354+
let _ = unsafe { self.isolation_level.swap(val) };
13141355
Ok(())
13151356
}
13161357

@@ -1320,7 +1361,7 @@ mod _sqlite {
13201361
}
13211362
#[pygetset(setter)]
13221363
fn set_text_factory(&self, val: PyObjectRef) {
1323-
unsafe { self.text_factory.swap(val) };
1364+
let _ = unsafe { self.text_factory.swap(val) };
13241365
}
13251366

13261367
#[pygetset]
@@ -1329,7 +1370,7 @@ mod _sqlite {
13291370
}
13301371
#[pygetset(setter)]
13311372
fn set_row_factory(&self, val: Option<PyObjectRef>) {
1332-
unsafe { self.row_factory.swap(val) };
1373+
let _ = unsafe { self.row_factory.swap(val) };
13331374
}
13341375

13351376
fn check_thread(&self, vm: &VirtualMachine) -> PyResult<()> {
@@ -1841,7 +1882,9 @@ mod _sqlite {
18411882
} else if let Some(name) = needle.payload::<PyStr>() {
18421883
for (obj, i) in self.description.iter().zip(0..) {
18431884
let obj = &obj.payload::<PyTuple>().unwrap().as_slice()[0];
1844-
let Some(obj) = obj.payload::<PyStr>() else { break; };
1885+
let Some(obj) = obj.payload::<PyStr>() else {
1886+
break;
1887+
};
18451888
let a_iter = name.as_str().chars().flat_map(|x| x.to_uppercase());
18461889
let b_iter = obj.as_str().chars().flat_map(|x| x.to_uppercase());
18471890

@@ -2153,7 +2196,10 @@ mod _sqlite {
21532196

21542197
if let Some(index) = needle.try_index_opt(vm) {
21552198
let Some(value) = value.payload::<PyInt>() else {
2156-
return Err(vm.new_type_error(format!("'{}' object cannot be interpreted as an integer", value.class())));
2199+
return Err(vm.new_type_error(format!(
2200+
"'{}' object cannot be interpreted as an integer",
2201+
value.class()
2202+
)));
21572203
};
21582204
let value = value.try_to_primitive::<u8>(vm)?;
21592205
let blob_len = inner.blob.bytes();

stdlib/src/ssl.rs

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -636,11 +636,19 @@ mod _ssl {
636636
);
637637
}
638638

639+
#[cold]
640+
fn invalid_cadata(vm: &VirtualMachine) -> PyBaseExceptionRef {
641+
vm.new_type_error(
642+
"cadata should be an ASCII string or a bytes-like object".to_owned(),
643+
)
644+
}
645+
646+
// validate cadata type and load cadata
639647
if let Some(cadata) = args.cadata {
640648
let certs = match cadata {
641649
Either::A(s) => {
642650
if !s.is_ascii() {
643-
return Err(vm.new_type_error("Must be an ascii string".to_owned()));
651+
return Err(invalid_cadata(vm));
644652
}
645653
X509::stack_from_pem(s.as_str().as_bytes())
646654
}
@@ -1191,27 +1199,33 @@ mod _ssl {
11911199
vm.new_exception_msg(cls, msg.to_owned())
11921200
}
11931201

1202+
// SSL_FILETYPE_ASN1 part of _add_ca_certs in CPython
11941203
fn x509_stack_from_der(der: &[u8]) -> Result<Vec<X509>, ErrorStack> {
11951204
unsafe {
11961205
openssl::init();
11971206
let bio = bio::MemBioSlice::new(der)?;
11981207

11991208
let mut certs = vec![];
12001209
loop {
1201-
let r = sys::d2i_X509_bio(bio.as_ptr(), std::ptr::null_mut());
1202-
if r.is_null() {
1203-
let err = sys::ERR_peek_last_error();
1204-
if sys::ERR_GET_LIB(err) == sys::ERR_LIB_ASN1
1205-
&& sys::ERR_GET_REASON(err) == sys::ASN1_R_HEADER_TOO_LONG
1206-
{
1207-
sys::ERR_clear_error();
1208-
break;
1209-
}
1210-
1211-
return Err(ErrorStack::get());
1212-
} else {
1213-
certs.push(X509::from_ptr(r));
1210+
let cert = sys::d2i_X509_bio(bio.as_ptr(), std::ptr::null_mut());
1211+
if cert.is_null() {
1212+
break;
12141213
}
1214+
certs.push(X509::from_ptr(cert));
1215+
}
1216+
1217+
let err = sys::ERR_peek_last_error();
1218+
1219+
if certs.is_empty() {
1220+
// let msg = if filetype == sys::SSL_FILETYPE_PEM {
1221+
// "no start line: cadata does not contain a certificate"
1222+
// } else {
1223+
// "not enough data: cadata does not contain a certificate"
1224+
// };
1225+
return Err(ErrorStack::get());
1226+
}
1227+
if err != 0 {
1228+
return Err(ErrorStack::get());
12151229
}
12161230

12171231
Ok(certs)

0 commit comments

Comments
 (0)