File harfbuzz-limit-buffer-max-size-growth.patch of Package harfbuzz
From 4301703bddb63a01651a0d58474bb15ac0ebbcf6 Mon Sep 17 00:00:00 2001
From: Behdad Esfahbod <behdad@behdad.org>
Date: Thu, 5 Nov 2015 23:44:59 -0800
Subject: [PATCH] Limit buffer max size growth
https://github.com/behdad/harfbuzz/issues/161
Backported by Mike Gorse <mgorse@suse.com>
---
diff -ur harfbuzz-1.0.3.orig/src/hb-buffer.cc harfbuzz-1.0.3/src/hb-buffer.cc
--- harfbuzz-1.0.3.orig/src/hb-buffer.cc 2015-09-01 10:59:29.785158338 -0500
+++ harfbuzz-1.0.3/src/hb-buffer.cc 2016-08-08 20:13:10.770617254 -0500
@@ -92,6 +92,12 @@
if (unlikely (in_error))
return false;
+ if (unlikely (size > max_len))
+ {
+ in_error = true;
+ return false;
+ }
+
unsigned int new_allocated = allocated;
hb_glyph_position_t *new_pos = NULL;
hb_glyph_info_t *new_info = NULL;
@@ -714,6 +720,8 @@
if (!(buffer = hb_object_create<hb_buffer_t> ()))
return hb_buffer_get_empty ();
+ buffer->max_len = HB_BUFFER_MAX_LEN_DEFAULT;
+
buffer->reset ();
return buffer;
@@ -739,6 +747,8 @@
HB_BUFFER_CLUSTER_LEVEL_DEFAULT,
HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT,
+ HB_BUFFER_MAX_LEN_DEFAULT,
+
HB_BUFFER_CONTENT_TYPE_INVALID,
HB_SEGMENT_PROPERTIES_DEFAULT,
true, /* in_error */
diff -ur harfbuzz-1.0.3.orig/src/hb-buffer-private.hh harfbuzz-1.0.3/src/hb-buffer-private.hh
--- harfbuzz-1.0.3.orig/src/hb-buffer-private.hh 2015-09-01 10:59:29.785158338 -0500
+++ harfbuzz-1.0.3/src/hb-buffer-private.hh 2016-08-08 20:13:10.770617254 -0500
@@ -34,6 +34,15 @@
#include "hb-object-private.hh"
#include "hb-unicode-private.hh"
+#ifndef HB_BUFFER_MAX_EXPANSION_FACTOR
+#define HB_BUFFER_MAX_EXPANSION_FACTOR 32
+#endif
+#ifndef HB_BUFFER_MAX_LEN_MIN
+#define HB_BUFFER_MAX_LEN_MIN 8192
+#endif
+#ifndef HB_BUFFER_MAX_LEN_DEFAULT_
+#define HB_BUFFER_MAX_LEN_DEFAULT 0x3FFFFFFF /* Shaping more than a billion chars? Let us know! */
+#endif
ASSERT_STATIC (sizeof (hb_glyph_info_t) == 20);
ASSERT_STATIC (sizeof (hb_glyph_info_t) == sizeof (hb_glyph_position_t));
@@ -53,6 +62,8 @@
hb_buffer_cluster_level_t cluster_level;
hb_codepoint_t replacement; /* U+FFFD or something else. */
+ unsigned int max_len; /* Maximum allowed len. */
+
/* Buffer contents */
hb_buffer_content_type_t content_type;
hb_segment_properties_t props; /* Script, language, direction */
diff -ur harfbuzz-1.0.3.orig/src/hb-ot-shape.cc harfbuzz-1.0.3/src/hb-ot-shape.cc
--- harfbuzz-1.0.3.orig/src/hb-ot-shape.cc 2015-09-01 10:59:29.789158287 -0500
+++ harfbuzz-1.0.3/src/hb-ot-shape.cc 2016-08-08 20:13:33.462617668 -0500
@@ -779,6 +779,12 @@
{
c->buffer->deallocate_var_all ();
+ if (likely (!_hb_unsigned_int_mul_overflows (c->buffer->len, HB_BUFFER_MAX_EXPANSION_FACTOR)))
+ {
+ c->buffer->max_len = MAX (c->buffer->len * HB_BUFFER_MAX_EXPANSION_FACTOR,
+ (unsigned) HB_BUFFER_MAX_LEN_MIN);
+ }
+
/* Save the original direction, we use it later. */
c->target_direction = c->buffer->props.direction;
@@ -801,6 +807,7 @@
c->buffer->props.direction = c->target_direction;
+ c->buffer->max_len = HB_BUFFER_MAX_LEN_DEFAULT;
c->buffer->deallocate_var_all ();
}