]> granicus.if.org Git - libass/commitdiff
Fix bunch of UB
authorDr.Smile <vabnick@gmail.com>
Mon, 20 May 2019 21:37:05 +0000 (00:37 +0300)
committerDr.Smile <vabnick@gmail.com>
Mon, 20 May 2019 21:37:05 +0000 (00:37 +0300)
Found by Coverity Scan and -fsanitize=undefined

libass/ass.c
libass/ass_render.c

index c3bc6e52102af3dbe59fb7d246e43c75540409ac..50b0df2218773bf3e59acd4dc639b76ebb222d42 100644 (file)
@@ -188,7 +188,7 @@ static int test_and_set_read_order_bit(ASS_Track *track, int id)
     if (resize_read_order_bitmap(track, id) < 0)
         return -1;
     int index = id / 32;
-    int bit = 1 << (id % 32);
+    uint32_t bit = 1u << (id % 32);
     if (track->parser_priv->read_order_bitmap[index] & bit)
         return 1;
     track->parser_priv->read_order_bitmap[index] |= bit;
index af93ba476748656cea2e4e53fb2f5529d880960a..0c4d20413c5119c0b47ce3fefea851fa3e0f79e3 100644 (file)
@@ -2295,6 +2295,7 @@ static void render_and_combine_glyphs(ASS_Renderer *render_priv,
                 nb_bitmaps++;
             }
             last_info = info;
+            assert(current_info);
 
             ASS_Vector pos, pos_o;
             info->pos.x = double_to_d6(device_x + d6_to_double(info->pos.x) * render_priv->font_scale_x);
@@ -2302,7 +2303,7 @@ static void render_and_combine_glyphs(ASS_Renderer *render_priv,
             get_bitmap_glyph(render_priv, info, &pos, &pos_o,
                              &offset, !current_info->bitmap_count, flags);
 
-            if (!current_info || (!info->bm && !info->bm_o)) {
+            if (!info->bm && !info->bm_o) {
                 ass_cache_dec_ref(info->bm);
                 ass_cache_dec_ref(info->bm_o);
                 continue;
@@ -3080,7 +3081,8 @@ ASS_Image *ass_render_frame(ASS_Renderer *priv, ASS_Track *track,
     }
 
     // sort by layer
-    qsort(priv->eimg, cnt, sizeof(EventImages), cmp_event_layer);
+    if (cnt > 0)
+        qsort(priv->eimg, cnt, sizeof(EventImages), cmp_event_layer);
 
     // call fix_collisions for each group of events with the same layer
     EventImages *last = priv->eimg;