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]);
+ }
}
}