mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

Valery Kharseko
29.59.2025 e96dc1eae5f6bd4d4669e4327a6b038b543fe21d
[#545] Fix deadlock in StaticGroup.updateMembers by reducing writeLock scope
1 files modified
27 ■■■■ changed files
opendj-server-legacy/src/main/java/org/opends/server/extensions/StaticGroup.java 27 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/extensions/StaticGroup.java
@@ -549,9 +549,6 @@
    Reject.ifNull(nestedGroups);
    reloadIfNeeded();
    lock.writeLock().lock();
    try
    {
      for (Modification mod : modifications)
      {
        Attribute attribute = mod.getAttribute();
@@ -563,30 +560,47 @@
              for (ByteString v : attribute)
              {
                DN member = DN.valueOf(v);
              lock.writeLock().lock();
              try {
                memberDNs.add(new CompactDn(member));
                if (DirectoryServer.getGroupManager().getGroupInstance(member) != null)
                {
                  nestedGroups.add(member);
                }
              } finally {
                lock.writeLock().unlock();
              }
              }
              break;
            case DELETE:
              if (attribute.isEmpty())
              {
              lock.writeLock().lock();
              try {
                memberDNs.clear();
                nestedGroups.clear();
              } finally {
                lock.writeLock().unlock();
              }
              }
              else
              {
                for (ByteString v : attribute)
                {
                  DN member = DN.valueOf(v);
                lock.writeLock().lock();
                try {
                  memberDNs.remove(new CompactDn(member));
                  nestedGroups.remove(member);
                } finally {
                  lock.writeLock().unlock();
                }
                }
              }
              break;
            case REPLACE:
            lock.writeLock().lock();
            try {
              memberDNs.clear();
              nestedGroups.clear();
              for (ByteString v : attribute)
@@ -598,15 +612,14 @@
                  nestedGroups.add(member);
                }
              }
            } finally {
              lock.writeLock().unlock();
            }
              break;
          }
        }
      }
    }
    finally {
      lock.writeLock().unlock();
    }
  }
  @Override
  public void addMember(Entry userEntry) throws UnsupportedOperationException, DirectoryException