Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix pool pollution, infinite loop #508

Merged
merged 1 commit into from
Nov 25, 2024
Merged

Commits on Nov 25, 2024

  1. Fix pool pollution, infinite loop

    When nanoid is called with a fractional value, there were a number
    of undesirable effects:
    - in browser and non-secure, the code infinite loops on `while (size--)`
    - in node, the value of poolOffset becomes fractional, causing calls to
      nanoid to return zeroes until the pool is next filled: when `i` is
      initialized to `poolOffset`, `pool[i] & 63` -> `undefined & 63` -> `0`
    - if the first call in node is a fractional argument, the initial buffer
      allocation fails with an error
    
    I chose `|0` to cast to a signed integer primarily because that has a
    slightly better outcome in the third case above: if the first call is
    negative (e.g. `nanoid(-1)`) then Node will throw an error for an
    invalid Buffer size, rather than attempting to allocate a buffer of
    size `2**32-1`. It's also more compact than `>>>0`, which would be
    necessary to cast to an unsigned integer. I don't _think_ there is
    a use case for generating ids longer than `2**31-1` :)
    myndzi committed Nov 25, 2024
    Configuration menu
    Copy the full SHA
    6d6767d View commit details
    Browse the repository at this point in the history