Re: [PATCH] Re: [Issue 816] - Silent failure in svn log -r
From: Kieran <kieran_at_esperi.demon.co.uk>
Date: 2002-07-30 07:27:32 CEST
On 29 Jul 2002, Philip Martin wrote:
> > @@ -151,6 +153,51 @@
Again, I hope I've fixed it.
> b) I think you broke it.
Another patch attached below. Thanks for the feedback.
Regards
Kieran
-- Fix for issue 816 * subversion/libsvn_client/log.c (svn_client_log): Tests added to ensure version numbers passed to it are between 0 and head inclusive Throws SVN_ERR_CLIENT_BAD_REVISION if new tests fail. * subversion/include/svn_client.h (svn_client_log comment text): amended to mention the new revision number tests. Index: subversion/libsvn_client/log.c =================================================================== --- subversion/libsvn_client/log.c +++ subversion/libsvn_client/log.c Tue Jul 30 06:16:37 2002 @@ -62,9 +62,11 @@ const char *URL; const char *base_name = NULL; apr_array_header_t *condensed_targets; - svn_revnum_t start_revnum, end_revnum; + svn_revnum_t start_revnum, end_revnum, youngest_rev; svn_error_t *err; + svn_client_revision_t head; + head.kind = svn_client_revision_head; if ((start->kind == svn_client_revision_unspecified) || (end->kind == svn_client_revision_unspecified)) { @@ -73,7 +75,7 @@ "svn_client_log: caller failed to supply revision"); } - start_revnum = end_revnum = SVN_INVALID_REVNUM; + start_revnum = end_revnum = youngest_rev = SVN_INVALID_REVNUM; path = (APR_ARRAY_IDX(targets, 0, const char *)); @@ -152,6 +154,83 @@ SVN_ERR (svn_client__get_revision_number (&end_revnum, ra_lib, session, end, base_name, pool)); + /* To save on network access, we check whether we already have head */ + if (start->kind == svn_client_revision_head) + youngest_rev = start_revnum; + else if (end->kind == svn_client_revision_head) + youngest_rev = end_revnum; + else + SVN_ERR (svn_client__get_revision_number + (&youngest_rev, ra_lib, session, &head, base_name, pool)); + + /* If the repository has at least one version, we can check the bounds + strictly */ + if (youngest_rev != 0 ) + { + /* Here, we check that the versions input were valid. If not, we + return an error */ + if (start_revnum > youngest_rev && end_revnum > youngest_rev) + { + return svn_error_createf + (SVN_ERR_CLIENT_BAD_REVISION, 0, NULL, pool, + "Both revision numbers too high: %" + SVN_REVNUM_T_FMT " and %" SVN_REVNUM_T_FMT + ". Head is %" SVN_REVNUM_T_FMT ".", + start_revnum, end_revnum, youngest_rev); + } + + if (start_revnum > youngest_rev || end_revnum > youngest_rev) + { + return svn_error_createf + (SVN_ERR_CLIENT_BAD_REVISION, 0, NULL, pool, + "Revision number too high: %" SVN_REVNUM_T_FMT + ". Head is %" SVN_REVNUM_T_FMT ".", + (start_revnum > end_revnum) ? start_revnum : end_revnum, + youngest_rev); + } + } + else + { + /* Special case of an empty repository. See comment below for details */ + if (start_revnum > 1 && end_revnum > 1) + { + return svn_error_createf + (SVN_ERR_CLIENT_BAD_REVISION, 0, NULL, pool, + "Both revision numbers too high: %" + SVN_REVNUM_T_FMT " and %" SVN_REVNUM_T_FMT + ".", start_revnum, end_revnum); + } + + if (start_revnum > youngest_rev + 1|| end_revnum > youngest_rev + 1) + { + return svn_error_createf + (SVN_ERR_CLIENT_BAD_REVISION, 0, NULL, pool, + "Revision number too high: %" SVN_REVNUM_T_FMT + ".", (start_revnum > end_revnum) ? start_revnum : end_revnum); + } + + + } + if (start_revnum < 0 && end_revnum < 0) + { + return svn_error_createf + (SVN_ERR_CLIENT_BAD_REVISION, 0, NULL, pool, + "Both revision numbers are negative: %" + SVN_REVNUM_T_FMT " and %" SVN_REVNUM_T_FMT + ". Negative revision number are not allowed.", + start_revnum, end_revnum); + + } + + if (start_revnum < 0 || end_revnum < 0) + { + return svn_error_createf + (SVN_ERR_CLIENT_BAD_REVISION, 0, NULL, pool, + "Revision number negative: %" SVN_REVNUM_T_FMT + ". Negative revision numbers are not allowed.", + (start_revnum < end_revnum) ? start_revnum : end_revnum); + } + err = ra_lib->get_log (session, condensed_targets, start_revnum, @@ -179,9 +258,7 @@ && ((end->kind == svn_client_revision_number) && (end->value.number == 1))) { - svn_revnum_t youngest_rev; - - SVN_ERR (ra_lib->get_latest_revnum (session, &youngest_rev)); + if (youngest_rev == 0) { err = SVN_NO_ERROR; Index: subversion/include/svn_client.h =================================================================== --- subversion/include/svn_client.h +++ subversion/include/svn_client.h Mon Jul 29 01:24:52 2002 @@ -557,6 +557,13 @@ If START->kind or END->kind is svn_client_revision_unspecified, return the error SVN_ERR_CLIENT_BAD_REVISION. + If the version number returned after canonicalising either START or + FINISH is greater than that of head, return the error + SVN_ERR_CLIENT_BAD_REVISION + + If the version number returned after canonicalising either START or + FINISH is negative, return the error SVN_ERR_CLIENT_BAD_REVISION + Use POOL for any temporary allocation. Special case for repositories at revision 0: --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org For additional commands, e-mail: dev-help@subversion.tigris.orgReceived on Tue Jul 30 07:28:32 2002 |
This is an archived mail posted to the Subversion Dev mailing list.
This site is subject to the Apache Privacy Policy and the Apache Public Forum Archive Policy.