{"record":{"id":"13595e20f199d61c","repo":"go-delve/delve","slug":"wrong-number-of-bytes-for-register-s-d","errorCode":null,"errorMessage":"wrong number of bytes for register %s (%d)","messagePattern":"wrong number of bytes for register (.+?) \\((.+?)\\)","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/proc/fbsdutil/regs.go","lineNumber":229,"sourceCode":"\tcase regnum.AMD64_R11:\n\t\tp = &r.Regs.R11\n\tcase regnum.AMD64_R12:\n\t\tp = &r.Regs.R12\n\tcase regnum.AMD64_R13:\n\t\tp = &r.Regs.R13\n\tcase regnum.AMD64_R14:\n\t\tp = &r.Regs.R14\n\tcase regnum.AMD64_R15:\n\t\tp = &r.Regs.R15\n\tcase regnum.AMD64_Rip:\n\t\tp = &r.Regs.Rip\n\tcase regnum.AMD64_Rflags:\n\t\tp = &r.Regs.Rflags\n\t}\n\n\tif p != nil {\n\t\tif reg.Bytes != nil && len(reg.Bytes) != 8 {\n\t\t\treturn false, fmt.Errorf(\"wrong number of bytes for register %s (%d)\", regnum.AMD64ToName(regNum), len(reg.Bytes))\n\t\t}\n\t\t*p = int64(reg.Uint64Val)\n\t\treturn false, nil\n\t}\n\n\tif r.loadFpRegs != nil {\n\t\tif err := r.loadFpRegs(r); err != nil {\n\t\t\treturn false, err\n\t\t}\n\t\tr.loadFpRegs = nil\n\t}\n\n\tif regNum < regnum.AMD64_XMM0 || regNum > regnum.AMD64_XMM0+15 {\n\t\treturn false, fmt.Errorf(\"can not set %s\", regnum.AMD64ToName(regNum))\n\t}\n\n\treg.FillBytes()\n","sourceCodeStart":211,"sourceCodeEnd":247,"githubUrl":"https://github.com/go-delve/delve/blob/a23773e6c31361e43246bc43a424ee009679b174/pkg/proc/fbsdutil/regs.go#L211-L247","documentation":"On FreeBSD (amd64), fbsdutil.SetReg validates that registers backed by an 8-byte field (e.g. Rflags and other general-purpose registers) receive exactly 8 bytes of data; otherwise it returns 'wrong number of bytes for register <name> (<n>)'. This protects against writing a malformed register buffer into the process's register state. It indicates the caller supplied a Regs value with an unexpected byte length.","triggerScenarios":"Calling SetReg (e.g. via proc.WriteRegister / the RPC SetRegister API) with reg.Bytes of length other than 8 for a GP register; scripted register modification via RPC2 with wrongly sized byte slices.","commonSituations":"Tooling that pokes registers programmatically passing 4-byte values for a 64-bit register; architecture confusion (32-bit sized writes on amd64); hand-crafted core/debug automation bugs.","solutions":["Pad/resize the byte slice to exactly 8 bytes (little-endian) before calling SetReg","Use reg.FillBytes()/proper Regs construction so Bytes length matches the register width","Verify you are writing an amd64-width value and not a 32-bit one"],"exampleFix":"// before\nb := []byte{0x10, 0x00} // 2 bytes\nthread.SetReg(regnum.AMD64_Rflags, proc.Regs{Bytes: b})\n// after\nb := make([]byte, 8)\nbinary.LittleEndian.PutUint64(b, 0x10)\nthread.SetReg(regnum.AMD64_Rflags, proc.Regs{Bytes: b})","handlingStrategy":"validation","validationCode":"if len(regBytes) != 8 {\n\treturn fmt.Errorf(\"GP register write needs 8 bytes, got %d\", len(regBytes))\n}","typeGuard":"func isEightBytes(b []byte) bool { return len(b) == 8 }","tryCatchPattern":"null","preventionTips":["Always encode 64-bit little-endian values for amd64 GP registers","Use proc.Regs helper constructors/FillBytes","Test register-write tooling on the target OS before deploying"],"tags":["freebsd","registers","amd64"],"backgroundTag":"invalid-register-size","analyzedSha":"a23773e6c31361e43246bc43a424ee009679b174","analyzedAt":"2026-08-31T15:12:45.221Z","schemaVersion":2},"datasetVersion":"2026-08-31T22:30:34.772Z"}