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

  1. Do a full clean rebuild of the entire ICU data package so pool.res and all dependent bundles are generated together.
  2. Remove stale .res files before rebuilding to prevent the build system from mixing old and new outputs.
  3. 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

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


AI-assisted analysis of nodejs/node@1b2de5e052 (2026-08-13). Data as JSON: /api/errors/fdd43d491d471dfb. Report an issue: GitHub.