summaryrefslogtreecommitdiff
path: root/src/harfbuzz-open.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/harfbuzz-open.c')
-rw-r--r--src/harfbuzz-open.c36
1 files changed, 32 insertions, 4 deletions
diff --git a/src/harfbuzz-open.c b/src/harfbuzz-open.c
index 0fe1e4d..4fc6ed1 100644
--- a/src/harfbuzz-open.c
+++ b/src/harfbuzz-open.c
@@ -1282,7 +1282,7 @@ _HB_OPEN_Get_Class( HB_ClassDefinition* cd,
HB_INTERNAL HB_Error
-_HB_OPEN_Load_Device( HB_Device* d,
+_HB_OPEN_Load_Device( HB_Device** device,
HB_Stream stream )
{
HB_Error error;
@@ -1295,6 +1295,14 @@ _HB_OPEN_Load_Device( HB_Device* d,
if ( ACCESS_Frame( 6L ) )
return error;
+ if ( ALLOC( *device, sizeof(HB_Device)) )
+ {
+ *device = 0;
+ return error;
+ }
+
+ HB_Device* d = *device;
+
d->StartSize = GET_UShort();
d->EndSize = GET_UShort();
d->DeltaFormat = GET_UShort();
@@ -1318,11 +1326,17 @@ _HB_OPEN_Load_Device( HB_Device* d,
( 4 - d->DeltaFormat ) ) + 1;
if ( ALLOC_ARRAY( d->DeltaValue, count, HB_UShort ) )
+ {
+ FREE( *device );
+ *device = 0;
return error;
+ }
if ( ACCESS_Frame( count * 2L ) )
{
FREE( d->DeltaValue );
+ FREE( *device );
+ *device = 0;
return error;
}
@@ -1338,9 +1352,13 @@ _HB_OPEN_Load_Device( HB_Device* d,
HB_INTERNAL void
-_HB_OPEN_Free_Device( HB_Device* d )
+_HB_OPEN_Free_Device( HB_Device** d )
{
- FREE( d->DeltaValue );
+ if ( *d )
+ {
+ FREE( (*d)->DeltaValue );
+ FREE( *d );
+ }
}
@@ -1380,12 +1398,20 @@ _HB_OPEN_Free_Device( HB_Device* d )
mask = 0x00FF */
HB_INTERNAL HB_Error
-_HB_OPEN_Get_Device( HB_Device* d,
+_HB_OPEN_Get_Device( HB_Device** device,
HB_UShort size,
HB_Short* value )
{
HB_UShort byte, bits, mask, f, s;
+ HB_Error error;
+
+ if ( ALLOC( *device, sizeof(HB_Device)) )
+ {
+ *device = 0;
+ return error;
+ }
+ HB_Device* d = *device;
f = d->DeltaFormat;
@@ -1408,6 +1434,8 @@ _HB_OPEN_Get_Device( HB_Device* d,
else
{
*value = 0;
+ FREE( *device );
+ *device = 0;
return HB_Err_Not_Covered;
}
}