Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Watson2019-03-07 14:49:11 +0000
committerThomas Watson2019-03-11 15:17:26 +0000
commit98755ac911c90491b65ff46484728203b93ede79 (patch)
tree8388f6156537192b05b507590c3e4561b729efc9 /bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/storage
parent1b378f8b5be942ea25bb3c6f38c9fb81cf80034d (diff)
downloadrt.equinox.framework-98755ac911c90491b65ff46484728203b93ede79.tar.gz
rt.equinox.framework-98755ac911c90491b65ff46484728203b93ede79.tar.xz
rt.equinox.framework-98755ac911c90491b65ff46484728203b93ede79.zip
Bug 545149 - performance hit on loading from cached stateI20190314-1800I20190312-1800I20190312-0340I20190311-1800
Change-Id: Ibc62835672f6f62bd2ee44cfdc110e9124b676b3 Signed-off-by: Thomas Watson <tjwatson@us.ibm.com>
Diffstat (limited to 'bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/storage')
-rw-r--r--bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/storage/Storage.java35
1 files changed, 32 insertions, 3 deletions
diff --git a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/storage/Storage.java b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/storage/Storage.java
index 6dfe504b7..25c70ac8f 100644
--- a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/storage/Storage.java
+++ b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/storage/Storage.java
@@ -955,10 +955,35 @@ public class Storage {
return bundleID + "/" + generationID + "/" + BUNDLE_FILE_NAME; //$NON-NLS-1$ //$NON-NLS-2$
}
+ /**
+ * Gets a file from storage and conditionally checks the parent storage area
+ * if the file does not exist in the child configuration.
+ * Note, this method does not check for escaping of paths from the root storage area.
+ * @param path the path relative to the root of the storage area
+ * @param checkParent if true then check the parent storage (if any) when the file
+ * does not exist in the child storage area
+ * @return the file being requested. A {@code null} value is never returned. The file
+ * returned may not exist.
+ * @throws StorageException if there was an issue getting the file
+ */
public File getFile(String path, boolean checkParent) throws StorageException {
return getFile(null, path, checkParent);
}
+ /**
+ * Same as {@link #getFile(String, boolean)} except takes a base parameter which is
+ * appended to the root storage area before looking for the path. If base is not
+ * null then additional checks are done to make sure the path does not escape out
+ * of the base path.
+ * @param base the additional base path to append to the root storage area. May be
+ * {@code null}, in which case no check is done for escaping out of the base path.
+ * @param path the path relative to the root + base storage area.
+ * @param checkParent if true then check the parent storage (if any) when the file
+ * does not exist in the child storage area
+ * @return the file being requested. A {@code null} value is never returned. The file
+ * returned may not exist.
+ * @throws StorageException if there was an issue getting the file
+ */
public File getFile(String base, String path, boolean checkParent) throws StorageException {
// first check the child location
File childPath = getFile(childRoot, base, path);
@@ -978,12 +1003,16 @@ public class Storage {
}
private static File getFile(File root, String base, String path) {
- if (base != null) {
- // if base is not null then move root to include the base
- root = new File(root, base);
+ if (base == null) {
+ // return quick; no need to check for path traversal
+ return new File(root, path);
}
+
+ // if base is not null then move root to include the base
+ root = new File(root, base);
File result = new File(root, path);
+ // do the extra check to make sure the path did not escape the root path
try {
String resultCanonical = result.getCanonicalPath();
String rootCanonical = root.getCanonicalPath();

Back to the top