From: William Roberts <[email protected]>

Introduced a malloc on pcre_version(). Libselinux
expected this to be static, just use a static
internal buffer.

Signed-off-by: William Roberts <[email protected]>
---
 libselinux/src/label_file.c           | 13 ++++++++-----
 libselinux/src/regex.c                | 20 +++++++-------------
 libselinux/utils/sefcontext_compile.c |  8 +++++---
 3 files changed, 20 insertions(+), 21 deletions(-)

diff --git a/libselinux/src/label_file.c b/libselinux/src/label_file.c
index 6698624..110db11 100644
--- a/libselinux/src/label_file.c
+++ b/libselinux/src/label_file.c
@@ -111,6 +111,7 @@ static int load_mmap(struct selabel_handle *rec, const char 
*path,
        struct mmap_area *mmap_area;
        uint32_t i, magic, version;
        uint32_t entry_len, stem_map_len, regex_array_len;
+       const char *reg_version;
 
        if (isbinary) {
                len = strlen(path);
@@ -174,11 +175,13 @@ static int load_mmap(struct selabel_handle *rec, const 
char *path,
        if (rc < 0 || version > SELINUX_COMPILED_FCONTEXT_MAX_VERS)
                return -1;
 
+       reg_version = regex_version();
+       if (!reg_version)
+               return -1;
+
        if (version >= SELINUX_COMPILED_FCONTEXT_PCRE_VERS) {
-               if (!regex_version()) {
-                       return -1;
-               }
-               len = strlen(regex_version());
+
+               len = strlen(reg_version);
 
                rc = next_entry(&entry_len, mmap_area, sizeof(uint32_t));
                if (rc < 0)
@@ -200,7 +203,7 @@ static int load_mmap(struct selabel_handle *rec, const char 
*path,
                }
 
                str_buf[entry_len] = '\0';
-               if ((strcmp(str_buf, regex_version()) != 0)) {
+               if ((strcmp(str_buf, reg_version) != 0)) {
                        free(str_buf);
                        return -1;
                }
diff --git a/libselinux/src/regex.c b/libselinux/src/regex.c
index 6b92b04..c880bfa 100644
--- a/libselinux/src/regex.c
+++ b/libselinux/src/regex.c
@@ -49,19 +49,13 @@ err:        regex_data_free(*regex);
 
 char const * regex_version(void) {
 #ifdef USE_PCRE2
-       static int initialized = 0;
-       static char * version_string = NULL;
-       size_t version_string_len;
-       if (!initialized) {
-               version_string_len = pcre2_config(PCRE2_CONFIG_VERSION, NULL);
-               version_string = (char*) malloc(version_string_len);
-               if (!version_string) {
-                       return NULL;
-               }
-               pcre2_config(PCRE2_CONFIG_VERSION, version_string);
-               initialized = 1;
-       }
-       return version_string;
+       static char version_buf[256];
+       size_t len = pcre2_config(PCRE2_CONFIG_VERSION, NULL);
+       if (len <= 0 || len > sizeof(version_buf))
+               return NULL;
+
+       pcre2_config(PCRE2_CONFIG_VERSION, version_buf);
+       return version_buf;
 #else
        return pcre_version();
 #endif
diff --git a/libselinux/utils/sefcontext_compile.c 
b/libselinux/utils/sefcontext_compile.c
index 8ff73f4..b6b8d92 100644
--- a/libselinux/utils/sefcontext_compile.c
+++ b/libselinux/utils/sefcontext_compile.c
@@ -101,6 +101,7 @@ static int write_binary_file(struct saved_data *data, int 
fd)
        uint32_t section_len;
        uint32_t i;
        int rc;
+       const char *reg_version;
 
        bin_file = fdopen(fd, "w");
        if (!bin_file) {
@@ -120,13 +121,14 @@ static int write_binary_file(struct saved_data *data, int 
fd)
                goto err;
 
        /* write version of the regex back-end */
-       if (!regex_version())
+       reg_version = regex_version();
+       if (!reg_version)
                goto err;
-       section_len = strlen(regex_version());
+       section_len = strlen(reg_version);
        len = fwrite(&section_len, sizeof(uint32_t), 1, bin_file);
        if (len != 1)
                goto err;
-       len = fwrite(regex_version(), sizeof(char), section_len, bin_file);
+       len = fwrite(reg_version, sizeof(char), section_len, bin_file);
        if (len != section_len)
                goto err;
 
-- 
2.8.0.rc3.226.g39d4020

_______________________________________________
Seandroid-list mailing list
[email protected]
To unsubscribe, send email to [email protected].
To get help, send an email containing "help" to 
[email protected].

Reply via email to