nodejs/node · warning
icupkg: %s has mismatched checksum for %s
Error message
icupkg: %s has mismatched checksum for %s
What it means
Warning printed when the pool checksum in the bundle's root indexes does not match the pool bundle's checksum. Pool bundles share keys and strings between bundles, and the checksum ensures they were generated together. A mismatch means the pool bundle is from a different build or different data, making it unsafe to use. The function returns without setting an error code, skipping pool integration.
Source
Thrown at deps/icu-small/source/tools/toolutil/pkgitems.cpp:423
const UDataInfo *poolInfo=nativePool.getDataInfo();
if(poolInfo->formatVersion[0]<=1) {
fprintf(stderr, "icupkg: %s is not a pool bundle\n", poolName);
return;
}
const int32_t* poolRoot = reinterpret_cast<const int32_t*>(nativePool.getBytes());
const int32_t *poolIndexes=poolRoot+1;
int32_t poolIndexLength=poolIndexes[URES_INDEX_LENGTH]&0xff;
if(!(poolIndexLength>URES_INDEX_POOL_CHECKSUM &&
(poolIndexes[URES_INDEX_ATTRIBUTES]&URES_ATT_IS_POOL_BUNDLE))
) {
fprintf(stderr, "icupkg: %s is not a pool bundle\n", poolName);
return;
}
if(resData.pRoot[1+URES_INDEX_POOL_CHECKSUM]==poolIndexes[URES_INDEX_POOL_CHECKSUM]) {
resData.poolBundleKeys = reinterpret_cast<const char*>(poolIndexes + poolIndexLength);
resData.poolBundleStrings = reinterpret_cast<const uint16_t*>(poolRoot + poolIndexes[URES_INDEX_KEYS_TOP]);
} else {
fprintf(stderr, "icupkg: %s has mismatched checksum for %s\n", poolName, itemName);
return;
}
}
UBool doCheckParent = ures_enumDependencies(
itemName, &resData,
resData.rootRes, nullptr, nullptr, 0,
check, context,
pkg,
pErrorCode);
if(!doCheckParent) {
return;
}
/*
* if the bundle attributes are present and the nofallback flag is not set,
* then add the parent bundle as a dependency
*/View on GitHub (pinned to 1b2de5e052)
Solutions
- Do a full clean rebuild of the entire ICU data package so pool.res and all dependent bundles are generated together.
- Remove stale .res files before rebuilding to prevent the build system from mixing old and new outputs.
- Ensure the build system tracks pool.res as a dependency of all bundles that use it.
Defensive patterns
Strategy: validation
Try / catch
// Check stderr for checksum mismatch warning
result = subprocess.run(['icupkg', 'data.dat'], capture_output=True)
stderr = result.stderr.decode()
if 'mismatched checksum' in stderr:
print('Pool and bundles are from different builds — full rebuild needed') Prevention
- Always do a clean full rebuild of ICU data so pool.res and dependent bundles are consistent.
- Delete all .res files before rebuilding to prevent stale files from mixing in.
- Never copy individual .res files between builds without rebuilding the pool.
When it happens
Trigger: resData.pRoot[1+URES_INDEX_POOL_CHECKSUM] != poolIndexes[URES_INDEX_POOL_CHECKSUM] at pkgitems.cpp:423 — the checksum stored in the dependent bundle doesn't match the pool's checksum.
Common situations: Pool.res was regenerated but dependent bundles were not (or vice versa); mixing .res files from different builds; partial build where pool changed but bundles referencing it weren't rebuilt; using a prebuilt ICU data package that was assembled from incompatible pieces.
Related errors
- icupkg: %s is not a pool bundle
- %s: cannot combine --writePoolBundle and --usePoolBundle\n
- %s: cannot combine --formatVersion 1 with --writePoolBundle
- unable to create an empty bundle for the pool keys: %s
- U_MEMORY_ALLOCATION_ERROR
AI-assisted analysis of nodejs/node@1b2de5e052 (2026-08-13).
Data as JSON: /api/errors/fdd43d491d471dfb.
Report an issue: GitHub.