svn commit: r1921178 - in /subversion/site/publish: doap.rdf docs/release-notes/release-history.html download.html index.html news.html security/CVE-2024-45720-advisory.txt security/CVE-2024-45720-advisory.txt.asc security/index.html

[email protected]
Newsgroups gmane.comp.version-control.subversion.svn
Message-ID <[email protected]>
Author: stsp
Date: Tue Oct  8 08:47:28 2024
New Revision: 1921178

URL: http://svn.apache.org/viewvc?rev=1921178&view=rev
Log:
Announce Subversion 1.14.4 release on the web site

Added:
    subversion/site/publish/security/CVE-2024-45720-advisory.txt
    subversion/site/publish/security/CVE-2024-45720-advisory.txt.asc   (with props)
Modified:
    subversion/site/publish/doap.rdf
    subversion/site/publish/docs/release-notes/release-history.html
    subversion/site/publish/download.html
    subversion/site/publish/index.html
    subversion/site/publish/news.html
    subversion/site/publish/security/index.html

Modified: subversion/site/publish/doap.rdf
URL: http://svn.apache.org/viewvc/subversion/site/publish/doap.rdf?rev=1921178&r1=1921177&r2=1921178&view=diff
==============================================================================
--- subversion/site/publish/doap.rdf (original)
+++ subversion/site/publish/doap.rdf Tue Oct  8 08:47:28 2024
@@ -37,8 +37,8 @@
     <release>
       <Version>
         <name>Current 1.14 LTS release</name>
-        <created>2022-12-28</created>
-        <revision>1.14.3</revision>
+        <created>2024-10-08</created>
+        <revision>1.14.4</revision>
       </Version>
     </release>
     <repository>

Modified: subversion/site/publish/docs/release-notes/release-history.html
URL: http://svn.apache.org/viewvc/subversion/site/publish/docs/release-notes/release-history.html?rev=1921178&r1=1921177&r2=1921178&view=diff
==============================================================================
--- subversion/site/publish/docs/release-notes/release-history.html (original)
+++ subversion/site/publish/docs/release-notes/release-history.html Tue Oct  8 08:47:28 2024
@@ -32,6 +32,9 @@ Subversion 2.0.</p>
 
 <ul>
   <li>
+    <b>Subversion 1.14.4</b> (Tuesday, 8 October 2024): Bugfix/security release.
+  </li>
+  <li>
     <b>Subversion 1.14.3</b> (Thursday, 28 December 2023): Bugfix release.
   </li>
   <li>

Modified: subversion/site/publish/download.html
URL: http://svn.apache.org/viewvc/subversion/site/publish/download.html?rev=1921178&r1=1921177&r2=1921178&view=diff
==============================================================================
--- subversion/site/publish/download.html (original)
+++ subversion/site/publish/download.html Tue Oct  8 08:47:28 2024
@@ -95,7 +95,7 @@ Other mirrors:
     title="Link to this section">&para;</a>
 </h3>
 
-<p style="font-size: 150%; text-align: center;">Apache Subversion 1.14.3 LTS</p>
+<p style="font-size: 150%; text-align: center;">Apache Subversion 1.14.4 LTS</p>
 <table class="centered">
 <tr>
   <th>File</th>
@@ -104,20 +104,20 @@ Other mirrors:
   <th>PGP Public Keys</th>
 </tr>
 <tr>
-  <td><a href="[preferred]subversion/subversion-1.14.3.tar.bz2">subversion-1.14.3.tar.bz2</a></td>
-  <td>[<a href="https://www.apache.org/dist/subversion/subversion-1.14.3.tar.bz2.sha512">SHA-512</a>]</td>
-  <td>[<a href="https://www.apache.org/dist/subversion/subversion-1.14.3.tar.bz2.asc">PGP signatures</a>]</td>
-  <td>[<a href="https://www.apache.org/dist/subversion/subversion-1.14.3.KEYS">PGP keyring</a>]</td>
+  <td><a href="[preferred]subversion/subversion-1.14.4.tar.bz2">subversion-1.14.4.tar.bz2</a></td>
+  <td>[<a href="https://www.apache.org/dist/subversion/subversion-1.14.4.tar.bz2.sha512">SHA-512</a>]</td>
+  <td>[<a href="https://www.apache.org/dist/subversion/subversion-1.14.4.tar.bz2.asc">PGP signatures</a>]</td>
+  <td>[<a href="https://www.apache.org/dist/subversion/subversion-1.14.4.KEYS">PGP keyring</a>]</td>
 </tr><tr>
-  <td><a href="[preferred]subversion/subversion-1.14.3.tar.gz">subversion-1.14.3.tar.gz</a></td>
-  <td>[<a href="https://www.apache.org/dist/subversion/subversion-1.14.3.tar.gz.sha512">SHA-512</a>]</td>
-  <td>[<a href="https://www.apache.org/dist/subversion/subversion-1.14.3.tar.gz.asc">PGP signatures</a>]</td>
-  <td>[<a href="https://www.apache.org/dist/subversion/subversion-1.14.3.KEYS">PGP keyring</a>]</td>
+  <td><a href="[preferred]subversion/subversion-1.14.4.tar.gz">subversion-1.14.4.tar.gz</a></td>
+  <td>[<a href="https://www.apache.org/dist/subversion/subversion-1.14.4.tar.gz.sha512">SHA-512</a>]</td>
+  <td>[<a href="https://www.apache.org/dist/subversion/subversion-1.14.4.tar.gz.asc">PGP signatures</a>]</td>
+  <td>[<a href="https://www.apache.org/dist/subversion/subversion-1.14.4.KEYS">PGP keyring</a>]</td>
 </tr><tr>
-  <td><a href="[preferred]subversion/subversion-1.14.3.zip">subversion-1.14.3.zip</a></td>
-  <td>[<a href="https://www.apache.org/dist/subversion/subversion-1.14.3.zip.sha512">SHA-512</a>]</td>
-  <td>[<a href="https://www.apache.org/dist/subversion/subversion-1.14.3.zip.asc">PGP signatures</a>]</td>
-  <td>[<a href="https://www.apache.org/dist/subversion/subversion-1.14.3.KEYS">PGP keyring</a>]</td>
+  <td><a href="[preferred]subversion/subversion-1.14.4.zip">subversion-1.14.4.zip</a></td>
+  <td>[<a href="https://www.apache.org/dist/subversion/subversion-1.14.4.zip.sha512">SHA-512</a>]</td>
+  <td>[<a href="https://www.apache.org/dist/subversion/subversion-1.14.4.zip.asc">PGP signatures</a>]</td>
+  <td>[<a href="https://www.apache.org/dist/subversion/subversion-1.14.4.KEYS">PGP keyring</a>]</td>
 </tr>
 </table>
 

Modified: subversion/site/publish/index.html
URL: http://svn.apache.org/viewvc/subversion/site/publish/index.html?rev=1921178&r1=1921177&r2=1921178&view=diff
==============================================================================
--- subversion/site/publish/index.html (original)
+++ subversion/site/publish/index.html Tue Oct  8 08:47:28 2024
@@ -70,6 +70,35 @@
 
 <!-- In general, we'll keep only the most recent 3 or 4 news items here. -->
 
+<div class="h3" id="news-20241008"> 
+<h3>2024-10-08 &mdash; Apache Subversion 1.14.4 Released
+ <a class="sectionlink" href="#news-20241008"
+ title="Link to this section">&para;</a> 
+</h3> 
+ 
+<p>We are pleased to announce the release of Apache Subversion 1.14.4.</p>
+<p>
+This release contains a fix for a security issue:
+ <a href="/security/CVE-2024-45720-advisory.txt">CVE-2024-45720</a>
+</p>
+<p>
+ This is the most complete Subversion release to date, and we encourage
+ users of Subversion to upgrade as soon as reasonable.
+ Please see the
+<!-- Initially the release announcement link is commented out
+until the release announcement has landed in the archives.
+Add the URL below and remove this comment start section...|
+ <a href=""
+ >release announcement</a> and the
+|... and this end comment -->
+ <a href="/docs/release-notes/1.14"
+ >release notes</a> for more information about this release.</p> 
+ 
+<p>To get this release from the nearest mirror, please visit our
+ <a href="/download.cgi#recommended-release">download page</a>.</p> 
+ 
+</div> <!-- #news-20241008 --> 
+
 <div class="h3" id="news-20231228-1.14.3"> 
 <h3>2023-12-28 &mdash; Apache Subversion 1.14.3 Released
  <a class="sectionlink" href="#news-20231228-1.14.3"
@@ -108,27 +137,6 @@ on 2022-04-12 and is available to anyone
 
 </div>  <!-- news-20230924 -->
 
-<div class="h3" id="news-20220412">
-<h3>2022-04-12 &mdash; Apache Subversion Security Advisory
-<a class="sectionlink" href="#news-20220412"
-   title="Link to this section">&para;</a>
-</h3>
-
-<p>The recent releases of Apache Subversion 1.14.2 and 1.10.8 contain
- fixes for two security issues:
- <a href="/security/CVE-2021-28544-advisory.txt">CVE-2021-28544</a> and
- <a href="/security/CVE-2022-24070-advisory.txt">CVE-2022-24070</a>.
- These issues affect Subversion 'mod_dav_svn' and 'svnserve' servers
- only. Subversion clients are not affected. We encourage server
- operators to upgrade to the latest appropriate version as soon as
- reasonable. Please see the <a href="https://lists.apache.org/list.html?announce-lmwclWVctOaVAsvtuwRBGM0vGNN6ct63@public.gmane.org:2022-04"
- >release announcements</a> for more information about the releases.</p>
-
-<p>To get the latest release from the nearest mirror, please visit our
- <a href="/download.cgi">download page</a>.</p>
-
-</div> <!-- #news-20220412 -->
-
 <p style="font-style: italic; text-align:
    right;">[Click <a href="/news.html">here</a> to see all News
    items.]</p>

Modified: subversion/site/publish/news.html
URL: http://svn.apache.org/viewvc/subversion/site/publish/news.html?rev=1921178&r1=1921177&r2=1921178&view=diff
==============================================================================
--- subversion/site/publish/news.html (original)
+++ subversion/site/publish/news.html Tue Oct  8 08:47:28 2024
@@ -26,6 +26,35 @@
 <!-- Maybe we could insert H2's to split up the news items by  -->
 <!-- calendar year if we felt the need to do so.               -->
 
