summaryrefslogtreecommitdiff
path: root/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-serialize.hh
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/libs/harfbuzz/harfbuzz-src/src/hb-serialize.hh')
-rw-r--r--Build/source/libs/harfbuzz/harfbuzz-src/src/hb-serialize.hh30
1 files changed, 28 insertions, 2 deletions
diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-serialize.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-serialize.hh
index 4fb4f4ef40a..4566153a593 100644
--- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-serialize.hh
+++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-serialize.hh
@@ -172,6 +172,8 @@ struct hb_serialize_context_t
propagate_error (packed, packed_map);
if (unlikely (!current)) return;
+ if (unlikely (in_error())) return;
+
assert (!current->next);
/* Only "pack" if there exist other objects... Otherwise, don't bother.
@@ -187,6 +189,8 @@ struct hb_serialize_context_t
template <typename Type = void>
Type *push ()
{
+ if (unlikely (in_error ())) return start_embed<Type> ();
+
object_t *obj = object_pool.alloc ();
if (unlikely (!obj))
check_success (false);
@@ -203,6 +207,8 @@ struct hb_serialize_context_t
{
object_t *obj = current;
if (unlikely (!obj)) return;
+ if (unlikely (in_error())) return;
+
current = current->next;
revert (obj->head, obj->tail);
obj->fini ();
@@ -217,6 +223,8 @@ struct hb_serialize_context_t
{
object_t *obj = current;
if (unlikely (!obj)) return 0;
+ if (unlikely (in_error())) return 0;
+
current = current->next;
obj->tail = head;
obj->next = nullptr;
@@ -248,25 +256,34 @@ struct hb_serialize_context_t
packed.push (obj);
- if (unlikely (packed.in_error ()))
+ if (unlikely (packed.in_error ())) {
+ // obj wasn't successfully added to packed, so clean it up otherwise it's
+ // links will be leaked.
+ propagate_error (packed);
+ obj->fini ();
return 0;
+ }
objidx = packed.length - 1;
if (share) packed_map.set (obj, objidx);
+ propagate_error (packed_map);
return objidx;
}
void revert (snapshot_t snap)
{
+ if (unlikely (in_error ())) return;
assert (snap.current == current);
current->links.shrink (snap.num_links);
revert (snap.head, snap.tail);
}
+
void revert (char *snap_head,
char *snap_tail)
{
+ if (unlikely (in_error ())) return;
assert (snap_head <= head);
assert (tail <= snap_tail);
head = snap_head;
@@ -276,6 +293,7 @@ struct hb_serialize_context_t
void discard_stale_objects ()
{
+ if (unlikely (in_error ())) return;
while (packed.length > 1 &&
packed.tail ()->head < tail)
{
@@ -294,6 +312,7 @@ struct hb_serialize_context_t
unsigned bias = 0)
{
static_assert (sizeof (T) == 2 || sizeof (T) == 4, "");
+ if (unlikely (in_error ())) return;
if (!objidx)
return;
@@ -313,6 +332,7 @@ struct hb_serialize_context_t
unsigned to_bias (const void *base) const
{
+ if (unlikely (in_error ())) return 0;
if (!base) return 0;
assert (current);
assert (current->head <= (const char *) base);
@@ -357,7 +377,11 @@ struct hb_serialize_context_t
}
}
- unsigned int length () const { return this->head - current->head; }
+ unsigned int length () const
+ {
+ if (unlikely (!current)) return 0;
+ return this->head - current->head;
+ }
void align (unsigned int alignment)
{
@@ -445,6 +469,8 @@ struct hb_serialize_context_t
template <typename Type>
Type *extend_size (Type *obj, unsigned int size)
{
+ if (unlikely (in_error ())) return nullptr;
+
assert (this->start <= (char *) obj);
assert ((char *) obj <= this->head);
assert ((char *) obj + size >= this->head);