@@ -3,7 +3,10 @@ use bevy_utils::tracing::{
3
3
span:: { Attributes , Record } ,
4
4
Event , Id , Level , Subscriber ,
5
5
} ;
6
- use std:: fmt:: { Debug , Write } ;
6
+ use std:: {
7
+ ffi:: CString ,
8
+ fmt:: { Debug , Write } ,
9
+ } ;
7
10
use tracing_subscriber:: { field:: Visit , layer:: Context , registry:: LookupSpan , Layer } ;
8
11
9
12
#[ derive( Default ) ]
@@ -37,16 +40,6 @@ impl Visit for StringRecorder {
37
40
}
38
41
}
39
42
40
- impl core:: fmt:: Display for StringRecorder {
41
- fn fmt ( & self , mut f : & mut core:: fmt:: Formatter < ' _ > ) -> core:: fmt:: Result {
42
- if !self . 0 . is_empty ( ) {
43
- write ! ( & mut f, " {}" , self . 0 )
44
- } else {
45
- Ok ( ( ) )
46
- }
47
- }
48
- }
49
-
50
43
impl core:: default:: Default for StringRecorder {
51
44
fn default ( ) -> Self {
52
45
StringRecorder :: new ( )
@@ -74,24 +67,33 @@ impl<S: Subscriber + for<'a> LookupSpan<'a>> Layer<S> for AndroidLayer {
74
67
}
75
68
76
69
fn on_event ( & self , event : & Event < ' _ > , _ctx : Context < ' _ , S > ) {
70
+ fn sanitize ( string : & str ) -> CString {
71
+ let mut bytes: Vec < u8 > = string
72
+ . as_bytes ( )
73
+ . into_iter ( )
74
+ . copied ( )
75
+ . filter ( |byte| * byte != 0 )
76
+ . collect ( ) ;
77
+ CString :: new ( bytes) . unwrap ( )
78
+ }
79
+
77
80
let mut recorder = StringRecorder :: new ( ) ;
78
81
event. record ( & mut recorder) ;
79
82
let meta = event. metadata ( ) ;
80
- let level = meta. level ( ) ;
81
- let priority = match * level {
83
+ let priority = match * meta. level ( ) {
82
84
Level :: TRACE => android_log_sys:: LogPriority :: VERBOSE ,
83
85
Level :: DEBUG => android_log_sys:: LogPriority :: DEBUG ,
84
86
Level :: INFO => android_log_sys:: LogPriority :: INFO ,
85
87
Level :: WARN => android_log_sys:: LogPriority :: WARN ,
86
88
Level :: ERROR => android_log_sys:: LogPriority :: ERROR ,
87
89
} ;
88
- let message = format ! ( "{} \0 " , recorder ) ;
89
- let tag = format ! ( "{} \0 " , meta . name ( ) ) ;
90
+ // SAFETY: Called only on Android platforms. priority is guaranteed to be in range of c_int.
91
+ // The provided tag and message are null terminated properly.
90
92
unsafe {
91
93
android_log_sys:: __android_log_write (
92
94
priority as android_log_sys:: c_int ,
93
- tag . as_ptr ( ) as * const android_log_sys :: c_char ,
94
- message . as_ptr ( ) as * const android_log_sys :: c_char ,
95
+ sanitize ( meta . name ( ) ) . as_ptr ( ) ,
96
+ sanitize ( & recorder . 0 ) . as_ptr ( ) ,
95
97
) ;
96
98
}
97
99
}
0 commit comments