nodejs/node · error

dictionary [ ] is larger than maximum allowed: \n

Error message

dictionary [%s] is larger than maximum allowed: %d\n

What it means

The dictionary file size exceeds `kMaxDictionarySize`, which is `BROTLI_MAX_DISTANCE - BROTLI_MAX_BACKWARD_LIMIT(24)` (approximately 16 MiB minus 16 MiB = implementation-dependent; effectively the raw dictionary must fit within the encoder's maximum backward distance window). The message prints the offending path and the maximum allowed size in bytes.

Solutions

  1. Trim or retrain the dictionary to be at most `kMaxDictionarySize` bytes.
  2. Verify you are pointing at the correct dictionary file, not a large data file.
  3. Check the value of `BROTLI_MAX_DISTANCE` and `BROTLI_MAX_BACKWARD_LIMIT(24)` in the build's headers to know the exact limit.
Defensive patterns

Strategy: validation

Validate before calling

#include <sys/stat.h>
#include <stdint.h>
#include <stdbool.h>

// BROTLI_MAX_DISTANCE is typically 0x3FFFFFFF (16 MiB window).
// The effective raw dict limit is implementation-dependent.
// Use a conservative 16 MiB ceiling for pre-validation:
#define SAFE_MAX_DICT (16 * 1024 * 1024)

bool dictionary_within_limit(const char *path) {
    struct stat st;
    if (stat(path, &st) != 0) return false;
    return (int64_t)st.st_size <= SAFE_MAX_DICT;
}

Prevention

When it happens

Trigger: Supplying a dictionary file larger than the brotli encoder's maximum raw dictionary size. The limit is a compile-time constant derived from brotli's distance-coding parameters, not a user-configurable value.

Common situations: Using a large pre-trained dictionary for domain-specific compression (e.g. a web text corpus) that exceeds the limit; accidentally pointing `--dictionary` at a large data file instead of the intended small dictionary.

Related errors


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

Appendix: source

Thrown at deps/brotli/c/tools/brotli.c:909

  if (context->dictionary_path == NULL) return BROTLI_TRUE;
  f = fopen(context->dictionary_path, "rb");
  if (f == NULL) {
    fprintf(stderr, "failed to open dictionary file [%s]: %s\n",
            PrintablePath(context->dictionary_path), strerror(errno));
    return BROTLI_FALSE;
  }

  file_size_64 = FileSize(context->dictionary_path);
  if (file_size_64 == -1) {
    fprintf(stderr, "could not get size of dictionary file [%s]",
            PrintablePath(context->dictionary_path));
    fclose(f);
    return BROTLI_FALSE;
  }

  if (file_size_64 > kMaxDictionarySize) {
    fprintf(stderr, "dictionary [%s] is larger than maximum allowed: %d\n",
            PrintablePath(context->dictionary_path), kMaxDictionarySize);
    fclose(f);
    return BROTLI_FALSE;
  }
  context->dictionary_size = (size_t)file_size_64;

  buffer = (uint8_t*)malloc(context->dictionary_size);
  if (!buffer) {
    fprintf(stderr, "could not read dictionary: out of memory\n");
    fclose(f);
    return BROTLI_FALSE;
  }
  bytes_read = fread(buffer, sizeof(uint8_t), context->dictionary_size, f);
  if (bytes_read != context->dictionary_size) {
    free(buffer);
    fprintf(stderr, "failed to read dictionary [%s]: %s\n",
            PrintablePath(context->dictionary_path), strerror(errno));
    fclose(f);

View on GitHub (pinned to 1b2de5e052)