Fix possible InvalidObjectIdException in ObjectDirectory

ObjectDirectory.getShallowCommits should throw an IOException
instead of an InvalidArgumentException if invalid SHAs are present
in .git/shallow (as this file is usually edited by a human).

Change-Id: Ia3a39d38f7aec4282109c7698438f0795fbec905
Signed-off-by: Marc Strapetz <marc.strapetz@syntevo.com>
Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
This commit is contained in:
Marc Strapetz 2017-01-10 16:28:54 +01:00
parent d3148f9410
commit 1c4b3f8c45
4 changed files with 54 additions and 2 deletions

View File

@ -47,13 +47,18 @@
import java.io.File; import java.io.File;
import java.io.FilenameFilter; import java.io.FilenameFilter;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.MessageFormat;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.Set;
import java.util.concurrent.Callable; import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.concurrent.Future; import java.util.concurrent.Future;
import org.eclipse.jgit.internal.JGitText;
import org.eclipse.jgit.junit.RepositoryTestCase; import org.eclipse.jgit.junit.RepositoryTestCase;
import org.eclipse.jgit.lib.ConfigConstants; import org.eclipse.jgit.lib.ConfigConstants;
import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.Constants;
@ -61,10 +66,15 @@
import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.storage.file.FileBasedConfig; import org.eclipse.jgit.storage.file.FileBasedConfig;
import org.junit.Assume; import org.junit.Assume;
import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.rules.ExpectedException;
public class ObjectDirectoryTest extends RepositoryTestCase { public class ObjectDirectoryTest extends RepositoryTestCase {
@Rule
public ExpectedException expectedEx = ExpectedException.none();
@Test @Test
public void testConcurrentInsertionOfBlobsToTheSameNewFanOutDirectory() public void testConcurrentInsertionOfBlobsToTheSameNewFanOutDirectory()
throws Exception { throws Exception {
@ -171,6 +181,40 @@ public boolean accept(File dir, String name) {
} }
} }
@Test
public void testShallowFile()
throws Exception {
FileRepository repository = createBareRepository();
ObjectDirectory dir = repository.getObjectDatabase();
String commit = "d3148f9410b071edd4a4c85d2a43d1fa2574b0d2";
try (PrintWriter writer = new PrintWriter(
new File(repository.getDirectory(), Constants.SHALLOW))) {
writer.println(commit);
}
Set<ObjectId> shallowCommits = dir.getShallowCommits();
assertTrue(shallowCommits.remove(ObjectId.fromString(commit)));
assertTrue(shallowCommits.isEmpty());
}
@Test
public void testShallowFileCorrupt()
throws Exception {
FileRepository repository = createBareRepository();
ObjectDirectory dir = repository.getObjectDatabase();
String commit = "X3148f9410b071edd4a4c85d2a43d1fa2574b0d2";
try (PrintWriter writer = new PrintWriter(
new File(repository.getDirectory(), Constants.SHALLOW))) {
writer.println(commit);
}
expectedEx.expect(IOException.class);
expectedEx.expectMessage(MessageFormat
.format(JGitText.get().badShallowLine, commit));
dir.getShallowCommits();
}
private Collection<Callable<ObjectId>> blobInsertersForTheSameFanOutDir( private Collection<Callable<ObjectId>> blobInsertersForTheSameFanOutDir(
final ObjectDirectory dir) { final ObjectDirectory dir) {
Callable<ObjectId> callable = new Callable<ObjectId>() { Callable<ObjectId> callable = new Callable<ObjectId>() {

View File

@ -31,6 +31,7 @@ badGroupHeader=Bad group header
badObjectType=Bad object type: {0} badObjectType=Bad object type: {0}
badRef=Bad ref: {0}: {1} badRef=Bad ref: {0}: {1}
badSectionEntry=Bad section entry: {0} badSectionEntry=Bad section entry: {0}
badShallowLine=Bad shallow line: {0}
bareRepositoryNoWorkdirAndIndex=Bare Repository has neither a working tree, nor an index bareRepositoryNoWorkdirAndIndex=Bare Repository has neither a working tree, nor an index
base64InputNotProperlyPadded=Base64 input not properly padded. base64InputNotProperlyPadded=Base64 input not properly padded.
baseLengthIncorrect=base length incorrect baseLengthIncorrect=base length incorrect

View File

@ -90,6 +90,7 @@ public static JGitText get() {
/***/ public String badObjectType; /***/ public String badObjectType;
/***/ public String badRef; /***/ public String badRef;
/***/ public String badSectionEntry; /***/ public String badSectionEntry;
/***/ public String badShallowLine;
/***/ public String bareRepositoryNoWorkdirAndIndex; /***/ public String bareRepositoryNoWorkdirAndIndex;
/***/ public String base64InputNotProperlyPadded; /***/ public String base64InputNotProperlyPadded;
/***/ public String baseLengthIncorrect; /***/ public String baseLengthIncorrect;

View File

@ -690,8 +690,14 @@ Set<ObjectId> getShallowCommits() throws IOException {
final BufferedReader reader = open(shallowFile); final BufferedReader reader = open(shallowFile);
try { try {
String line; String line;
while ((line = reader.readLine()) != null) while ((line = reader.readLine()) != null) {
shallowCommitsIds.add(ObjectId.fromString(line)); try {
shallowCommitsIds.add(ObjectId.fromString(line));
} catch (IllegalArgumentException ex) {
throw new IOException(MessageFormat
.format(JGitText.get().badShallowLine, line));
}
}
} finally { } finally {
reader.close(); reader.close();
} }