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

baedke pushed a commit to branch OAK-11845-2
in repository https://gitbox.apache.org/repos/asf/jackrabbit-oak.git


The following commit(s) were added to refs/heads/OAK-11845-2 by this push:
     new e84e04dd9d OAK-11845: Avoid race conditions in 
SecureNodeBuilder#getTreePermissions()
e84e04dd9d is described below

commit e84e04dd9ddff79673ae3f200ab5739c8d780b2e
Author: Manfred Baedke <[email protected]>
AuthorDate: Thu Aug 7 17:10:34 2025 +0200

    OAK-11845: Avoid race conditions in SecureNodeBuilder#getTreePermissions()
    
    Done.
---
 .../jackrabbit/oak/core/SecureNodeBuilder.java       | 20 ++++++++++++++------
 1 file changed, 14 insertions(+), 6 deletions(-)

diff --git 
a/oak-core/src/main/java/org/apache/jackrabbit/oak/core/SecureNodeBuilder.java 
b/oak-core/src/main/java/org/apache/jackrabbit/oak/core/SecureNodeBuilder.java
index 1490b11460..3a9d1c9161 100644
--- 
a/oak-core/src/main/java/org/apache/jackrabbit/oak/core/SecureNodeBuilder.java
+++ 
b/oak-core/src/main/java/org/apache/jackrabbit/oak/core/SecureNodeBuilder.java
@@ -88,6 +88,8 @@ class SecureNodeBuilder implements NodeBuilder {
      */
     private TreePermission rootPermission = null; // initialized lazily
 
+    private volatile boolean reevaluatePermissions = true;
+
     /**
      * Create the {@code SecureNodeBuilder} for the root node.
      *
@@ -156,10 +158,9 @@ class SecureNodeBuilder implements NodeBuilder {
         return builder.isReplaced(name) && !isNew(name);
     }
 
-    public synchronized void baseChanged() {
+    public void baseChanged() {
         Validate.checkState(parent == null);
-        treePermission = null; // trigger re-evaluation
-        rootPermission = null;
+        reevaluatePermissions = true;
     }
 
     @Override
@@ -349,9 +350,8 @@ class SecureNodeBuilder implements NodeBuilder {
      * @return The permissions for this tree.
      */
     @NotNull
-    private synchronized TreePermission getTreePermission() {
-        if (treePermission == null
-                || rootPermission != rootBuilder.treePermission) {
+    private TreePermission getTreePermission() {
+        if (isPermissionEvaluationNeeded()) {
             NodeState base = builder.getBaseState();
             String msg = "see OAK-11790 and OAK-11843";
             if (parent == null) {
@@ -364,10 +364,18 @@ class SecureNodeBuilder implements NodeBuilder {
                 treePermission = 
Objects.requireNonNull(parentTreePermission.getChildPermission(name, base), 
msg);
                 rootPermission = parent.rootPermission;
             }
+            reevaluatePermissions = false;
         }
         return treePermission;
     }
 
+    private boolean isPermissionEvaluationNeeded() {
+        if (rootPermission != rootBuilder.treePermission) {
+            reevaluatePermissions = true;
+        }
+        return reevaluatePermissions;
+    }
+
     private static boolean isType(@Nullable PropertyState property, Type<?> 
type) {
         Type<?> t = (property == null) ? null : property.getType();
         return t == type;

Reply via email to