diff --git a/core/src/main/java/hudson/FilePath.java b/core/src/main/java/hudson/FilePath.java index e2a4b30b8c..4e1d44c331 100644 --- a/core/src/main/java/hudson/FilePath.java +++ b/core/src/main/java/hudson/FilePath.java @@ -130,6 +130,7 @@ import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipFile; import org.jenkinsci.remoting.RoleChecker; import org.jenkinsci.remoting.RoleSensitive; +import org.jenkinsci.remoting.SerializableOnlyOverRemoting; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; import org.kohsuke.stapler.Function; @@ -207,7 +208,7 @@ import org.apache.tools.ant.BuildException; * @author Kohsuke Kawaguchi * @see VirtualFile */ -public final class FilePath implements Serializable { +public final class FilePath implements SerializableOnlyOverRemoting { /** * Maximum http redirects we will follow. This defaults to the same number as Firefox/Chrome tolerates. */ @@ -2985,18 +2986,17 @@ public final class FilePath implements Serializable { } private void writeObject(ObjectOutputStream oos) throws IOException { - Channel target = Channel.current(); - - if(channel!=null && channel!=target) - throw new IllegalStateException("Can't send a remote FilePath to a different remote channel"); + Channel target = getChannelForSerialization(); + if (channel != null && channel != target) { + throw new IllegalStateException("Can't send a remote FilePath to a different remote channel (current=" + channel + ", target=" + target + ")"); + } oos.defaultWriteObject(); oos.writeBoolean(channel==null); } private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException { - Channel channel = Channel.current(); - assert channel!=null; + Channel channel = getChannelForSerialization(); ois.defaultReadObject(); if(ois.readBoolean()) { diff --git a/core/src/main/java/hudson/util/ProcessTree.java b/core/src/main/java/hudson/util/ProcessTree.java index a0c2c6fc48..4e2a4b3c14 100644 --- a/core/src/main/java/hudson/util/ProcessTree.java +++ b/core/src/main/java/hudson/util/ProcessTree.java @@ -40,6 +40,7 @@ import hudson.util.ProcessTree.OSProcess; import hudson.util.ProcessTreeRemoting.IOSProcess; import hudson.util.ProcessTreeRemoting.IProcessTree; import jenkins.security.SlaveToMasterCallable; +import org.jenkinsci.remoting.SerializableOnlyOverRemoting; import jenkins.util.java.JavaUtils; import org.jvnet.winp.WinProcess; import org.jvnet.winp.WinpException; @@ -54,6 +55,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.RandomAccessFile; import java.io.Serializable; +import java.io.ObjectStreamException; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -95,7 +97,7 @@ import javax.annotation.Nonnull; * @author Kohsuke Kawaguchi * @since 1.315 */ -public abstract class ProcessTree implements Iterable, IProcessTree, Serializable { +public abstract class ProcessTree implements Iterable, IProcessTree, SerializableOnlyOverRemoting { /** * To be filled in the constructor of the derived type. */ @@ -1828,7 +1830,7 @@ public abstract class ProcessTree implements Iterable, IProcessTree, /** * Represents a process tree over a channel. */ - public static class Remote extends ProcessTree implements Serializable { + public static class Remote extends ProcessTree { private final IProcessTree proxy; @Deprecated @@ -1908,8 +1910,8 @@ public abstract class ProcessTree implements Iterable, IProcessTree, /** * Use {@link Remote} as the serialized form. */ - /*package*/ Object writeReplace() { - return new Remote(this,Channel.current()); + /*package*/ Object writeReplace() throws ObjectStreamException { + return new Remote(this, getChannelForSerialization()); } // public static void main(String[] args) { diff --git a/core/src/main/java/hudson/util/StreamTaskListener.java b/core/src/main/java/hudson/util/StreamTaskListener.java index 931a0b99bb..ac2ed2550c 100644 --- a/core/src/main/java/hudson/util/StreamTaskListener.java +++ b/core/src/main/java/hudson/util/StreamTaskListener.java @@ -43,6 +43,7 @@ import java.nio.file.StandardOpenOption; import java.util.logging.Level; import java.util.logging.Logger; import jenkins.util.SystemProperties; +import org.jenkinsci.remoting.SerializableOnlyOverRemoting; import org.kohsuke.stapler.framework.io.WriterOutputStream; import javax.annotation.CheckForNull; @@ -59,7 +60,7 @@ import javax.annotation.Nonnull; * * @author Kohsuke Kawaguchi */ -public class StreamTaskListener extends AbstractTaskListener implements TaskListener, Closeable { +public class StreamTaskListener extends AbstractTaskListener implements TaskListener, SerializableOnlyOverRemoting, Closeable { @Nonnull private PrintStream out; @CheckForNull