summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam Roberts <william.c.roberts@intel.com>2015-10-29 16:54:21 +0000
committerandroid-build-merger <android-build-merger@google.com>2015-10-29 16:54:21 +0000
commita83098b60edda2c5ea690fb6a7bb3cb76b46bc30 (patch)
tree03623d5c29ec2fe67704ca3799f96ee8ae853a28
parentca65fd5116ff9605f143aef40b8d7b6f497f9ff9 (diff)
parent0f520fac932d1dc92731b056d6848e45f6cd6974 (diff)
downloadlibselinux-a83098b60edda2c5ea690fb6a7bb3cb76b46bc30.tar.gz
fix memory leaks and uninitialized jump
am: 0f520fac93 * commit '0f520fac932d1dc92731b056d6848e45f6cd6974': fix memory leaks and uninitialized jump
-rw-r--r--src/label.c2
-rw-r--r--src/label_file.c5
-rw-r--r--src/label_file.h20
3 files changed, 19 insertions, 8 deletions
diff --git a/src/label.c b/src/label.c
index 84cee51..fb8c266 100644
--- a/src/label.c
+++ b/src/label.c
@@ -86,6 +86,7 @@ struct selabel_handle *selabel_open(unsigned int backend,
rec->validating = selabel_is_validate_set(opts, nopts);
if ((*initfuncs[backend])(rec, opts, nopts)) {
+ free(rec->spec_file);
free(rec);
rec = NULL;
}
@@ -161,6 +162,7 @@ enum selabel_cmp_result selabel_cmp(struct selabel_handle *h1,
void selabel_close(struct selabel_handle *rec)
{
rec->func_close(rec);
+ free(rec->spec_file);
free(rec);
}
diff --git a/src/label_file.c b/src/label_file.c
index b75c02a..9d0a54c 100644
--- a/src/label_file.c
+++ b/src/label_file.c
@@ -492,6 +492,8 @@ out:
return rc;
}
+static void closef(struct selabel_handle *rec);
+
static int init(struct selabel_handle *rec, const struct selinux_opt *opts,
unsigned n)
{
@@ -543,7 +545,8 @@ static int init(struct selabel_handle *rec, const struct selinux_opt *opts,
finish:
if (status)
- free(data->spec_arr);
+ closef(rec);
+
return status;
}
diff --git a/src/label_file.h b/src/label_file.h
index 7f53ea7..035315d 100644
--- a/src/label_file.h
+++ b/src/label_file.h
@@ -278,6 +278,7 @@ static inline int store_stem(struct saved_data *data, char *buf, int stem_len)
}
data->stem_arr[num].len = stem_len;
data->stem_arr[num].buf = buf;
+ data->stem_arr[num].from_mmap = 0;
data->num_stems++;
return num;
@@ -425,6 +426,18 @@ static inline int process_line(struct selabel_handle *rec,
/* process and store the specification in spec. */
spec_arr[nspec].stem_id = find_stem_from_spec(data, regex);
spec_arr[nspec].regex_str = regex;
+
+ spec_arr[nspec].type_str = type;
+ spec_arr[nspec].mode = 0;
+
+ spec_arr[nspec].lr.ctx_raw = context;
+
+ /*
+ * bump data->nspecs to cause closef() to cover it in its free
+ * but do not bump nspec since it's used below.
+ */
+ data->nspec++;
+
if (rec->validating &&
compile_regex(data, &spec_arr[nspec], &errbuf)) {
selinux_log(SELINUX_ERROR,
@@ -435,9 +448,6 @@ static inline int process_line(struct selabel_handle *rec,
return -1;
}
- /* Convert the type string to a mode format */
- spec_arr[nspec].type_str = type;
- spec_arr[nspec].mode = 0;
if (type) {
mode_t mode = string_to_mode(type);
@@ -451,8 +461,6 @@ static inline int process_line(struct selabel_handle *rec,
spec_arr[nspec].mode = mode;
}
- spec_arr[nspec].lr.ctx_raw = context;
-
/* Determine if specification has
* any meta characters in the RE */
spec_hasMetaChars(&spec_arr[nspec]);
@@ -467,8 +475,6 @@ static inline int process_line(struct selabel_handle *rec,
}
}
- data->nspec = ++nspec;
-
return 0;
}