Browse Source

Fix NPE in openFetch on Transport without local repository

Setting the walk and other fields to null will result in NPEs when the
user e.g. calls fetch on the connection, but at least the advertised
refs can be read like that without having a local repository.

Bug: 413389
Change-Id: I39c8363e81a1c7e6cb3412ba88542ead669e69ed
Signed-off-by: Robin Stocker <robin@nibor.org>
Signed-off-by: Chris Aniszczyk <caniszczyk@gmail.com>
tags/v3.1.0.201309270735-rc1
Robin Stocker 10 years ago
parent
commit
8b6bbf094f

+ 16
- 0
org.eclipse.jgit.http.test/tst/org/eclipse/jgit/http/test/HttpClientTests.java View File

@@ -376,4 +376,20 @@ public class HttpClientTests extends HttpTestCase {
t.close();
}
}

@Test
public void testListRemoteWithoutLocalRepository() throws Exception {
Transport t = Transport.open(smartAuthNoneURI);
try {
FetchConnection c = t.openFetch();
try {
Ref head = c.getRef(Constants.HEAD);
assertNotNull(head);
} finally {
c.close();
}
} finally {
t.close();
}
}
}

+ 27
- 14
org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackFetchConnection.java View File

@@ -239,21 +239,33 @@ public abstract class BasePackFetchConnection extends BasePackConnection
public BasePackFetchConnection(final PackTransport packTransport) {
super(packTransport);

final FetchConfig cfg = local.getConfig().get(FetchConfig.KEY);
if (local != null) {
final FetchConfig cfg = local.getConfig().get(FetchConfig.KEY);
allowOfsDelta = cfg.allowOfsDelta;
} else {
allowOfsDelta = true;
}
includeTags = transport.getTagOpt() != TagOpt.NO_TAGS;
thinPack = transport.isFetchThin();
allowOfsDelta = cfg.allowOfsDelta;

walk = new RevWalk(local);
reachableCommits = new RevCommitList<RevCommit>();
REACHABLE = walk.newFlag("REACHABLE"); //$NON-NLS-1$
COMMON = walk.newFlag("COMMON"); //$NON-NLS-1$
STATE = walk.newFlag("STATE"); //$NON-NLS-1$
ADVERTISED = walk.newFlag("ADVERTISED"); //$NON-NLS-1$

walk.carry(COMMON);
walk.carry(REACHABLE);
walk.carry(ADVERTISED);

if (local != null) {
walk = new RevWalk(local);
reachableCommits = new RevCommitList<RevCommit>();
REACHABLE = walk.newFlag("REACHABLE"); //$NON-NLS-1$
COMMON = walk.newFlag("COMMON"); //$NON-NLS-1$
STATE = walk.newFlag("STATE"); //$NON-NLS-1$
ADVERTISED = walk.newFlag("ADVERTISED"); //$NON-NLS-1$

walk.carry(COMMON);
walk.carry(REACHABLE);
walk.carry(ADVERTISED);
} else {
walk = null;
REACHABLE = null;
COMMON = null;
STATE = null;
ADVERTISED = null;
}
}

private static class FetchConfig {
@@ -357,7 +369,8 @@ public abstract class BasePackFetchConnection extends BasePackConnection

@Override
public void close() {
walk.release();
if (walk != null)
walk.release();
super.close();
}


+ 6
- 0
org.eclipse.jgit/src/org/eclipse/jgit/transport/Transport.java View File

@@ -559,6 +559,9 @@ public abstract class Transport {

/**
* Open a new transport with no local repository.
* <p>
* Note that the resulting transport instance can not be used for fetching
* or pushing, but only for reading remote refs.
*
* @param uri
* @return new Transport instance
@@ -1238,6 +1241,9 @@ public abstract class Transport {

/**
* Begins a new connection for fetching from the remote repository.
* <p>
* If the transport has no local repository, the fetch connection can only
* be used for reading remote refs.
*
* @return a fresh connection to fetch from the remote repository.
* @throws NotSupportedException

Loading…
Cancel
Save