From 415f773f9c1fcfb5555ec6b999fba1dac03e48cb Mon Sep 17 00:00:00 2001 From: KrzysztofCiborowski <77268009+KrzysztofCiborowski@users.noreply.github.com> Date: Tue, 14 Oct 2025 21:44:16 +0100 Subject: [PATCH 1/3] Ensure `TaskContext` is marked as closed to prevent unsafe operations after task completion. --- .../hibernate/AbstractHibernateStorage.java | 7 +++++++ .../taskcontext/StandardTaskContext.java | 19 +++++++++++++++++++ .../storageutils/taskcontext/TaskContext.java | 5 +++++ 3 files changed, 31 insertions(+) diff --git a/src/main/java/net/dirtcraft/storageutils/hibernate/AbstractHibernateStorage.java b/src/main/java/net/dirtcraft/storageutils/hibernate/AbstractHibernateStorage.java index 6b09441..096436a 100644 --- a/src/main/java/net/dirtcraft/storageutils/hibernate/AbstractHibernateStorage.java +++ b/src/main/java/net/dirtcraft/storageutils/hibernate/AbstractHibernateStorage.java @@ -87,6 +87,8 @@ public R performTask(final HibernateStorage.@NonNull ResultTask task) final R result = task.execute(taskContext); transaction.commit(); + // marks context closed soo no context actions are done in queue + taskContext.markClosed(); // execute tasks after transaction was successfully committed taskContext.executeTasks(); @@ -94,6 +96,9 @@ public R performTask(final HibernateStorage.@NonNull ResultTask task) } catch (final Exception e) { if (transaction.isActive()) { transaction.rollback(); + + taskContext.markClosed(); + taskContext.executeRollbackTasks(); } @@ -123,6 +128,8 @@ public R performTask(final HibernateStorage.@NonNull ResultTask task) } throw new CompletionException(e); + } finally { + taskContext.markClosed(); } } } catch (final JDBCConnectionException e) { diff --git a/src/main/java/net/dirtcraft/storageutils/taskcontext/StandardTaskContext.java b/src/main/java/net/dirtcraft/storageutils/taskcontext/StandardTaskContext.java index 7d3cb66..2a11113 100644 --- a/src/main/java/net/dirtcraft/storageutils/taskcontext/StandardTaskContext.java +++ b/src/main/java/net/dirtcraft/storageutils/taskcontext/StandardTaskContext.java @@ -20,12 +20,16 @@ public class StandardTaskContext implements TaskContext { @NonNull private final Queue rollbackQueue = new LinkedList<>(); + private final Thread owner = Thread.currentThread(); + private volatile boolean closed = false; + public StandardTaskContext(@NonNull final Session session) { this.session = session; } @Override public @NonNull Session session() { + this.checkUse(); return this.session; } @@ -52,4 +56,19 @@ public void executeRollbackTasks() { this.rollbackQueue.poll().run(); } } + + @Override + public void markClosed() { + this.closed = true; + } + + private void checkUse() { + if (closed) { + throw new IllegalStateException("TaskContext used after task finished"); + } + + if (Thread.currentThread() != owner) { + throw new IllegalStateException("TaskContext used from non-owner thread"); + } + } } diff --git a/src/main/java/net/dirtcraft/storageutils/taskcontext/TaskContext.java b/src/main/java/net/dirtcraft/storageutils/taskcontext/TaskContext.java index 1b2a0d0..344fb36 100644 --- a/src/main/java/net/dirtcraft/storageutils/taskcontext/TaskContext.java +++ b/src/main/java/net/dirtcraft/storageutils/taskcontext/TaskContext.java @@ -42,4 +42,9 @@ public interface TaskContext { * Executes the runnable tasks upon rollback. */ void executeRollbackTasks(); + + /** + * Marks context as closed. + */ + void markClosed(); } From 0cdf05af350968f65b3e87ba0553cc1895be1c61 Mon Sep 17 00:00:00 2001 From: KrzysztofCiborowski <77268009+KrzysztofCiborowski@users.noreply.github.com> Date: Tue, 14 Oct 2025 21:55:09 +0100 Subject: [PATCH 2/3] Bump `version_minor` to 1.7 in `gradle.properties`. --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 66d7e44..fe5a2e3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,4 +8,4 @@ name=StorageUtils authors=AlphaConqueror description=Utilities for data storage. version_major=1 -version_minor=6 +version_minor=7 From ed2cd0533ae06ef5a44f204cfd21cfb6fb944926 Mon Sep 17 00:00:00 2001 From: KrzysztofCiborowski <77268009+KrzysztofCiborowski@users.noreply.github.com> Date: Thu, 16 Oct 2025 13:28:02 +0100 Subject: [PATCH 3/3] Add `checkUse` method in `TaskContext` to validate usage after closure. --- .../storageutils/taskcontext/StandardTaskContext.java | 3 ++- .../net/dirtcraft/storageutils/taskcontext/TaskContext.java | 5 +++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/dirtcraft/storageutils/taskcontext/StandardTaskContext.java b/src/main/java/net/dirtcraft/storageutils/taskcontext/StandardTaskContext.java index 2a11113..07d8eaf 100644 --- a/src/main/java/net/dirtcraft/storageutils/taskcontext/StandardTaskContext.java +++ b/src/main/java/net/dirtcraft/storageutils/taskcontext/StandardTaskContext.java @@ -62,7 +62,8 @@ public void markClosed() { this.closed = true; } - private void checkUse() { + @Override + public void checkUse() { if (closed) { throw new IllegalStateException("TaskContext used after task finished"); } diff --git a/src/main/java/net/dirtcraft/storageutils/taskcontext/TaskContext.java b/src/main/java/net/dirtcraft/storageutils/taskcontext/TaskContext.java index 344fb36..6b44219 100644 --- a/src/main/java/net/dirtcraft/storageutils/taskcontext/TaskContext.java +++ b/src/main/java/net/dirtcraft/storageutils/taskcontext/TaskContext.java @@ -47,4 +47,9 @@ public interface TaskContext { * Marks context as closed. */ void markClosed(); + + /** + * Check if context is used after close. + */ + void checkUse(); }