{"record":{"id":"ce18b62707024d04","repo":"golang/go","slug":"invalid-nul-in-s-value","errorCode":null,"errorMessage":"invalid NUL in %s=... value","messagePattern":"invalid NUL in (.+?)=\\.\\.\\. value","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/cmd/go/internal/envcmd/env.go","lineNumber":697,"sourceCode":"\t\t\tbreak\n\t\t}\n\t\targs, err := quoted.Split(val)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"invalid %s: %v\", key, err)\n\t\t}\n\t\tif len(args) == 0 {\n\t\t\treturn fmt.Errorf(\"%s entry cannot contain only space\", key)\n\t\t}\n\t\tif !filepath.IsAbs(args[0]) && args[0] != filepath.Base(args[0]) {\n\t\t\treturn fmt.Errorf(\"%s entry is relative; must be absolute path: %q\", key, args[0])\n\t\t}\n\t}\n\n\tif !utf8.ValidString(val) {\n\t\treturn fmt.Errorf(\"invalid UTF-8 in %s=... value\", key)\n\t}\n\tif strings.Contains(val, \"\\x00\") {\n\t\treturn fmt.Errorf(\"invalid NUL in %s=... value\", key)\n\t}\n\tif strings.ContainsAny(val, \"\\v\\r\\n\") {\n\t\treturn fmt.Errorf(\"invalid newline in %s=... value\", key)\n\t}\n\treturn nil\n}\n\nfunc readEnvFileLines(mustExist bool) []string {\n\tfile, _, err := cfg.EnvFile()\n\tif file == \"\" {\n\t\tif mustExist {\n\t\t\tbase.Fatalf(\"go: cannot find go env config: %v\", err)\n\t\t}\n\t\treturn nil\n\t}\n\tdata, err := os.ReadFile(file)\n\tif err != nil && (!os.IsNotExist(err) || mustExist) {\n\t\tbase.Fatalf(\"go: reading go env config: %v\", err)","sourceCodeStart":679,"sourceCodeEnd":715,"githubUrl":"https://github.com/golang/go/blob/b6b368adc57c96c3151d224d172029f233ead2c3/src/cmd/go/internal/envcmd/env.go#L679-L715","documentation":"Returned by checkEnvWrite when the value written via `go env -w` contains a NUL byte (\\x00). NUL is illegal in environment values on most platforms and would silently truncate the value or break file parsing.","triggerScenarios":"Any `go env -w KEY=...` value containing a literal NUL byte, typically from binary input, embedded C strings, or a corrupt env value.","commonSituations":"Scripts forwarding bytes from binary blobs; values constructed by string concatenation over fixed-size buffers; malicious/accidental control characters in templated config.","solutions":["Strip NUL bytes from the value before invoking `go env -w`.","Validate the input source — values should be human-readable text.","Reject binary input at the trust boundary of your config tooling."],"exampleFix":"// before\nv := string(binaryBuf) // may contain \\x00\ngoEnvW(key, v)\n// after — strip and validate\nv = strings.ReplaceAll(v, \"\\x00\", \"\")\nif strings.ContainsRune(v, 0) { return fmt.Errorf(\"nul\") }\ngoEnvW(key, v)","handlingStrategy":"validation","validationCode":"import \"strings\"\n\nif strings.ContainsRune(val, '\\x00') {\n    return fmt.Errorf(\"value for %s contains NUL\", key)\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Sanitize binary-sourced values at the trust boundary.","Use text-only input for env values; reject blobs.","Add a CI lint that fails on control characters in config files."],"tags":["config","env","validation","sanitization"],"analyzedSha":"b6b368adc57c96c3151d224d172029f233ead2c3","analyzedAt":"2026-08-12T00:22:02.250Z","schemaVersion":2},"datasetVersion":"2026-08-12T12:17:08.281Z"}