diff --git a/java/org/apache/catalina/session/FileStore.java b/java/org/apache/catalina/session/FileStore.java index 0ec92f10c522..b576206f88a5 100644 --- a/java/org/apache/catalina/session/FileStore.java +++ b/java/org/apache/catalina/session/FileStore.java @@ -269,13 +269,21 @@ public void save(Session session) throws IOException { .trace(sm.getString(getStoreName() + ".saving", session.getIdInternal(), file.getAbsolutePath())); } + File tempFile = new File(file.getAbsolutePath() + ".tmp"); + Lock writeLock = sessionLocksById.getLock(session.getIdInternal()).writeLock(); writeLock.lock(); try { - try (FileOutputStream fos = new FileOutputStream(file.getAbsolutePath()); + try (FileOutputStream fos = new FileOutputStream(tempFile); ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(fos))) { ((StandardSession) session).writeObjectData(oos); } + if (!tempFile.renameTo(file)) { + if (tempFile.exists() && !tempFile.delete()) { + log.warn(sm.getString("fileStore.deleteFailed", tempFile)); + } + throw new IOException(sm.getString("fileStore.renameFailed", tempFile, file)); + } } finally { writeLock.unlock(); }