diff options
author | Philipp Marx <smigfu@googlemail.com> | 2016-11-11 10:43:09 +0100 |
---|---|---|
committer | Philipp Marx <smigfu@googlemail.com> | 2016-11-11 10:43:09 +0100 |
commit | 8adbfe4da6723768febbb86c22ac118e233c2154 (patch) | |
tree | 2ffe1b2ecf24714b5463e0f5b7a765df5f957b6c /org.eclipse.jgit/src/org | |
parent | f8ac03459a96138cc9cf8578933a946fb1f179f3 (diff) | |
download | jgit-8adbfe4da6723768febbb86c22ac118e233c2154.tar.gz jgit-8adbfe4da6723768febbb86c22ac118e233c2154.zip |
Check that DfsBlockCache#blockSize is a power of 2
In case a value is used which isn’t a power of 2 there will be a high
chance of java.lang.ArrayIndexOutBoundsException and
org.eclipse.jgit.errors.CorruptObjectException due to a mismatching
assumption for the DfsBlockCache#blockSizeShift parameter.
Change-Id: Ib348b3704edf10b5f93a3ffab4fa6f09cbbae231
Signed-off-by: Philipp Marx <smigfu@googlemail.com>
Diffstat (limited to 'org.eclipse.jgit/src/org')
3 files changed, 10 insertions, 1 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java index 00d019184d..29b319fe65 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java @@ -98,6 +98,7 @@ public class JGitText extends TranslationBundle { /***/ public String blameNotCommittedYet; /***/ public String blobNotFound; /***/ public String blobNotFoundForPath; + /***/ public String blockSizeNotPowerOf2; /***/ public String branchNameInvalid; /***/ public String buildingBitmaps; /***/ public String cachedPacksPreventsIndexCreation; diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsBlockCache.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsBlockCache.java index 764ae12849..05627ed86b 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsBlockCache.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsBlockCache.java @@ -145,6 +145,8 @@ public final class DfsBlockCache { * <p> * If a pack file has a native size, a whole multiple of the native size * will be used until it matches this size. + * <p> + * The value for blockSize must be a power of 2. */ private final int blockSize; diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsBlockCacheConfig.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsBlockCacheConfig.java index 7e32554c69..089bfa471d 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsBlockCacheConfig.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsBlockCacheConfig.java @@ -106,10 +106,16 @@ public class DfsBlockCacheConfig { /** * @param newSize * size in bytes of a single window read in from the pack file. + * The value must be a power of 2. * @return {@code this} */ public DfsBlockCacheConfig setBlockSize(final int newSize) { - blockSize = Math.max(512, newSize); + int size = Math.max(512, newSize); + if ((size & (size - 1)) != 0) { + throw new IllegalArgumentException( + JGitText.get().blockSizeNotPowerOf2); + } + blockSize = size; return this; } |