diff options
-rw-r--r-- | src/fccharset.c | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/src/fccharset.c b/src/fccharset.c index 6e0093f1..3f178923 100644 --- a/src/fccharset.c +++ b/src/fccharset.c @@ -164,6 +164,14 @@ FcCharSetPutLeaf (FcCharSet *fcs, unsigned int alloced = 8; leaves = malloc (alloced * sizeof (*leaves)); numbers = malloc (alloced * sizeof (*numbers)); + if (!leaves || !numbers) + { + if (leaves) + free (leaves); + if (numbers) + free (numbers); + return FcFalse; + } } else { @@ -172,8 +180,19 @@ FcCharSetPutLeaf (FcCharSet *fcs, alloced *= 2; new_leaves = realloc (leaves, alloced * sizeof (*leaves)); + if (!new_leaves) + return FcFalse; numbers = realloc (numbers, alloced * sizeof (*numbers)); - + if (!numbers) + { + /* Revert the reallocation of leaves */ + leaves = realloc (new_leaves, (alloced / 2) * sizeof (*new_leaves)); + /* unlikely to fail though */ + if (!leaves) + return FcFalse; + fcs->leaves_offset = FcPtrToOffset (fcs, leaves); + return FcFalse; + } distance = (intptr_t) new_leaves - (intptr_t) leaves; if (new_leaves && distance) { @@ -184,9 +203,6 @@ FcCharSetPutLeaf (FcCharSet *fcs, leaves = new_leaves; } - if (!leaves || !numbers) - return FcFalse; - fcs->leaves_offset = FcPtrToOffset (fcs, leaves); fcs->numbers_offset = FcPtrToOffset (fcs, numbers); } |