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

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

 



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.




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

  Powered by Linux