mirror of
https://github.com/SELinuxProject/selinux
synced 2024-12-16 19:24:35 +00:00
Replace fmemopen() with internal function in libsepol.
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@tycho.nsa.gov>
This commit is contained in:
parent
fe0366b8ed
commit
8ebb97d0be
@ -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", ®ex, &mode, &context);
|
||||
matched = sscanf(line, "%ms %ms %ms", ®ex, &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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user