android_logger: patch a crash in quiche
Update android_logger did not expect nullbytes in passed strings. Some
crates assume this works.
Upstream PR: https://github.com/rust-mobile/android_logger-rs/pull/90
Bug: 390554805
Bug: 390555176
Bug: 359442427
Test: atest external/rust/android-crates-io/crates/android_logger \
Test: system/logging/rust \
Test: external/rust/android-crates-io/crates/quiche
Test: on the entire CL chain
Change-Id: I825dc2dfe597ea37535ce0df95506984a65ca8df
diff --git a/crates/android_logger/.android-checksum.json b/crates/android_logger/.android-checksum.json
index 940f8e1..8ef962b 100644
--- a/crates/android_logger/.android-checksum.json
+++ b/crates/android_logger/.android-checksum.json
@@ -1 +1 @@
-{"package":null,"files":{".cargo-checksum.json":"bb1282294f4a45733717195ea6317d186a5f08f64110d739d8071dc5788099c8","Android.bp":"c25d0aacdd3e0f90caa0781a510ddb4286e2d45c6db3e2431abf0a5054091032","CHANGELOG.md":"ab5ac93fc671de1301c568dab343d2011083b4d7f9548c08e1c746b4969131c6","Cargo.toml":"9210dde4a9c83dc7638a00507bf2042ed4ed42048ac101bba11c5f58f432107e","LICENSE":"9e94e8fa1a66063ba4a2fad43e53df8f02ccf2c3f00167753edfd1fd4d80a3a1","LICENSE-APACHE":"9e94e8fa1a66063ba4a2fad43e53df8f02ccf2c3f00167753edfd1fd4d80a3a1","METADATA":"dd42c22e95e847ce043545d097066e15cca5f58024f35ba769ec68ed374efe92","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"2c8a88474c7be10d8392d0fdf5a1f560bb760cebd822af7b22cf7c7d754e08d3","TEST_MAPPING":"785ff94435a91e5ab242637b4cd1297f5ccd0f6a6f3b7f3da49018fc4a90ef43","cargo_embargo.json":"43485ecf999715aac110bea3a8ad0a995e6963adbc8e44a83df866a9a0f8597d","patches/0001-Enable-embedding-android_logger-in-liblog_rust.patch":"f8ee0d6719260d4c81482016ae65b095359ddea51f9a42dfa31776b02e888e71","rustfmt.toml":"94a1759611ead56078e428dd775bcdcfa913ab913cbb95d197d5db6f735e88fe","src/arrays.rs":"59b11faca551cabb70d47444b4cb6027ff22352ad5ce0f5568b7e3e83df2c8ae","src/config.rs":"9d1eec9a2ad4df09781aa0da6f5bd383d6a4b3c4271805ad4705fb247f948640","src/id.rs":"62a1f10a3d62c242bbffec54a1875b0676c7e815551c93858766add577bcfd1e","src/lib.rs":"3950f3a4ace142098c2514ad35100640fd6a8081e165d2f30fbf9238415990c8","src/platform_log_writer.rs":"590d3e60e0421b6ebb8911b194b9329865cb734a999204112446522ab97414c8","src/tests.rs":"0126ac58466c2ecf1664e71aeeaa837b08e029587a3d8aacea53ba384e9b0645","tests/config_log_level.rs":"bae8099d68b0af40be75cd94f08594858be226feb09052ac55750703736eecc7","tests/default_init.rs":"9bdbce19667b4fb9b816c78135161c6e9aa135de66a9158949f647acd9c9f84b","tests/multiple_init.rs":"57892c30b859874d8b818a872668e176b59ab8d570d2cc4e589d403413678229"}}
\ No newline at end of file
+{"package":null,"files":{".cargo-checksum.json":"bb1282294f4a45733717195ea6317d186a5f08f64110d739d8071dc5788099c8","Android.bp":"c25d0aacdd3e0f90caa0781a510ddb4286e2d45c6db3e2431abf0a5054091032","CHANGELOG.md":"ab5ac93fc671de1301c568dab343d2011083b4d7f9548c08e1c746b4969131c6","Cargo.toml":"9210dde4a9c83dc7638a00507bf2042ed4ed42048ac101bba11c5f58f432107e","LICENSE":"9e94e8fa1a66063ba4a2fad43e53df8f02ccf2c3f00167753edfd1fd4d80a3a1","LICENSE-APACHE":"9e94e8fa1a66063ba4a2fad43e53df8f02ccf2c3f00167753edfd1fd4d80a3a1","METADATA":"dd42c22e95e847ce043545d097066e15cca5f58024f35ba769ec68ed374efe92","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"2c8a88474c7be10d8392d0fdf5a1f560bb760cebd822af7b22cf7c7d754e08d3","TEST_MAPPING":"785ff94435a91e5ab242637b4cd1297f5ccd0f6a6f3b7f3da49018fc4a90ef43","cargo_embargo.json":"43485ecf999715aac110bea3a8ad0a995e6963adbc8e44a83df866a9a0f8597d","patches/0001-Enable-embedding-android_logger-in-liblog_rust.patch":"f8ee0d6719260d4c81482016ae65b095359ddea51f9a42dfa31776b02e888e71","patches/0002-Avoid-panic-on-buffers-with-embedded-nul-bytes.patch":"26b96b9072821c6aae858ef0800b44b2c3f1e176faf3492bbcd79b4d0885c21f","rustfmt.toml":"94a1759611ead56078e428dd775bcdcfa913ab913cbb95d197d5db6f735e88fe","src/arrays.rs":"59b11faca551cabb70d47444b4cb6027ff22352ad5ce0f5568b7e3e83df2c8ae","src/config.rs":"9d1eec9a2ad4df09781aa0da6f5bd383d6a4b3c4271805ad4705fb247f948640","src/id.rs":"62a1f10a3d62c242bbffec54a1875b0676c7e815551c93858766add577bcfd1e","src/lib.rs":"3950f3a4ace142098c2514ad35100640fd6a8081e165d2f30fbf9238415990c8","src/platform_log_writer.rs":"927af1a88d268a50562d5edde8b1bc139d387ad16be9e390c52e7f95cfe002fe","src/tests.rs":"0126ac58466c2ecf1664e71aeeaa837b08e029587a3d8aacea53ba384e9b0645","tests/config_log_level.rs":"bae8099d68b0af40be75cd94f08594858be226feb09052ac55750703736eecc7","tests/default_init.rs":"9bdbce19667b4fb9b816c78135161c6e9aa135de66a9158949f647acd9c9f84b","tests/multiple_init.rs":"57892c30b859874d8b818a872668e176b59ab8d570d2cc4e589d403413678229"}}
\ No newline at end of file
diff --git a/crates/android_logger/patches/0002-Avoid-panic-on-buffers-with-embedded-nul-bytes.patch b/crates/android_logger/patches/0002-Avoid-panic-on-buffers-with-embedded-nul-bytes.patch
new file mode 100644
index 0000000..c074d40
--- /dev/null
+++ b/crates/android_logger/patches/0002-Avoid-panic-on-buffers-with-embedded-nul-bytes.patch
@@ -0,0 +1,70 @@
+From c8429943e1c53006652e8925d1d5e3728828c566 Mon Sep 17 00:00:00 2001
+From: Marcin Radomski
+Date: Tue, 18 Mar 2025 13:31:21 +0000
+Subject: [PATCH] Avoid panic on buffers with embedded nul bytes
+
+Upstream PR: https://github.com/rust-mobile/android_logger-rs/pull/90
+
+Some crates use log crate with a message padded with a number of
+nullbytes [1]. This currently causes panics.
+
+Replace the nullbytes with spaces when printing the log message to
+prevent this crash.
+
+[1] https://github.com/cloudflare/quiche/blob/d0efd2c5278b9dbe8d6544c3015f8c772f3513b4/quiche/src/tls/mod.rs#L1040
+---
+ src/platform_log_writer.rs | 24 ++++++++++++++++++++++--
+ 1 file changed, 22 insertions(+), 2 deletions(-)
+
+diff --git a/src/platform_log_writer.rs b/src/platform_log_writer.rs
+index 85826ca..2a7b53a 100644
+--- a/src/platform_log_writer.rs
++++ b/src/platform_log_writer.rs
+@@ -113,7 +113,7 @@ impl PlatformLogWriter<'_> {
+ /// Output buffer up until the \0 which will be placed at `len` position.
+ ///
+ /// # Safety
+- /// The first `len` bytes of `self.buffer` must be initialized.
++ /// The first `len` bytes of `self.buffer` must be initialized and not contain nullbytes.
+ unsafe fn output_specified_len(&mut self, len: usize) {
+ let mut last_byte = MaybeUninit::new(b'\0');
+
+@@ -152,7 +152,13 @@ impl fmt::Write for PlatformLogWriter<'_> {
+ .zip(incoming_bytes)
+ .enumerate()
+ .fold(None, |acc, (i, (output, input))| {
+- output.write(*input);
++ if *input == b'\0' {
++ // Replace nullbytes with whitespace, so we can put the message in a CStr
++ // later to pass it through a const char*.
++ output.write(b' ');
++ } else {
++ output.write(*input);
++ }
+ if *input == b'\n' { Some(i) } else { acc }
+ });
+
+@@ -297,6 +303,20 @@ pub mod tests {
+ );
+ }
+
++ #[test]
++ fn writer_substitutes_nullbytes_with_spaces() {
++ let test_string = "Test_string_with\0\0\0\0nullbytes\0";
++ let mut writer = get_tag_writer();
++ writer
++ .write_str(test_string)
++ .expect("Unable to write to PlatformLogWriter");
++
++ assert_eq!(
++ unsafe { slice_assume_init_ref(&writer.buffer[..test_string.len()]) },
++ test_string.replace("\0", " ").as_bytes()
++ );
++ }
++
+ fn get_tag_writer() -> PlatformLogWriter<'static> {
+ PlatformLogWriter::new(
+ None,
+--
+2.49.0.rc1.451.g8f38331e32-goog
+
diff --git a/crates/android_logger/src/platform_log_writer.rs b/crates/android_logger/src/platform_log_writer.rs
index bfc6d28..6a3da82 100644
--- a/crates/android_logger/src/platform_log_writer.rs
+++ b/crates/android_logger/src/platform_log_writer.rs
@@ -119,7 +119,7 @@
/// Output buffer up until the \0 which will be placed at `len` position.
///
/// # Safety
- /// The first `len` bytes of `self.buffer` must be initialized.
+ /// The first `len` bytes of `self.buffer` must be initialized and not contain nullbytes.
unsafe fn output_specified_len(&mut self, len: usize) {
let mut last_byte = MaybeUninit::new(b'\0');
@@ -158,7 +158,13 @@
.zip(incoming_bytes)
.enumerate()
.fold(None, |acc, (i, (output, input))| {
- output.write(*input);
+ if *input == b'\0' {
+ // Replace nullbytes with whitespace, so we can put the message in a CStr
+ // later to pass it through a const char*.
+ output.write(b' ');
+ } else {
+ output.write(*input);
+ }
if *input == b'\n' { Some(i) } else { acc }
});
@@ -303,6 +309,20 @@
);
}
+ #[test]
+ fn writer_substitutes_nullbytes_with_spaces() {
+ let test_string = "Test_string_with\0\0\0\0nullbytes\0";
+ let mut writer = get_tag_writer();
+ writer
+ .write_str(test_string)
+ .expect("Unable to write to PlatformLogWriter");
+
+ assert_eq!(
+ unsafe { slice_assume_init_ref(&writer.buffer[..test_string.len()]) },
+ test_string.replace("\0", " ").as_bytes()
+ );
+ }
+
fn get_tag_writer() -> PlatformLogWriter<'static> {
PlatformLogWriter::new(
None,