提交 688eb6ab 编写于 作者: J Jesse Glick

[FIXED JENKINS-14922] TarArchiver.visitSymlink can throw undeclared PosixException.

上级 f4c65633
......@@ -55,6 +55,9 @@ Upcoming changes</a>
<!-- Record your changes in the trunk here. -->
<div id="trunk" style="display:none"><!--=TRUNK-BEGIN=-->
<ul class=image>
<li class=bug>
<code>TarArchiver.visitSymlink</code> can throw undeclared <code>PosixException</code>.
(<a href="https://issues.jenkins-ci.org/browse/JENKINS-14922">issue 14922</a>)
<li class=>
</ul>
</div><!--=TRUNK-END=-->
......
......@@ -2,6 +2,7 @@ package hudson.util;
import hudson.Functions;
import hudson.os.PosixAPI;
import hudson.os.PosixException;
import java.io.*;
import java.util.regex.Pattern;
......@@ -115,9 +116,11 @@ public class IOUtils extends org.apache.commons.io.IOUtils {
/**
* Gets the mode of a file/directory, if appropriate. Returns -1 if not on Unix.
* Gets the mode of a file/directory, if appropriate.
* @return a file mode, or -1 if not on Unix
* @throws PosixException if the file could not be statted, e.g. broken symlink
*/
public static int mode(File f) {
public static int mode(File f) throws PosixException {
if(Functions.isWindows()) return -1;
return PosixAPI.get().stat(f.getPath()).mode();
}
......
......@@ -26,6 +26,7 @@ package hudson.util.io;
import hudson.Functions;
import hudson.org.apache.tools.tar.TarOutputStream;
import hudson.os.PosixException;
import hudson.util.FileVisitor;
import hudson.util.IOException2;
import hudson.util.IOUtils;
......@@ -65,8 +66,14 @@ final class TarArchiver extends Archiver {
@Override
public void visitSymlink(File link, String target, String relativePath) throws IOException {
TarEntry e = new TarEntry(relativePath, LF_SYMLINK);
int mode = IOUtils.mode(link);
if (mode!=-1) e.setMode(mode);
try {
int mode = IOUtils.mode(link);
if (mode != -1) {
e.setMode(mode);
}
} catch (PosixException x) {
// ignore
}
try {
StringBuffer linkName = (StringBuffer) LINKNAME_FIELD.get(e);
......
......@@ -26,6 +26,9 @@ package hudson.util.io;
import hudson.FilePath;
import hudson.Functions;
import hudson.Launcher.LocalLauncher;
import hudson.Util;
import hudson.model.TaskListener;
import hudson.util.NullStream;
import hudson.util.StreamTaskListener;
import java.io.File;
import java.io.FileOutputStream;
......@@ -34,10 +37,8 @@ import static org.junit.Assume.*;
import org.junit.Test;
import org.jvnet.hudson.test.Bug;
/**
* @author Kohsuke Kawaguchi
*/
public class TarArchiverTest {
/**
* Makes sure that permissions are properly stored in the tar file.
*/
......@@ -92,4 +93,13 @@ public class TarArchiverTest {
dir.deleteRecursive();
}
}
@Bug(14922)
@Test public void brokenSymlinks() throws Exception {
assumeTrue(!Functions.isWindows());
File dir = Util.createTempDir();
Util.createSymlink(dir, "nonexistent", "link", TaskListener.NULL);
new FilePath(dir).tar(new NullStream(), "**");
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册