Re: [PATCH v4] Replace fmemopen() with internal function in libsepol.

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

 



Thank you!

Up for review on AOSP: https://android-review.googlesource.com/#/c/149966/

On Fri, May 8, 2015 at 8:05 AM, James Carter <jwcart2@xxxxxxxxxxxxx> wrote:
Applied.


On 05/08/2015 10:57 AM, Stephen Smalley wrote:
On 05/08/2015 10:51 AM, James Carter wrote:
Created a new function, get_line(), to replace the use of fmemopen()
and getline() in module_to_cil.c since fmemopen() is not available
on Darwin.

Signed-off-by: James Carter <jwcart2@xxxxxxxxxxxxx>

Acked-by:  Stephen Smalley <sds@xxxxxxxxxxxxx>

---
  libsepol/src/module_to_cil.c | 122 +++++++++++++++++++++++--------------------
  1 file changed, 65 insertions(+), 57 deletions(-)

diff --git a/libsepol/src/module_to_cil.c b/libsepol/src/module_to_cil.c
index d1d2efe..8d16d3e 100644
--- a/libsepol/src/module_to_cil.c
+++ b/libsepol/src/module_to_cil.c
@@ -107,6 +107,44 @@ static void cil_println(int indent, const char *fmt, ...)
        }
  }

