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

  1. Confirm localpath points to a regular file or directory, not a device/socket/fifo (stat -c %F)
  2. Exclude non-regular files from the packaging input list
  3. 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

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


AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04). Data as JSON: /api/errors/a5e1532ac45510e7. Report an issue: GitHub.