+<div class="h3" id="news-20241008"> 
+<h3>2024-10-08 &mdash; Apache Subversion 1.14.4 Released
+ <a class="sectionlink" href="#news-20241008"
+ title="Link to this section">&para;</a> 
+</h3> 
+ 
+<p>We are pleased to announce the release of Apache Subversion 1.14.4.</p>
+<p>
+This release contains a fix for a security issue:
+ <a href="/security/CVE-2024-45720-advisory.txt">CVE-2024-45720</a>
+</p>
+<p>
+ This is the most complete Subversion release to date, and we encourage
+ users of Subversion to upgrade as soon as reasonable.
+ Please see the
+<!-- Initially the release announcement link is commented out
+until the release announcement has landed in the archives.
+Add the URL below and remove this comment start section...|
+ <a href=""
+ >release announcement</a> and the
+|... and this end comment -->
+ <a href="/docs/release-notes/1.14"
+ >release notes</a> for more information about this release.</p> 
+ 
+<p>To get this release from the nearest mirror, please visit our
+ <a href="/download.cgi#recommended-release">download page</a>.</p> 
+ 
+</div> <!-- #news-20241008 --> 
+
 <div class="h3" id="news-20231228-1.14.3"> 
 <h3>2023-12-28 &mdash; Apache Subversion 1.14.3 Released
  <a class="sectionlink" href="#news-20231228-1.14.3"

