summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Henrie <alexhenrie24@gmail.com>2023-12-03 22:52:09 -0700
committerAlex Henrie <alexhenrie24@gmail.com>2023-12-03 22:52:09 -0700
commitc2c814d4051f23260dfacb1db1c9307ca32d8852 (patch)
treed2cfc3d5503d0411c4388fb1c9d5df08e1f43d38
parentf67d181c30ddf5e525b147551701e0d05095b7ce (diff)
Handle realloc moving the buffer in _xdg_mime_(cache_)mime_type_subclass
-rw-r--r--src/xdgmime.c26
-rw-r--r--src/xdgmime.h2
-rw-r--r--src/xdgmimecache.c25
-rw-r--r--src/xdgmimecache.h2
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);