Rust fixes for v6.2

A soundness fix:
 
  - Avoid evaluating arguments in 'pr_*' macros in 'unsafe' blocks.
 -----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCgAdFiEEPjU5OPd5QIZ9jqqOGXyLc2htIW0FAmPQCLIACgkQGXyLc2ht
 IW1D5w/+KReYuziOU9pT9DvWg0qY1Fb9w8JQQxG/qKRtAzm3s3DQFFHRmfHnhW/L
 k2ESdGemAkWSplmjVYjbQVSHBfq50lhkMmnwzh6FS3StpeX4P65RdOiew6AJFjJC
 XpRzaDbpbaBWdiv3Xw5IQHOOnPqmyX+d8caX8P1IeUBMDFx+BhbfKL2saTRvnj1k
 PW0yAxDLxhiFph8Il98pLzrPRJ4TVUHHS0Bl505tMsWPGOXabCYbiGUCycXcjR5A
 7c1muA0EXF/5A2J1RzDJMYSUOBK3tKqYenXAh21WyaRbD5syglQazfBLFMhM4R6G
 ZQbr1hTVb2mEov9F3EfOvkx6lHilrCQedyr4bs54uhUjbGqdBFEXCKd+xWyyFp6M
 U9xxqRQ98Ex+IIbLIL+iNalDDQ/rWFlFonWwEZNsrgcEwsDIIJvqnd238sv1inOV
 Hx186F9jDLFGtsIGwj6xI2HwXpQQhU0Q/GQ+JfkXk7ZjtVQc0TQVDEf/3cHmUpgk
 u8ARDjUqRH4y35cH99Sclhztm47GbTFIUD3tAAgBb3JF5QP6igSTnlbml2VbdCf7
 plyleZbGwD5/RMv8XOuwGlzZQxykxRKFUrs4FnfpCpvD6wtMl+64j/aNrOb0vNuT
 iJbAef07FAlVvmVfQgQXeVcnO6S/Hh2a/d5dlccVmdDValff4C4=
 =01k+
 -----END PGP SIGNATURE-----

Merge tag 'rust-fixes-6.2' of https://github.com/Rust-for-Linux/linux

Pull rust fix from Miguel Ojeda:

 - Avoid evaluating arguments in 'pr_*' macros in 'unsafe' blocks

* tag 'rust-fixes-6.2' of https://github.com/Rust-for-Linux/linux:
  rust: print: avoid evaluating arguments in `pr_*` macros in `unsafe` blocks
This commit is contained in:
Linus Torvalds 2023-01-24 17:54:25 -08:00
commit 246dc53fb2

View File

@ -142,17 +142,24 @@ pub fn call_printk_cont(args: fmt::Arguments<'_>) {
macro_rules! print_macro (
// The non-continuation cases (most of them, e.g. `INFO`).
($format_string:path, false, $($arg:tt)+) => (
// SAFETY: This hidden macro should only be called by the documented
// printing macros which ensure the format string is one of the fixed
// ones. All `__LOG_PREFIX`s are null-terminated as they are generated
// by the `module!` proc macro or fixed values defined in a kernel
// crate.
unsafe {
$crate::print::call_printk(
&$format_string,
crate::__LOG_PREFIX,
format_args!($($arg)+),
);
// To remain sound, `arg`s must be expanded outside the `unsafe` block.
// Typically one would use a `let` binding for that; however, `format_args!`
// takes borrows on the arguments, but does not extend the scope of temporaries.
// Therefore, a `match` expression is used to keep them around, since
// the scrutinee is kept until the end of the `match`.
match format_args!($($arg)+) {
// SAFETY: This hidden macro should only be called by the documented
// printing macros which ensure the format string is one of the fixed
// ones. All `__LOG_PREFIX`s are null-terminated as they are generated
// by the `module!` proc macro or fixed values defined in a kernel
// crate.
args => unsafe {
$crate::print::call_printk(
&$format_string,
crate::__LOG_PREFIX,
args,
);
}
}
);