This is an automated email from the ASF dual-hosted git repository.

hsluoyz pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/casbin.git


The following commit(s) were added to refs/heads/master by this push:
     new a771855  fix: keep PolicyMap in sync when UpdatePolicies reuses old 
rules
a771855 is described below

commit a7718555c28cfa92e4c22c7ddd90c739b56f7af2
Author: Yang Luo <[email protected]>
AuthorDate: Sat Oct 31 09:02:07 2026 +0800

    fix: keep PolicyMap in sync when UpdatePolicies reuses old rules
---
 model/policy.go | 48 ++++++++++++++++++++----------------------------
 1 file changed, 20 insertions(+), 28 deletions(-)

diff --git a/model/policy.go b/model/policy.go
index 7669dfe..c09527d 100644
--- a/model/policy.go
+++ b/model/policy.go
@@ -300,40 +300,32 @@ func (model Model) UpdatePolicy(sec string, ptype string, 
oldRule []string, newR
 
 // UpdatePolicies updates a policy rule from the model.
 func (model Model) UpdatePolicies(sec string, ptype string, oldRules, newRules 
[][]string) (bool, error) {
-       _, err := model.GetAssertion(sec, ptype)
+       assertion, err := model.GetAssertion(sec, ptype)
        if err != nil {
                return false, err
        }
-       rollbackFlag := false
-       // index -> []{oldIndex, newIndex}
-       modifiedRuleIndex := make(map[int][]int)
-       // rollback
-       defer func() {
-               if rollbackFlag {
-                       for index, oldNewIndex := range modifiedRuleIndex {
-                               model[sec][ptype].Policy[index] = 
oldRules[oldNewIndex[0]]
-                               oldPolicy := 
strings.Join(oldRules[oldNewIndex[0]], DefaultSep)
-                               newPolicy := 
strings.Join(newRules[oldNewIndex[1]], DefaultSep)
-                               delete(model[sec][ptype].PolicyMap, newPolicy)
-                               model[sec][ptype].PolicyMap[oldPolicy] = index
-                       }
-               }
-       }()
-
-       newIndex := 0
-       for oldIndex, oldRule := range oldRules {
-               oldPolicy := strings.Join(oldRule, DefaultSep)
-               index, ok := model[sec][ptype].PolicyMap[oldPolicy]
-               if !ok {
-                       rollbackFlag = true
+       if len(oldRules) != len(newRules) {
+               return false, fmt.Errorf("the length of oldRules should be 
equal to the length of newRules, but got the length of oldRules is %d, the 
length of newRules is %d", len(oldRules), len(newRules))
+       }
+
+       // Resolve all indexes before writing, since newRules may reuse keys of 
oldRules.
+       indexes := make([]int, len(oldRules))
+       seen := make(map[int]bool, len(oldRules))
+       for i, oldRule := range oldRules {
+               index, ok := assertion.PolicyMap[strings.Join(oldRule, 
DefaultSep)]
+               if !ok || seen[index] {
                        return false, nil
                }
+               seen[index] = true
+               indexes[i] = index
+       }
 
-               model[sec][ptype].Policy[index] = newRules[newIndex]
-               delete(model[sec][ptype].PolicyMap, oldPolicy)
-               model[sec][ptype].PolicyMap[strings.Join(newRules[newIndex], 
DefaultSep)] = index
-               modifiedRuleIndex[index] = []int{oldIndex, newIndex}
-               newIndex++
+       for _, oldRule := range oldRules {
+               delete(assertion.PolicyMap, strings.Join(oldRule, DefaultSep))
+       }
+       for i, newRule := range newRules {
+               assertion.Policy[indexes[i]] = newRule
+               assertion.PolicyMap[strings.Join(newRule, DefaultSep)] = 
indexes[i]
        }
 
        return true, nil


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to