coreutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: FYI, more id.c changes


From: Jim Meyering
Subject: Re: FYI, more id.c changes
Date: Fri, 27 Apr 2012 23:00:11 +0200

Jim Meyering wrote:

> Jim Meyering wrote:
>> While investigating today's bug, I noticed that a plain old "id -G"
>> would call getcon unnecessarily.  It's not going to print a context
>> string, so it obviously doesn't need to call getcon.
>>
>> While addressing that, factoring and cleaning up, I noticed this:
>>
>>     Old behavior: nonsensical diagnostic, since with -Z,
>>     you don't get the default format:
>>
>>         $ id -Z -n
>>         id: cannot print only names or real IDs in default format
>>
>>     New: -n is ignored with --context (-Z)
>>
>>         $ src/id -Z -n
>>         unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
>>
>> Considering it's at least two separate issues, I will separate this
>> into two (or more) patches, with at least one more test:
>
> Just as well that I separated them.
> In doing so, I found an additional "argc - optind" to factor out.
> I haven't added a test for the second or third patches -- out of time,
> and they don't seem worth it.  However, if someone else would like to,
> you're welcome.
>
>>From a6719d9f7252bbd85eaab840a61dfc93d57b05c5 Mon Sep 17 00:00:00 2001
> From: Jim Meyering <address@hidden>
> Date: Fri, 27 Apr 2012 20:44:58 +0200
> Subject: [PATCH 1/3] maint: id: minor factorization
>
> * src/id.c (main): Factor out uses of "argc - optind".
> Move option-consistency checks to precede the potential getcon call.
> ---
>  src/id.c |   23 ++++++++++++-----------
>  1 file changed, 12 insertions(+), 11 deletions(-)
>
> diff --git a/src/id.c b/src/id.c
> index c600e63..e1b51e7 100644
> --- a/src/id.c
> +++ b/src/id.c
> @@ -163,34 +163,35 @@ main (int argc, char **argv)
>          }
>      }
>
> -  if (1 < argc - optind)
> +  size_t n_ids = argc - optind;
> +  if (1 < n_ids)
>      {
>        error (0, 0, _("extra operand %s"), quote (argv[optind + 1]));
>        usage (EXIT_FAILURE);
>      }
>
> -  if (argc - optind == 1 && just_context)
> +  if (n_ids && just_context)
>      error (EXIT_FAILURE, 0,
>             _("cannot print security context when user specified"));
>
> +  if (just_user + just_group + just_group_list + just_context > 1)
> +    error (EXIT_FAILURE, 0, _("cannot print \"only\" of more than one 
> choice"));
> +
> +  if (just_user + just_group + just_group_list == 0 && (use_real || 
> use_name))
> +    error (EXIT_FAILURE, 0,
> +           _("cannot print only names or real IDs in default format"));
> +
>    /* If we are on a selinux-enabled kernel and no user is specified,
>       get our context. Otherwise, leave the context variable alone -
>       it has been initialized known invalid value and will be not
>       displayed in print_full_info() */
> -  if (selinux_enabled && argc == optind)
> +  if (selinux_enabled && n_ids == 0)
>      {
>        if (getcon (&context) && just_context)
>          error (EXIT_FAILURE, 0, _("can't get process context"));
>      }
>
> -  if (just_user + just_group + just_group_list + just_context > 1)
> -    error (EXIT_FAILURE, 0, _("cannot print \"only\" of more than one 
> choice"));
> -
> -  if (just_user + just_group + just_group_list == 0 && (use_real || 
> use_name))
> -    error (EXIT_FAILURE, 0,
> -           _("cannot print only names or real IDs in default format"));
> -
> -  if (argc - optind == 1)
> +  if (n_ids == 1)
>      {
>        struct passwd *pwd = getpwnam (argv[optind]);
>        if (pwd == NULL)
> --
> 1.7.10.365.g7cacb
>
>
>>From fbbb4e0e351f528dc662064b413bcd76c44767fc Mon Sep 17 00:00:00 2001
> From: Jim Meyering <address@hidden>
> Date: Fri, 27 Apr 2012 21:24:03 +0200
> Subject: [PATCH 2/3] id: don't call getcon unnecessarily
>
> * src/id.c (main): Invocations like "id" and "id -G" would call getcon
> to determine the current security context even though that result would
> not be used.  Similarly, when POSIXLY_CORRECT is set.  Rearrange
> conditionals and hoist the POSIXLY_CORRECT test so that we call
> getcon only when necessary.
> ---
>  src/id.c |   21 ++++++++++++++-------
>  1 file changed, 14 insertions(+), 7 deletions(-)
>
> diff --git a/src/id.c b/src/id.c
> index e1b51e7..058622c 100644
> --- a/src/id.c
> +++ b/src/id.c
> @@ -177,16 +177,23 @@ main (int argc, char **argv)
>    if (just_user + just_group + just_group_list + just_context > 1)
>      error (EXIT_FAILURE, 0, _("cannot print \"only\" of more than one 
> choice"));
>
> -  if (just_user + just_group + just_group_list == 0 && (use_real || 
> use_name))
> +  if (default_format && (use_real || use_name))
>      error (EXIT_FAILURE, 0,
>             _("cannot print only names or real IDs in default format"));
>
> -  /* If we are on a selinux-enabled kernel and no user is specified,
> -     get our context. Otherwise, leave the context variable alone -
> -     it has been initialized known invalid value and will be not
> -     displayed in print_full_info() */
> -  if (selinux_enabled && n_ids == 0)
> +  bool default_format = (just_user + just_group + just_group_list == 0);

Well, don't waste time looking at those.
In a last-minute rebase, I didn't notice that while
resolving a conflict I moved the declaration of default_format
to be after the first use.  Oops.  Adjusting...



reply via email to

[Prev in Thread] Current Thread [Next in Thread]