diff --git a/internal/parser/archive.go b/internal/parser/archive.go index e34a72c..842bd41 100644 --- a/internal/parser/archive.go +++ b/internal/parser/archive.go @@ -15,9 +15,11 @@ import ( ) const maxSingleFileSize = 10 * 1024 * 1024 +const maxSingleFileSizeLarge = 1024 * 1024 * 1024 const maxZipArchiveSize = 50 * 1024 * 1024 const maxGzipDecompressedSize = 50 * 1024 * 1024 + var supportedArchiveExt = map[string]struct{}{ ".ahs": {}, ".gz": {}, @@ -47,7 +49,7 @@ func ExtractArchive(archivePath string) ([]ExtractedFile, error) { switch ext { case ".ahs": - return extractSingleFile(archivePath) + return extractSingleFileWithLimit(archivePath, maxSingleFileSizeLarge) case ".gz", ".tgz": return extractTarGz(archivePath) case ".tar", ".sds": @@ -55,7 +57,7 @@ func ExtractArchive(archivePath string) ([]ExtractedFile, error) { case ".zip": return extractZip(archivePath) case ".txt", ".log": - return extractSingleFile(archivePath) + return extractSingleFileWithLimit(archivePath, maxSingleFileSize) default: return nil, fmt.Errorf("unsupported archive format: %s", ext) } @@ -70,7 +72,7 @@ func ExtractArchiveFromReader(r io.Reader, filename string) ([]ExtractedFile, er switch ext { case ".ahs": - return extractSingleFileFromReader(r, filename) + return extractSingleFileFromReaderWithLimit(r, filename, maxSingleFileSizeLarge) case ".gz", ".tgz": return extractTarGzFromReader(r, filename) case ".tar", ".sds": @@ -78,7 +80,7 @@ func ExtractArchiveFromReader(r io.Reader, filename string) ([]ExtractedFile, er case ".zip": return extractZipFromReader(r) case ".txt", ".log": - return extractSingleFileFromReader(r, filename) + return extractSingleFileFromReaderWithLimit(r, filename, maxSingleFileSize) default: return nil, fmt.Errorf("unsupported archive format: %s", ext) } @@ -337,7 +339,7 @@ func extractZipFromReader(r io.Reader) ([]ExtractedFile, error) { return files, nil } -func extractSingleFile(path string) ([]ExtractedFile, error) { +func extractSingleFileWithLimit(path string, limit int64) ([]ExtractedFile, error) { info, err := os.Stat(path) if err != nil { return nil, fmt.Errorf("stat file: %w", err) @@ -348,7 +350,7 @@ func extractSingleFile(path string) ([]ExtractedFile, error) { } defer f.Close() - files, err := extractSingleFileFromReader(f, filepath.Base(path)) + files, err := extractSingleFileFromReaderWithLimit(f, filepath.Base(path), limit) if err != nil { return nil, err } @@ -358,14 +360,14 @@ func extractSingleFile(path string) ([]ExtractedFile, error) { return files, nil } -func extractSingleFileFromReader(r io.Reader, filename string) ([]ExtractedFile, error) { - content, err := io.ReadAll(io.LimitReader(r, maxSingleFileSize+1)) +func extractSingleFileFromReaderWithLimit(r io.Reader, filename string, limit int64) ([]ExtractedFile, error) { + content, err := io.ReadAll(io.LimitReader(r, limit+1)) if err != nil { return nil, fmt.Errorf("read file content: %w", err) } - truncated := len(content) > maxSingleFileSize + truncated := int64(len(content)) > limit if truncated { - content = content[:maxSingleFileSize] + content = content[:limit] } file := ExtractedFile{ @@ -376,7 +378,7 @@ func extractSingleFileFromReader(r io.Reader, filename string) ([]ExtractedFile, file.Truncated = true file.TruncatedMessage = fmt.Sprintf( "file exceeded %d bytes and was truncated", - maxSingleFileSize, + limit, ) }