Hi again,

I made several patches which will fix the issue.
svn-info-assert-path.patch.txt and svn-info-fix-revision-kind.patch.txt
files are attached to this email.

Any thoughts?

On Fri, May 2, 2025 at 4:20 PM Timofei Zhakov <t...@chemodax.net> wrote:

> Hi,
>
> I was consuming the Subversion API, especially requesting the working copy
> information, and noticed a little bit of weird behaviour when the WORKING
> revision kind was specified. For some reason, it makes a request to a
> server, even if it shouldn't. However, if svn_opt_revision_unspecified
> revision kind is passed instead, everything works perfectly as a local
> working copy operation.
>
> I dug down into the implementation a little bit, and noticed this block of
> code: [1]. Here, info decides whether to do a lookup into WC DB or make an
> RA request. However, the branch for local info is being invoked only if the
> kind of both revision and peg revision are 'unspecified', but 'working'
> doesn't trigger it. Maybe, the svn_opt_revision_base revision kind should
> be considered as local, but I'm not sure, because there is a reason for
> svn_client_info4 to execute on the target itself but not its working and
> base variants if you get what I mean. But this is a reason against
> supporting info for 'working' revision. Still, this must be either
> disallowed or optimised. What do you think?
>
> Also, I noticed that it doesn't assert the abspath_or_url argument whether
> it's a local abspath or not. This may cause a crash later on.
>
> Am I right with this or is there conceptual proof behind?
>
> [1]
> https://github.com/apache/subversion/blob/54e2d898f180c47050d0fc788f75ab5e2e43f6e1/subversion/libsvn_client/info.c#L353
>
> --
> Timofei Zhakov
>


-- 
Timofei Zhakov
Ensure a path was given to client's info command when performing
a local operation since url target is invalid in this case.

* subversion/libsvn_client/info.c
  (includes): Add svn_path.h
  (svn_client_info4): Add assertion

Index: subversion/libsvn_client/info.c
===================================================================
--- subversion/libsvn_client/info.c     (revision 1925415)
+++ subversion/libsvn_client/info.c     (working copy)
@@ -29,6 +29,7 @@
 #include "svn_client.h"
 #include "svn_dirent_uri.h"
 #include "svn_hash.h"
+#include "svn_path.h"
 #include "svn_pools.h"
 #include "svn_sorts.h"
 
@@ -355,6 +356,9 @@
       && (peg_revision == NULL
           || peg_revision->kind == svn_opt_revision_unspecified))
     {
+      /* Ensure a path was given since a local operation is being performed */
+      SVN_ERR_ASSERT(! svn_path_is_url(abspath_or_url));
+
       /* Do all digging in the working copy. */
       wc_info_receiver_baton_t b;
 
Perform working copy operation in client's info command even if `working`
or `base` revision's or peg_revision's kinds were given.

* subversion/libsvn_client/info.c
  (svn_client_info4): Ditto.

Index: subversion/libsvn_client/info.c
===================================================================
--- subversion/libsvn_client/info.c     (revision 1925415)
+++ subversion/libsvn_client/info.c     (working copy)
@@ -351,9 +352,13 @@
     depth = svn_depth_empty;
 
   if ((revision == NULL
-       || revision->kind == svn_opt_revision_unspecified)
+       || revision->kind == svn_opt_revision_unspecified
+       || revision->kind == svn_opt_revision_working
+       || revision->kind == svn_opt_revision_base)
       && (peg_revision == NULL
-          || peg_revision->kind == svn_opt_revision_unspecified))
+          || peg_revision->kind == svn_opt_revision_unspecified
+          || peg_revision->kind == svn_opt_revision_working
+          || peg_revision->kind == svn_opt_revision_base))
     {
       /* Do all digging in the working copy. */
       wc_info_receiver_baton_t b;

Reply via email to