{"record":{"id":"ecc285644fed5c92","repo":"go-delve/delve","slug":"maximum-len-exceeded-d-reading-s","errorCode":null,"errorMessage":"maximum len exceeded (%d) reading %s","messagePattern":"maximum len exceeded \\((.+?)\\) reading (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/proc/core/delve_core.go","lineNumber":100,"sourceCode":"\t\tread(&th.regs.gaddr)\n\n\t\tvar n uint32\n\t\tread(&n)\n\n\t\tif readerr != nil {\n\t\t\treturn nil, fmt.Errorf(\"error reading thread note header for thread %d: %v\", th.id, readerr)\n\t\t}\n\n\t\tth.regs.slice = make([]proc.Register, n)\n\n\t\treadBytes := func(maxlen uint16, kind string) []byte {\n\t\t\tif readerr != nil {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tvar len uint16\n\t\t\tread(&len)\n\t\t\tif maxlen > 0 && len > maxlen {\n\t\t\t\treaderr = fmt.Errorf(\"maximum len exceeded (%d) reading %s\", len, kind)\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tif readerr != nil {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tbuf := make([]byte, len)\n\t\t\t_, readerr = body.Read(buf)\n\t\t\treturn buf\n\t\t}\n\n\t\tfor i := 0; i < int(n); i++ {\n\t\t\tname := string(readBytes(20, \"register name\"))\n\t\t\tvalue := readBytes(2048, \"register value\")\n\t\t\tth.regs.slice[i] = proc.Register{Name: name, Reg: op.DwarfRegisterFromBytes(value)}\n\t\t\tif readerr != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"error reading thread note registers for thread %d: %v\", th.id, readerr)\n\t\t\t}\n\t\t}","sourceCodeStart":82,"sourceCodeEnd":118,"githubUrl":"https://github.com/go-delve/delve/blob/a23773e6c31361e43246bc43a424ee009679b174/pkg/proc/core/delve_core.go#L82-L118","documentation":"Inside threadsFromDelveNotes, readBytes reads a uint16 length then that many bytes; when a caller passes maxlen > 0 and the encoded length exceeds it, parsing stops with 'maximum len exceeded'. This guards against corrupt lengths allocating huge or bogus buffers for register names (max 20) and values (max 2048).","triggerScenarios":"readLinuxOrPlatformIndependentCore -> threadsFromDelveNotes: a register name field encodes len > 20, or a register value field encodes len > 2048, in the thread note.","commonSituations":"Byte-stream misalignment from an earlier bad length or corrupted note; a non-delve writer producing differently framed note data; endianness mismatch making the uint16 length look huge.","solutions":["Regenerate the core dump with delve to restore a well-formed note stream.","Check for earlier corruption/misalignment in the note (one bad length shifts all subsequent reads).","Verify the file was not converted (e.g. compression or text-mode transfer) which alters bytes.","Confirm the writer and reader use the same delve note layout version."],"exampleFix":"// symptom in stream\nlen=0xFFFF followed by garbage // exceeds maxlen 20 for register name\n// fix by regenerating\n$ dlv core <exe> <core>  # after re-dumping a valid core","handlingStrategy":"validation","validationCode":"// Pre-scan thread notes: every length field must respect the caps\nif nameLen > 20 || valLen > 2048 {\n\treturn fmt.Errorf(\"implausible register field lengths name=%d val=%d; core likely corrupt\", nameLen, valLen)\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Treat any 'maximum len exceeded' as stream corruption — regenerate the core.","Avoid any byte-level transformation (compression, text mode) of core files.","Match endianness expectations between writer and reader.","Verify integrity before analysis."],"tags":["core-dump","corruption","bounds-check"],"backgroundTag":"truncated-core-file","analyzedSha":"a23773e6c31361e43246bc43a424ee009679b174","analyzedAt":"2026-08-31T15:12:45.221Z","schemaVersion":2},"datasetVersion":"2026-08-31T19:17:28.585Z"}