RefUpdate: Protect against null ObjectId in ReceiveCommand RefUpdate's onRefOperation method is invoked by RefOperationValidators for every registered RefOperationValidationListener. If one of those listeners passes a RefReceivedEvent that contains an instance of ReceiveCommand that was initialized with null old or new ObjectId, this results in a NullPointerException when the ObjectId is dereferenced to get the name. Protect against such misbehaving validators by translating any null instance to ObjectId.zeroId(). Change-Id: Ib9399c2351af20b23f8c4481c7b067f3a4dcb688
diff --git a/src/main/java/com/googlesource/gerrit/plugins/hooks/RefUpdate.java b/src/main/java/com/googlesource/gerrit/plugins/hooks/RefUpdate.java index 6189277..d9b38e4 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/hooks/RefUpdate.java +++ b/src/main/java/com/googlesource/gerrit/plugins/hooks/RefUpdate.java
@@ -15,6 +15,7 @@ package com.googlesource.gerrit.plugins.hooks; import com.google.common.collect.ImmutableList; +import com.google.gerrit.common.Nullable; import com.google.gerrit.server.events.RefReceivedEvent; import com.google.gerrit.server.git.validators.RefOperationValidationListener; import com.google.gerrit.server.git.validators.ValidationMessage; @@ -22,6 +23,7 @@ import com.google.inject.Inject; import java.util.Collections; import java.util.List; +import org.eclipse.jgit.lib.ObjectId; public class RefUpdate implements RefOperationValidationListener { private final SynchronousHook hook; @@ -33,6 +35,10 @@ this.hookFactory = hookFactory; } + private ObjectId getObjectId(@Nullable ObjectId object) { + return object == null ? ObjectId.zeroId() : object; + } + @Override public List<ValidationMessage> onRefOperation(RefReceivedEvent refEvent) throws ValidationException { @@ -41,8 +47,8 @@ HookArgs args = hookFactory.createArgs(); args.add("--project", projectName); args.add("--uploader", refEvent.user.getNameEmail()); - args.add("--oldrev", refEvent.command.getOldId().getName()); - args.add("--newrev", refEvent.command.getNewId().getName()); + args.add("--oldrev", getObjectId(refEvent.command.getOldId()).getName()); + args.add("--newrev", getObjectId(refEvent.command.getNewId()).getName()); args.add("--refname", refEvent.command.getRefName()); HookResult result = hook.run(projectName, args);