Author: rhuijben
Date: Tue Mar 17 13:30:24 2015
New Revision: 1667301
URL: http://svn.apache.org/r1667301
Log:
Following up on r1667233, report errors from svnserve's get_location_segments
function in a way that the caller doesn't get a protocol error. Change the
error values to match what get_location_segments would return.
* subversion/svnserve/serve.c
(get_location_segments): Write done before writing the error.
Modified:
subversion/trunk/subversion/svnserve/serve.c
Modified: subversion/trunk/subversion/svnserve/serve.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/svnserve/serve.c?rev=1667301&r1=1667300&r2=1667301&view=diff
==============================================================================
--- subversion/trunk/subversion/svnserve/serve.c (original)
+++ subversion/trunk/subversion/svnserve/serve.c Tue Mar 17 13:30:24 2015
@@ -2517,7 +2517,16 @@ static svn_error_t *get_location_segment
{
svn_revnum_t youngest;
- SVN_CMD_ERR(svn_fs_youngest_rev(&youngest, b->repository->fs, pool));
+ err = svn_fs_youngest_rev(&youngest, b->repository->fs, pool);
+
+ if (err)
+ {
+ err = svn_error_compose_create(
+ svn_ra_svn__write_word(conn, pool, "done"),
+ err);
+
+ return log_fail_and_flush(err, b, conn, pool);
+ }
if (!SVN_IS_VALID_REVNUM(start_rev))
start_rev = youngest;
@@ -2531,7 +2540,8 @@ static svn_error_t *get_location_segment
if (end_rev > start_rev)
{
- err = svn_error_createf(SVN_ERR_INCORRECT_PARAMS, NULL,
+ err = svn_ra_svn__write_word(conn, pool, "done");
+ err = svn_error_createf(SVN_ERR_FS_NO_SUCH_REVISION, err,
"Get-location-segments end revision must not be "
"younger than start revision");
return log_fail_and_flush(err, b, conn, pool);
@@ -2539,7 +2549,8 @@ static svn_error_t *get_location_segment
if (start_rev > peg_revision)
{
- err = svn_error_createf(SVN_ERR_INCORRECT_PARAMS, NULL,
+ err = svn_ra_svn__write_word(conn, pool, "done");
+ err = svn_error_createf(SVN_ERR_FS_NO_SUCH_REVISION, err,
"Get-location-segments start revision must not "
"be younger than peg revision");
return log_fail_and_flush(err, b, conn, pool);
@@ -2559,8 +2570,7 @@ static svn_error_t *get_location_segment
write_err = svn_ra_svn__write_word(conn, pool, "done");
if (write_err)
{
- svn_error_clear(err);
- return write_err;
+ return svn_error_compose_create(write_err, err);
}
SVN_CMD_ERR(err);