Skip to content

Commit d5e1053

Browse files
committed
Fix truncate logic
1 parent 7779cd6 commit d5e1053

File tree

2 files changed

+58
-9
lines changed

2 files changed

+58
-9
lines changed

sdk/log/crate/src/lib.rs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,46 @@ mod tests {
333333

334334
logger.append_with_args("0123456789", &[Argument::TruncateStart(9)]);
335335
assert!(&*logger == "..@".as_bytes());
336+
337+
let mut logger = Logger::<1>::default();
338+
339+
logger.append_with_args("test", &[Argument::TruncateStart(0)]);
340+
assert!(&*logger == "".as_bytes());
341+
342+
logger.clear();
343+
344+
logger.append_with_args("test", &[Argument::TruncateStart(1)]);
345+
assert!(&*logger == "@".as_bytes());
346+
347+
let mut logger = Logger::<2>::default();
348+
349+
logger.append_with_args("test", &[Argument::TruncateStart(2)]);
350+
assert!(&*logger == ".@".as_bytes());
351+
352+
let mut logger = Logger::<3>::default();
353+
354+
logger.append_with_args("test", &[Argument::TruncateStart(3)]);
355+
assert!(&*logger == "..@".as_bytes());
356+
357+
let mut logger = Logger::<1>::default();
358+
359+
logger.append_with_args("test", &[Argument::TruncateEnd(0)]);
360+
assert!(&*logger == "".as_bytes());
361+
362+
logger.clear();
363+
364+
logger.append_with_args("test", &[Argument::TruncateEnd(1)]);
365+
assert!(&*logger == "@".as_bytes());
366+
367+
let mut logger = Logger::<2>::default();
368+
369+
logger.append_with_args("test", &[Argument::TruncateEnd(2)]);
370+
assert!(&*logger == ".@".as_bytes());
371+
372+
let mut logger = Logger::<3>::default();
373+
374+
logger.append_with_args("test", &[Argument::TruncateEnd(3)]);
375+
assert!(&*logger == "..@".as_bytes());
336376
}
337377

338378
#[test]

sdk/log/crate/src/logger.rs

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -616,17 +616,26 @@ unsafe impl Log for &str {
616616
}
617617
};
618618

619-
// SAFETY: the `destination` is always within `length_to_write` bounds.
620-
unsafe {
621-
copy_nonoverlapping(source, destination as *mut _, length_to_write);
622-
}
623-
624-
// There might not have been space for all the value.
625-
if truncated {
619+
if length_to_write > 0 {
626620
// SAFETY: the `destination` is always within `length_to_write` bounds.
627621
unsafe {
628-
let last = buffer.get_unchecked_mut(length_to_write - 1);
629-
last.write(TRUNCATED);
622+
#[cfg(target_os = "solana")]
623+
syscalls::sol_memcpy_(
624+
destination as *mut _,
625+
source as *const _,
626+
length_to_write as u64,
627+
);
628+
#[cfg(not(target_os = "solana"))]
629+
copy_nonoverlapping(source, destination as *mut _, length_to_write);
630+
}
631+
632+
// There might not have been space for all the value.
633+
if truncated {
634+
// SAFETY: the `destination` is always within `length_to_write` bounds.
635+
unsafe {
636+
let last = buffer.get_unchecked_mut(length_to_write - 1);
637+
last.write(TRUNCATED);
638+
}
630639
}
631640
}
632641

0 commit comments

Comments
 (0)