denoland/deno · error
malformed .msi: no _StringPool stream
Error message
malformed .msi: no _StringPool stream
What it means
Error "malformed .msi: no _StringPool stream" thrown in denoland/deno.
Source
Thrown at cli/tools/desktop.rs:4938
let write_stream = |comp: &mut cfb::CompoundFile<std::fs::File>,
raw: &str,
bytes: &[u8]|
-> Result<(), AnyError> {
let mut s = comp.open_stream(format!("/{raw}"))?;
s.write_all(bytes)?;
Ok(())
};
let find_raw = |suffix: &str| -> Option<String> {
names
.iter()
.find(|n| msi_demangle_stream_name(n).ends_with(suffix))
.cloned()
};
// The string-pool header's top bit selects 3-byte string references; tiny
// databases use 2-byte refs, but honor the flag to stay correct at any size.
let pool_raw = find_raw("_StringPool").ok_or_else(|| {
deno_core::anyhow::anyhow!("malformed .msi: no _StringPool stream")
})?;
let pool = read_stream(&mut comp, &pool_raw)?;
let str_w: usize = if pool.len() >= 4 && (pool[3] & 0x80) != 0 {
3
} else {
2
};
// Map every string-pool id to its text so data-table streams (named by table
// text) can be matched to their column schema (keyed by table string id).
let data_raw = find_raw("_StringData").ok_or_else(|| {
deno_core::anyhow::anyhow!("malformed .msi: no _StringData stream")
})?;
let str_data = read_stream(&mut comp, &data_raw)?;
let mut strings = vec![String::new()]; // 1-based; index 0 is unused.
{
let mut off = 0usize;
let mut i = 4;View on GitHub (pinned to 89f33cbef2)
When it happens
Trigger: Thrown at cli/tools/desktop.rs:4938 when the library encounters an invalid state.
Common situations: See trigger scenarios.
Understand the failure class
- Parsing and encoding errors: unexpected token, malformed input — why parsers reject input and how to find the real culprit.
AI-assisted analysis of denoland/deno@89f33cbef2 (2026-08-16).
Data as JSON: /api/errors/ec16d87ff6f3768b.
Report an issue: GitHub.