freetype-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Git][freetype/freetype][master] [stream] Fix reading s32 when long is s


From: Ben Wagner (@bungeman)
Subject: [Git][freetype/freetype][master] [stream] Fix reading s32 when long is s64
Date: Sat, 18 Jun 2022 21:10:08 +0000

Ben Wagner pushed to branch master at FreeType / FreeType

Commits:

  • f7daf9d2
    by Ben Wagner at 2022-06-18T12:58:23-04:00
    [stream] Fix reading s32 when long is s64
    
    `FT_READ_LONG`, `FT_GET_LONG`, and related macros did not return
    negative values when `long` is more than 32 bits. `FT_Stream_ReadULong`
    would read four bytes into the LSB of an `FT_ULong` and return that.
    Since this can never set the MSb of the `FT_ULong` when `FT_ULong` is
    more than 32 bits the cast to `FT_Long` never resulted in a negative
    value.
    
    Fix this by modifying `FT_Stream_Read*` to return a type of the same
    size as the bytes it is reading and changing the `FT_READ_*` and
    `FT_GET_*` macros to cast to the same type returned by `FT_Stream_Read*`
    but with the correctly signed type (instead of casting to what is
    assumed to be the type of `var` which will happen automatically anyway).
    
    There exist a few cases like with the `OFF3` variants where there isn't
    generally a type with the correct size. `FT_PEEK_OFF3` works around this
    loading the bytes into the three most significant bits and then doing a
    signed shift down. `FT_NEXT_OFF3` also already worked correctly by
    casting this signed value to another signed type. `FT_Stream_GetUOffset`
    works correctly but one must be careful not to attempt to cast the
    returned value to a signed type. Fortunately there is only
    `FT_GET_UOFF3` and no `FT_GET_OFF3`.
    
    All of these cases are handled correctly when reading values through
    `FT_Stream_ReadFields` since it generically computes the signed value
    through an `FT_Int32`. This change is essentially doing the same for
    these macros.
    
    * include/freetype/internal/ftstream.h (FT_NEXT_*, FT_GET_*, FT_READ*):
    Update macros and return types to use fixed size types for fixed size
    values.
    
    * src/base/ftstream.c (FT_StreamGet*, FT_StreamRead*): Dito.
    
    Issue: #1161
    

2 changed files:

