Hi,
I'm not even sure it should be labeled as a patch, more
like a RFC rather. Here's my attempt to close the TODO
for svn_stream_copy3() in stream.c in which the function
"should close the streams ALWAYS, even on error exit".
Since this isn't even a confirmed patch, I haven't made
any modifications to the original comment in svn_io.h.
After this patch has been accepted, then I (or someone)
can remove the TODO. This is my first C patch. Talk
about apprehension.
Log:
[[[
Completed the TODO as stated in svn_io.h for
svn_stream_copy3().
* subversion/libsvn_subr/stream.c
(svn_stream_copy3): Even on error exit, the two files
from and to are closed.
Patch by: Edmund Wong <edmund_at_belfordhk.com>
]]]
------------------------------------------------------
http://subversion.tigris.org/ds/viewMessage.do?dsForumId=462&dsMessageId=1590141
Index: subversion/libsvn_subr/stream.c
===================================================================
--- subversion/libsvn_subr/stream.c (revision 37093)
+++ subversion/libsvn_subr/stream.c (working copy)
@@ -210,6 +210,8 @@
apr_pool_t *scratch_pool)
{
char *buf = apr_palloc(scratch_pool, SVN__STREAM_CHUNK_SIZE);
+ svn_error_t *svn_err__save_error;
+ svn_error_t *svn_err__save_error2;
/* Read and write chunks until we get a short read, indicating the
end of the stream. (We can't get a short write without an
@@ -218,18 +220,54 @@
{
apr_size_t len = SVN__STREAM_CHUNK_SIZE;
- if (cancel_func)
- SVN_ERR(cancel_func(cancel_baton));
-
- SVN_ERR(svn_stream_read(from, buf, &len));
- if (len > 0)
- SVN_ERR(svn_stream_write(to, buf, &len));
- if (len != SVN__STREAM_CHUNK_SIZE)
- break;
+ if (cancel_func)
+ *svn_err__save_error = cancel_func(cancel_baton);
+
+ if (! svn_err__save_error)
+ {
+ *svn_err__save_error = svn_stream_read(from, buf, &len);
+ if (! svn_err__save_error)
+ {
+ if (len > 0)
+ {
+ *svn_err__save_error = svn_stream_write(to, buf, &len);
+ if (! svn_err__save_error)
+ {
+ if (len != SVN__STREAM_CHUNK_SIZE)
+ break;
+ }
+ else
+ {
+ break;
+ }
+ }
+ }
+ else
+ {
+ break;
+ }
+ }
+ else
+ {
+ break;
+ }
}
- return svn_error_compose_create(svn_stream_close(from),
- svn_stream_close(to));
+ if (!svn_err__save_error)
+ {
+ svn_err__save_error = svn_error_compose_create(svn_stream_close(from),
+ svn_stream_close(to));
+ }
+ else
+ {
+ svn_err__save_error2 = svn_error_compose_create(svn_stream_close(from),
+ svn_stream_close(to));
+ svn_err__save_error = svn_error_compose_create(svn_err__save_error2,
+ svn_err__save_error);
+ }
+
+
+ return svn_err__save_error;
}
svn_error_t *
Received on 2009-04-08 07:00:39 CEST