diff options
author | William Roberts <william.c.roberts@intel.com> | 2015-10-29 16:54:21 +0000 |
---|---|---|
committer | android-build-merger <android-build-merger@google.com> | 2015-10-29 16:54:21 +0000 |
commit | a83098b60edda2c5ea690fb6a7bb3cb76b46bc30 (patch) | |
tree | 03623d5c29ec2fe67704ca3799f96ee8ae853a28 | |
parent | ca65fd5116ff9605f143aef40b8d7b6f497f9ff9 (diff) | |
parent | 0f520fac932d1dc92731b056d6848e45f6cd6974 (diff) | |
download | libselinux-a83098b60edda2c5ea690fb6a7bb3cb76b46bc30.tar.gz |
fix memory leaks and uninitialized jump
am: 0f520fac93
* commit '0f520fac932d1dc92731b056d6848e45f6cd6974':
fix memory leaks and uninitialized jump
-rw-r--r-- | src/label.c | 2 | ||||
-rw-r--r-- | src/label_file.c | 5 | ||||
-rw-r--r-- | src/label_file.h | 20 |
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; } |