+static int get_line(char **start, char *end, char **line)
+{
+       int rc = 1;
+       char *p = NULL;
+       size_t len = 0;
+
+       *line = NULL;
+
+       for (p = *start; p < end && isspace(*p); p++);
+
+       *start = p;
+
+       for (len = 0; p < end && *p != '\n' && *p != '\0'; p++, len++);
+
+       if (len == 0) {
+               rc = 0;
+               goto exit;
+       }
+
+       *line = malloc(len+1);
+       if (*line == NULL) {
+               log_err("Out of memory");
+               rc = -1;
+               goto exit;
+       }
+
+       memcpy(*line, *start, len);
+       (*line)[len] = '\0';
+
+       *start = p;
+
+       return rc;
+
+exit:
+       *start = NULL;
+       return rc;
+}
+
  struct map_args {
        struct policydb *pdb;
        struct avrule_block *block;
@@ -2907,14 +2945,11 @@ exit:
  static int seusers_to_cil(struct sepol_module_package *mod_pkg)
  {
        int rc = -1;
-       FILE *fp = NULL;
        char *seusers = sepol_module_package_get_seusers(mod_pkg);
        size_t seusers_len = sepol_module_package_get_seusers_len(mod_pkg);
-       size_t len = 0;
+       char *cur = seusers;
+       char *end = seusers + seusers_len;
        char *line = NULL;
-       ssize_t line_len = 0;
-       char *buf = NULL;
-
        char *user = NULL;
        char *seuser = NULL;
        char *level = NULL;
@@ -2924,19 +2959,12 @@ static int seusers_to_cil(struct sepol_module_package *mod_pkg)
                return 0;
        }

-       fp = fmemopen(seusers, seusers_len, "r");
-
-       while ((line_len = getline(&line, &len, fp)) != -1) {
-               buf = line;
-               buf[line_len - 1] = '\0';
-               while (*buf && isspace(buf[0])) {
-                       buf++;
-               }
-               if (buf[0] == '#' || buf[0] == '\0') {
+       while ((rc = get_line(&cur, end, &line)) > 0) {
+               if (line[0] == '#') {
                        continue;
                }

-               matched = sscanf(buf, "%m[^:]:%m[^:]:%ms", &user, &seuser, &level);
+               matched = sscanf(line, "%m[^:]:%m[^:]:%ms", &user, &seuser, &level);

                if (matched < 2 || matched > 3) {
                        log_err("Invalid seuser line: %s", line);
@@ -2964,20 +2992,17 @@ static int seusers_to_cil(struct sepol_module_package *mod_pkg)
                free(user);
                free(seuser);
                free(level);
+               free(line);
                user = seuser = level = NULL;
        }
-       if (ferror(fp)) {
+
+       if (rc == -1) {
                cil_printf("Failed to read seusers\n");
-               rc = -1;
                goto exit;
        }

        rc = 0;
-
  exit:
-       if (fp != NULL) {
-               fclose(fp);
-       }
        free(line);
        free(user);
        free(seuser);
@@ -3002,10 +3027,9 @@ static int user_extra_to_cil(struct sepol_module_package *mod_pkg)
        int rc = -1;
        char *userx = sepol_module_package_get_user_extra(mod_pkg);
        size_t userx_len = sepol_module_package_get_user_extra_len(mod_pkg);
-       FILE *fp = NULL;
-       size_t len = 0;
-       char *line = NULL;
-       ssize_t line_len = 0;
+       char *cur = userx;
+       char *end = userx + userx_len;
+       char *line;
        int matched;
        char *user = NULL;
        char *prefix = NULL;
@@ -3014,10 +3038,10 @@ static int user_extra_to_cil(struct sepol_module_package *mod_pkg)
                return 0;
        }

-       fp = fmemopen(userx, userx_len, "r");
-
-       while ((line_len = getline(&line, &len, fp)) != -1) {
-               line[line_len - 1] = '\0';
+       while ((rc = get_line(&cur, end, &line)) > 0) {
+               if (line[0] == '#') {
+                       continue;
+               }

                matched = sscanf(line, "user %ms prefix %m[^;];", &user, &prefix);
                if (matched != 2) {
@@ -3029,20 +3053,17 @@ static int user_extra_to_cil(struct sepol_module_package *mod_pkg)
                cil_println(0, "(userprefix %s %s)", user, prefix);
                free(user);
                free(prefix);
-               user = prefix = NULL;
+               free(line);
+               user = prefix = line = NULL;
        }

-       if (ferror(fp)) {
+       if (rc == -1) {
                cil_printf("Failed to read user_extra\n");
-               rc = -1;
                goto exit;
        }

        rc = 0;
  exit:
-       if (fp != NULL) {
-               fclose(fp);
-       }
        free(line);
        free(user);
        free(prefix);
@@ -3055,11 +3076,9 @@ static int file_contexts_to_cil(struct sepol_module_package *mod_pkg)
        int rc = -1;
        char *fc = sepol_module_package_get_file_contexts(mod_pkg);
        size_t fc_len = sepol_module_package_get_file_contexts_len(mod_pkg);
-       FILE *fp = NULL;
-       size_t len = 0;
+       char *cur = fc;
+       char *end = fc + fc_len;
        char *line = NULL;
-       char *buf = NULL;
-       ssize_t line_len = 0;
        int matched;
        char *regex = NULL;
        char *mode = NULL;
@@ -3070,20 +3089,12 @@ static int file_contexts_to_cil(struct sepol_module_package *mod_pkg)
                return 0;
        }

-       fp = fmemopen(fc, fc_len, "r");
-       while ((line_len = getline(&line, &len, fp)) != -1) {
-               buf = line;
-               if (buf[line_len - 1] == '\n') {
-                       buf[line_len - 1] = '\0';
-               }
-               while (*buf && isspace(buf[0])) {
-                       buf++;
-               }
-               if (buf[0] == '#' || buf[0] == '\0') {
+       while ((rc = get_line(&cur, end, &line)) > 0) {
+               if (line[0] == '#') {
                        continue;
                }

-               matched = sscanf(buf, "%ms %ms %ms", &regex, &mode, &context);
+               matched = sscanf(line, "%ms %ms %ms", &regex, &mode, &context);
                if (matched < 2 || matched > 3) {
                        rc = -1;
                        log_err("Invalid file context line: %s", line);
@@ -3130,12 +3141,12 @@ static int file_contexts_to_cil(struct sepol_module_package *mod_pkg)
                free(regex);
                free(mode);
                free(context);
-               regex = mode = context = NULL;
+               free(line);
+               regex = mode = context = line = NULL;
        }

-       if (ferror(fp)) {
-               cil_printf("Failed to read user_extra\n");
-               rc = -1;
+       if (rc == -1) {
+               cil_printf("Failed to read file_contexts_to_cil\n");
                goto exit;
        }

@@ -3145,9 +3156,6 @@ exit:
        free(regex);
        free(mode);
        free(context);
-       if (fp != NULL) {
-               fclose(fp);
-       }

        return rc;
  }





--
James Carter <jwcart2@xxxxxxxxxxxxx>
National Security Agency

_______________________________________________
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.

_______________________________________________
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