On Thu, Sep 15, 2016 at 11:10 AM, <[email protected]> wrote:
> From: William Roberts <[email protected]>
>
> 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.
>
> Signed-off-by: William Roberts <[email protected]>
> ---
> libselinux/src/label_file.c | 43 +++++++++++++++++++++++++++++--------------
> 1 file changed, 29 insertions(+), 14 deletions(-)
>
> diff --git a/libselinux/src/label_file.c b/libselinux/src/label_file.c
> index 9faecdb..e3dcdd6 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,35 @@ 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++)
> + {
brace on same line :-(
> + 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);
> --
> 1.9.1
>
> _______________________________________________
> Selinux mailing list
> [email protected]
> To unsubscribe, send email to [email protected].
> To get help, send an email containing "help" to [email protected].
--
Respectfully,
William C Roberts
_______________________________________________
Seandroid-list mailing list
[email protected]
To unsubscribe, send email to [email protected].
To get help, send an email containing "help" to
[email protected].