avsc icon indicating copy to clipboard operation
avsc copied to clipboard

RangeError: Attempt to access memory outside buffer bounds

Open CyanChanges opened this issue 1 year ago • 1 comments

Defintions here: https://github.com/CyanChanges/pastebin_but_github/blob/163d015645f6ef71a2ebd43abd18d91e2d6e9663/avsc_1.ts

trying to serialize with toBuffer()

ObjectSchema.toBuffer({
      "downloads": {
        "lastMonth": 124
      },
      "dependents": 0,
      "category": "other",
      "createdAt": "2022-03-16T09:45:31.652Z",
      "updatedAt": "2022-05-07T11:11:38.682Z",
      "updated": "2022-05-07T11:11:38.682Z",
      "verified": false,
      "insecure": false,
      "portable": false,
      "package": {
        "name": "koishi-plugin-chinfo",
        "keywords": [
          "chatbot",
          "koishi",
          "plugin",
          "Koishi.js"
        ],
        "version": "1.0.0",
        "description": "Show infos of a channel",
        "publisher": {
          "name": "constasj",
          "email": "[email protected]"
        },
        "maintainers": [
          {
            "name": "constasj",
            "email": "[email protected]"
          }
        ],
        "license": "MIT",
        "date": "2022-03-16T09:45:31.807Z",
        "links": {
          "npm": "https://www.npmjs.com/koishi-plugin-chinfo"
        },
        "contributors": []
      },
      "flags": {
        "insecure": 0
      },
      "manifest": {
        "public": [],
        "service": {
          "required": [],
          "optional": [],
          "implements": []
        },
        "locales": [],
        "description": "Show infos of a channel"
      },
      "publishSize": 1064
})

that throws following error:

Uncaught RangeError: Attempt to access memory outside buffer bounds
    at boundsError (ext:deno_node/internal/buffer.mjs:2383:11)
    at readUInt24LE (ext:deno_node/internal/buffer.mjs:1872:5)
    at Uint8Array.readUIntLE (ext:deno_node/internal/buffer.mjs:1016:12)
    at Tap.packLongBytes (file:///home/cyan/.cache/deno/npm/registry.npmjs.org/avsc/5.7.7/lib/utils.js:892:9)
    at AbstractLongType._write (file:///home/cyan/.cache/deno/npm/registry.npmjs.org/avsc/5.7.7/lib/types.js:2754:9)
    at UnwrappedUnionType._write (file:///home/cyan/.cache/deno/npm/registry.npmjs.org/avsc/5.7.7/lib/types.js:1329:23)
    at RecordType.writeObject [as _write] (eval at RecordType._createWriter (file:///home/cyan/.cache/deno/npm/registry.npmjs.org/avsc/5.7.7/lib/types.js:2343:10), <anonymous>:8:6)
    at RecordType.Type.toBuffer (file:///home/cyan/.cache/deno/npm/registry.npmjs.org/avsc/5.7.7/lib/types.js:658:8)
    at <anonymous>:1:35

CyanChanges avatar Dec 10 '24 14:12 CyanChanges

Hi @CyanChanges. avsc currently relies on node's buffers ignoring out-of-bound writes. This is used to optimize buffer size computation when the original buffer is too small. I haven't used deno, but from the stack trace it looks like it behaves differently?

You should be able to work around this by preemptively increasing the size of the underlying buffer:

avro.Type.__reset(1 << 20);

Alternatively you can use type.encode and pass in an adequately sized buffer explicitly.

mtth avatar Feb 05 '25 05:02 mtth