On Fri, Jul 26, 2024 at 6:35 PM <dsahlb...@apache.org> wrote:
>
> Author: dsahlberg
> Date: Fri Jul 26 16:33:52 2024
> New Revision: 1919535
>
> URL: http://svn.apache.org/viewvc?rev=1919535&view=rev
> Log:
> Fix the check for limit < 0 in svnlook.
>
> strtol will parse a signed long and thus for example accept -1. But the limit
> field in opt_state is apr_size_t which can be an unsigned type. If this is the
> case, the later check for opt_state.limit <= 0 will not see -1 but rather
> INT_MAX (or LONG_MAX or whatever) and thus the error message "Argument to
> --limit must be positive" is never shown.
>
> Changing the check to be the same as in subversion/svn/svn.c. This has a few
> implications:
> - The limit in svn.c is int. If apr_size_t was larger this means a lower
>   maximum for --limit is now enforced.
> - svnlook and svn now behave the same with regards to the limit option.
>
> * subversion/svnlook/svnlook.c:
>   (struct svnlook_opt_state),
>   (struct svnlook_ctxt_t),
>   (struct print_history_baton): change limit from apr_size to int
>   (sub_main): Change handling of opt_id == 'l' to the same as in svn.c
>
> See dev@: https://lists.apache.org/thread/kg36nodcgtgkcfww8qy88kyl7h46ry7x
>
> Found by: zongga...@tencent.com
>
>
> Modified:
>     subversion/trunk/subversion/svnlook/svnlook.c
>
> Modified: subversion/trunk/subversion/svnlook/svnlook.c
> URL: 
> http://svn.apache.org/viewvc/subversion/trunk/subversion/svnlook/svnlook.c?rev=1919535&r1=1919534&r2=1919535&view=diff
> ==============================================================================
> --- subversion/trunk/subversion/svnlook/svnlook.c (original)
> +++ subversion/trunk/subversion/svnlook/svnlook.c Fri Jul 26 16:33:52 2024
> @@ -363,7 +363,7 @@ struct svnlook_opt_state
>    const char *txn;
>    svn_boolean_t version;          /* --version */
>    svn_boolean_t show_ids;         /* --show-ids */
> -  apr_size_t limit;               /* --limit */
> +  int limit;                      /* --limit */
>    svn_boolean_t help;             /* --help */
>    svn_boolean_t no_diff_deleted;  /* --no-diff-deleted */
>    svn_boolean_t no_diff_added;    /* --no-diff-added */
> @@ -391,7 +391,7 @@ typedef struct svnlook_ctxt_t
>    svn_fs_t *fs;
>    svn_boolean_t is_revision;
>    svn_boolean_t show_ids;
> -  apr_size_t limit;
> +  int limit;
>    svn_boolean_t no_diff_deleted;
>    svn_boolean_t no_diff_added;
>    svn_boolean_t diff_copy_from;
> @@ -1579,7 +1579,7 @@ struct print_history_baton
>  {
>    svn_fs_t *fs;
>    svn_boolean_t show_ids;    /* whether to show node IDs */
> -  apr_size_t limit;          /* max number of history items */
> +  int limit;                 /* max number of history items */
>    apr_size_t count;          /* number of history items processed */
>  };
>
> @@ -2582,11 +2582,12 @@ sub_main(int *exit_code, int argc, const
>
>          case 'l':
>            {
> -            char *end;
> -            opt_state.limit = strtol(opt_arg, &end, 10);
> -            if (end == opt_arg || *end != '\0')
> +            const char *utf8_opt_arg;
> +            SVN_ERR(svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool));
> +            svn_error_t *err = svn_cstring_atoi(&opt_state.limit, 
> utf8_opt_arg);
> +            if (err)
>                {
> -                return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
> +                return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, err ,
>                                          _("Non-numeric limit argument 
> given"));
>                }
>              if (opt_state.limit <= 0)
>
>

I found that it fails on Linux, if maintainer mode is enabled (if
configured with --enable-maintainer-mode option). Providing the
detailed log above:

[[[
subversion/svnlook/svnlook.c: In function 'sub_main':
subversion/svnlook/svnlook.c:2587:26: warning: declaration of 'err'
shadows a previous local [-Wshadow]
 2587 |             svn_error_t *err =
svn_cstring_atoi(&opt_state.limit, utf8_opt_arg);
      |                          ^~~
subversion/svnlook/svnlook.c:2471:16: note: shadowed declaration is here
 2471 |   svn_error_t *err;
      |                ^~~
subversion/svnlook/svnlook.c:2587:13: error: ISO C90 forbids mixed
declarations and code [-Werror=declaration-after-statement]
 2587 |             svn_error_t *err =
svn_cstring_atoi(&opt_state.limit, utf8_opt_arg);
      |             ^~~~~~~~~~~
]]]


--
Timofei Zhakov

Reply via email to