{"record":{"id":"674f73aa9f03601a","repo":"hyperledger/fabric","slug":"could-not-read-s-from-tar","errorCode":null,"errorMessage":"could not read %s from tar","messagePattern":"could not read (.+?) from tar","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"core/chaincode/persistence/chaincode_package.go","lineNumber":307,"sourceCode":"\tvar codePackage []byte\n\tvar ccPackageMetadata *ChaincodePackageMetadata\n\tfor {\n\t\theader, err := tarReader.Next()\n\t\tif err == io.EOF {\n\t\t\tbreak\n\t\t}\n\n\t\tif err != nil {\n\t\t\treturn ccPackageMetadata, nil, errors.Wrapf(err, \"error inspecting next tar header\")\n\t\t}\n\n\t\tif header.Typeflag != tar.TypeReg {\n\t\t\treturn ccPackageMetadata, nil, errors.Errorf(\"tar entry %s is not a regular file, type %v\", header.Name, header.Typeflag)\n\t\t}\n\n\t\tfileBytes, err := io.ReadAll(tarReader)\n\t\tif err != nil {\n\t\t\treturn ccPackageMetadata, nil, errors.Wrapf(err, \"could not read %s from tar\", header.Name)\n\t\t}\n\n\t\tswitch header.Name {\n\n\t\tcase MetadataFile:\n\t\t\tccPackageMetadata = &ChaincodePackageMetadata{}\n\t\t\terr := json.Unmarshal(fileBytes, ccPackageMetadata)\n\t\t\tif err != nil {\n\t\t\t\treturn ccPackageMetadata, nil, errors.Wrapf(err, \"could not unmarshal %s as json\", MetadataFile)\n\t\t\t}\n\n\t\tcase CodePackageFile:\n\t\t\tcodePackage = fileBytes\n\t\tdefault:\n\t\t\tlogger.Warningf(\"Encountered unexpected file '%s' in top level of chaincode package\", header.Name)\n\t\t}\n\t}\n","sourceCodeStart":289,"sourceCodeEnd":325,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/core/chaincode/persistence/chaincode_package.go#L289-L325","documentation":"After confirming a tar entry is a regular file, ParseChaincodePackage reads its full contents with io.ReadAll; if that read fails it returns this wrapped error naming the entry. This indicates I/O-level corruption or truncation within an otherwise well-formed tar header.","triggerScenarios":"Calling Parse or PackageID where a tar entry's data blocks are truncated or undecodable mid-stream — e.g. the gzip stream ends before the entry's declared size is read.","commonSituations":"Packages truncated during upload/download, corrupted stored blobs, or archives built by buggy tooling writing short data sections.","solutions":["Repackage the chaincode and re-upload/install it.","Verify integrity with tar -tzvf (it will report unexpected EOF).","Compare the package checksum with the source of truth.","Check storage/transfer path (network reliability, disk space) that truncated the bytes."],"exampleFix":"// before: partial copy\naws s3 cp s3://bucket/mycc.tgz . --range bytes=0-1000\n// after: full object copy\naws s3 cp s3://bucket/mycc.tgz . && sha256sum mycc.tgz","handlingStrategy":"validation","validationCode":"gr, _ := gzip.NewReader(bytes.NewReader(source))\ntr := tar.NewReader(gr)\nfor {\n\th, err := tr.Next()\n\tif err == io.EOF { break }\n\tif err != nil { return err }\n\tif _, err := io.ReadAll(tr); err != nil {\n\t\treturn fmt.Errorf(\"entry %q truncated/corrupt: %w\", h.Name, err)\n\t}\n}","typeGuard":null,"tryCatchPattern":"meta, code, err := persistence.ParseChaincodePackage(source)\nif err != nil {\n\tif strings.Contains(err.Error(), \"could not read\") {\n\t\treturn fmt.Errorf(\"package truncated in transit; re-upload with checksum check: %w\", err)\n\t}\n\treturn err\n}","preventionTips":["Verify package checksums after download/upload.","Use resumable/checksummed transfers for large packages.","Check available disk space where the package is stored.","Recreate the package if 'tar -tzvf' reports unexpected EOF."],"tags":["tar","chaincode-package","io-error"],"backgroundTag":"corrupt-tar-archive","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"}