Re: [PATCH v3] libselinux: correct error path to always try text

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

 



On Fri, Sep 16, 2016 at 7:41 AM, William Roberts
<bill.c.roberts@xxxxxxxxx> wrote:
> On Fri, Sep 16, 2016 at 7:38 AM, Stephen Smalley <sds@xxxxxxxxxxxxx> wrote:
>> On 09/16/2016 10:30 AM, Stephen Smalley wrote:
>>> On 09/15/2016 07:13 PM, william.c.roberts@xxxxxxxxx wrote:
>>>> From: William Roberts <william.c.roberts@xxxxxxxxx>
>>>>
>>>> patch 5e15a52aaa cleans up the process_file() but introduced
>>>> a bug. If the binary file cannot be opened, always attempt
>>>> to fall back to the textual file, this was not occurring.
>>>>
>>>> The logic should be:
>>>> 1. Open the newest file based on base path + suffix vs
>>>>    base_path + suffix + ".bin".
>>>> 2. If anything fails, attempt base_path + suffix.
>>>>
>>>> In the case that the file_contexts was the newest file and
>>>> used for processing fails, it will attempt the same failure
>>>> recovery, which will fail. It was decided to keep it this
>>>> was for simplicity.
>>>
>>> I don't like the approach.  What we want is:
>>> - if .bin file exists and is not older, try to load it,
>>> - if any of the above fails (i.e. .bin file does not exist, is older, or
>>> cannot be loaded for any reason), then load the text file.
>>>
>>> We shouldn't try loading the text file twice.
>>>
>>> Also, attached is checkpatch output for your patch.  Please fix.
>>
>> Also, there is a further wrinkle: Android passes in file_contexts.bin as
>> the SELABEL_OPT_PATH, so that is the base path.  Under the old logic
>> (before your original clean up patch), we would open that file, detect
>> that it is binary, and then load it.  Under the current logic, we'll
>> open file_contexts.bin, then try to open file_contexts.bin.bin (which
>> will fail), and then use the first one.
>
> Not true, I don't try to open it, I try to stat it.

My code never assumes file suffix == type

>
>>
>> Wondering if we just need to revert.
>
> If you want to revert I have no problem with that, but I provided IMO
> a valid fix.
> Since I won't likely have a next version patch out till after you go
> home today, I
> would support reverting.
>
>>
>>>
>>>>
>>>> Signed-off-by: William Roberts <william.c.roberts@xxxxxxxxx>
>>>> ---
>>>>  libselinux/src/label_file.c | 41 +++++++++++++++++++++++++++--------------
>>>>  1 file changed, 27 insertions(+), 14 deletions(-)
>>>>
>>>> diff --git a/libselinux/src/label_file.c b/libselinux/src/label_file.c
>>>> index 9faecdb..0dee059 100644
>>>> --- a/libselinux/src/label_file.c
>>>> +++ b/libselinux/src/label_file.c
>>>> @@ -447,7 +447,7 @@ static bool fcontext_is_binary(FILE *fp)
>>>>  #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
>>>>
>>>>  static FILE *open_file(const char *path, const char *suffix,
>>>> -                   char *save_path, size_t len, struct stat *sb)
>>>> +                   char *save_path, size_t len, struct stat *sb, bool force_text)
>>>>  {
>>>>      unsigned int i;
>>>>      int rc;
>>>> @@ -469,7 +469,11 @@ static FILE *open_file(const char *path, const char *suffix,
>>>>              return NULL;
>>>>      }
>>>>
>>>> -    for (i = 0; i < ARRAY_SIZE(fdetails); i++) {
>>>> +    size_t array_size = ARRAY_SIZE(fdetails);
>>>> +    if (force_text)
>>>> +            array_size--;
>>>> +
>>>> +    for (i = 0; i < array_size; i++) {
>>>>
>>>>              /* This handles the case if suffix is null */
>>>>              path = rolling_append(stack_path, fdetails[i].suffix,
>>>> @@ -515,24 +519,33 @@ static int process_file(const char *path, const char *suffix,
>>>>                        const char *prefix, struct selabel_digest *digest)
>>>>  {
>>>>      int rc;
>>>> +    unsigned int i;
>>>>      struct stat sb;
>>>>      FILE *fp = NULL;
>>>>      char found_path[PATH_MAX];
>>>>
>>>> -    fp = open_file(path, suffix, found_path, sizeof(found_path), &sb);
>>>> -    if (fp == NULL)
>>>> -            return -1;
>>>> +    /*
>>>> +     * first path open the newest modified file, if it fails, the second
>>>> +     * pass falls through to the plain text file.
>>>> +     */
>>>> +    for(i=0; i < 2; i++) {
>>>> +            fp = open_file(path, suffix, found_path, sizeof(found_path), &sb,
>>>> +                            i > 0);
>>>> +            if (fp == NULL)
>>>> +                    return -1;
>>>>
>>>> -    rc = fcontext_is_binary(fp) ?
>>>> -                    load_mmap(fp, sb.st_size, rec, found_path) :
>>>> -                    process_text_file(fp, prefix, rec, found_path);
>>>> -    if (rc < 0)
>>>> -            goto out;
>>>> +            rc = fcontext_is_binary(fp) ?
>>>> +                            load_mmap(fp, sb.st_size, rec, found_path) :
>>>> +                            process_text_file(fp, prefix, rec, found_path);
>>>> +            if (!rc)
>>>> +                    rc = digest_add_specfile(digest, fp, NULL, sb.st_size, found_path);
>>>>
>>>> -    rc = digest_add_specfile(digest, fp, NULL, sb.st_size, found_path);
>>>> -out:
>>>> -    fclose(fp);
>>>> -    return rc;
>>>> +            fclose(fp);
>>>> +
>>>> +            if(!rc)
>>>> +                    return 0;
>>>> +    }
>>>> +    return -1;
>>>>  }
>>>>
>>>>  static void closef(struct selabel_handle *rec);
>>>>
>>>
>>>
>>>
>>> _______________________________________________
>>> Selinux mailing list
>>> Selinux@xxxxxxxxxxxxx
>>> To unsubscribe, send email to Selinux-leave@xxxxxxxxxxxxx.
>>> To get help, send an email containing "help" to Selinux-request@xxxxxxxxxxxxx.
>>>
>>
>> _______________________________________________
>> Seandroid-list mailing list
>> Seandroid-list@xxxxxxxxxxxxx
>> To unsubscribe, send email to Seandroid-list-leave@xxxxxxxxxxxxx.
>> To get help, send an email containing "help" to Seandroid-list-request@xxxxxxxxxxxxx.
>
>
>
> --
> Respectfully,
>
> William C Roberts



-- 
Respectfully,

William C Roberts
_______________________________________________
Selinux mailing list
Selinux@xxxxxxxxxxxxx
To unsubscribe, send email to Selinux-leave@xxxxxxxxxxxxx.
To get help, send an email containing "help" to Selinux-request@xxxxxxxxxxxxx.



[Index of Archives]     [Selinux Refpolicy]     [Linux SGX]     [Fedora Users]     [Fedora Desktop]     [Yosemite Photos]     [Yosemite Camping]     [Yosemite Campsites]     [KDE Users]     [Gnome Users]

  Powered by Linux