freetype-commit
[Top][All Lists]
Advanced

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

[Git][freetype/freetype][master] * src/base/ftobjs.c (FT_Request_Metrics


From: Alexei Podtelezhnikov (@apodtele)
Subject: [Git][freetype/freetype][master] * src/base/ftobjs.c (FT_Request_Metrics): Avoid division by zero.
Date: Thu, 05 Jan 2023 03:45:39 +0000

Alexei Podtelezhnikov pushed to branch master at FreeType / FreeType

Commits:

  • 81a456b2
    by Alexei Podtelezhnikov at 2023-01-04T22:41:34-05:00
    * src/base/ftobjs.c (FT_Request_Metrics): Avoid division by zero.
    
    The division-by-zero might happen in broken fonts (see #1194).
    Instead of returning a huge number from FT_DivFix and failing
    to scale later, we now bail immediately.
    

1 changed file:

Changes:

  • src/base/ftobjs.c
    ... ... @@ -3280,34 +3280,49 @@
    3280 3280
           scaled_h = FT_REQUEST_HEIGHT( req );
    
    3281 3281
     
    
    3282 3282
           /* determine scales */
    
    3283
    -      if ( req->width )
    
    3283
    +      if ( req->height || !req->width )
    
    3284 3284
           {
    
    3285
    -        metrics->x_scale = FT_DivFix( scaled_w, w );
    
    3286
    -
    
    3287
    -        if ( req->height )
    
    3285
    +        if ( h == 0 )
    
    3288 3286
             {
    
    3289
    -          metrics->y_scale = FT_DivFix( scaled_h, h );
    
    3290
    -
    
    3291
    -          if ( req->type == FT_SIZE_REQUEST_TYPE_CELL )
    
    3292
    -          {
    
    3293
    -            if ( metrics->y_scale > metrics->x_scale )
    
    3294
    -              metrics->y_scale = metrics->x_scale;
    
    3295
    -            else
    
    3296
    -              metrics->x_scale = metrics->y_scale;
    
    3297
    -          }
    
    3287
    +          FT_ERROR(( "FT_Request_Metrics: Divide by zero\n" ));
    
    3288
    +          error = FT_ERR( Divide_By_Zero );
    
    3289
    +          goto Exit;
    
    3298 3290
             }
    
    3299
    -        else
    
    3291
    +
    
    3292
    +        metrics->y_scale = FT_DivFix( scaled_h, h );
    
    3293
    +      }
    
    3294
    +
    
    3295
    +      if ( req->width )
    
    3296
    +      {
    
    3297
    +        if ( w == 0 )
    
    3300 3298
             {
    
    3301
    -          metrics->y_scale = metrics->x_scale;
    
    3302
    -          scaled_h = FT_MulDiv( scaled_w, h, w );
    
    3299
    +          FT_ERROR(( "FT_Request_Metrics: Divide by zero\n" ));
    
    3300
    +          error = FT_ERR( Divide_By_Zero );
    
    3301
    +          goto Exit;
    
    3303 3302
             }
    
    3303
    +
    
    3304
    +        metrics->x_scale = FT_DivFix( scaled_w, w );
    
    3304 3305
           }
    
    3305 3306
           else
    
    3306 3307
           {
    
    3307
    -        metrics->x_scale = metrics->y_scale = FT_DivFix( scaled_h, h );
    
    3308
    +        metrics->x_scale = metrics->y_scale;
    
    3308 3309
             scaled_w = FT_MulDiv( scaled_h, w, h );
    
    3309 3310
           }
    
    3310 3311
     
    
    3312
    +      if ( !req->height )
    
    3313
    +      {
    
    3314
    +        metrics->y_scale = metrics->x_scale;
    
    3315
    +        scaled_h = FT_MulDiv( scaled_w, h, w );
    
    3316
    +      }
    
    3317
    +
    
    3318
    +      if ( req->type == FT_SIZE_REQUEST_TYPE_CELL )
    
    3319
    +      {
    
    3320
    +        if ( metrics->y_scale > metrics->x_scale )
    
    3321
    +          metrics->y_scale = metrics->x_scale;
    
    3322
    +        else
    
    3323
    +          metrics->x_scale = metrics->y_scale;
    
    3324
    +      }
    
    3325
    +
    
    3311 3326
       Calculate_Ppem:
    
    3312 3327
           /* calculate the ppems */
    
    3313 3328
           if ( req->type != FT_SIZE_REQUEST_TYPE_NOMINAL )
    


  • reply via email to

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