@@ -183,8 +183,6 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
183
183
if !matches ! ( & * this. tcx. sess. target. os, "solaris" | "illumos" ) {
184
184
// tm_zone represents the timezone value in the form of: +0730, +08, -0730 or -08.
185
185
// This may not be consistent with libc::localtime_r's result.
186
- const TZ_MAX_LEN : u64 = 6 ; // 5 chars max + null terminator
187
- static TIMEZONE_PTR : OnceLock < Pointer > = OnceLock :: new ( ) ;
188
186
189
187
let offset_in_seconds = dt. offset ( ) . fix ( ) . local_minus_utc ( ) ;
190
188
let tm_gmtoff = offset_in_seconds;
@@ -201,21 +199,17 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
201
199
write ! ( tm_zone, "{:02}" , offset_min) . unwrap ( ) ;
202
200
}
203
201
204
- // Ensure string deduplication by allocating the buffer only once,
205
- // even if the function is called multiple times.
206
- let tm_zone_ptr = TIMEZONE_PTR . get_or_init ( || {
207
- let arg_type = Ty :: new_array ( this. tcx . tcx , this. tcx . types . u8 , TZ_MAX_LEN ) ;
208
- let arg_place = this
209
- . allocate ( this. layout_of ( arg_type) . unwrap ( ) , MiriMemoryKind :: Machine . into ( ) )
210
- . expect ( "timezone buffer allocation failed" ) ;
211
- arg_place. ptr ( )
212
- } ) ;
213
-
214
- // Write the `tm_zone` string into the allocated buffer.
215
- let ( written, _) =
216
- this. write_os_str_to_c_str ( & OsString :: from ( tm_zone) , * tm_zone_ptr, TZ_MAX_LEN ) ?;
217
- assert ! ( written) ;
218
-
202
+ // Add null terminator for C string compatibility
203
+ tm_zone. push ( '\0' ) ;
204
+
205
+ // Deduplicate and allocate the string.
206
+ let tm_zone_ptr = this. allocate_bytes (
207
+ & tm_zone. as_bytes ( ) ,
208
+ Align :: ONE ,
209
+ MiriMemoryKind :: Machine . into ( ) ,
210
+ Mutability :: Not ,
211
+ ) ?;
212
+
219
213
// Write the timezone pointer and offset into the result structure.
220
214
this. write_pointer ( * tm_zone_ptr, & this. project_field_named ( & result, "tm_zone" ) ?) ?;
221
215
this. write_int_fields_named ( & [ ( "tm_gmtoff" , tm_gmtoff. into ( ) ) ] , & result) ?;
0 commit comments