hyperledger/fabric · error
failed calculating FileInfoHeader: %s
Error message
failed calculating FileInfoHeader: %s
What it means
tar.FileInfoHeader(fi, localpath) failed while converting the os.FileInfo into a tar header. This is thrown by the archive/tar machinery, not the filesystem, and is rare — it usually means the FileInfo came from an unsupported file type or the tar writer was constructed inconsistently.
Source
Thrown at core/chaincode/platforms/util/writer.go:122
}
// WriteFileToPackage writes a file to a tar stream.
func WriteFileToPackage(localpath string, packagepath string, tw *tar.Writer) error {
logger.Debug("Writing file to tarball:", packagepath)
fd, err := os.Open(localpath)
if err != nil {
return fmt.Errorf("%s: %s", localpath, err)
}
defer fd.Close()
fi, err := fd.Stat()
if err != nil {
return fmt.Errorf("%s: %s", localpath, err)
}
header, err := tar.FileInfoHeader(fi, localpath)
if err != nil {
return fmt.Errorf("failed calculating FileInfoHeader: %s", err)
}
// Take the variance out of the tar by using zero time and fixed uid/gid.
var zeroTime time.Time
header.AccessTime = zeroTime
header.ModTime = zeroTime
header.ChangeTime = zeroTime
header.Name = packagepath
header.Mode = 0o100644
header.Uid = 500
header.Gid = 500
header.Uname = ""
header.Gname = ""
err = tw.WriteHeader(header)
if err != nil {
return fmt.Errorf("failed to write header for %s: %s", localpath, err)
}View on GitHub (pinned to 2736b63f8f)
Solutions
- Confirm localpath points to a regular file or directory, not a device/socket/fifo (stat -c %F)
- Exclude non-regular files from the packaging input list
- If a tool is generating special files in your build tree, fix the generator
Example fix
// before
err := util.WriteFileToPackage(socketPath, pkgPath, tw)
// after
fi, _ := os.Stat(socketPath)
if !fi.Mode().IsRegular() && !fi.IsDir() {
return fmt.Errorf("skipping non-regular file %s", socketPath)
}
err := util.WriteFileToPackage(socketPath, pkgPath, tw) Defensive patterns
Strategy: validation
Validate before calling
func isRegularOrDir(localpath string) error {
fi, err := os.Stat(localpath)
if err != nil { return err }
m := fi.Mode()
if !m.IsRegular() && !m.IsDir() {
return fmt.Errorf("%s is %v; only regular files/dirs are packageable", localpath, m.Type())
}
return nil
} Type guard
func isPackageableFile(path string) bool {
fi, err := os.Stat(path)
return err == nil && (fi.Mode().IsRegular() || fi.IsDir())
} Try / catch
if err := util.WriteFileToPackage(localpath, pkgPath, tw); err != nil {
if strings.HasPrefix(err.Error(), "failed calculating FileInfoHeader") {
return fmt.Errorf("unsupported file type in package input %s", localpath)
}
return err
} Prevention
- Only pass regular files or directories to WriteFileToPackage
- Exclude sockets/devices/fifos generated by builds from the packaging set
- Keep source metadata healthy; do not package from damaged filesystems
When it happens
Trigger: tar.FileInfoHeader returns an error for the stat'ed file — e.g. exotic file types or a malformed FileInfo on the target platform.
Common situations: Packaging special files (devices, sockets) instead of regular files or directories; platform edge cases; corrupted filesystem metadata.
Related errors
- failed to write header for %s: %s
- failed to write %s as %s: %s
- illegal file name in payload: %s
- illegal file mode in payload: %s
- Error writing %s to tar: %s
AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04).
Data as JSON: /api/errors/a5e1532ac45510e7.
Report an issue: GitHub.