summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBehdad Esfahbod <behdad@behdad.org>2010-04-23 13:57:10 -0400
committerBehdad Esfahbod <behdad@behdad.org>2010-04-23 13:57:10 -0400
commit254933c397f1ce9796f59689a25f9fc2e58df4ea (patch)
treefa6580f5f2bfdc15a86c8eff001b85c4df768dd7
parent71e735e915c85536ee4d3035576f7426e8cd19dd (diff)
When sanitizing, delay making writable
Before, as soon as we needed to make an edit, we tried to make the blob writable inplace. That grows code unnecessarily though. We can simply fail, make writable, then start again. That's indeed what the fallback was doing anyway.
-rw-r--r--src/hb-open-type-private.hh11
1 files changed, 7 insertions, 4 deletions
diff --git a/src/hb-open-type-private.hh b/src/hb-open-type-private.hh
index 3a89425..a4b76c5 100644
--- a/src/hb-open-type-private.hh
+++ b/src/hb-open-type-private.hh
@@ -166,7 +166,8 @@ typedef struct _hb_sanitize_context_t hb_sanitize_context_t;
struct _hb_sanitize_context_t
{
const char *start, *end;
- int edit_count;
+ hb_bool_t writable;
+ unsigned int edit_count;
hb_blob_t *blob;
};
@@ -177,6 +178,7 @@ _hb_sanitize_init (hb_sanitize_context_t *context,
context->blob = blob;
context->start = hb_blob_lock (blob);
context->end = context->start + hb_blob_get_length (blob);
+ context->writable = hb_blob_is_writable (blob);
context->edit_count = 0;
#if HB_DEBUG_SANITIZE
@@ -236,6 +238,7 @@ _hb_sanitize_array (SANITIZE_ARG_DEF,
context->start, context->end,
!overflows ? "does not overflow" : "OVERFLOWS FAIL");
#endif
+
return HB_LIKELY (!overflows) && _hb_sanitize_check (SANITIZE_ARG, base, record_size * len);
}
@@ -244,7 +247,6 @@ _hb_sanitize_edit (SANITIZE_ARG_DEF,
const char *base HB_GNUC_UNUSED,
unsigned int len HB_GNUC_UNUSED)
{
- bool perm = hb_blob_try_writable_inplace (context->blob);
context->edit_count++;
#if HB_DEBUG_SANITIZE
@@ -254,9 +256,10 @@ _hb_sanitize_edit (SANITIZE_ARG_DEF,
context->edit_count,
base, base+len, len,
context->start, context->end,
- perm ? "granted" : "REJECTED");
+ context->writable ? "granted" : "REJECTED");
#endif
- return perm;
+
+ return context->writable;
}
#define SANITIZE(X) HB_LIKELY ((X).sanitize (SANITIZE_ARG))