{"record":{"id":"1a5d5c752bde232c","repo":"hyperledger/fabric","slug":"failed-to-write-header-for-s-s","errorCode":null,"errorMessage":"failed to write header for %s: %s","messagePattern":"failed to write header for (.+?): (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"core/chaincode/platforms/util/writer.go","lineNumber":139,"sourceCode":"\tif err != nil {\n\t\treturn fmt.Errorf(\"failed calculating FileInfoHeader: %s\", err)\n\t}\n\n\t// Take the variance out of the tar by using zero time and fixed uid/gid.\n\tvar zeroTime time.Time\n\theader.AccessTime = zeroTime\n\theader.ModTime = zeroTime\n\theader.ChangeTime = zeroTime\n\theader.Name = packagepath\n\theader.Mode = 0o100644\n\theader.Uid = 500\n\theader.Gid = 500\n\theader.Uname = \"\"\n\theader.Gname = \"\"\n\n\terr = tw.WriteHeader(header)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to write header for %s: %s\", localpath, err)\n\t}\n\n\tis := bufio.NewReader(fd)\n\t_, err = io.Copy(tw, is)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to write %s as %s: %s\", localpath, packagepath, err)\n\t}\n\n\treturn nil\n}\n","sourceCodeStart":121,"sourceCodeEnd":150,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/core/chaincode/platforms/util/writer.go#L121-L150","documentation":"After building the header, the function writes it to the tar.Writer via tw.WriteHeader. Failure here means the tar stream itself rejected the write — most commonly the underlying writer returned an error (closed/broken pipe, disk full) or the header is invalid for the stream format.","triggerScenarios":"tw.WriteHeader(header) returns an error: the tar.Writer previously hit an error and is closed for further writes, the underlying io.Writer (file/socket) failed, or the header name exceeds format limits (USTAR 100-char name without PAX support).","commonSituations":"Writing to an already-failed output stream (disk full on the package file), very long source paths exceeding USTAR name limits, or the tar.Writer being reused/closed incorrectly by the caller.","solutions":["Check the underlying writer/package destination for disk space or closed-handle errors reported in the wrapped %s","Shorten the packaged file's relative path so the header name fits the tar format limits","Create a fresh tar.Writer for each package; do not reuse one after a prior error"],"exampleFix":"// before\ntarFileName := deeplyNestedFileAbsPath // >100 chars\nutil.WriteFileToPackage(deeplyNestedFileAbsPath, pkgPath, tw)\n// after\nrelName, _ := filepath.Rel(pkgRoot, deeplyNestedFileAbsPath) // short relative name\ntarFileName := relName\nutil.WriteFileToPackage(deeplyNestedFileAbsPath, pkgPath, tw)","handlingStrategy":"try-catch","validationCode":"// ensure header name fits USTAR limits before calling\nrel, err := filepath.Rel(pkgRoot, localpath)\nif err != nil || len(rel) > 100 { return fmt.Errorf(\"packaged name too long: %s\", rel) }\n// ensure destination writable\nif err := checkWritable(pkgPath); err != nil { return err }","typeGuard":"func tarNameFits(path string, root string) bool {\n    rel, err := filepath.Rel(root, path)\n    return err == nil && len(rel) <= 100 && rel != \"..\"\n}","tryCatchPattern":"if err := util.WriteFileToPackage(localpath, pkgPath, tw); err != nil {\n    if strings.Contains(err.Error(), \"failed to write header\") {\n        return fmt.Errorf(\"tar stream rejected header for %s; check output writer state and path length: %w\", localpath, err)\n    }\n    return err\n}","preventionTips":["Keep relative paths inside the package short (USTAR 100-char name limit)","Check free disk space for the package destination before packaging","Use a fresh tar.Writer per package and never reuse one after an error","Ensure the underlying writer (file/buffer) stays open for the whole operation"],"tags":["go","tar","io","chaincode"],"backgroundTag":"tar-write-failed","analyzedSha":"2736b63f8fd5932511d56fe68b7039d15977f7f6","analyzedAt":"2026-09-04T08:52:36.465Z","contentChangedAt":"2026-09-04T08:52:36.465Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}