Index: subversion/libsvn_client/commit.c
===================================================================
--- subversion/libsvn_client/commit.c	(revision 22277)
+++ subversion/libsvn_client/commit.c	(working copy)
@@ -664,7 +664,10 @@
       SVN_ERR(svn_client__get_log_msg(&log_msg, &tmp_file, commit_items,
                                       ctx, pool));
       if (! log_msg)
-        return SVN_NO_ERROR;
+        {
+          commit_info_p = NULL;
+          return SVN_NO_ERROR;
+        }
       if (tmp_file)
         {
           const char *abs_path;
@@ -804,7 +807,8 @@
 }
 
 static svn_error_t *
-remove_tmpfiles(apr_hash_t *tempfiles,
+remove_tmpfiles(svn_commit_info_t **commit_info_p,
+                apr_hash_t *tempfiles,
                 apr_pool_t *pool)
 {
   apr_hash_index_t *hi;
@@ -812,7 +816,10 @@
 
   /* Split if there's nothing to be done. */
   if (! tempfiles)
-    return SVN_NO_ERROR;
+    {
+      commit_info_p = NULL;
+      return SVN_NO_ERROR;
+    }
 
   /* Make a subpool. */
   subpool = svn_pool_create(pool);
@@ -847,7 +854,8 @@
 
 
 static svn_error_t *
-reconcile_errors(svn_error_t *commit_err,
+reconcile_errors(svn_commit_info_t **commit_info_p,
+                 svn_error_t *commit_err,
                  svn_error_t *unlock_err,
                  svn_error_t *bump_err,
                  svn_error_t *cleanup_err,
@@ -857,7 +865,10 @@
 
   /* Early release (for good behavior). */
   if (! (commit_err || unlock_err || bump_err || cleanup_err))
-    return SVN_NO_ERROR;
+    {
+      commit_info_p = NULL;
+      return SVN_NO_ERROR;
+    }
 
   /* If there was a commit error, start off our error chain with
      that. */
@@ -1599,10 +1610,11 @@
       unlock_err = svn_wc_adm_close(base_dir_access);
 
       if (! unlock_err)
-        cleanup_err = remove_tmpfiles(tempfiles, pool);
+        cleanup_err = remove_tmpfiles(commit_info_p, tempfiles, pool);
     }
 
-  return reconcile_errors(cmt_err, unlock_err, bump_err, cleanup_err, pool);
+  return reconcile_errors(commit_info_p, cmt_err, unlock_err, bump_err, 
+                          cleanup_err, pool);
 }
 
 svn_error_t *
Index: subversion/bindings/swig/include/svn_types.swg
===================================================================
--- subversion/bindings/swig/include/svn_types.swg	(revision 22277)
+++ subversion/bindings/swig/include/svn_types.swg	(working copy)
@@ -42,18 +42,6 @@
 */
 %typemap(in, numinputs=0) SWIGTYPE ** ($*1_ltype temp) "$1 = &temp;";
 
-/* We have a long standing bug where svn_client_commit_info_t and
-   svn_commit_info_t output parameters are not properly initialized to NULL
-   when there is nothing to commit.  This is a workaround.  Yes, it is
-   unspeakably evil that this was not just fixed at source when it was
-   discovered initially. */
-%typemap(in, numinputs=0) BAD_OUTPUT_INIT_HACK ** ($*1_ltype temp = NULL)
-  "$1 = &temp;";
-%apply BAD_OUTPUT_INIT_HACK ** {
-  svn_commit_info_t **,
-  svn_client_commit_info_t **
-};
-
 %typemap(argout,warning="900:FIXME: Missing argout typemap") SWIGTYPE ** {
   /* FIXME: Missing argout typemap: $symname arg $argnum ($1_type) */
 #if defined(SWIGRUBY) && SWIG_VERSION <= 0x010329
@@ -148,7 +136,9 @@
   svn_wc_revision_status_t **,
   svn_wc_status_t **,
   svn_wc_status2_t **,
-  void **set_locks_baton
+  void **set_locks_baton,
+  svn_commit_info_t **,
+  svn_client_commit_info_t **
 };
 
 /* -----------------------------------------------------------------------