Added: subversion/site/publish/security/CVE-2024-45720-advisory.txt
URL: http://svn.apache.org/viewvc/subversion/site/publish/security/CVE-2024-45720-advisory.txt?rev=1921178&view=auto
==============================================================================
--- subversion/site/publish/security/CVE-2024-45720-advisory.txt (added)
+++ subversion/site/publish/security/CVE-2024-45720-advisory.txt Tue Oct  8 08:47:28 2024
@@ -0,0 +1,1653 @@
+  Subversion command line argument injection on Windows platforms
+
+Summary:
+========
+
+  On Windows platforms, a "best fit" character encoding conversion of
+  command line arguments to Subversion's executables (e.g., svn.exe,
+  etc.) may lead to unexpected command line argument interpretation,
+  including argument injection and execution of other programs, if a
+  specially crafted command line argument string is processed.
+
+  UNIX-like platforms are not affected.
+
+Known vulnerable:
+=================
+
+  Subversion up to 1.14.3 (inclusive).
+
+Known fixed:
+============
+
+  Subversion 1.14.4.
+
+Details:
+========
+
+  On Windows platforms, command line arguments are passed to a program
+  as a single string. It is up to the program to separate command line
+  arguments. In many cases, such as when a C-language program has a
+  main() function as its entry point, this command line argument
+  separation functionality is provided by a library and is more or
+  less transparent to the program's developer.
+
+  Furthermore, on Windows platforms, programs with a main() function
+  receive their command line arguments in an "ANSI" (MultiByte) string
+  by default, though the Windows system natively uses Unicode UTF-16
+  (WideChar). This may necessitate a character encoding conversion.
+  The use of certain Unicode characters on the command line may
+  trigger a "best fit" algorithm to perform the conversion.
+
+  An attacker who can run one of Subversion's executables (svn.exe,
+  etc.) with a specially crafted command line argument string could
+  take advantage of the character encoding conversion process to cause
+  unexpected command line argument interpretation, leading to argument
+  injection and execution of other programs.
+
+  Subversion is known to be affected on Windows 10 and 11; it may be
+  affected on most other versions of Windows as well.
+
+  This issue affects Subversion on Windows platforms only.
+
+  UNIX-like platforms are not affected.
+
+Severity:
+=========
+
+  CVSSv3.1 Base Score: 8.2 (High)
+  CVSSv3.1 Base Vector: CVSS:3.1/AV:L/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:H
+
+  Exploitation may result in unexpected command line argument
+  interpretation, argument injection, and execution of other programs.
+
+Recommendations:
+================
+
+  We recommend all users to upgrade to a known fixed release of
+  Subversion.
+
+  Users who are unable to upgrade may apply the patch included below.
+
+References:
+===========
+
+  CVE-2024-45720 (Subversion)
+
+Reported by:
+============
+
+  Orange Tsai (@orange_8361) from DEVCORE Research Team
+  splitline (@_splitline_) from DEVCORE Research Team
+
+Patch:
+======
+
+  Patch against Subversion 1.14.3:
+
+[[[
+
+Index: build.conf
+===================================================================
+--- build.conf	(revision 1920475)
++++ build.conf	(working copy)
+@@ -153,7 +153,7 @@ libs = libsvn_client libsvn_wc libsvn_ra libsvn_de
+        apriconv apr
+ manpages = subversion/svn/svn.1
+ install = bin
+-msvc-libs = setargv.obj
++msvc-libs = wsetargv.obj
+
+ # The subversion repository administration tool
+ [svnadmin]
+@@ -163,7 +163,7 @@ path = subversion/svnadmin
+ install = bin
+ manpages = subversion/svnadmin/svnadmin.1
+ libs = libsvn_repos libsvn_fs libsvn_delta libsvn_subr apriconv apr
+-msvc-libs = setargv.obj
++msvc-libs = wsetargv.obj
+
+ # The subversion repository dump filtering tool
+ [svndumpfilter]
+Index: subversion/include/private/svn_cmdline_private.h
+===================================================================
+--- subversion/include/private/svn_cmdline_private.h	(revision 1920475)
++++ subversion/include/private/svn_cmdline_private.h	(working copy)
+@@ -278,6 +278,34 @@ svn_cmdline__stdin_readline(const char **result,
+                             apr_pool_t *result_pool,
+                             apr_pool_t *scratch_pool);
+
++#if defined(WIN32)
++/* Normalizes Windows-specific command line arguments, such as those passed
++   to wmain(), to the environment-specific code page. */
++svn_error_t *
++svn_cmdline__win32_get_cstring_argv(const char **cstring_argv_p[],
++                                    int argc,
++                                    const wchar_t *argv[],
++                                    apr_pool_t *result_pool);
++#endif
++
++/* Default platform-agnostic handler that normalizes command line arguments
++   to the environment-specific code page. */
++svn_error_t *
++svn_cmdline__default_get_cstring_argv(const char **cstring_argv_p[],
++                                      int argc,
++                                      const char *argv[],
++                                      apr_pool_t *result_pool);
++
++#if defined(WIN32) && defined(_MSC_VER)
++typedef wchar_t svn_cmdline__argv_char_t;
++#define SVN_CMDLINE__MAIN wmain
++#define svn_cmdline__get_cstring_argv svn_cmdline__win32_get_cstring_argv
++#else
++typedef char svn_cmdline__argv_char_t;
++#define SVN_CMDLINE__MAIN main
++#define svn_cmdline__get_cstring_argv svn_cmdline__default_get_cstring_argv
++#endif
++
+ #ifdef __cplusplus
+ }
+ #endif /* __cplusplus */
+Index: subversion/libsvn_subr/cmdline.c
+===================================================================
+--- subversion/libsvn_subr/cmdline.c	(revision 1920475)
++++ subversion/libsvn_subr/cmdline.c	(working copy)
+@@ -1898,3 +1898,60 @@ svn_cmdline__cancellation_exit(void)
+ #endif
+     }
+ }
++
++#if defined(WIN32)
++
++svn_error_t *
++svn_cmdline__win32_get_cstring_argv(const char **cstring_argv_p[],
++                                    int argc,
++                                    const wchar_t *argv[],
++                                    apr_pool_t *result_pool)
++{
++  apr_array_header_t *cstring_argv;
++  int i;
++
++  cstring_argv = apr_array_make(result_pool, argc + 1, sizeof(const char *));
++
++  for (i = 0; i < argc; i++)
++    {
++      const wchar_t *arg = argv[i];
++      char *cstring_arg;
++      int rv;
++
++      /* Passing -1 for the string length guarantees that the returned length
++         will account for a terminating null character. */
++      rv = WideCharToMultiByte(CP_ACP, 0, arg, -1, NULL, 0, NULL, NULL);
++      if (rv <= 0)
++        {
++          return svn_error_wrap_apr(apr_get_os_error(),
++                                    _("Conversion from UTF-16 failed"));
++        }
++
++      cstring_arg = apr_palloc(result_pool, rv);
++      rv = WideCharToMultiByte(CP_ACP, 0, arg, -1, cstring_arg, rv, NULL, NULL);
++      if (rv <= 0)
++        {
++          return svn_error_wrap_apr(apr_get_os_error(),
++                                    _("Conversion from UTF-16 failed"));
++        }
++
++      APR_ARRAY_PUSH(cstring_argv, const char *) = cstring_arg;
++    }
++
++  APR_ARRAY_PUSH(cstring_argv, const char *) = NULL;
++
++  *cstring_argv_p = (const char **)cstring_argv->elts;
++  return SVN_NO_ERROR;
++}
++
++#endif
++
++svn_error_t *
++svn_cmdline__default_get_cstring_argv(const char **cstring_argv_p[],
++                                      int argc,
++                                      const char *argv[],
++                                      apr_pool_t *result_pool)
++{
++  *cstring_argv_p = argv;
++  return SVN_NO_ERROR;
++}
+Index: subversion/svn/svn.c
+===================================================================
+--- subversion/svn/svn.c	(revision 1920475)
++++ subversion/svn/svn.c	(working copy)
+@@ -2019,7 +2019,10 @@ add_commands(const svn_opt_subcommand_desc3_t *cmd
+  * return SVN_NO_ERROR.
+  */
+ static svn_error_t *
+-sub_main(int *exit_code, int argc, const char *argv[], apr_pool_t *pool)
++sub_main(int *exit_code,
++         int argc,
++         const svn_cmdline__argv_char_t *cmdline_argv[],
++         apr_pool_t *pool)
+ {
+   svn_error_t *err;
+   int opt_id;
+@@ -2045,6 +2048,7 @@ static svn_error_t *
+   apr_hash_t *cfg_hash;
+   svn_membuf_t buf;
+   svn_boolean_t read_pass_from_stdin = FALSE;
++  const char **argv;
+
+   received_opts = apr_array_make(pool, SVN_OPT_MAX_OPTIONS, sizeof(int));
+
+@@ -2051,6 +2055,8 @@ static svn_error_t *
+   /* Check library versions */
+   SVN_ERR(check_lib_versions());
+
++  SVN_ERR(svn_cmdline__get_cstring_argv(&argv, argc, cmdline_argv, pool));
++
+ #if defined(WIN32) || defined(__CYGWIN__)
+   /* Set the working copy administrative directory name. */
+   if (getenv("SVN_ASP_DOT_NET_HACK"))
+@@ -3324,7 +3330,7 @@ static svn_error_t *
+ }
+
+ int
+-main(int argc, const char *argv[])
++SVN_CMDLINE__MAIN(int argc, const svn_cmdline__argv_char_t *argv[])
+ {
+   apr_pool_t *pool;
+   int exit_code = EXIT_SUCCESS;
+Index: subversion/svnadmin/svnadmin.c
+===================================================================
+--- subversion/svnadmin/svnadmin.c	(revision 1920475)
++++ subversion/svnadmin/svnadmin.c	(working copy)
+@@ -3048,7 +3048,10 @@ subcommand_build_repcache(apr_getopt_t *os, void *
+  * return SVN_NO_ERROR.
+  */
+ static svn_error_t *
+-sub_main(int *exit_code, int argc, const char *argv[], apr_pool_t *pool)
++sub_main(int *exit_code,
++         int argc,
++         const svn_cmdline__argv_char_t *cmdline_argv[],
++         apr_pool_t *pool)
+ {
+   svn_error_t *err;
+   apr_status_t apr_err;
+@@ -3060,6 +3063,7 @@ static svn_error_t *
+   apr_array_header_t *received_opts;
+   int i;
+   svn_boolean_t dash_F_arg = FALSE;
++  const char **argv;
+
+   received_opts = apr_array_make(pool, SVN_OPT_MAX_OPTIONS, sizeof(int));
+
+@@ -3066,6 +3070,8 @@ static svn_error_t *
+   /* Check library versions */
+   SVN_ERR(check_lib_versions());
+
++  SVN_ERR(svn_cmdline__get_cstring_argv(&argv, argc, cmdline_argv, pool));
++
+   /* Initialize the FS library. */
+   SVN_ERR(svn_fs_initialize(pool));
+
+@@ -3445,7 +3451,7 @@ static svn_error_t *
+ }
+
+ int
+-main(int argc, const char *argv[])
++SVN_CMDLINE__MAIN(int argc, const svn_cmdline__argv_char_t *argv[])
+ {
+   apr_pool_t *pool;
+   int exit_code = EXIT_SUCCESS;
+Index: subversion/svnbench/svnbench.c
+===================================================================
+--- subversion/svnbench/svnbench.c	(revision 1920475)
++++ subversion/svnbench/svnbench.c	(working copy)
+@@ -386,7 +386,10 @@ add_search_pattern_group(svn_cl__opt_state_t *opt_
+  * return SVN_NO_ERROR.
+  */
+ static svn_error_t *
+-sub_main(int *exit_code, int argc, const char *argv[], apr_pool_t *pool)
++sub_main(int *exit_code,
++         int argc,
++         const svn_cmdline__argv_char_t *cmdline_argv[],
++         apr_pool_t *pool)
+ {
+   svn_error_t *err;
+   int opt_id;
+@@ -405,6 +408,7 @@ static svn_error_t *
+   ra_progress_baton_t ra_progress_baton = {0};
+   svn_membuf_t buf;
+   svn_boolean_t read_pass_from_stdin = FALSE;
++  const char **argv;
+
+   received_opts = apr_array_make(pool, SVN_OPT_MAX_OPTIONS, sizeof(int));
+
+@@ -414,6 +418,8 @@ static svn_error_t *
+   /* Check library versions */
+   SVN_ERR(check_lib_versions());
+
++  SVN_ERR(svn_cmdline__get_cstring_argv(&argv, argc, cmdline_argv, pool));
++
+ #if defined(WIN32) || defined(__CYGWIN__)
+   /* Set the working copy administrative directory name. */
+   if (getenv("SVN_ASP_DOT_NET_HACK"))
+@@ -1039,7 +1045,7 @@ static svn_error_t *
+ }
+
+ int
+-main(int argc, const char *argv[])
++SVN_CMDLINE__MAIN(int argc, const svn_cmdline__argv_char_t *argv[])
+ {
+   apr_pool_t *pool;
+   int exit_code = EXIT_SUCCESS;
+Index: subversion/svndumpfilter/svndumpfilter.c
+===================================================================
+--- subversion/svndumpfilter/svndumpfilter.c	(revision 1920475)
++++ subversion/svndumpfilter/svndumpfilter.c	(working copy)
+@@ -1291,7 +1291,10 @@ subcommand_include(apr_getopt_t *os, void *baton,
+  * return SVN_NO_ERROR.
+  */
+ static svn_error_t *
+-sub_main(int *exit_code, int argc, const char *argv[], apr_pool_t *pool)
++sub_main(int *exit_code,
++         int argc,
++         const svn_cmdline__argv_char_t *cmdline_argv[],
++         apr_pool_t *pool)
+ {
+   svn_error_t *err;
+   apr_status_t apr_err;
+@@ -1302,10 +1305,13 @@ static svn_error_t *
+   int opt_id;
+   apr_array_header_t *received_opts;
+   int i;
++  const char **argv;
+
+   /* Check library versions */
+   SVN_ERR(check_lib_versions());
+
++  SVN_ERR(svn_cmdline__get_cstring_argv(&argv, argc, cmdline_argv, pool));
++
+   received_opts = apr_array_make(pool, SVN_OPT_MAX_OPTIONS, sizeof(int));
+
+   /* Initialize the FS library. */
+@@ -1564,7 +1570,7 @@ static svn_error_t *
+ }
+
+ int
+-main(int argc, const char *argv[])
++SVN_CMDLINE__MAIN(int argc, const svn_cmdline__argv_char_t *argv[])
+ {
+   apr_pool_t *pool;
+   int exit_code = EXIT_SUCCESS;
+Index: subversion/svnfsfs/svnfsfs.c
+===================================================================
+--- subversion/svnfsfs/svnfsfs.c	(revision 1920475)
++++ subversion/svnfsfs/svnfsfs.c	(working copy)
+@@ -228,7 +228,10 @@ subcommand__help(apr_getopt_t *os, void *baton, ap
+  * return SVN_NO_ERROR.
+  */
+ static svn_error_t *
+-sub_main(int *exit_code, int argc, const char *argv[], apr_pool_t *pool)
++sub_main(int *exit_code,
++         int argc,
++         const svn_cmdline__argv_char_t *cmdline_argv[],
++         apr_pool_t *pool)
+ {
+   svn_error_t *err;
+   apr_status_t apr_err;
+@@ -239,6 +242,7 @@ static svn_error_t *
+   int opt_id;
+   apr_array_header_t *received_opts;
+   int i;
++  const char **argv;
+
+   received_opts = apr_array_make(pool, SVN_OPT_MAX_OPTIONS, sizeof(int));
+
+@@ -245,6 +249,8 @@ static svn_error_t *
+   /* Check library versions */
+   SVN_ERR(check_lib_versions());
+
++  SVN_ERR(svn_cmdline__get_cstring_argv(&argv, argc, cmdline_argv, pool));
++
+   /* Initialize the FS library. */
+   SVN_ERR(svn_fs_initialize(pool));
+
+@@ -473,7 +479,7 @@ static svn_error_t *
+ }
+
+ int
+-main(int argc, const char *argv[])
++SVN_CMDLINE__MAIN(int argc, const svn_cmdline__argv_char_t *argv[])
+ {
+   apr_pool_t *pool;
+   int exit_code = EXIT_SUCCESS;
+Index: subversion/svnlook/svnlook.c
+===================================================================
+--- subversion/svnlook/svnlook.c	(revision 1920475)
++++ subversion/svnlook/svnlook.c	(working copy)
+@@ -2466,7 +2466,10 @@ subcommand_uuid(apr_getopt_t *os, void *baton, apr
+  * return SVN_NO_ERROR.
+  */
+ static svn_error_t *
+-sub_main(int *exit_code, int argc, const char *argv[], apr_pool_t *pool)
++sub_main(int *exit_code,
++         int argc,
++         const svn_cmdline__argv_char_t *cmdline_argv[],
++         apr_pool_t *pool)
+ {
+   svn_error_t *err;
+   apr_status_t apr_err;
+@@ -2477,6 +2480,7 @@ static svn_error_t *
+   int opt_id;
+   apr_array_header_t *received_opts;
+   int i;
++  const char **argv;
+
+   received_opts = apr_array_make(pool, SVN_OPT_MAX_OPTIONS, sizeof(int));
+
+@@ -2483,6 +2487,8 @@ static svn_error_t *
+   /* Check library versions */
+   SVN_ERR(check_lib_versions());
+
++  SVN_ERR(svn_cmdline__get_cstring_argv(&argv, argc, cmdline_argv, pool));
++
+   /* Initialize the FS library. */
+   SVN_ERR(svn_fs_initialize(pool));
+
+@@ -2849,7 +2855,7 @@ static svn_error_t *
+ }
+
+ int
+-main(int argc, const char *argv[])
++SVN_CMDLINE__MAIN(int argc, const svn_cmdline__argv_char_t *argv[])
+ {
+   apr_pool_t *pool;
+   int exit_code = EXIT_SUCCESS;
+Index: subversion/svnmucc/svnmucc.c
+===================================================================
+--- subversion/svnmucc/svnmucc.c	(revision 1920475)
++++ subversion/svnmucc/svnmucc.c	(working copy)
+@@ -467,7 +467,10 @@ log_message_func(const char **log_msg,
+  * return SVN_NO_ERROR.
+  */
+ static svn_error_t *
+-sub_main(int *exit_code, int argc, const char *argv[], apr_pool_t *pool)
++sub_main(int *exit_code,
++         int argc,
++         const svn_cmdline__argv_char_t *cmdline_argv[],
++         apr_pool_t *pool)
+ {
+   apr_array_header_t *actions = apr_array_make(pool, 1,
+                                                sizeof(struct action *));
+@@ -533,10 +536,13 @@ static svn_error_t *
+   struct log_message_baton lmb;
+   int i;
+   svn_boolean_t read_pass_from_stdin = FALSE;
++  const char **argv;
+
+   /* Check library versions */
+   SVN_ERR(check_lib_versions());
+
++  SVN_ERR(svn_cmdline__get_cstring_argv(&argv, argc, cmdline_argv, pool));
++
+   /* Initialize the RA library. */
+   SVN_ERR(svn_ra_initialize(pool));
+
+@@ -980,7 +986,7 @@ static svn_error_t *
+ }
+
+ int
+-main(int argc, const char *argv[])
++SVN_CMDLINE__MAIN(int argc, const svn_cmdline__argv_char_t *argv[])
+ {
+   apr_pool_t *pool;
+   int exit_code = EXIT_SUCCESS;
+Index: subversion/svnrdump/svnrdump.c
+===================================================================
+--- subversion/svnrdump/svnrdump.c	(revision 1920475)
++++ subversion/svnrdump/svnrdump.c	(working copy)
+@@ -784,7 +784,10 @@ validate_and_resolve_revisions(opt_baton_t *opt_ba
+  * return SVN_NO_ERROR.
+  */
+ static svn_error_t *
+-sub_main(int *exit_code, int argc, const char *argv[], apr_pool_t *pool)
++sub_main(int *exit_code,
++         int argc,
++         const svn_cmdline__argv_char_t *cmdline_argv[],
++         apr_pool_t *pool)
+ {
+   svn_error_t *err = SVN_NO_ERROR;
+   const svn_opt_subcommand_desc3_t *subcommand = NULL;
+@@ -806,7 +809,10 @@ static svn_error_t *
+   apr_array_header_t *received_opts;
+   int i;
+   svn_boolean_t read_pass_from_stdin = FALSE;
++  const char **argv;
+
++  SVN_ERR(svn_cmdline__get_cstring_argv(&argv, argc, cmdline_argv, pool));
++
+   opt_baton = apr_pcalloc(pool, sizeof(*opt_baton));
+   opt_baton->start_revision.kind = svn_opt_revision_unspecified;
+   opt_baton->end_revision.kind = svn_opt_revision_unspecified;
+@@ -1155,7 +1161,7 @@ static svn_error_t *
+ }
+
+ int
+-main(int argc, const char *argv[])
++SVN_CMDLINE__MAIN(int argc, const svn_cmdline__argv_char_t *argv[])
+ {
+   apr_pool_t *pool;
+   int exit_code = EXIT_SUCCESS;
+Index: subversion/svnserve/svnserve.c
+===================================================================
+--- subversion/svnserve/svnserve.c	(revision 1920475)
++++ subversion/svnserve/svnserve.c	(working copy)
+@@ -703,7 +703,10 @@ check_lib_versions(void)
+  * return SVN_NO_ERROR.
+  */
+ static svn_error_t *
+-sub_main(int *exit_code, int argc, const char *argv[], apr_pool_t *pool)
++sub_main(int *exit_code,
++         int argc,
++         const svn_cmdline__argv_char_t *cmdline_argv[],
++         apr_pool_t *pool)
+ {
+   enum run_mode run_mode = run_mode_unspecified;
+   svn_boolean_t foreground = FALSE;
+@@ -742,6 +745,8 @@ static svn_error_t *
+   svn_node_kind_t kind;
+   apr_size_t min_thread_count = THREADPOOL_MIN_SIZE;
+   apr_size_t max_thread_count = THREADPOOL_MAX_SIZE;
++  const char **argv;
++
+ #ifdef SVN_HAVE_SASL
+   SVN_ERR(cyrus_init(pool));
+ #endif
+@@ -749,6 +754,8 @@ static svn_error_t *
+   /* Check library versions */
+   SVN_ERR(check_lib_versions());
+
++  SVN_ERR(svn_cmdline__get_cstring_argv(&argv, argc, cmdline_argv, pool));
++
+   /* Initialize the FS library. */
+   SVN_ERR(svn_fs_initialize(pool));
+
+@@ -1395,7 +1402,7 @@ static svn_error_t *
+ }
+
+ int
+-main(int argc, const char *argv[])
++SVN_CMDLINE__MAIN(int argc, const svn_cmdline__argv_char_t *argv[])
+ {
+   apr_pool_t *pool;
+   int exit_code = EXIT_SUCCESS;
+Index: subversion/svnsync/svnsync.c
+===================================================================
+--- subversion/svnsync/svnsync.c	(revision 1920475)
++++ subversion/svnsync/svnsync.c	(working copy)
+@@ -1963,7 +1963,10 @@ help_cmd(apr_getopt_t *os, void *baton, apr_pool_t
+  * return SVN_NO_ERROR.
+  */
+ static svn_error_t *
+-sub_main(int *exit_code, int argc, const char *argv[], apr_pool_t *pool)
++sub_main(int *exit_code,
++         int argc,
++         const svn_cmdline__argv_char_t *cmdline_argv[],
++         apr_pool_t *pool)
+ {
+   const svn_opt_subcommand_desc3_t *subcommand = NULL;
+   apr_array_header_t *received_opts;
+@@ -1978,10 +1981,13 @@ static svn_error_t *
+   apr_array_header_t *config_options = NULL;
+   const char *source_prop_encoding = NULL;
+   svn_boolean_t force_interactive = FALSE;
++  const char **argv;
+
+   /* Check library versions */
+   SVN_ERR(check_lib_versions());
+
++  SVN_ERR(svn_cmdline__get_cstring_argv(&argv, argc, cmdline_argv, pool));
++
+   SVN_ERR(svn_ra_initialize(pool));
+
+   /* Initialize the option baton. */
+@@ -2402,7 +2408,7 @@ static svn_error_t *
+ }
+
+ int
+-main(int argc, const char *argv[])
++SVN_CMDLINE__MAIN(int argc, const svn_cmdline__argv_char_t *argv[])
+ {
+   apr_pool_t *pool;
+   int exit_code = EXIT_SUCCESS;
+Index: subversion/svnversion/svnversion.c
+===================================================================
+--- subversion/svnversion/svnversion.c	(revision 1920475)
++++ subversion/svnversion/svnversion.c	(working copy)
+@@ -124,7 +124,10 @@ check_lib_versions(void)
+  * program.  Obviously we don't want to have to run svn when building svn.
+  */
+ static svn_error_t *
+-sub_main(int *exit_code, int argc, const char *argv[], apr_pool_t *pool)
++sub_main(int *exit_code,
++         int argc,
++         const svn_cmdline__argv_char_t *cmdline_argv[],
++         apr_pool_t *pool)
+ {
+   const char *wc_path, *trail_url;
+   const char *local_abspath;
+@@ -146,10 +149,13 @@ static svn_error_t *
+        N_("no progress (only errors) to stderr")},
+       {0,             0,  0,  0}
+     };
++  const char **argv;
+
+   /* Check library versions */
+   SVN_ERR(check_lib_versions());
+
++  SVN_ERR(svn_cmdline__get_cstring_argv(&argv, argc, cmdline_argv, pool));
++
+ #if defined(WIN32) || defined(__CYGWIN__)
+   /* Set the working copy administrative directory name. */
+   if (getenv("SVN_ASP_DOT_NET_HACK"))
+@@ -289,7 +295,7 @@ static svn_error_t *
+ }
+
+ int
+-main(int argc, const char *argv[])
++SVN_CMDLINE__MAIN(int argc, const svn_cmdline__argv_char_t *argv[])
+ {
+   apr_pool_t *pool;
+   int exit_code = EXIT_SUCCESS;
+Index: tools/client-side/svn-mergeinfo-normalizer/svn-mergeinfo-normalizer.c
+===================================================================
+--- tools/client-side/svn-mergeinfo-normalizer/svn-mergeinfo-normalizer.c	(revision 1920475)
++++ tools/client-side/svn-mergeinfo-normalizer/svn-mergeinfo-normalizer.c	(working copy)
+@@ -408,7 +408,10 @@ svn_min__check_cancel(void *baton)
+  * return SVN_NO_ERROR.
+  */
+ static svn_error_t *
+-sub_main(int *exit_code, int argc, const char *argv[], apr_pool_t *pool)
++sub_main(int *exit_code,
++         int argc,
++         const svn_cmdline__argv_char_t *cmdline_argv[],
++         apr_pool_t *pool)
+ {
+   svn_error_t *err;
+   int opt_id;
+@@ -425,6 +428,7 @@ static svn_error_t *
+   svn_boolean_t force_interactive = FALSE;
+   apr_hash_t *cfg_hash;
+   svn_boolean_t read_pass_from_stdin = FALSE;
++  const char **argv;
+
+   received_opts = apr_array_make(pool, SVN_OPT_MAX_OPTIONS, sizeof(int));
+
+@@ -431,6 +435,8 @@ static svn_error_t *
+   /* Check library versions */
+   SVN_ERR(check_lib_versions());
+
++  SVN_ERR(svn_cmdline__get_cstring_argv(&argv, argc, cmdline_argv, pool));
++
+ #if defined(WIN32) || defined(__CYGWIN__)
+   /* Set the working copy administrative directory name. */
+   if (getenv("SVN_ASP_DOT_NET_HACK"))
+@@ -946,7 +952,7 @@ static svn_error_t *
+ }
+
+ int
+-main(int argc, const char *argv[])
++SVN_CMDLINE__MAIN(int argc, const svn_cmdline__argv_char_t *argv[])
+ {
+   apr_pool_t *pool;
+   int exit_code = EXIT_SUCCESS;
+Index: tools/client-side/svnconflict/svnconflict.c
+===================================================================
+--- tools/client-side/svnconflict/svnconflict.c	(revision 1920475)
++++ tools/client-side/svnconflict/svnconflict.c	(working copy)
+@@ -632,7 +632,10 @@ svnconflict_resolve_tree(apr_getopt_t *os, void *b
+  * return SVN_NO_ERROR.
+  */
+ static svn_error_t *
+-sub_main(int *exit_code, int argc, const char *argv[], apr_pool_t *pool)
++sub_main(int *exit_code,
++         int argc,
++         const svn_cmdline__argv_char_t *cmdline_argv[],
++         apr_pool_t *pool)
+ {
+   svn_error_t *err;
+   int opt_id;
+@@ -647,6 +650,7 @@ static svn_error_t *
+   svn_config_t *cfg_config;
+   apr_hash_t *cfg_hash;
+   svn_boolean_t read_pass_from_stdin = FALSE;
++  const char **argv;
+
+   received_opts = apr_array_make(pool, SVN_OPT_MAX_OPTIONS, sizeof(int));
+
+@@ -653,6 +657,8 @@ static svn_error_t *
+   /* Check library versions */
+   SVN_ERR(check_lib_versions());
+
++  SVN_ERR(svn_cmdline__get_cstring_argv(&argv, argc, cmdline_argv, pool));
++
+ #if defined(WIN32) || defined(__CYGWIN__)
+   /* Set the working copy administrative directory name. */
+   if (getenv("SVN_ASP_DOT_NET_HACK"))
+@@ -949,7 +955,7 @@ static svn_error_t *
+ }
+
+ int
+-main(int argc, const char *argv[])
++SVN_CMDLINE__MAIN(int argc, const svn_cmdline__argv_char_t *argv[])
+ {
+   apr_pool_t *pool;
+   int exit_code = EXIT_SUCCESS;
+Index: tools/dev/svnraisetreeconflict/svnraisetreeconflict.c
+===================================================================
+--- tools/dev/svnraisetreeconflict/svnraisetreeconflict.c	(revision 1920475)
++++ tools/dev/svnraisetreeconflict/svnraisetreeconflict.c	(working copy)
+@@ -302,7 +302,10 @@ check_lib_versions(void)
+  * return SVN_NO_ERROR.
+  */
+ static svn_error_t *
+-sub_main(int *exit_code, int argc, const char *argv[], apr_pool_t *pool)
++sub_main(int *exit_code,
++         int argc,
++         const svn_cmdline__argv_char_t *cmdline_argv[],
++         apr_pool_t *pool)
+ {
+   apr_getopt_t *os;
+   const apr_getopt_option_t options[] =
+@@ -313,10 +316,13 @@ static svn_error_t *
+       {0,             0,  0,  0}
+     };
+   apr_array_header_t *remaining_argv;
++  const char **argv;
+
+   /* Check library versions */
+   SVN_ERR(check_lib_versions());
+
++  SVN_ERR(svn_cmdline__get_cstring_argv(&argv, argc, cmdline_argv, pool));
++
+ #if defined(WIN32) || defined(__CYGWIN__)
+   /* Set the working copy administrative directory name. */
+   if (getenv("SVN_ASP_DOT_NET_HACK"))
+@@ -383,7 +389,7 @@ static svn_error_t *
+ }
+
+ int
+-main(int argc, const char *argv[])
++SVN_CMDLINE__MAIN(int argc, const svn_cmdline__argv_char_t *argv[])
+ {
+   apr_pool_t *pool;
+   int exit_code = EXIT_SUCCESS;
+Index: tools/dev/wc-ng/svn-wc-db-tester.c
+===================================================================
+--- tools/dev/wc-ng/svn-wc-db-tester.c	(revision 1920475)
++++ tools/dev/wc-ng/svn-wc-db-tester.c	(working copy)
+@@ -156,7 +156,10 @@ check_lib_versions(void)
+  * return SVN_NO_ERROR.
+  */
+ static svn_error_t *
+-sub_main(int *exit_code, int argc, const char *argv[], apr_pool_t *pool)
++sub_main(int *exit_code,
++         int argc,
++         const svn_cmdline__argv_char_t *cmdline_argv[],
++         apr_pool_t *pool)
+ {
+   apr_getopt_t *os;
+   const apr_getopt_option_t options[] =
+@@ -167,10 +170,13 @@ static svn_error_t *
+       {0,             0,  0,  0}
+     };
+   apr_array_header_t *remaining_argv;
++  const char **argv;
+
+   /* Check library versions */
+   SVN_ERR(check_lib_versions());
+
++  SVN_ERR(svn_cmdline__get_cstring_argv(&argv, argc, cmdline_argv, pool));
++
+ #if defined(WIN32) || defined(__CYGWIN__)
+   /* Set the working copy administrative directory name. */
+   if (getenv("SVN_ASP_DOT_NET_HACK"))
+@@ -237,7 +243,7 @@ static svn_error_t *
+ }
+
+ int
+-main(int argc, const char *argv[])
++SVN_CMDLINE__MAIN(int argc, const svn_cmdline__argv_char_t *argv[])
+ {
+   apr_pool_t *pool;
+   int exit_code = EXIT_SUCCESS;
+Index: tools/server-side/svnauthz.c
+===================================================================
+--- tools/server-side/svnauthz.c	(revision 1920475)
++++ tools/server-side/svnauthz.c	(working copy)
+@@ -490,7 +490,10 @@ canonicalize_access_file(const char **canonicalize
+  * return SVN_NO_ERROR.
+  */
+ static svn_error_t *
+-sub_main(int *exit_code, int argc, const char *argv[], apr_pool_t *pool)
++sub_main(int *exit_code,
++         int argc,
++         const svn_cmdline__argv_char_t *cmdline_argv[],
++         apr_pool_t *pool)
+ {
+   svn_error_t *err;
+
+@@ -499,7 +502,10 @@ static svn_error_t *
+   apr_getopt_t *os;
+   apr_array_header_t *received_opts;
+   int i;
++  const char **argv;
+
++  SVN_ERR(svn_cmdline__get_cstring_argv(&argv, argc, cmdline_argv, pool));
++
+   /* Initialize the FS library. */
+   SVN_ERR(svn_fs_initialize(pool));
+
+@@ -752,7 +758,7 @@ static svn_error_t *
+ }
+
+ int
+-main(int argc, const char *argv[])
++SVN_CMDLINE__MAIN(int argc, const svn_cmdline__argv_char_t *argv[])
+ {
+   apr_pool_t *pool;
+   int exit_code = EXIT_SUCCESS;
+@@ -759,7 +765,7 @@ int
+   svn_error_t *err;
+
+   /* Initialize the app.  Send all error messages to 'stderr'.  */
+-  if (svn_cmdline_init(argv[0], stderr) != EXIT_SUCCESS)
++  if (svn_cmdline_init("svnauthz", stderr) != EXIT_SUCCESS)
+     return EXIT_FAILURE;
+
+   pool = svn_pool_create(NULL);
+
+]]]
+
+Patches:
+========
+
+  Patch for Subversion 1.14.3:
+[[[
+Index: build.conf
+===================================================================
+--- build.conf	(revision 1920475)
++++ build.conf	(working copy)
+@@ -153,7 +153,7 @@ libs = libsvn_client libsvn_wc libsvn_ra libsvn_de
+        apriconv apr
+ manpages = subversion/svn/svn.1
+ install = bin
+-msvc-libs = setargv.obj
++msvc-libs = wsetargv.obj
+ 
+ # The subversion repository administration tool
+ [svnadmin]
+@@ -163,7 +163,7 @@ path = subversion/svnadmin
+ install = bin
+ manpages = subversion/svnadmin/svnadmin.1
+ libs = libsvn_repos libsvn_fs libsvn_delta libsvn_subr apriconv apr
+-msvc-libs = setargv.obj
++msvc-libs = wsetargv.obj
+ 
+ # The subversion repository dump filtering tool
+ [svndumpfilter]
+Index: subversion/include/private/svn_cmdline_private.h
+===================================================================
+--- subversion/include/private/svn_cmdline_private.h	(revision 1920475)
++++ subversion/include/private/svn_cmdline_private.h	(working copy)
+@@ -278,6 +278,34 @@ svn_cmdline__stdin_readline(const char **result,
+                             apr_pool_t *result_pool,
+                             apr_pool_t *scratch_pool);
+ 
++#if defined(WIN32)
++/* Normalizes Windows-specific command line arguments, such as those passed
++   to wmain(), to the environment-specific code page. */
++svn_error_t *
++svn_cmdline__win32_get_cstring_argv(const char **cstring_argv_p[],
++                                    int argc,
++                                    const wchar_t *argv[],
++                                    apr_pool_t *result_pool);
++#endif
++
++/* Default platform-agnostic handler that normalizes command line arguments
++   to the environment-specific code page. */
++svn_error_t *
++svn_cmdline__default_get_cstring_argv(const char **cstring_argv_p[],
++                                      int argc,
++                                      const char *argv[],
++                                      apr_pool_t *result_pool);
++
++#if defined(WIN32) && defined(_MSC_VER)
++typedef wchar_t svn_cmdline__argv_char_t;
++#define SVN_CMDLINE__MAIN wmain
++#define svn_cmdline__get_cstring_argv svn_cmdline__win32_get_cstring_argv
++#else
++typedef char svn_cmdline__argv_char_t;
++#define SVN_CMDLINE__MAIN main
++#define svn_cmdline__get_cstring_argv svn_cmdline__default_get_cstring_argv
++#endif
++
+ #ifdef __cplusplus
+ }
+ #endif /* __cplusplus */
+Index: subversion/libsvn_subr/cmdline.c
+===================================================================
+--- subversion/libsvn_subr/cmdline.c	(revision 1920475)
++++ subversion/libsvn_subr/cmdline.c	(working copy)
+@@ -1898,3 +1898,60 @@ svn_cmdline__cancellation_exit(void)
+ #endif
+     }
+ }
++
++#if defined(WIN32)
++
++svn_error_t *
++svn_cmdline__win32_get_cstring_argv(const char **cstring_argv_p[],
++                                    int argc,
++                                    const wchar_t *argv[],
++                                    apr_pool_t *result_pool)
++{
++  apr_array_header_t *cstring_argv;
++  int i;
++
++  cstring_argv = apr_array_make(result_pool, argc + 1, sizeof(const char *));
++
++  for (i = 0; i < argc; i++)
++    {
++      const wchar_t *arg = argv[i];
++      char *cstring_arg;
++      int rv;
++
++      /* Passing -1 for the string length guarantees that the returned length
++         will account for a terminating null character. */
++      rv = WideCharToMultiByte(CP_ACP, 0, arg, -1, NULL, 0, NULL, NULL);
++      if (rv <= 0)
++        {
++          return svn_error_wrap_apr(apr_get_os_error(),
++                                    _("Conversion from UTF-16 failed"));
++        }
++
++      cstring_arg = apr_palloc(result_pool, rv);
++      rv = WideCharToMultiByte(CP_ACP, 0, arg, -1, cstring_arg, rv, NULL, NULL);
++      if (rv <= 0)
++        {
++          return svn_error_wrap_apr(apr_get_os_error(),
++                                    _("Conversion from UTF-16 failed"));
++        }
++
++      APR_ARRAY_PUSH(cstring_argv, const char *) = cstring_arg;
++    }
++
++  APR_ARRAY_PUSH(cstring_argv, const char *) = NULL;
++
++  *cstring_argv_p = (const char **)cstring_argv->elts;
++  return SVN_NO_ERROR;
++}
++
++#endif
++
++svn_error_t *
++svn_cmdline__default_get_cstring_argv(const char **cstring_argv_p[],
++                                      int argc,
++                                      const char *argv[],
++                                      apr_pool_t *result_pool)
++{
++  *cstring_argv_p = argv;
++  return SVN_NO_ERROR;
++}
+Index: subversion/svn/svn.c
+===================================================================
+--- subversion/svn/svn.c	(revision 1920475)
++++ subversion/svn/svn.c	(working copy)
+@@ -2019,7 +2019,10 @@ add_commands(const svn_opt_subcommand_desc3_t *cmd
+  * return SVN_NO_ERROR.
+  */
+ static svn_error_t *
+-sub_main(int *exit_code, int argc, const char *argv[], apr_pool_t *pool)
++sub_main(int *exit_code,
++         int argc,
++         const svn_cmdline__argv_char_t *cmdline_argv[],
++         apr_pool_t *pool)
+ {
+   svn_error_t *err;
+   int opt_id;
+@@ -2045,6 +2048,7 @@ static svn_error_t *
+   apr_hash_t *cfg_hash;
+   svn_membuf_t buf;
+   svn_boolean_t read_pass_from_stdin = FALSE;
++  const char **argv;
+ 
+   received_opts = apr_array_make(pool, SVN_OPT_MAX_OPTIONS, sizeof(int));
+ 
+@@ -2051,6 +2055,8 @@ static svn_error_t *
+   /* Check library versions */
+   SVN_ERR(check_lib_versions());
+ 
++  SVN_ERR(svn_cmdline__get_cstring_argv(&argv, argc, cmdline_argv, pool));
++
+ #if defined(WIN32) || defined(__CYGWIN__)
+   /* Set the working copy administrative directory name. */
+   if (getenv("SVN_ASP_DOT_NET_HACK"))
+@@ -3324,7 +3330,7 @@ static svn_error_t *
+ }
+ 
+ int
+-main(int argc, const char *argv[])
++SVN_CMDLINE__MAIN(int argc, const svn_cmdline__argv_char_t *argv[])
+ {
+   apr_pool_t *pool;
+   int exit_code = EXIT_SUCCESS;
+Index: subversion/svnadmin/svnadmin.c
+===================================================================
+--- subversion/svnadmin/svnadmin.c	(revision 1920475)
++++ subversion/svnadmin/svnadmin.c	(working copy)
+@@ -3048,7 +3048,10 @@ subcommand_build_repcache(apr_getopt_t *os, void *
+  * return SVN_NO_ERROR.
+  */
+ static svn_error_t *
+-sub_main(int *exit_code, int argc, const char *argv[], apr_pool_t *pool)
++sub_main(int *exit_code,
++         int argc,
++         const svn_cmdline__argv_char_t *cmdline_argv[],
++         apr_pool_t *pool)
+ {
+   svn_error_t *err;
+   apr_status_t apr_err;
+@@ -3060,6 +3063,7 @@ static svn_error_t *
+   apr_array_header_t *received_opts;
+   int i;
+   svn_boolean_t dash_F_arg = FALSE;
++  const char **argv;
+ 
+   received_opts = apr_array_make(pool, SVN_OPT_MAX_OPTIONS, sizeof(int));
+ 
+@@ -3066,6 +3070,8 @@ static svn_error_t *
+   /* Check library versions */
+   SVN_ERR(check_lib_versions());
+ 
++  SVN_ERR(svn_cmdline__get_cstring_argv(&argv, argc, cmdline_argv, pool));
++
+   /* Initialize the FS library. */
+   SVN_ERR(svn_fs_initialize(pool));
+ 
+@@ -3445,7 +3451,7 @@ static svn_error_t *
+ }
+ 
+ int
+-main(int argc, const char *argv[])
++SVN_CMDLINE__MAIN(int argc, const svn_cmdline__argv_char_t *argv[])
+ {
+   apr_pool_t *pool;
+   int exit_code = EXIT_SUCCESS;
+Index: subversion/svnbench/svnbench.c
+===================================================================
+--- subversion/svnbench/svnbench.c	(revision 1920475)
++++ subversion/svnbench/svnbench.c	(working copy)
+@@ -386,7 +386,10 @@ add_search_pattern_group(svn_cl__opt_state_t *opt_
+  * return SVN_NO_ERROR.
+  */
+ static svn_error_t *
+-sub_main(int *exit_code, int argc, const char *argv[], apr_pool_t *pool)
++sub_main(int *exit_code,
++         int argc,
++         const svn_cmdline__argv_char_t *cmdline_argv[],
++         apr_pool_t *pool)
+ {
+   svn_error_t *err;
+   int opt_id;
+@@ -405,6 +408,7 @@ static svn_error_t *
+   ra_progress_baton_t ra_progress_baton = {0};
+   svn_membuf_t buf;
+   svn_boolean_t read_pass_from_stdin = FALSE;
++  const char **argv;
+ 
+   received_opts = apr_array_make(pool, SVN_OPT_MAX_OPTIONS, sizeof(int));
+ 
+@@ -414,6 +418,8 @@ static svn_error_t *
+   /* Check library versions */
+   SVN_ERR(check_lib_versions());
+ 
++  SVN_ERR(svn_cmdline__get_cstring_argv(&argv, argc, cmdline_argv, pool));
++
+ #if defined(WIN32) || defined(__CYGWIN__)
+   /* Set the working copy administrative directory name. */
+   if (getenv("SVN_ASP_DOT_NET_HACK"))
+@@ -1039,7 +1045,7 @@ static svn_error_t *
+ }
+ 
+ int
+-main(int argc, const char *argv[])
++SVN_CMDLINE__MAIN(int argc, const svn_cmdline__argv_char_t *argv[])
+ {
+   apr_pool_t *pool;
+   int exit_code = EXIT_SUCCESS;
+Index: subversion/svndumpfilter/svndumpfilter.c
+===================================================================
+--- subversion/svndumpfilter/svndumpfilter.c	(revision 1920475)
++++ subversion/svndumpfilter/svndumpfilter.c	(working copy)
+@@ -1291,7 +1291,10 @@ subcommand_include(apr_getopt_t *os, void *baton,
+  * return SVN_NO_ERROR.
+  */
+ static svn_error_t *
+-sub_main(int *exit_code, int argc, const char *argv[], apr_pool_t *pool)
++sub_main(int *exit_code,
++         int argc,
++         const svn_cmdline__argv_char_t *cmdline_argv[],
++         apr_pool_t *pool)
+ {
+   svn_error_t *err;
+   apr_status_t apr_err;
+@@ -1302,10 +1305,13 @@ static svn_error_t *
+   int opt_id;
+   apr_array_header_t *received_opts;
+   int i;
++  const char **argv;
+ 
+   /* Check library versions */
+   SVN_ERR(check_lib_versions());
+ 
++  SVN_ERR(svn_cmdline__get_cstring_argv(&argv, argc, cmdline_argv, pool));
++
+   received_opts = apr_array_make(pool, SVN_OPT_MAX_OPTIONS, sizeof(int));
+ 
+   /* Initialize the FS library. */
+@@ -1564,7 +1570,7 @@ static svn_error_t *
+ }
+ 
+ int
+-main(int argc, const char *argv[])
++SVN_CMDLINE__MAIN(int argc, const svn_cmdline__argv_char_t *argv[])
+ {
+   apr_pool_t *pool;
+   int exit_code = EXIT_SUCCESS;
+Index: subversion/svnfsfs/svnfsfs.c
+===================================================================
+--- subversion/svnfsfs/svnfsfs.c	(revision 1920475)
++++ subversion/svnfsfs/svnfsfs.c	(working copy)
+@@ -228,7 +228,10 @@ subcommand__help(apr_getopt_t *os, void *baton, ap
+  * return SVN_NO_ERROR.
+  */
+ static svn_error_t *
+-sub_main(int *exit_code, int argc, const char *argv[], apr_pool_t *pool)
++sub_main(int *exit_code,
++         int argc,
++         const svn_cmdline__argv_char_t *cmdline_argv[],
++         apr_pool_t *pool)
+ {
+   svn_error_t *err;
+   apr_status_t apr_err;
+@@ -239,6 +242,7 @@ static svn_error_t *
+   int opt_id;
+   apr_array_header_t *received_opts;
+   int i;
++  const char **argv;
+ 
+   received_opts = apr_array_make(pool, SVN_OPT_MAX_OPTIONS, sizeof(int));
+ 
+@@ -245,6 +249,8 @@ static svn_error_t *
+   /* Check library versions */
+   SVN_ERR(check_lib_versions());
+ 
++  SVN_ERR(svn_cmdline__get_cstring_argv(&argv, argc, cmdline_argv, pool));
++
+   /* Initialize the FS library. */
+   SVN_ERR(svn_fs_initialize(pool));
+ 
+@@ -473,7 +479,7 @@ static svn_error_t *
+ }
+ 
+ int
+-main(int argc, const char *argv[])
++SVN_CMDLINE__MAIN(int argc, const svn_cmdline__argv_char_t *argv[])
+ {
+   apr_pool_t *pool;
+   int exit_code = EXIT_SUCCESS;
+Index: subversion/svnlook/svnlook.c
+===================================================================
+--- subversion/svnlook/svnlook.c	(revision 1920475)
++++ subversion/svnlook/svnlook.c	(working copy)
+@@ -2466,7 +2466,10 @@ subcommand_uuid(apr_getopt_t *os, void *baton, apr
+  * return SVN_NO_ERROR.
+  */
+ static svn_error_t *
+-sub_main(int *exit_code, int argc, const char *argv[], apr_pool_t *pool)
++sub_main(int *exit_code,
++         int argc,
++         const svn_cmdline__argv_char_t *cmdline_argv[],
++         apr_pool_t *pool)
+ {
+   svn_error_t *err;
+   apr_status_t apr_err;
+@@ -2477,6 +2480,7 @@ static svn_error_t *
+   int opt_id;
+   apr_array_header_t *received_opts;
+   int i;
++  const char **argv;
+ 
+   received_opts = apr_array_make(pool, SVN_OPT_MAX_OPTIONS, sizeof(int));
+ 
+@@ -2483,6 +2487,8 @@ static svn_error_t *
+   /* Check library versions */
+   SVN_ERR(check_lib_versions());
+ 
++  SVN_ERR(svn_cmdline__get_cstring_argv(&argv, argc, cmdline_argv, pool));
++
+   /* Initialize the FS library. */
+   SVN_ERR(svn_fs_initialize(pool));
+ 
+@@ -2849,7 +2855,7 @@ static svn_error_t *
+ }
+ 
+ int
+-main(int argc, const char *argv[])
++SVN_CMDLINE__MAIN(int argc, const svn_cmdline__argv_char_t *argv[])
+ {
+   apr_pool_t *pool;
+   int exit_code = EXIT_SUCCESS;
+Index: subversion/svnmucc/svnmucc.c
+===================================================================
+--- subversion/svnmucc/svnmucc.c	(revision 1920475)
++++ subversion/svnmucc/svnmucc.c	(working copy)
+@@ -467,7 +467,10 @@ log_message_func(const char **log_msg,
+  * return SVN_NO_ERROR.
+  */
+ static svn_error_t *
+-sub_main(int *exit_code, int argc, const char *argv[], apr_pool_t *pool)
++sub_main(int *exit_code,
++         int argc,
++         const svn_cmdline__argv_char_t *cmdline_argv[],
++         apr_pool_t *pool)
+ {
+   apr_array_header_t *actions = apr_array_make(pool, 1,
+                                                sizeof(struct action *));
+@@ -533,10 +536,13 @@ static svn_error_t *
+   struct log_message_baton lmb;
+   int i;
+   svn_boolean_t read_pass_from_stdin = FALSE;
++  const char **argv;
+ 
+   /* Check library versions */
+   SVN_ERR(check_lib_versions());
+ 
++  SVN_ERR(svn_cmdline__get_cstring_argv(&argv, argc, cmdline_argv, pool));
++
+   /* Initialize the RA library. */
+   SVN_ERR(svn_ra_initialize(pool));
+ 
+@@ -980,7 +986,7 @@ static svn_error_t *
+ }
+ 
+ int
+-main(int argc, const char *argv[])
++SVN_CMDLINE__MAIN(int argc, const svn_cmdline__argv_char_t *argv[])
+ {
+   apr_pool_t *pool;
+   int exit_code = EXIT_SUCCESS;
+Index: subversion/svnrdump/svnrdump.c
+===================================================================
+--- subversion/svnrdump/svnrdump.c	(revision 1920475)
++++ subversion/svnrdump/svnrdump.c	(working copy)
+@@ -784,7 +784,10 @@ validate_and_resolve_revisions(opt_baton_t *opt_ba
+  * return SVN_NO_ERROR.
+  */
+ static svn_error_t *
+-sub_main(int *exit_code, int argc, const char *argv[], apr_pool_t *pool)
++sub_main(int *exit_code,
++         int argc,
++         const svn_cmdline__argv_char_t *cmdline_argv[],
++         apr_pool_t *pool)
+ {
+   svn_error_t *err = SVN_NO_ERROR;
+   const svn_opt_subcommand_desc3_t *subcommand = NULL;
+@@ -806,7 +809,10 @@ static svn_error_t *
+   apr_array_header_t *received_opts;
+   int i;
+   svn_boolean_t read_pass_from_stdin = FALSE;
++  const char **argv;
+ 
++  SVN_ERR(svn_cmdline__get_cstring_argv(&argv, argc, cmdline_argv, pool));
++
+   opt_baton = apr_pcalloc(pool, sizeof(*opt_baton));
+   opt_baton->start_revision.kind = svn_opt_revision_unspecified;
+   opt_baton->end_revision.kind = svn_opt_revision_unspecified;
+@@ -1155,7 +1161,7 @@ static svn_error_t *
+ }
+ 
+ int
+-main(int argc, const char *argv[])
++SVN_CMDLINE__MAIN(int argc, const svn_cmdline__argv_char_t *argv[])
+ {
+   apr_pool_t *pool;
+   int exit_code = EXIT_SUCCESS;
+Index: subversion/svnserve/svnserve.c
+===================================================================
+--- subversion/svnserve/svnserve.c	(revision 1920475)
++++ subversion/svnserve/svnserve.c	(working copy)
+@@ -703,7 +703,10 @@ check_lib_versions(void)
+  * return SVN_NO_ERROR.
+  */
+ static svn_error_t *
+-sub_main(int *exit_code, int argc, const char *argv[], apr_pool_t *pool)
++sub_main(int *exit_code,
++         int argc,
++         const svn_cmdline__argv_char_t *cmdline_argv[],
++         apr_pool_t *pool)
+ {
+   enum run_mode run_mode = run_mode_unspecified;
+   svn_boolean_t foreground = FALSE;
+@@ -742,6 +745,8 @@ static svn_error_t *
+   svn_node_kind_t kind;
+   apr_size_t min_thread_count = THREADPOOL_MIN_SIZE;
+   apr_size_t max_thread_count = THREADPOOL_MAX_SIZE;
++  const char **argv;
++
+ #ifdef SVN_HAVE_SASL
+   SVN_ERR(cyrus_init(pool));
+ #endif
+@@ -749,6 +754,8 @@ static svn_error_t *
+   /* Check library versions */
+   SVN_ERR(check_lib_versions());
+ 
++  SVN_ERR(svn_cmdline__get_cstring_argv(&argv, argc, cmdline_argv, pool));
++
+   /* Initialize the FS library. */
+   SVN_ERR(svn_fs_initialize(pool));
+ 
+@@ -1395,7 +1402,7 @@ static svn_error_t *
+ }
+ 
+ int
+-main(int argc, const char *argv[])
++SVN_CMDLINE__MAIN(int argc, const svn_cmdline__argv_char_t *argv[])
+ {
+   apr_pool_t *pool;
+   int exit_code = EXIT_SUCCESS;
+Index: subversion/svnsync/svnsync.c
+===================================================================
+--- subversion/svnsync/svnsync.c	(revision 1920475)
++++ subversion/svnsync/svnsync.c	(working copy)
+@@ -1963,7 +1963,10 @@ help_cmd(apr_getopt_t *os, void *baton, apr_pool_t
+  * return SVN_NO_ERROR.
+  */
+ static svn_error_t *
+-sub_main(int *exit_code, int argc, const char *argv[], apr_pool_t *pool)
++sub_main(int *exit_code,
++         int argc,
++         const svn_cmdline__argv_char_t *cmdline_argv[],
++         apr_pool_t *pool)
+ {
+   const svn_opt_subcommand_desc3_t *subcommand = NULL;
+   apr_array_header_t *received_opts;
+@@ -1978,10 +1981,13 @@ static svn_error_t *
+   apr_array_header_t *config_options = NULL;
+   const char *source_prop_encoding = NULL;
+   svn_boolean_t force_interactive = FALSE;
++  const char **argv;
+ 
+   /* Check library versions */
+   SVN_ERR(check_lib_versions());
+ 
++  SVN_ERR(svn_cmdline__get_cstring_argv(&argv, argc, cmdline_argv, pool));
++
+   SVN_ERR(svn_ra_initialize(pool));
+ 
+   /* Initialize the option baton. */
+@@ -2402,7 +2408,7 @@ static svn_error_t *
+ }
+ 
+ int
+-main(int argc, const char *argv[])
++SVN_CMDLINE__MAIN(int argc, const svn_cmdline__argv_char_t *argv[])
+ {
+   apr_pool_t *pool;
+   int exit_code = EXIT_SUCCESS;
+Index: subversion/svnversion/svnversion.c
+===================================================================
+--- subversion/svnversion/svnversion.c	(revision 1920475)
++++ subversion/svnversion/svnversion.c	(working copy)
+@@ -124,7 +124,10 @@ check_lib_versions(void)
+  * program.  Obviously we don't want to have to run svn when building svn.
+  */
+ static svn_error_t *
+-sub_main(int *exit_code, int argc, const char *argv[], apr_pool_t *pool)
++sub_main(int *exit_code,
++         int argc,
++         const svn_cmdline__argv_char_t *cmdline_argv[],
++         apr_pool_t *pool)
+ {
+   const char *wc_path, *trail_url;
+   const char *local_abspath;
+@@ -146,10 +149,13 @@ static svn_error_t *
+        N_("no progress (only errors) to stderr")},
+       {0,             0,  0,  0}
+     };
++  const char **argv;
+ 
+   /* Check library versions */
+   SVN_ERR(check_lib_versions());
+ 
++  SVN_ERR(svn_cmdline__get_cstring_argv(&argv, argc, cmdline_argv, pool));
++
+ #if defined(WIN32) || defined(__CYGWIN__)
+   /* Set the working copy administrative directory name. */
+   if (getenv("SVN_ASP_DOT_NET_HACK"))
+@@ -289,7 +295,7 @@ static svn_error_t *
+ }
+ 
+ int
+-main(int argc, const char *argv[])
++SVN_CMDLINE__MAIN(int argc, const svn_cmdline__argv_char_t *argv[])
+ {
+   apr_pool_t *pool;
+   int exit_code = EXIT_SUCCESS;
+Index: tools/client-side/svn-mergeinfo-normalizer/svn-mergeinfo-normalizer.c
+===================================================================
+--- tools/client-side/svn-mergeinfo-normalizer/svn-mergeinfo-normalizer.c	(revision 1920475)
++++ tools/client-side/svn-mergeinfo-normalizer/svn-mergeinfo-normalizer.c	(working copy)
+@@ -408,7 +408,10 @@ svn_min__check_cancel(void *baton)
+  * return SVN_NO_ERROR.
+  */
+ static svn_error_t *
+-sub_main(int *exit_code, int argc, const char *argv[], apr_pool_t *pool)
++sub_main(int *exit_code,
++         int argc,
++         const svn_cmdline__argv_char_t *cmdline_argv[],
++         apr_pool_t *pool)
+ {
+   svn_error_t *err;
+   int opt_id;
+@@ -425,6 +428,7 @@ static svn_error_t *
+   svn_boolean_t force_interactive = FALSE;
+   apr_hash_t *cfg_hash;
+   svn_boolean_t read_pass_from_stdin = FALSE;
++  const char **argv;
+ 
+   received_opts = apr_array_make(pool, SVN_OPT_MAX_OPTIONS, sizeof(int));
+ 
+@@ -431,6 +435,8 @@ static svn_error_t *
+   /* Check library versions */
+   SVN_ERR(check_lib_versions());
+ 
++  SVN_ERR(svn_cmdline__get_cstring_argv(&argv, argc, cmdline_argv, pool));
++
+ #if defined(WIN32) || defined(__CYGWIN__)
+   /* Set the working copy administrative directory name. */
+   if (getenv("SVN_ASP_DOT_NET_HACK"))
+@@ -946,7 +952,7 @@ static svn_error_t *
+ }
+ 
+ int
+-main(int argc, const char *argv[])
++SVN_CMDLINE__MAIN(int argc, const svn_cmdline__argv_char_t *argv[])
+ {
+   apr_pool_t *pool;
+   int exit_code = EXIT_SUCCESS;
+Index: tools/client-side/svnconflict/svnconflict.c
+===================================================================
+--- tools/client-side/svnconflict/svnconflict.c	(revision 1920475)
++++ tools/client-side/svnconflict/svnconflict.c	(working copy)
+@@ -632,7 +632,10 @@ svnconflict_resolve_tree(apr_getopt_t *os, void *b
+  * return SVN_NO_ERROR.
+  */
+ static svn_error_t *
+-sub_main(int *exit_code, int argc, const char *argv[], apr_pool_t *pool)
++sub_main(int *exit_code,
++         int argc,
++         const svn_cmdline__argv_char_t *cmdline_argv[],
++         apr_pool_t *pool)
+ {
+   svn_error_t *err;
+   int opt_id;
+@@ -647,6 +650,7 @@ static svn_error_t *
+   svn_config_t *cfg_config;
+   apr_hash_t *cfg_hash;
+   svn_boolean_t read_pass_from_stdin = FALSE;
++  const char **argv;
+ 
+   received_opts = apr_array_make(pool, SVN_OPT_MAX_OPTIONS, sizeof(int));
+ 
+@@ -653,6 +657,8 @@ static svn_error_t *
+   /* Check library versions */
+   SVN_ERR(check_lib_versions());
+ 
++  SVN_ERR(svn_cmdline__get_cstring_argv(&argv, argc, cmdline_argv, pool));
++
+ #if defined(WIN32) || defined(__CYGWIN__)
+   /* Set the working copy administrative directory name. */
+   if (getenv("SVN_ASP_DOT_NET_HACK"))
+@@ -949,7 +955,7 @@ static svn_error_t *
+ }
+ 
+ int
+-main(int argc, const char *argv[])
++SVN_CMDLINE__MAIN(int argc, const svn_cmdline__argv_char_t *argv[])
+ {
+   apr_pool_t *pool;
+   int exit_code = EXIT_SUCCESS;
+Index: tools/dev/svnraisetreeconflict/svnraisetreeconflict.c
+===================================================================
+--- tools/dev/svnraisetreeconflict/svnraisetreeconflict.c	(revision 1920475)
++++ tools/dev/svnraisetreeconflict/svnraisetreeconflict.c	(working copy)
+@@ -302,7 +302,10 @@ check_lib_versions(void)
+  * return SVN_NO_ERROR.
+  */
+ static svn_error_t *
+-sub_main(int *exit_code, int argc, const char *argv[], apr_pool_t *pool)
++sub_main(int *exit_code,
++         int argc,
++         const svn_cmdline__argv_char_t *cmdline_argv[],
++         apr_pool_t *pool)
+ {
+   apr_getopt_t *os;
+   const apr_getopt_option_t options[] =
+@@ -313,10 +316,13 @@ static svn_error_t *
+       {0,             0,  0,  0}
+     };
+   apr_array_header_t *remaining_argv;
++  const char **argv;
+ 
+   /* Check library versions */
+   SVN_ERR(check_lib_versions());
+ 
++  SVN_ERR(svn_cmdline__get_cstring_argv(&argv, argc, cmdline_argv, pool));
++
+ #if defined(WIN32) || defined(__CYGWIN__)
+   /* Set the working copy administrative directory name. */
+   if (getenv("SVN_ASP_DOT_NET_HACK"))
+@@ -383,7 +389,7 @@ static svn_error_t *
+ }
+ 
+ int
+-main(int argc, const char *argv[])
++SVN_CMDLINE__MAIN(int argc, const svn_cmdline__argv_char_t *argv[])
+ {
+   apr_pool_t *pool;
+   int exit_code = EXIT_SUCCESS;
+Index: tools/dev/wc-ng/svn-wc-db-tester.c
+===================================================================
+--- tools/dev/wc-ng/svn-wc-db-tester.c	(revision 1920475)
++++ tools/dev/wc-ng/svn-wc-db-tester.c	(working copy)
+@@ -156,7 +156,10 @@ check_lib_versions(void)
+  * return SVN_NO_ERROR.
+  */
+ static svn_error_t *
+-sub_main(int *exit_code, int argc, const char *argv[], apr_pool_t *pool)
++sub_main(int *exit_code,
++         int argc,
++         const svn_cmdline__argv_char_t *cmdline_argv[],
++         apr_pool_t *pool)
+ {
+   apr_getopt_t *os;
+   const apr_getopt_option_t options[] =
+@@ -167,10 +170,13 @@ static svn_error_t *
+       {0,             0,  0,  0}
+     };
+   apr_array_header_t *remaining_argv;
++  const char **argv;
+ 
+   /* Check library versions */
+   SVN_ERR(check_lib_versions());
+ 
++  SVN_ERR(svn_cmdline__get_cstring_argv(&argv, argc, cmdline_argv, pool));
++
+ #if defined(WIN32) || defined(__CYGWIN__)
+   /* Set the working copy administrative directory name. */
+   if (getenv("SVN_ASP_DOT_NET_HACK"))
+@@ -237,7 +243,7 @@ static svn_error_t *
+ }
+ 
+ int
+-main(int argc, const char *argv[])
++SVN_CMDLINE__MAIN(int argc, const svn_cmdline__argv_char_t *argv[])
+ {
+   apr_pool_t *pool;
+   int exit_code = EXIT_SUCCESS;
+Index: tools/server-side/svnauthz.c
+===================================================================
+--- tools/server-side/svnauthz.c	(revision 1920475)
++++ tools/server-side/svnauthz.c	(working copy)
+@@ -490,7 +490,10 @@ canonicalize_access_file(const char **canonicalize
+  * return SVN_NO_ERROR.
+  */
+ static svn_error_t *
+-sub_main(int *exit_code, int argc, const char *argv[], apr_pool_t *pool)
++sub_main(int *exit_code,
++         int argc,
++         const svn_cmdline__argv_char_t *cmdline_argv[],
++         apr_pool_t *pool)
+ {
+   svn_error_t *err;
+ 
+@@ -499,7 +502,10 @@ static svn_error_t *
+   apr_getopt_t *os;
+   apr_array_header_t *received_opts;
+   int i;
++  const char **argv;
+ 
++  SVN_ERR(svn_cmdline__get_cstring_argv(&argv, argc, cmdline_argv, pool));
++
+   /* Initialize the FS library. */
+   SVN_ERR(svn_fs_initialize(pool));
+ 
+@@ -752,7 +758,7 @@ static svn_error_t *
+ }
+ 
+ int
+-main(int argc, const char *argv[])
++SVN_CMDLINE__MAIN(int argc, const svn_cmdline__argv_char_t *argv[])
+ {
+   apr_pool_t *pool;
+   int exit_code = EXIT_SUCCESS;
+@@ -759,7 +765,7 @@ int
+   svn_error_t *err;
+ 
+   /* Initialize the app.  Send all error messages to 'stderr'.  */
+-  if (svn_cmdline_init(argv[0], stderr) != EXIT_SUCCESS)
++  if (svn_cmdline_init("svnauthz", stderr) != EXIT_SUCCESS)
+     return EXIT_FAILURE;
+ 
+   pool = svn_pool_create(NULL);
+]]]

Added: subversion/site/publish/security/CVE-2024-45720-advisory.txt.asc
URL: http://svn.apache.org/viewvc/subversion/site/publish/security/CVE-2024-45720-advisory.txt.asc?rev=1921178&view=auto
==============================================================================
--- subversion/site/publish/security/CVE-2024-45720-advisory.txt.asc (added)
+++ subversion/site/publish/security/CVE-2024-45720-advisory.txt.asc Tue Oct  8 08:47:28 2024
@@ -0,0 +1,11 @@
+-----BEGIN PGP SIGNATURE-----
+
+iQEzBAABCAAdFiEEi8Ta4MWk1l9ARAEHT326qZpZuXMFAmcE7QkACgkQT326qZpZ
+uXPv2Qf8Dvfr1ZYMnXlR68PBCd45APR/p49QYu6ZJ+zgZPqf2feKEZBLxUfroK9H
+U3dPj1tBw24YiQT0udLSVkLHwcu/GfeJkBCJgbp2MiWgur9Zsbv0qMa2ouNUeC+s
+ZNWn8jInJ2omp/TQuaiH/6D26yNjhEFUzp+6Qf8M0DkTI/ft7qUVi1QAVpbmdNuH
+IzexPruzF5LgSnQBTZEBKtaASfXuFoYANlr5Ks38+n9/TcrJ1Q+f8y9cRDaehlvw
+G6M60c6V3BTrFAEEzS90nu8jEtaIP47XXN+q7zdN+fo5XP2nyJ+P4iN6VUj4nI78
++3aIVfD+3BxAdRrtkUboJQBTVJiePw==
+=0QCk
+-----END PGP SIGNATURE-----

Propchange: subversion/site/publish/security/CVE-2024-45720-advisory.txt.asc
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: subversion/site/publish/security/index.html
URL: http://svn.apache.org/viewvc/subversion/site/publish/security/index.html?rev=1921178&r1=1921177&r2=1921178&view=diff
==============================================================================
--- subversion/site/publish/security/index.html (original)
+++ subversion/site/publish/security/index.html Tue Oct  8 08:47:28 2024
@@ -331,6 +331,13 @@ clients using http(s)://</td>
   <td>1.10.0-1.10.7, 1.14.0-1.14.1</td>
   <td>mod_dav_svn is vulnerable to memory corruption</td>
 </tr>
+
+<tr>
+  <td><a href="CVE-2024-45720-advisory.txt">CVE-2024-45720-advisory.txt</a>
+  [<a href="CVE-2024-45720-advisory.txt.asc">PGP</a>]</td>
+  <td>1.0.0-1.10.8, 1.14.0-1.14.3</td>
+  <td>Subversion command line argument injection on Windows platforms</td>
+</tr>
   
 </tbody>
 </table>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.