From 801a44a2079d19479ddaed087dfe4a982ae955a3 Mon Sep 17 00:00:00 2001 From: Stefan Bodewig Date: Fri, 9 Feb 2018 18:36:20 +0100 Subject: [PATCH 1/3] add some documentation hints see https://bz.apache.org/bugzilla/show_bug.cgi?id=62076 --- src/main/org/apache/tools/ant/util/ChainedMapper.java | 3 +++ src/main/org/apache/tools/ant/util/FileNameMapper.java | 4 +++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/org/apache/tools/ant/util/ChainedMapper.java b/src/main/org/apache/tools/ant/util/ChainedMapper.java index 635a05387..6e07aa6c9 100644 --- a/src/main/org/apache/tools/ant/util/ChainedMapper.java +++ b/src/main/org/apache/tools/ant/util/ChainedMapper.java @@ -35,6 +35,9 @@ public class ChainedMapper extends ContainerMapper { public String[] mapFileName(String sourceFileName) { List inputs = new ArrayList(); List results = new ArrayList(); + // we do this even if the sourceFileName is null. Some + // resources have a null name and users may use a mapper like + // MergeMapper to provide a name for it. results.add(sourceFileName); FileNameMapper mapper = null; diff --git a/src/main/org/apache/tools/ant/util/FileNameMapper.java b/src/main/org/apache/tools/ant/util/FileNameMapper.java index bbd826141..ec85f9d5d 100644 --- a/src/main/org/apache/tools/ant/util/FileNameMapper.java +++ b/src/main/org/apache/tools/ant/util/FileNameMapper.java @@ -52,7 +52,9 @@ public interface FileNameMapper { * omit the source file in question.

