Author: rhuijben
Date: Thu Aug  5 21:20:56 2010
New Revision: 982791

URL: http://svn.apache.org/viewvc?rev=982791&view=rev
Log:
Remove the update handler specific error handling from libsvn_ra_serf.
This code can just use the common error handling now. This removes the
possible leaking of errors when the two error containers are mixed.

* subversion/libsvn_ra_serf/update.c
  (report_fetch_t): Remove err.
  (cancel_fetch): Return the right no-error value.
  (error_fetch): Return the provided error instead of storing it.
  (handle_stream): Just return the error instead of just storing the
     error and state.
  (open_connection_if_needed): Stop leaking errors.
  (finish_report): Remove old error handling. If we found an error we would
     have seen that earlier.

Modified:
    subversion/trunk/subversion/libsvn_ra_serf/update.c

Modified: subversion/trunk/subversion/libsvn_ra_serf/update.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_ra_serf/update.c?rev=982791&r1=982790&r2=982791&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_ra_serf/update.c (original)
+++ subversion/trunk/subversion/libsvn_ra_serf/update.c Thu Aug  5 21:20:56 2010
@@ -239,9 +239,6 @@ typedef struct report_fetch_t {
   /* Our pool. */
   apr_pool_t *pool;
 
-  /* Non-NULL if we received an error during processing. */
-  svn_error_t *err;
-
   /* The session we should use to fetch the file. */
   svn_ra_serf__session_t *sess;
 
@@ -721,7 +718,7 @@ cancel_fetch(serf_request_t *request,
           fetch_ctx->read_size = 0;
         }
 
-      return APR_SUCCESS;
+      return SVN_NO_ERROR;
     }
 
   /* We have no idea what went wrong. */
@@ -733,8 +730,6 @@ error_fetch(serf_request_t *request,
             report_fetch_t *fetch_ctx,
             svn_error_t *err)
 {
-  fetch_ctx->err = err;
-
   fetch_ctx->done = TRUE;
 
   fetch_ctx->done_item.data = fetch_ctx;
@@ -746,7 +741,7 @@ error_fetch(serf_request_t *request,
   serf_request_set_handler(request,
                            svn_ra_serf__response_discard_handler, NULL);
 
-  return SVN_NO_ERROR;
+  return err;
 }
 
 /* Implements svn_ra_serf__response_handler_t */
@@ -1003,19 +998,25 @@ handle_stream(serf_request_t *request,
   report_fetch_t *fetch_ctx = handler_baton;
   serf_status_line sl;
   const char *location;
+  svn_error_t *err;
 
   serf_bucket_response_status(response, &sl);
 
   /* Woo-hoo.  Nothing here to see.  */
   location = svn_ra_serf__response_get_location(response, pool);
-  fetch_ctx->err = svn_ra_serf__error_on_status(sl.code,
-                                                fetch_ctx->info->name,
-                                                location);
-  if (fetch_ctx->err)
+  
+  err = svn_ra_serf__error_on_status(sl.code,
+                                     fetch_ctx->info->name,
+                                     location);
+  if (err)
     {
       fetch_ctx->done = TRUE;
 
-      return svn_ra_serf__handle_discard_body(request, response, NULL, pool);
+      err = svn_error_compose_create(
+                  err,
+                  svn_ra_serf__handle_discard_body(request, response, NULL, 
pool));
+
+      return svn_error_return(err);
     }
 
   while (1)
@@ -2203,10 +2204,12 @@ open_connection_if_needed(svn_ra_serf__s
 
       /* Authentication protocol specific initalization. */
       if (sess->auth_protocol)
-        sess->auth_protocol->init_conn_func(sess, sess->conns[cur], 
sess->pool);
+        SVN_ERR(sess->auth_protocol->init_conn_func(sess, sess->conns[cur],
+                                                    sess->pool));
       if (sess->proxy_auth_protocol)
-        sess->proxy_auth_protocol->init_conn_func(sess, sess->conns[cur],
-                                                  sess->pool);
+        SVN_ERR(sess->proxy_auth_protocol->init_conn_func(sess,
+                                                          sess->conns[cur],
+                                                          sess->pool));
     }
 
   return SVN_NO_ERROR;
@@ -2386,21 +2389,6 @@ finish_report(void *report_baton,
           report_fetch_t *done_fetch = done_list->data;
           report_dir_t *cur_dir;
 
-          if (done_fetch->err)
-            {
-              svn_error_t *err = done_fetch->err;
-              /* Error found. There might be more, clear those first. */
-              done_list = done_list->next;
-              while (done_list)
-                {
-                  done_fetch = done_list->data;
-                  if (done_fetch->err)
-                    svn_error_clear(done_fetch->err);
-                  done_list = done_list->next;
-                }
-              return err;
-            }
-
           /* decrease our parent's directory refcount. */
           cur_dir = done_fetch->info->dir;
           cur_dir->ref_count--;
@@ -2763,7 +2751,6 @@ svn_ra_serf__get_file(svn_ra_session_t *
       svn_ra_serf__request_create(handler);
 
       SVN_ERR(svn_ra_serf__context_run_wait(&stream_ctx->done, session, pool));
-      SVN_ERR(stream_ctx->err);
     }
 
   return SVN_NO_ERROR;


Reply via email to