shithub: furgit

Download patch

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
 	}
--