ref: 98231f518208f77ee6e92291976a1512ad1da282
parent: ab6f8dde0cdc554084c4455c76feef0099db70d9
author: Runxi Yu <runxiyu@umich.edu>
date: Sun Mar 22 19:23:32 EDT 2026
refstore/files: UB on use after close
--- a/refstore/files/close.go
+++ b/refstore/files/close.go
@@ -3,6 +3,7 @@
// Close releases resources associated with the store.
//
// Store borrows gitRoot, so Close does not close it.
+// Transactions and batches borrowing the store are invalid after Close.
//
// Repeated calls to Close are undefined behavior.
func (store *Store) Close() error {--- a/refstore/files/transaction.go
+++ b/refstore/files/transaction.go
@@ -5,9 +5,8 @@
)
type Transaction struct {- store *Store
- ops []txOp
- closed bool
+ store *Store
+ ops []txOp
}
var _ refstore.Transaction = (*Transaction)(nil)
--- a/refstore/files/transaction_abort.go
+++ b/refstore/files/transaction_abort.go
@@ -1,22 +1,3 @@
package files
-import "fmt"
-
-func (tx *Transaction) Abort() error {- err := tx.ensureOpen()
- if err != nil {- return err
- }
-
- tx.closed = true
-
- return nil
-}
-
-func (tx *Transaction) ensureOpen() error {- if tx.closed {- return fmt.Errorf("refstore/files: transaction already closed")- }
-
- return nil
-}
+func (tx *Transaction) Abort() error { return nil }--- a/refstore/files/transaction_commit.go
+++ b/refstore/files/transaction_commit.go
@@ -6,15 +6,8 @@
)
func (tx *Transaction) Commit() error {- err := tx.ensureOpen()
- if err != nil {- return err
- }
-
prepared, err := tx.prepare()
if err != nil {- tx.closed = true
-
return err
}
@@ -29,8 +22,6 @@
err = tx.writeLoose(item)
if err != nil {- tx.closed = true
-
return err
}
}
@@ -37,8 +28,6 @@
err = tx.applyPackedDeletes(prepared)
if err != nil {- tx.closed = true
-
return err
}
@@ -48,8 +37,6 @@
if item.target.ref.isLoose {err = tx.store.rootFor(item.target.loc.root).Remove(item.target.loc.path)
if err != nil && !errors.Is(err, os.ErrNotExist) {- tx.closed = true
-
return err
}
@@ -58,8 +45,6 @@
case txCreate, txUpdate, txVerify, txCreateSymbolic, txUpdateSymbolic, txVerifySymbolic:
}
}
-
- tx.closed = true
return nil
}
--- a/refstore/files/transaction_queue.go
+++ b/refstore/files/transaction_queue.go
@@ -1,12 +1,7 @@
package files
func (tx *Transaction) queue(op txOp) error {- err := tx.ensureOpen()
- if err != nil {- return err
- }
-
- err = tx.validateOp(op)
+ err := tx.validateOp(op)
if err != nil {return err
}
--
⑨