bz-64912, bz-64790 Fix regression in javac task when using arguments file
diff --git a/CONTRIBUTORS b/CONTRIBUTORS
index 5b9639b..9d06fb7 100644
--- a/CONTRIBUTORS
+++ b/CONTRIBUTORS
@@ -427,6 +427,7 @@
 Tim Whittington
 Timoteo Ohara
 Timothy Gerard Endres
+TJ Rothwell
 Tom Ball
 Tom Brus
 Tom Cunningham
diff --git a/WHATSNEW b/WHATSNEW
index 4b01a53..bc08e16 100644
--- a/WHATSNEW
+++ b/WHATSNEW
@@ -7,6 +7,10 @@
  * SCP (with sftp=true) task would fail if fetching file located in root directory
    Bugzilla Report 64742
 
+ * javac task would fail if the arguments file it (internally) created didn't quote
+   the # character. This has now been fixed.
+   Bugzilla Reports 64912, 64790
+
 Other changes:
 --------------
 
diff --git a/contributors.xml b/contributors.xml
index bbdb03c..a2969b5 100644
--- a/contributors.xml
+++ b/contributors.xml
@@ -1761,6 +1761,10 @@
     <last>Endres</last>
   </name>
   <name>
+    <first>TJ</first>
+    <last>Rothwell</last>
+  </name>
+  <name>
     <first>Tom</first>
     <last>Ball</last>
   </name>
diff --git a/src/main/org/apache/tools/ant/taskdefs/compilers/DefaultCompilerAdapter.java b/src/main/org/apache/tools/ant/taskdefs/compilers/DefaultCompilerAdapter.java
index 7b37a58..b5227f5 100644
--- a/src/main/org/apache/tools/ant/taskdefs/compilers/DefaultCompilerAdapter.java
+++ b/src/main/org/apache/tools/ant/taskdefs/compilers/DefaultCompilerAdapter.java
@@ -23,6 +23,7 @@
 import java.io.FileWriter;
 import java.io.IOException;
 import java.util.Optional;
+import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -67,6 +68,8 @@
     protected static final String lSep = StringUtils.LINE_SEP;
     // CheckStyle:ConstantNameCheck ON
 
+    private static final Pattern JAVAC_ARG_FILE_CHARS_TO_QUOTE = Pattern.compile("[ #]"); // space or # character
+
     protected Path src;
     protected File destDir;
     protected String encoding;
@@ -549,7 +552,7 @@
                     try (BufferedWriter out =
                         new BufferedWriter(new FileWriter(tmpFile))) {
                         for (int i = firstFileName; i < args.length; i++) {
-                            if (quoteFiles && args[i].contains(" ")) {
+                            if (quoteFiles && JAVAC_ARG_FILE_CHARS_TO_QUOTE.matcher(args[i]).find()) {
                                 args[i] =
                                     args[i].replace(File.separatorChar, '/');
                                 out.write("\"" + args[i] + "\"");
diff --git a/src/tests/antunit/taskdefs/javac-test.xml b/src/tests/antunit/taskdefs/javac-test.xml
index cdd8382..ab5e3eb 100644
--- a/src/tests/antunit/taskdefs/javac-test.xml
+++ b/src/tests/antunit/taskdefs/javac-test.xml
@@ -193,6 +193,26 @@
     <au:assertLogContains text="adapter called" />
   </target>
 
+  <target name="testSpaceCharInArgs" depends="setup" description="https://bz.apache.org/bugzilla/show_bug.cgi?id=64912">
+    <delete dir="${javac-dir}/src" />
+    <mkdir dir="${javac-dir}/src" />
+    <echo file="${javac-dir}/src/Foo.java">
+      public class Foo { }
+    </echo>
+    <mkdir dir="${output}/foo with space bar" />
+    <javac srcdir="${javac-dir}/src" destdir="${output}/foo with space bar" fork="yes" failOnError="true"/>
+  </target>
+
+  <target name="test#CharInArgs" depends="setup" description="https://bz.apache.org/bugzilla/show_bug.cgi?id=64912">
+    <delete dir="${javac-dir}/src" />
+    <mkdir dir="${javac-dir}/src" />
+    <echo file="${javac-dir}/src/Foo.java">
+      public class Foo { }
+    </echo>
+    <mkdir dir="${output}/foo#bar" />
+    <javac srcdir="${javac-dir}/src" destdir="${output}/foo#bar" fork="yes" failOnError="true"/>
+  </target>
+
   <target name="testCompilerAsNestedElement" depends="-create-javac-adapter">
     <componentdef classname="org.example.Adapter" name="myjavac">
       <classpath location="${resources}" />