[svn.haxx.se] · SVN Dev · SVN Users · SVN Org · TSVN Dev · TSVN Users · Subclipse Dev · Subclipse Users · this month's index

Re: svn commit: r1101990 - /subversion/trunk/subversion/libsvn_client/cmdline.c

From: Julian Foad <julian.foad_at_wandisco.com>
Date: Mon, 27 Jun 2011 16:35:33 +0100

On Wed, 2011-05-11, philip_at_apache.org wrote:
> Author: philip
> Date: Wed May 11 17:24:46 2011
> New Revision: 1101990
>
> URL: http://svn.apache.org/viewvc?rev=1101990&view=rev
> Log:
> Avoid leaking errors about user input when some other runtime error occurs.
>
> * subversion/libsvn_client/cmdline.c
> (svn_client_args_to_target_array): Delay generating errors until returning.

Hi Philip. This changed the behaviour so it no longer matches its
documentation:

 * If a path has the same name as a Subversion working copy
 * administrative directory, return #SVN_ERR_RESERVED_FILENAME_SPECIFIED;
 * if multiple reserved paths are encountered, return a chain of
 * errors, all of which are #SVN_ERR_RESERVED_FILENAME_SPECIFIED. Do
 * not return this type of error in a chain with any other type of
 * error, and if this is the only type of error encountered, complete
 * the operation before returning the error(s).

It should only generate and return error objects corresponding to the
reserved names if there is no other error. I think this patch should
fix it:

[[[
* subversion/libsvn_client/cmdline.c
  (svn_client_args_to_target_array2): Restore documented error behaviour. A
    follow-up to r1101990.
--This line, and those below, will be ignored--

Index: subversion/libsvn_client/cmdline.c
===================================================================
--- subversion/libsvn_client/cmdline.c (revision 1140096)
+++ subversion/libsvn_client/cmdline.c (working copy)
@@ -347,20 +347,10 @@ svn_client_args_to_target_array2(apr_arr
         {
           err = svn_client_root_url_from_path(&root_url, "", ctx, pool);
           if (err || root_url == NULL)
- {
- if (reserved_names)
- for (i = 0; i < reserved_names->nelts; ++i)
- err = svn_error_createf(SVN_ERR_RESERVED_FILENAME_SPECIFIED,
- err,
- _("'%s' ends in a reserved name"),
- APR_ARRAY_IDX(reserved_names, i,
- const char *));
-
- return svn_error_create(SVN_ERR_WC_NOT_WORKING_COPY, err,
- _("Resolving '^/': no repository root "
- "found in the target arguments or "
- "in the current directory"));
- }
+ return svn_error_create(SVN_ERR_WC_NOT_WORKING_COPY, err,
+ _("Resolving '^/': no repository root "
+ "found in the target arguments or "
+ "in the current directory"));
         }
 
       *targets_p = apr_array_make(pool, output_targets->nelts,
@@ -395,7 +385,7 @@ svn_client_args_to_target_array2(apr_arr
   else
     *targets_p = output_targets;
 
- if (reserved_names)
+ if (reserved_names && ! err)
     for (i = 0; i < reserved_names->nelts; ++i)
       err = svn_error_createf(SVN_ERR_RESERVED_FILENAME_SPECIFIED, err,
                               _("'%s' ends in a reserved name"),
]]]

Agree?

- Julian

> Modified: subversion/trunk/subversion/libsvn_client/cmdline.c
> URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/cmdline.c?rev=1101990&r1=1101989&r2=1101990&view=diff
> ==============================================================================
> --- subversion/trunk/subversion/libsvn_client/cmdline.c (original)
> +++ subversion/trunk/subversion/libsvn_client/cmdline.c Wed May 11 17:24:46 2011
> @@ -172,6 +172,7 @@ svn_client_args_to_target_array(apr_arra
> apr_array_make(pool, DEFAULT_ARRAY_SIZE, sizeof(const char *));
> apr_array_header_t *output_targets =
> apr_array_make(pool, DEFAULT_ARRAY_SIZE, sizeof(const char *));
> + apr_array_header_t *reserved_names = NULL;
>
> /* Step 1: create a master array of targets that are in UTF-8
> encoding, and come from concatenating the targets left by apr_getopt,
> @@ -263,12 +264,12 @@ svn_client_args_to_target_array(apr_arra
>
> if (svn_wc_is_adm_dir(base_name, pool))
> {
> - err = svn_error_createf(SVN_ERR_RESERVED_FILENAME_SPECIFIED,
> - err,
> - _("'%s' ends in a reserved name"),
> - utf8_target);
> + if (!reserved_names)
> + reserved_names = apr_array_make(pool, DEFAULT_ARRAY_SIZE,
> + sizeof(const char *));
> +
> + APR_ARRAY_PUSH(reserved_names, const char *) = utf8_target;
>
> - /* ### Error leaks! Mixing SVN_ERR with err is a leak */
> continue;
> }
> }
> @@ -296,14 +297,22 @@ svn_client_args_to_target_array(apr_arra
> */
> if (root_url == NULL)
> {
> - svn_error_t *err2;
> - err2 = svn_client_root_url_from_path(&root_url, "", ctx, pool);
> + err = svn_client_root_url_from_path(&root_url, "", ctx, pool);
> + if (err || root_url == NULL)
> + {
> + if (reserved_names)
> + for (i = 0; i < reserved_names->nelts; ++i)
> + err = svn_error_createf(SVN_ERR_RESERVED_FILENAME_SPECIFIED,
> + err,
> + _("'%s' ends in a reserved name"),
> + APR_ARRAY_IDX(reserved_names, i,
> + const char *));
>
> - if (err2 || root_url == NULL)
> - return svn_error_create(SVN_ERR_WC_NOT_WORKING_COPY, err2,
> - _("Resolving '^/': no repository root "
> - "found in the target arguments or "
> - "in the current directory"));
> + return svn_error_create(SVN_ERR_WC_NOT_WORKING_COPY, err,
> + _("Resolving '^/': no repository root "
> + "found in the target arguments or "
> + "in the current directory"));
> + }
> }
>
> *targets_p = apr_array_make(pool, output_targets->nelts,
> @@ -338,5 +347,11 @@ svn_client_args_to_target_array(apr_arra
> else
> *targets_p = output_targets;
>
> + if (reserved_names)
> + for (i = 0; i < reserved_names->nelts; ++i)
> + err = svn_error_createf(SVN_ERR_RESERVED_FILENAME_SPECIFIED, err,
> + _("'%s' ends in a reserved name"),
> + APR_ARRAY_IDX(reserved_names, i, const char *));
> +
> return svn_error_return(err);
> }
>
>
Received on 2011-06-27 17:36:12 CEST

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.