* stable-5.1: BasePackConnection: Check for expected length of ref advertisement TransferConfig: Make constructors public Change-Id: I2480a0455250ee381fae93cac2db30f8305fa6aa Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>tags/v5.2.1.201812262042-r
@@ -390,6 +390,7 @@ invalidPathPeriodAtEndWindows=Invalid path (period at end is ignored by Windows) | |||
invalidPathSpaceAtEndWindows=Invalid path (space at end is ignored by Windows): {0} | |||
invalidPathReservedOnWindows=Invalid path (''{0}'' is reserved on Windows): {1} | |||
invalidRedirectLocation=Invalid redirect location {0} -> {1} | |||
invalidRefAdvertisementLine=Invalid ref advertisement line: ''{1}'' | |||
invalidReflogRevision=Invalid reflog revision: {0} | |||
invalidRefName=Invalid ref name: {0} | |||
invalidReftableBlock=Invalid reftable block |
@@ -451,6 +451,7 @@ public class JGitText extends TranslationBundle { | |||
/***/ public String invalidPathSpaceAtEndWindows; | |||
/***/ public String invalidPathReservedOnWindows; | |||
/***/ public String invalidRedirectLocation; | |||
/***/ public String invalidRefAdvertisementLine; | |||
/***/ public String invalidReflogRevision; | |||
/***/ public String invalidRefName; | |||
/***/ public String invalidReftableBlock; |
@@ -57,6 +57,7 @@ import java.util.HashSet; | |||
import java.util.LinkedHashMap; | |||
import java.util.Set; | |||
import org.eclipse.jgit.errors.InvalidObjectIdException; | |||
import org.eclipse.jgit.errors.NoRemoteRepositoryException; | |||
import org.eclipse.jgit.errors.PackProtocolException; | |||
import org.eclipse.jgit.errors.RemoteRepositoryException; | |||
@@ -222,6 +223,10 @@ abstract class BasePackConnection extends BaseConnection { | |||
} | |||
} | |||
// Expecting to get a line in the form "sha1 refname" | |||
if (line.length() < 41 || line.charAt(40) != ' ') { | |||
throw invalidRefAdvertisementLine(line); | |||
} | |||
String name = line.substring(41, line.length()); | |||
if (avail.isEmpty() && name.equals("capabilities^{}")) { //$NON-NLS-1$ | |||
// special line from git-receive-pack to show | |||
@@ -229,7 +234,12 @@ abstract class BasePackConnection extends BaseConnection { | |||
continue; | |||
} | |||
final ObjectId id = ObjectId.fromString(line.substring(0, 40)); | |||
final ObjectId id; | |||
try { | |||
id = ObjectId.fromString(line.substring(0, 40)); | |||
} catch (InvalidObjectIdException e) { | |||
throw invalidRefAdvertisementLine(line); | |||
} | |||
if (name.equals(".have")) { //$NON-NLS-1$ | |||
additionalHaves.add(id); | |||
} else if (name.endsWith("^{}")) { //$NON-NLS-1$ | |||
@@ -318,6 +328,10 @@ abstract class BasePackConnection extends BaseConnection { | |||
return new PackProtocolException(uri, MessageFormat.format(JGitText.get().duplicateAdvertisementsOf, name)); | |||
} | |||
private PackProtocolException invalidRefAdvertisementLine(String line) { | |||
return new PackProtocolException(uri, MessageFormat.format(JGitText.get().invalidRefAdvertisementLine, line)); | |||
} | |||
/** {@inheritDoc} */ | |||
@Override | |||
public void close() { |
@@ -134,12 +134,31 @@ public class TransferConfig { | |||
final @Nullable ProtocolVersion protocolVersion; | |||
final String[] hideRefs; | |||
TransferConfig(Repository db) { | |||
/** | |||
* Create a configuration honoring the repository's settings. | |||
* | |||
* @param db | |||
* the repository to read settings from. The repository is not | |||
* retained by the new configuration, instead its settings are | |||
* copied during the constructor. | |||
* @since 5.1.4 | |||
*/ | |||
public TransferConfig(Repository db) { | |||
this(db.getConfig()); | |||
} | |||
/** | |||
* Create a configuration honoring settings in a | |||
* {@link org.eclipse.jgit.lib.Config}. | |||
* | |||
* @param rc | |||
* the source to read settings from. The source is not retained | |||
* by the new configuration, instead its settings are copied | |||
* during the constructor. | |||
* @since 5.1.4 | |||
*/ | |||
@SuppressWarnings("nls") | |||
TransferConfig(Config rc) { | |||
public TransferConfig(Config rc) { | |||
boolean fsck = rc.getBoolean("transfer", "fsckobjects", false); | |||
fetchFsck = rc.getBoolean("fetch", "fsckobjects", fsck); | |||
receiveFsck = rc.getBoolean("receive", "fsckobjects", fsck); |