From 1ed828b2a171ab4accb03f7c41ec587ad4cbf8d9 Mon Sep 17 00:00:00 2001 From: lujiefsi Date: Fri, 3 Sep 2021 19:41:24 +0800 Subject: [PATCH] CLOUDSTACK-10436:remind users to use correct permission for tmp dir and fixed an NPE (#5066) * CLOUDSTACK-10436:remind users to use correct permission for tmp dir * remove static * fix potential NPE * check /tmp * simplified the code * remove /tmp * add /tmp * add static tmp * rename tmp Co-authored-by: lujie --- .../com/cloud/storage/JavaStorageLayer.java | 26 ++++++++++++++++--- .../java/com/cloud/storage/StorageLayer.java | 2 +- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/com/cloud/storage/JavaStorageLayer.java b/core/src/main/java/com/cloud/storage/JavaStorageLayer.java index a7ba287d468..b65a76b6c25 100644 --- a/core/src/main/java/com/cloud/storage/JavaStorageLayer.java +++ b/core/src/main/java/com/cloud/storage/JavaStorageLayer.java @@ -21,15 +21,21 @@ package com.cloud.storage; import java.io.File; import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.nio.file.attribute.PosixFilePermission; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.UUID; import javax.naming.ConfigurationException; +import org.apache.log4j.Logger; public class JavaStorageLayer implements StorageLayer { - + private static final Logger s_logger = Logger.getLogger(JavaStorageLayer.class); + private static final String STD_TMP_DIR_PATH = "/tmp"; String _name; boolean _makeWorldWriteable = true; @@ -178,18 +184,25 @@ public class JavaStorageLayer implements StorageLayer { } @Override - public File createUniqDir() { + public File createUniqDir() throws IOException { String dirName = System.getProperty("java.io.tmpdir"); if (dirName != null) { File dir = new File(dirName); if (dir.exists()) { + if (isWorldReadable(dir)) { + if (STD_TMP_DIR_PATH.equals(dir.getAbsolutePath())) { + s_logger.warn(String.format("The temp dir is %s", STD_TMP_DIR_PATH)); + } else { + s_logger.warn("The temp dir " + dir.getAbsolutePath() + " is World Readable"); + } + } String uniqDirName = dir.getAbsolutePath() + File.separator + UUID.randomUUID().toString(); if (mkdir(uniqDirName)) { return new File(uniqDirName); } } } - return null; + throw new IOException("the tmp dir " + dirName + " does not exist"); } @Override @@ -217,6 +230,13 @@ public class JavaStorageLayer implements StorageLayer { } } + public boolean isWorldReadable(File file) throws IOException { + Set permissions; + permissions = Files.getPosixFilePermissions( + Paths.get(file.getAbsolutePath())); + return permissions.contains(PosixFilePermission.OTHERS_READ); + } + private List listDirPaths(String path) { String[] dirNames = path.split("/"); List dirPaths = new ArrayList(); diff --git a/core/src/main/java/com/cloud/storage/StorageLayer.java b/core/src/main/java/com/cloud/storage/StorageLayer.java index 8421aeb1285..cd7ce8613bf 100644 --- a/core/src/main/java/com/cloud/storage/StorageLayer.java +++ b/core/src/main/java/com/cloud/storage/StorageLayer.java @@ -42,7 +42,7 @@ public interface StorageLayer extends Manager { */ long getSize(String path); - File createUniqDir(); + File createUniqDir() throws IOException; /** * Is this path a directory?