Skip to content

Commit 28b7ec3

Browse files
committed
Check POSIX file permissions before writing PID
Update `ApplicationPid` to check POSIX file permissions in addition to `File.canWrite()` before PID file. This helps to provided consistent behavior, regardless of if the application is running as root or not. Fixes gh-9922
1 parent fd1dfbb commit 28b7ec3

File tree

1 file changed

+32
-0
lines changed

1 file changed

+32
-0
lines changed

spring-boot/src/main/java/org/springframework/boot/ApplicationPid.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,13 @@
1717
package org.springframework.boot;
1818

1919
import java.io.File;
20+
import java.io.FileNotFoundException;
2021
import java.io.FileWriter;
2122
import java.io.IOException;
2223
import java.lang.management.ManagementFactory;
24+
import java.nio.file.Files;
25+
import java.nio.file.attribute.PosixFilePermission;
26+
import java.util.Set;
2327

2428
import org.springframework.util.Assert;
2529
import org.springframework.util.ObjectUtils;
@@ -31,6 +35,10 @@
3135
*/
3236
public class ApplicationPid {
3337

38+
private static final PosixFilePermission[] WRITE_PERMISSIONS = {
39+
PosixFilePermission.OWNER_WRITE, PosixFilePermission.GROUP_WRITE,
40+
PosixFilePermission.OTHERS_WRITE };
41+
3442
private final String pid;
3543

3644
public ApplicationPid() {
@@ -81,6 +89,7 @@ public boolean equals(Object obj) {
8189
public void write(File file) throws IOException {
8290
Assert.state(this.pid != null, "No PID available");
8391
createParentFolder(file);
92+
assertCanWrite(file);
8493
try (FileWriter writer = new FileWriter(file)) {
8594
writer.append(this.pid);
8695
}
@@ -93,4 +102,27 @@ private void createParentFolder(File file) {
93102
}
94103
}
95104

105+
private void assertCanWrite(File file) throws IOException {
106+
if (!file.canWrite() || !canWritePosixFile(file)) {
107+
throw new FileNotFoundException(file.toString() + " (permission denied)");
108+
}
109+
}
110+
111+
private boolean canWritePosixFile(File file) throws IOException {
112+
try {
113+
Set<PosixFilePermission> permissions = Files
114+
.getPosixFilePermissions(file.toPath());
115+
for (PosixFilePermission permission : WRITE_PERMISSIONS) {
116+
if (permissions.contains(permission)) {
117+
return true;
118+
}
119+
}
120+
return false;
121+
}
122+
catch (UnsupportedOperationException ex) {
123+
// Assume that we can
124+
return true;
125+
}
126+
}
127+
96128
}

0 commit comments

Comments
 (0)