Skip to content

Commit

Permalink
Fix SmoLStrBuilder pushing null bytes on heap spill
Browse files Browse the repository at this point in the history
  • Loading branch information
Veykril committed Oct 23, 2024
1 parent f680abc commit 7235aa1
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 1 deletion.
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
# Changelog

## 0.3.2 - 2024-10-23

- Fix `SmolStrBuilder::push` incorrectly padding null bytes when spilling onto the heap on a
multibyte character push

## 0.3.1 - 2024-09-04

- Fix `SmolStrBuilder` leaking implementation details
Expand Down
2 changes: 1 addition & 1 deletion src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -763,7 +763,7 @@ impl SmolStrBuilder {
let mut heap = String::with_capacity(new_len);
// copy existing inline bytes over to the heap
// SAFETY: inline data is guaranteed to be valid utf8 for `old_len` bytes
unsafe { heap.as_mut_vec().extend_from_slice(buf) };
unsafe { heap.as_mut_vec().extend_from_slice(&buf[..*len]) };
heap.push(c);
self.0 = SmolStrBuilderRepr::Heap(heap);
}
Expand Down
9 changes: 9 additions & 0 deletions tests/test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -255,6 +255,7 @@ fn test_to_smolstr() {
assert_eq!(a, smol_str::format_smolstr!("{}", a));
}
}

#[test]
fn test_builder_push_str() {
//empty
Expand Down Expand Up @@ -290,6 +291,14 @@ fn test_builder_push_str() {
let s = builder.finish();
assert!(s.is_heap_allocated());
assert_eq!("a".repeat(46), s);

// heap push on multibyte char
let mut builder = SmolStrBuilder::new();
builder.push_str("ohnonononononononono!");
builder.push('🤯');
let s = builder.finish();
assert!(s.is_heap_allocated());
assert_eq!("ohnonononononononono!🤯", s);
}

#[test]
Expand Down

0 comments on commit 7235aa1

Please sign in to comment.