diff options
author | Alex Henrie <alexhenrie24@gmail.com> | 2023-12-03 22:52:09 -0700 |
---|---|---|
committer | Alex Henrie <alexhenrie24@gmail.com> | 2023-12-03 22:52:09 -0700 |
commit | c2c814d4051f23260dfacb1db1c9307ca32d8852 (patch) | |
tree | d2cfc3d5503d0411c4388fb1c9d5df08e1f43d38 | |
parent | f67d181c30ddf5e525b147551701e0d05095b7ce (diff) |
Handle realloc moving the buffer in _xdg_mime_(cache_)mime_type_subclass
-rw-r--r-- | src/xdgmime.c | 26 | ||||
-rw-r--r-- | src/xdgmime.h | 2 | ||||
-rw-r--r-- | src/xdgmimecache.c | 25 | ||||
-rw-r--r-- | src/xdgmimecache.h | 2 |
4 files changed, 30 insertions, 25 deletions
diff --git a/src/xdgmime.c b/src/xdgmime.c index dcdb272..6fd0369 100644 --- a/src/xdgmime.c +++ b/src/xdgmime.c @@ -820,12 +820,12 @@ xdg_mime_is_super_type (const char *mime) int _xdg_mime_mime_type_subclass (const char *mime, const char *base, - const char **seen) + const char ***seen) { const char *umime, *ubase, *parent; - const char **parents; + const char **parents, **first_seen = NULL, **new_seen; - int first_seen = 0, i, ret = 0; + int i, ret = 0; if (_caches) return _xdg_mime_cache_mime_type_subclass (mime, base, NULL); @@ -854,8 +854,8 @@ _xdg_mime_mime_type_subclass (const char *mime, if (!seen) { - seen = calloc (1, sizeof (char *)); - first_seen = 1; + first_seen = calloc (1, sizeof (char *)); + seen = &first_seen; } parents = _xdg_mime_parent_list_lookup (parent_list, umime); @@ -864,12 +864,15 @@ _xdg_mime_mime_type_subclass (const char *mime, parent = *parents; /* Detect and avoid buggy circular relationships */ - for (i = 0; seen[i] != NULL; i++) - if (parent == seen[i]) + for (i = 0; (*seen)[i] != NULL; i++) + if (parent == (*seen)[i]) goto next_parent; - seen = realloc (seen, (i + 2) * sizeof (char *)); - seen[i] = parent; - seen[i + 1] = NULL; + new_seen = realloc (*seen, (i + 2) * sizeof (char *)); + if (!new_seen) + goto done; + new_seen[i] = parent; + new_seen[i + 1] = NULL; + *seen = new_seen; if (_xdg_mime_mime_type_subclass (parent, ubase, seen)) { @@ -882,8 +885,7 @@ _xdg_mime_mime_type_subclass (const char *mime, } done: - if (first_seen) - free (seen); + free (first_seen); return ret; } diff --git a/src/xdgmime.h b/src/xdgmime.h index 897683d..093b12a 100644 --- a/src/xdgmime.h +++ b/src/xdgmime.h @@ -110,7 +110,7 @@ int _xdg_mime_mime_type_equal (const char *mime_a, const char *mime_b); int _xdg_mime_mime_type_subclass (const char *mime, const char *base, - const char **seen); + const char ***seen); const char *_xdg_mime_unalias_mime_type (const char *mime); diff --git a/src/xdgmimecache.c b/src/xdgmimecache.c index 1276efd..5677481 100644 --- a/src/xdgmimecache.c +++ b/src/xdgmimecache.c @@ -897,12 +897,13 @@ is_super_type (const char *mime) int _xdg_mime_cache_mime_type_subclass (const char *mime, const char *base, - const char **seen) + const char ***seen) { const char *umime, *ubase, *parent; + const char **first_seen = NULL, **new_seen; xdg_uint32_t j; - int i, k, min, max, med, cmp, first_seen = 0, ret = 0; + int i, k, min, max, med, cmp, ret = 0; umime = _xdg_mime_cache_unalias_mime_type (mime); ubase = _xdg_mime_cache_unalias_mime_type (base); @@ -931,8 +932,8 @@ _xdg_mime_cache_mime_type_subclass (const char *mime, if (!seen) { - seen = calloc (1, sizeof (char *)); - first_seen = 1; + first_seen = calloc (1, sizeof (char *)); + seen = &first_seen; } for (i = 0; _caches[i]; i++) @@ -976,12 +977,15 @@ _xdg_mime_cache_mime_type_subclass (const char *mime, parent = cache->buffer + parent_offset; /* Detect and avoid buggy circular relationships */ - for (k = 0; seen[k] != NULL; k++) - if (parent == seen[k]) + for (k = 0; (*seen)[k] != NULL; k++) + if (parent == (*seen)[k]) goto next_parent; - seen = realloc (seen, (k + 2) * sizeof (char *)); - seen[k] = parent; - seen[k + 1] = NULL; + new_seen = realloc (*seen, (k + 2) * sizeof (char *)); + if (!new_seen) + goto done; + new_seen[k] = parent; + new_seen[k + 1] = NULL; + *seen = new_seen; if (_xdg_mime_cache_mime_type_subclass (parent, ubase, seen)) { @@ -999,8 +1003,7 @@ _xdg_mime_cache_mime_type_subclass (const char *mime, } done: - if (first_seen) - free (seen); + free (first_seen); return ret; } diff --git a/src/xdgmimecache.h b/src/xdgmimecache.h index 5e6f274..de7e531 100644 --- a/src/xdgmimecache.h +++ b/src/xdgmimecache.h @@ -55,7 +55,7 @@ int _xdg_mime_cache_media_type_equal (const char *mime_a, const char *mime_b); int _xdg_mime_cache_mime_type_subclass (const char *mime_a, const char *mime_b, - const char **seen); + const char ***seen); char **_xdg_mime_cache_list_mime_parents (const char *mime); const char *_xdg_mime_cache_unalias_mime_type (const char *mime); int _xdg_mime_cache_get_max_buffer_extents (void); |