Changes:

  • include/freetype/internal/ftstream.h
    ... ... @@ -238,42 +238,42 @@ FT_BEGIN_HEADER
    238 238
     #define FT_NEXT_BYTE( buffer )         \
    
    239 239
               ( (unsigned char)*buffer++ )
    
    240 240
     
    
    241
    -#define FT_NEXT_SHORT( buffer )                                   \
    
    242
    -          ( (short)( buffer += 2, FT_PEEK_SHORT( buffer - 2 ) ) )
    
    241
    +#define FT_NEXT_SHORT( buffer )                        \
    
    242
    +          ( buffer += 2, FT_PEEK_SHORT( buffer - 2 ) )
    
    243 243
     
    
    244
    -#define FT_NEXT_USHORT( buffer )                                            \
    
    245
    -          ( (unsigned short)( buffer += 2, FT_PEEK_USHORT( buffer - 2 ) ) )
    
    244
    +#define FT_NEXT_USHORT( buffer )                        \
    
    245
    +          ( buffer += 2, FT_PEEK_USHORT( buffer - 2 ) )
    
    246 246
     
    
    247
    -#define FT_NEXT_OFF3( buffer )                                  \
    
    248
    -          ( (long)( buffer += 3, FT_PEEK_OFF3( buffer - 3 ) ) )
    
    247
    +#define FT_NEXT_OFF3( buffer )                        \
    
    248
    +          ( buffer += 3, FT_PEEK_OFF3( buffer - 3 ) )
    
    249 249
     
    
    250
    -#define FT_NEXT_UOFF3( buffer )                                           \
    
    251
    -          ( (unsigned long)( buffer += 3, FT_PEEK_UOFF3( buffer - 3 ) ) )
    
    250
    +#define FT_NEXT_UOFF3( buffer )                        \
    
    251
    +          ( buffer += 3, FT_PEEK_UOFF3( buffer - 3 ) )
    
    252 252
     
    
    253
    -#define FT_NEXT_LONG( buffer )                                  \
    
    254
    -          ( (long)( buffer += 4, FT_PEEK_LONG( buffer - 4 ) ) )
    
    253
    +#define FT_NEXT_LONG( buffer )                        \
    
    254
    +          ( buffer += 4, FT_PEEK_LONG( buffer - 4 ) )
    
    255 255
     
    
    256
    -#define FT_NEXT_ULONG( buffer )                                           \
    
    257
    -          ( (unsigned long)( buffer += 4, FT_PEEK_ULONG( buffer - 4 ) ) )
    
    256
    +#define FT_NEXT_ULONG( buffer )                        \
    
    257
    +          ( buffer += 4, FT_PEEK_ULONG( buffer - 4 ) )
    
    258 258
     
    
    259 259
     
    
    260
    -#define FT_NEXT_SHORT_LE( buffer )                                   \
    
    261
    -          ( (short)( buffer += 2, FT_PEEK_SHORT_LE( buffer - 2 ) ) )
    
    260
    +#define FT_NEXT_SHORT_LE( buffer )                        \
    
    261
    +          ( buffer += 2, FT_PEEK_SHORT_LE( buffer - 2 ) )
    
    262 262
     
    
    263
    -#define FT_NEXT_USHORT_LE( buffer )                                            \
    
    264
    -          ( (unsigned short)( buffer += 2, FT_PEEK_USHORT_LE( buffer - 2 ) ) )
    
    263
    +#define FT_NEXT_USHORT_LE( buffer )                        \
    
    264
    +          ( buffer += 2, FT_PEEK_USHORT_LE( buffer - 2 ) )
    
    265 265
     
    
    266
    -#define FT_NEXT_OFF3_LE( buffer )                                  \
    
    267
    -          ( (long)( buffer += 3, FT_PEEK_OFF3_LE( buffer - 3 ) ) )
    
    266
    +#define FT_NEXT_OFF3_LE( buffer )                        \
    
    267
    +          ( buffer += 3, FT_PEEK_OFF3_LE( buffer - 3 ) )
    
    268 268
     
    
    269
    -#define FT_NEXT_UOFF3_LE( buffer )                                           \
    
    270
    -          ( (unsigned long)( buffer += 3, FT_PEEK_UOFF3_LE( buffer - 3 ) ) )
    
    269
    +#define FT_NEXT_UOFF3_LE( buffer )                        \
    
    270
    +          ( buffer += 3, FT_PEEK_UOFF3_LE( buffer - 3 ) )
    
    271 271
     
    
    272
    -#define FT_NEXT_LONG_LE( buffer )                                  \
    
    273
    -          ( (long)( buffer += 4, FT_PEEK_LONG_LE( buffer - 4 ) ) )
    
    272
    +#define FT_NEXT_LONG_LE( buffer )                        \
    
    273
    +          ( buffer += 4, FT_PEEK_LONG_LE( buffer - 4 ) )
    
    274 274
     
    
    275
    -#define FT_NEXT_ULONG_LE( buffer )                                           \
    
    276
    -          ( (unsigned long)( buffer += 4, FT_PEEK_ULONG_LE( buffer - 4 ) ) )
    
    275
    +#define FT_NEXT_ULONG_LE( buffer )                        \
    
    276
    +          ( buffer += 4, FT_PEEK_ULONG_LE( buffer - 4 ) )
    
    277 277
     
    
    278 278
     
    
    279 279
       /**************************************************************************
    
    ... ... @@ -307,17 +307,17 @@ FT_BEGIN_HEADER
    307 307
     
    
    308 308
     #define FT_GET_CHAR()       FT_GET_MACRO( FT_Stream_GetByte, FT_Char )
    
    309 309
     #define FT_GET_BYTE()       FT_GET_MACRO( FT_Stream_GetByte, FT_Byte )
    
    310
    -#define FT_GET_SHORT()      FT_GET_MACRO( FT_Stream_GetUShort, FT_Short )
    
    311
    -#define FT_GET_USHORT()     FT_GET_MACRO( FT_Stream_GetUShort, FT_UShort )
    
    312
    -#define FT_GET_UOFF3()      FT_GET_MACRO( FT_Stream_GetUOffset, FT_ULong )
    
    313
    -#define FT_GET_LONG()       FT_GET_MACRO( FT_Stream_GetULong, FT_Long )
    
    314
    -#define FT_GET_ULONG()      FT_GET_MACRO( FT_Stream_GetULong, FT_ULong )
    
    315
    -#define FT_GET_TAG4()       FT_GET_MACRO( FT_Stream_GetULong, FT_ULong )
    
    316
    -
    
    317
    -#define FT_GET_SHORT_LE()   FT_GET_MACRO( FT_Stream_GetUShortLE, FT_Short )
    
    318
    -#define FT_GET_USHORT_LE()  FT_GET_MACRO( FT_Stream_GetUShortLE, FT_UShort )
    
    319
    -#define FT_GET_LONG_LE()    FT_GET_MACRO( FT_Stream_GetULongLE, FT_Long )
    
    320
    -#define FT_GET_ULONG_LE()   FT_GET_MACRO( FT_Stream_GetULongLE, FT_ULong )
    
    310
    +#define FT_GET_SHORT()      FT_GET_MACRO( FT_Stream_GetUShort, FT_Int16 )
    
    311
    +#define FT_GET_USHORT()     FT_GET_MACRO( FT_Stream_GetUShort, FT_UInt16 )
    
    312
    +#define FT_GET_UOFF3()      FT_GET_MACRO( FT_Stream_GetUOffset, FT_UInt32 )
    
    313
    +#define FT_GET_LONG()       FT_GET_MACRO( FT_Stream_GetULong, FT_Int32 )
    
    314
    +#define FT_GET_ULONG()      FT_GET_MACRO( FT_Stream_GetULong, FT_UInt32 )
    
    315
    +#define FT_GET_TAG4()       FT_GET_MACRO( FT_Stream_GetULong, FT_UInt32 )
    
    316
    +
    
    317
    +#define FT_GET_SHORT_LE()   FT_GET_MACRO( FT_Stream_GetUShortLE, FT_Int32 )
    
    318
    +#define FT_GET_USHORT_LE()  FT_GET_MACRO( FT_Stream_GetUShortLE, FT_UInt32 )
    
    319
    +#define FT_GET_LONG_LE()    FT_GET_MACRO( FT_Stream_GetULongLE, FT_Int32 )
    
    320
    +#define FT_GET_ULONG_LE()   FT_GET_MACRO( FT_Stream_GetULongLE, FT_UInt32 )
    
    321 321
     #endif
    
    322 322
     
    
    323 323
     
    
    ... ... @@ -334,16 +334,16 @@ FT_BEGIN_HEADER
    334 334
        */
    
    335 335
     #define FT_READ_BYTE( var )       FT_READ_MACRO( FT_Stream_ReadByte, FT_Byte, var )
    
    336 336
     #define FT_READ_CHAR( var )       FT_READ_MACRO( FT_Stream_ReadByte, FT_Char, var )
    
    337
    -#define FT_READ_SHORT( var )      FT_READ_MACRO( FT_Stream_ReadUShort, FT_Short, var )
    
    338
    -#define FT_READ_USHORT( var )     FT_READ_MACRO( FT_Stream_ReadUShort, FT_UShort, var )
    
    339
    -#define FT_READ_UOFF3( var )      FT_READ_MACRO( FT_Stream_ReadUOffset, FT_ULong, var )
    
    340
    -#define FT_READ_LONG( var )       FT_READ_MACRO( FT_Stream_ReadULong, FT_Long, var )
    
    341
    -#define FT_READ_ULONG( var )      FT_READ_MACRO( FT_Stream_ReadULong, FT_ULong, var )
    
    337
    +#define FT_READ_SHORT( var )      FT_READ_MACRO( FT_Stream_ReadUShort, FT_Int16, var )
    
    338
    +#define FT_READ_USHORT( var )     FT_READ_MACRO( FT_Stream_ReadUShort, FT_UInt16, var )
    
    339
    +#define FT_READ_UOFF3( var )      FT_READ_MACRO( FT_Stream_ReadUOffset, FT_UInt32, var )
    
    340
    +#define FT_READ_LONG( var )       FT_READ_MACRO( FT_Stream_ReadULong, FT_Int32, var )
    
    341
    +#define FT_READ_ULONG( var )      FT_READ_MACRO( FT_Stream_ReadULong, FT_UInt32, var )
    
    342 342
     
    
    343
    -#define FT_READ_SHORT_LE( var )   FT_READ_MACRO( FT_Stream_ReadUShortLE, FT_Short, var )
    
    344
    -#define FT_READ_USHORT_LE( var )  FT_READ_MACRO( FT_Stream_ReadUShortLE, FT_UShort, var )
    
    345
    -#define FT_READ_LONG_LE( var )    FT_READ_MACRO( FT_Stream_ReadULongLE, FT_Long, var )
    
    346
    -#define FT_READ_ULONG_LE( var )   FT_READ_MACRO( FT_Stream_ReadULongLE, FT_ULong, var )
    
    343
    +#define FT_READ_SHORT_LE( var )   FT_READ_MACRO( FT_Stream_ReadUShortLE, FT_Int16, var )
    
    344
    +#define FT_READ_USHORT_LE( var )  FT_READ_MACRO( FT_Stream_ReadUShortLE, FT_UInt16, var )
    
    345
    +#define FT_READ_LONG_LE( var )    FT_READ_MACRO( FT_Stream_ReadULongLE, FT_Int32, var )
    
    346
    +#define FT_READ_ULONG_LE( var )   FT_READ_MACRO( FT_Stream_ReadULongLE, FT_UInt32, var )
    
    347 347
     
    
    348 348
     
    
    349 349
     #ifndef FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM
    
    ... ... @@ -459,23 +459,23 @@ FT_BEGIN_HEADER
    459 459
       FT_Stream_GetByte( FT_Stream  stream );
    
    460 460
     
    
    461 461
       /* read a 16-bit big-endian unsigned integer from an entered frame */
    
    462
    -  FT_BASE( FT_UShort )
    
    462
    +  FT_BASE( FT_UInt16 )
    
    463 463
       FT_Stream_GetUShort( FT_Stream  stream );
    
    464 464
     
    
    465 465
       /* read a 24-bit big-endian unsigned integer from an entered frame */
    
    466
    -  FT_BASE( FT_ULong )
    
    466
    +  FT_BASE( FT_UInt32 )
    
    467 467
       FT_Stream_GetUOffset( FT_Stream  stream );
    
    468 468
     
    
    469 469
       /* read a 32-bit big-endian unsigned integer from an entered frame */
    
    470
    -  FT_BASE( FT_ULong )
    
    470
    +  FT_BASE( FT_UInt32 )
    
    471 471
       FT_Stream_GetULong( FT_Stream  stream );
    
    472 472
     
    
    473 473
       /* read a 16-bit little-endian unsigned integer from an entered frame */
    
    474
    -  FT_BASE( FT_UShort )
    
    474
    +  FT_BASE( FT_UInt16 )
    
    475 475
       FT_Stream_GetUShortLE( FT_Stream  stream );
    
    476 476
     
    
    477 477
       /* read a 32-bit little-endian unsigned integer from an entered frame */
    
    478
    -  FT_BASE( FT_ULong )
    
    478
    +  FT_BASE( FT_UInt32 )
    
    479 479
       FT_Stream_GetULongLE( FT_Stream  stream );
    
    480 480
     
    
    481 481
     
    
    ... ... @@ -485,7 +485,7 @@ FT_BEGIN_HEADER
    485 485
                           FT_Error*  error );
    
    486 486
     
    
    487 487
       /* read a 16-bit big-endian unsigned integer from a stream */
    
    488
    -  FT_BASE( FT_UShort )
    
    488
    +  FT_BASE( FT_UInt16 )
    
    489 489
       FT_Stream_ReadUShort( FT_Stream  stream,
    
    490 490
                             FT_Error*  error );
    
    491 491
     
    
    ... ... @@ -495,17 +495,17 @@ FT_BEGIN_HEADER
    495 495
                              FT_Error*  error );
    
    496 496
     
    
    497 497
       /* read a 32-bit big-endian integer from a stream */
    
    498
    -  FT_BASE( FT_ULong )
    
    498
    +  FT_BASE( FT_UInt32 )
    
    499 499
       FT_Stream_ReadULong( FT_Stream  stream,
    
    500 500
                            FT_Error*  error );
    
    501 501
     
    
    502 502
       /* read a 16-bit little-endian unsigned integer from a stream */
    
    503
    -  FT_BASE( FT_UShort )
    
    503
    +  FT_BASE( FT_UInt16 )
    
    504 504
       FT_Stream_ReadUShortLE( FT_Stream  stream,
    
    505 505
                               FT_Error*  error );
    
    506 506
     
    
    507 507
       /* read a 32-bit little-endian unsigned integer from a stream */
    
    508
    -  FT_BASE( FT_ULong )
    
    508
    +  FT_BASE( FT_UInt32 )
    
    509 509
       FT_Stream_ReadULongLE( FT_Stream  stream,
    
    510 510
                              FT_Error*  error );
    
    511 511
     
    

  • src/base/ftstream.c
    ... ... @@ -363,11 +363,11 @@
    363 363
       }
    
    364 364
     
    
    365 365
     
    
    366
    -  FT_BASE_DEF( FT_UShort )
    
    366
    +  FT_BASE_DEF( FT_UInt16 )
    
    367 367
       FT_Stream_GetUShort( FT_Stream  stream )
    
    368 368
       {
    
    369 369
         FT_Byte*   p;
    
    370
    -    FT_UShort  result;
    
    370
    +    FT_UInt16  result;
    
    371 371
     
    
    372 372
     
    
    373 373
         FT_ASSERT( stream && stream->cursor );
    
    ... ... @@ -382,11 +382,11 @@
    382 382
       }
    
    383 383
     
    
    384 384
     
    
    385
    -  FT_BASE_DEF( FT_UShort )
    
    385
    +  FT_BASE_DEF( FT_UInt16 )
    
    386 386
       FT_Stream_GetUShortLE( FT_Stream  stream )
    
    387 387
       {
    
    388 388
         FT_Byte*   p;
    
    389
    -    FT_UShort  result;
    
    389
    +    FT_UInt16  result;
    
    390 390
     
    
    391 391
     
    
    392 392
         FT_ASSERT( stream && stream->cursor );
    
    ... ... @@ -401,11 +401,11 @@
    401 401
       }
    
    402 402
     
    
    403 403
     
    
    404
    -  FT_BASE_DEF( FT_ULong )
    
    404
    +  FT_BASE_DEF( FT_UInt32 )
    
    405 405
       FT_Stream_GetUOffset( FT_Stream  stream )
    
    406 406
       {
    
    407 407
         FT_Byte*  p;
    
    408
    -    FT_ULong  result;
    
    408
    +    FT_UInt32 result;
    
    409 409
     
    
    410 410
     
    
    411 411
         FT_ASSERT( stream && stream->cursor );
    
    ... ... @@ -419,11 +419,11 @@
    419 419
       }
    
    420 420
     
    
    421 421
     
    
    422
    -  FT_BASE_DEF( FT_ULong )
    
    422
    +  FT_BASE_DEF( FT_UInt32 )
    
    423 423
       FT_Stream_GetULong( FT_Stream  stream )
    
    424 424
       {
    
    425 425
         FT_Byte*  p;
    
    426
    -    FT_ULong  result;
    
    426
    +    FT_UInt32 result;
    
    427 427
     
    
    428 428
     
    
    429 429
         FT_ASSERT( stream && stream->cursor );
    
    ... ... @@ -437,11 +437,11 @@
    437 437
       }
    
    438 438
     
    
    439 439
     
    
    440
    -  FT_BASE_DEF( FT_ULong )
    
    440
    +  FT_BASE_DEF( FT_UInt32 )
    
    441 441
       FT_Stream_GetULongLE( FT_Stream  stream )
    
    442 442
       {
    
    443 443
         FT_Byte*  p;
    
    444
    -    FT_ULong  result;
    
    444
    +    FT_UInt32 result;
    
    445 445
     
    
    446 446
     
    
    447 447
         FT_ASSERT( stream && stream->cursor );
    
    ... ... @@ -493,13 +493,13 @@
    493 493
       }
    
    494 494
     
    
    495 495
     
    
    496
    -  FT_BASE_DEF( FT_UShort )
    
    496
    +  FT_BASE_DEF( FT_UInt16 )
    
    497 497
       FT_Stream_ReadUShort( FT_Stream  stream,
    
    498 498
                             FT_Error*  error )
    
    499 499
       {
    
    500 500
         FT_Byte    reads[2];
    
    501 501
         FT_Byte*   p;
    
    502
    -    FT_UShort  result = 0;
    
    502
    +    FT_UInt16  result = 0;
    
    503 503
     
    
    504 504
     
    
    505 505
         FT_ASSERT( stream );
    
    ... ... @@ -538,13 +538,13 @@
    538 538
       }
    
    539 539
     
    
    540 540
     
    
    541
    -  FT_BASE_DEF( FT_UShort )
    
    541
    +  FT_BASE_DEF( FT_UInt16 )
    
    542 542
       FT_Stream_ReadUShortLE( FT_Stream  stream,
    
    543 543
                               FT_Error*  error )
    
    544 544
       {
    
    545 545
         FT_Byte    reads[2];
    
    546 546
         FT_Byte*   p;
    
    547
    -    FT_UShort  result = 0;
    
    547
    +    FT_UInt16  result = 0;
    
    548 548
     
    
    549 549
     
    
    550 550
         FT_ASSERT( stream );
    
    ... ... @@ -628,13 +628,13 @@
    628 628
       }
    
    629 629
     
    
    630 630
     
    
    631
    -  FT_BASE_DEF( FT_ULong )
    
    631
    +  FT_BASE_DEF( FT_UInt32 )
    
    632 632
       FT_Stream_ReadULong( FT_Stream  stream,
    
    633 633
                            FT_Error*  error )
    
    634 634
       {
    
    635 635
         FT_Byte   reads[4];
    
    636 636
         FT_Byte*  p;
    
    637
    -    FT_ULong  result = 0;
    
    637
    +    FT_UInt32 result = 0;
    
    638 638
     
    
    639 639
     
    
    640 640
         FT_ASSERT( stream );
    
    ... ... @@ -673,13 +673,13 @@
    673 673
       }
    
    674 674
     
    
    675 675
     
    
    676
    -  FT_BASE_DEF( FT_ULong )
    
    676
    +  FT_BASE_DEF( FT_UInt32 )
    
    677 677
       FT_Stream_ReadULongLE( FT_Stream  stream,
    
    678 678
                              FT_Error*  error )
    
    679 679
       {
    
    680 680
         FT_Byte   reads[4];
    
    681 681
         FT_Byte*  p;
    
    682
    -    FT_ULong  result = 0;
    
    682
    +    FT_UInt32 result = 0;
    
    683 683
     
    
    684 684
     
    
    685 685
         FT_ASSERT( stream );
    


  • reply via email to

    [Prev in Thread] Current Thread [Next in Thread]