* * @param sourceFileName the name of the source file relative to - * some given basedirectory. + * some given basedirectory. Might be {@code + * null} for resources that don't provide a + * name. * @return an array of strings if the rule applies to the source file, or * null if it does not. */ From a3246562ff3ac48ef32d75df688bc04e22bc7dd7 Mon Sep 17 00:00:00 2001 From: Stefan Bodewig Date: Fri, 9 Feb 2018 18:37:58 +0100 Subject: [PATCH 2/3] ensure FileNameMapper implementations deal with null source names https://bz.apache.org/bugzilla/show_bug.cgi?id=62076 --- src/main/org/apache/tools/ant/types/mappers/CutDirsMapper.java | 3 +++ src/main/org/apache/tools/ant/types/mappers/FilterMapper.java | 3 +++ src/main/org/apache/tools/ant/util/FlatFileNameMapper.java | 3 ++- src/main/org/apache/tools/ant/util/GlobPatternMapper.java | 3 +++ src/main/org/apache/tools/ant/util/RegexpPatternMapper.java | 3 +++ 5 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/main/org/apache/tools/ant/types/mappers/CutDirsMapper.java b/src/main/org/apache/tools/ant/types/mappers/CutDirsMapper.java index ce8f39c13..932f3ec13 100644 --- a/src/main/org/apache/tools/ant/types/mappers/CutDirsMapper.java +++ b/src/main/org/apache/tools/ant/types/mappers/CutDirsMapper.java @@ -63,6 +63,9 @@ public class CutDirsMapper implements FileNameMapper { throw new BuildException("dirs must be set to a positive number"); } final char fileSep = File.separatorChar; + if (sourceFileName == null) { + return null; + } final String fileSepCorrected = sourceFileName.replace('/', fileSep).replace('\\', fileSep); int nthMatch = fileSepCorrected.indexOf(fileSep); diff --git a/src/main/org/apache/tools/ant/types/mappers/FilterMapper.java b/src/main/org/apache/tools/ant/types/mappers/FilterMapper.java index 501da5000..9ef922e5f 100644 --- a/src/main/org/apache/tools/ant/types/mappers/FilterMapper.java +++ b/src/main/org/apache/tools/ant/types/mappers/FilterMapper.java @@ -63,6 +63,9 @@ public class FilterMapper extends FilterChain implements FileNameMapper { * the filterchain returns an empty string. */ public String[] mapFileName(String sourceFileName) { + if (sourceFileName == null) { + return null; + } try { Reader stringReader = new StringReader(sourceFileName); ChainReaderHelper helper = new ChainReaderHelper(); diff --git a/src/main/org/apache/tools/ant/util/FlatFileNameMapper.java b/src/main/org/apache/tools/ant/util/FlatFileNameMapper.java index 420ccc6c9..04d58bed5 100644 --- a/src/main/org/apache/tools/ant/util/FlatFileNameMapper.java +++ b/src/main/org/apache/tools/ant/util/FlatFileNameMapper.java @@ -49,6 +49,7 @@ public class FlatFileNameMapper implements FileNameMapper { * @return the file name in a one-element array. */ public String[] mapFileName(String sourceFileName) { - return new String[] {new java.io.File(sourceFileName).getName()}; + return sourceFileName == null ? null + : new String[] {new java.io.File(sourceFileName).getName()}; } } diff --git a/src/main/org/apache/tools/ant/util/GlobPatternMapper.java b/src/main/org/apache/tools/ant/util/GlobPatternMapper.java index ebba54ea2..a0f0ca987 100644 --- a/src/main/org/apache/tools/ant/util/GlobPatternMapper.java +++ b/src/main/org/apache/tools/ant/util/GlobPatternMapper.java @@ -154,6 +154,9 @@ public class GlobPatternMapper implements FileNameMapper { * @return a list of converted filenames */ public String[] mapFileName(String sourceFileName) { + if (sourceFileName == null) { + return null; + } String modName = modifyName(sourceFileName); if (fromPrefix == null || (sourceFileName.length() < (prefixLength + postfixLength)) diff --git a/src/main/org/apache/tools/ant/util/RegexpPatternMapper.java b/src/main/org/apache/tools/ant/util/RegexpPatternMapper.java index fa620d9ad..6a2f4b5c7 100644 --- a/src/main/org/apache/tools/ant/util/RegexpPatternMapper.java +++ b/src/main/org/apache/tools/ant/util/RegexpPatternMapper.java @@ -114,6 +114,9 @@ public class RegexpPatternMapper implements FileNameMapper { * null if the to pattern did not match */ public String[] mapFileName(String sourceFileName) { + if (sourceFileName == null) { + return null; + } if (handleDirSep) { if (sourceFileName.indexOf("\\") != -1) { sourceFileName = sourceFileName.replace('\\', '/'); From 21b870006b985713b76723e73a64607a0d7d63fe Mon Sep 17 00:00:00 2001 From: Stefan Bodewig Date: Fri, 9 Feb 2018 18:39:08 +0100 Subject: [PATCH 3/3] properly check return value of mapFileName https://bz.apache.org/bugzilla/show_bug.cgi?id=62076 --- src/main/org/apache/tools/ant/taskdefs/Copy.java | 5 ++++- src/main/org/apache/tools/ant/taskdefs/CopyPath.java | 3 +++ src/main/org/apache/tools/ant/taskdefs/Rmic.java | 3 +++ .../org/apache/tools/ant/taskdefs/optional/Native2Ascii.java | 5 ++++- 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/main/org/apache/tools/ant/taskdefs/Copy.java b/src/main/org/apache/tools/ant/taskdefs/Copy.java index 42f7cb76f..fab73796a 100644 --- a/src/main/org/apache/tools/ant/taskdefs/Copy.java +++ b/src/main/org/apache/tools/ant/taskdefs/Copy.java @@ -788,6 +788,9 @@ public class Copy extends Task { for (int i = 0; i < toCopy.length; i++) { final File src = new File(fromDir, toCopy[i]); final String[] mappedFiles = mapper.mapFileName(toCopy[i]); + if (mappedFiles == null || mappedFiles.length == 0) { + continue; + } if (!enableMultipleMappings) { map.put(src.getAbsolutePath(), @@ -836,7 +839,7 @@ public class Copy extends Task { } for (int i = 0; i < toCopy.length; i++) { final String[] mappedFiles = mapper.mapFileName(toCopy[i].getName()); - if (mappedFiles == null) { + if (mappedFiles == null || mappedFiles.length == 0) { throw new BuildException("Can't copy a resource without a" + " name if the mapper doesn't" + " provide one."); diff --git a/src/main/org/apache/tools/ant/taskdefs/CopyPath.java b/src/main/org/apache/tools/ant/taskdefs/CopyPath.java index 53596fd98..bad9e5d93 100644 --- a/src/main/org/apache/tools/ant/taskdefs/CopyPath.java +++ b/src/main/org/apache/tools/ant/taskdefs/CopyPath.java @@ -182,6 +182,9 @@ public class CopyPath extends Task { String sourceFileName = sourceFiles[sources]; File sourceFile = new File(sourceFileName); String[] toFiles = (String[]) mapper.mapFileName(sourceFileName); + if (toFiles == null) { + continue; + } for (int i = 0; i < toFiles.length; i++) { String destFileName = toFiles[i]; diff --git a/src/main/org/apache/tools/ant/taskdefs/Rmic.java b/src/main/org/apache/tools/ant/taskdefs/Rmic.java index d72c39e68..0a54b3efe 100644 --- a/src/main/org/apache/tools/ant/taskdefs/Rmic.java +++ b/src/main/org/apache/tools/ant/taskdefs/Rmic.java @@ -709,6 +709,9 @@ public class Rmic extends MatchingTask { String classFileName = classname.replace('.', File.separatorChar) + ".class"; String[] generatedFiles = adapter.getMapper().mapFileName(classFileName); + if (generatedFiles == null) { + return; + } for (int i = 0; i < generatedFiles.length; i++) { final String generatedFile = generatedFiles[i]; diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/Native2Ascii.java b/src/main/org/apache/tools/ant/taskdefs/optional/Native2Ascii.java index 664e574f0..1474ccecc 100644 --- a/src/main/org/apache/tools/ant/taskdefs/optional/Native2Ascii.java +++ b/src/main/org/apache/tools/ant/taskdefs/optional/Native2Ascii.java @@ -255,7 +255,10 @@ public class Native2Ascii extends MatchingTask { + (count != 1 ? "s" : "") + " from "; log(message + srcDir + " to " + destDir); for (int i = 0; i < files.length; i++) { - convert(files[i], m.mapFileName(files[i])[0]); + String[] dest = m.mapFileName(files[i]); + if (dest != null && dest.length > 0) { + convert(files[i], dest[0]); + } } }