diff options
author | Thomas Watson | 2019-03-07 14:49:11 +0000 |
---|---|---|
committer | Thomas Watson | 2019-03-11 15:17:26 +0000 |
commit | 98755ac911c90491b65ff46484728203b93ede79 (patch) | |
tree | 8388f6156537192b05b507590c3e4561b729efc9 /bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/storage | |
parent | 1b378f8b5be942ea25bb3c6f38c9fb81cf80034d (diff) | |
download | rt.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.java | 35 |
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(); |