Author: philip
Date: Thu Jan 26 16:41:52 2012
New Revision: 1236283

URL: http://svn.apache.org/viewvc?rev=1236283&view=rev
Log:
Try to get errno before it changes.

* subversion/libsvn_ra_svn/cyrus_auth.c
  (get_sasl_errno_msg): Document usage.
  (get_sasl_error): Document usage, query errno earlier.
  (new_sasl_ctx): Query errno earlier.

Modified:
    subversion/trunk/subversion/libsvn_ra_svn/cyrus_auth.c

Modified: subversion/trunk/subversion/libsvn_ra_svn/cyrus_auth.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_ra_svn/cyrus_auth.c?rev=1236283&r1=1236282&r2=1236283&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_ra_svn/cyrus_auth.c (original)
+++ subversion/trunk/subversion/libsvn_ra_svn/cyrus_auth.c Thu Jan 26 16:41:52 
2012
@@ -340,7 +340,8 @@ get_password_cb(sasl_conn_t *conn, void 
 
 /* Sometimes SASL returns SASL_FAIL as RESULT and sets errno.
  * SASL_FAIL translates to "generic error" which is quite unhelpful.
- * Try to append a more informative error message based on errno. */
+ * Try to append a more informative error message based on errno so
+ * should be called before doing anything that may change errno. */
 static const char *
 get_sasl_errno_msg(int result, apr_pool_t *result_pool)
 {
@@ -353,14 +354,16 @@ get_sasl_errno_msg(int result, apr_pool_
 }
 
 /* Wrap an error message from SASL with a prefix that allows users
- * to tell that the error message came from SASL. */
+ * to tell that the error message came from SASL.  Queries errno and
+ * so should be called before doing anything that may change errno. */
 static const char *
 get_sasl_error(sasl_conn_t *sasl_ctx, int result, apr_pool_t *result_pool)
 {
+  const char *sasl_errno_msg = get_sasl_errno_msg(result, result_pool);
+
   return apr_psprintf(result_pool,
                       _("SASL authentication error: %s%s"),
-                      sasl_errdetail(sasl_ctx),
-                      get_sasl_errno_msg(result, result_pool));
+                      sasl_errdetail(sasl_ctx), sasl_errno_msg);
 }
 
 /* Create a new SASL context. */
@@ -380,10 +383,14 @@ static svn_error_t *new_sasl_ctx(sasl_co
                            callbacks, SASL_SUCCESS_DATA,
                            sasl_ctx);
   if (result != SASL_OK)
-    return svn_error_createf(SVN_ERR_RA_NOT_AUTHORIZED, NULL,
-                             _("Could not create SASL context: %s%s"),
-                             sasl_errstring(result, NULL, NULL),
-                             get_sasl_errno_msg(result, pool));
+    {
+      const char *sasl_errno_msg = get_sasl_errno_msg(result, pool);
+
+      return svn_error_createf(SVN_ERR_RA_NOT_AUTHORIZED, NULL,
+                               _("Could not create SASL context: %s%s"),
+                               sasl_errstring(result, NULL, NULL),
+                               sasl_errno_msg);
+    }
   svn_atomic_inc(&sasl_ctx_count);
   apr_pool_cleanup_register(pool, *sasl_ctx, sasl_dispose_cb,
                             apr_pool_cleanup_null);


Reply via email to