osx.Copy bỏ qua lỗi Close() → file có thể hỏng #16

Closed
opened 2026-07-22 11:23:41 +07:00 by claudecode · 1 comment
Owner

Vấn đề

pkg/osx/file.go:21 defer dstFile.Close() không kiểm tra lỗi. Khi ghi file, lỗi flush/có thể xảy ra ở Close() bị bỏ qua → file có thể bị cắt xén mà hàm vẫn báo thành công.

dstFile, err := os.Create(to)
...
defer dstFile.Close()   // ❌ không check
...
_, err = io.CopyBuffer(dstFile, srcFile, buf)
...
return nil              // ❌ không sync/close-err

Fix đề xuất

dstFile, err := os.Create(to)
if err != nil { return err }
defer dstFile.Close()
...
_, err = io.CopyBuffer(dstFile, srcFile, buf)
if err != nil { return err }
// quan trọng: kiểm tra lỗi close (flush)
if err := dstFile.Close(); err != nil { return err }
return nil

(Đổi defer close cho cleanup path, và close tường minh kiểm tra lỗi ở happy path — hoặc dùng defer với named return.)

## Vấn đề `pkg/osx/file.go:21` `defer dstFile.Close()` không kiểm tra lỗi. Khi ghi file, lỗi flush/có thể xảy ra ở `Close()` bị bỏ qua → file có thể bị cắt xén mà hàm vẫn báo thành công. ```go dstFile, err := os.Create(to) ... defer dstFile.Close() // ❌ không check ... _, err = io.CopyBuffer(dstFile, srcFile, buf) ... return nil // ❌ không sync/close-err ``` ## Fix đề xuất ```go dstFile, err := os.Create(to) if err != nil { return err } defer dstFile.Close() ... _, err = io.CopyBuffer(dstFile, srcFile, buf) if err != nil { return err } // quan trọng: kiểm tra lỗi close (flush) if err := dstFile.Close(); err != nil { return err } return nil ``` (Đổi `defer` close cho cleanup path, và close tường minh kiểm tra lỗi ở happy path — hoặc dùng `defer` với named return.)
claudecode added the bug label 2026-07-22 11:23:41 +07:00
Author
Owner

Đã sửa trong PR #22 (merge commit 361eb40).

  • pkg/osx/file.go: Copy kiểm tra lỗi Close() của dst — Close() có thể flush write buffer, nên lỗi close phải được surface (không phải return nil khi file đích chưa hoàn chỉnh). Dùng defer chỉ ghi đè giá trị trả về khi bản thân copy thành công.
  • Cùng commit: dọn temp file khi copy/open fail (internal/data/ipdb.go).

Verify: go build / go vet PASS.

Đã sửa trong PR #22 (merge commit `361eb40`). - `pkg/osx/file.go`: `Copy` kiểm tra lỗi `Close()` của dst — `Close()` có thể flush write buffer, nên lỗi close phải được surface (không phải return nil khi file đích chưa hoàn chỉnh). Dùng defer chỉ ghi đè giá trị trả về khi bản thân copy thành công. - Cùng commit: dọn temp file khi copy/open fail (`internal/data/ipdb.go`). Verify: `go build` / `go vet` PASS.
This repo is archived. You cannot comment on issues.
1 Participants
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: public/ip-info#16