summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOneric <oneric@oneric.stub>2022-06-03 21:51:00 +0200
committerOneric <oneric@oneric.stub>2022-07-03 16:19:50 +0200
commit4f35eedd3f074d0a95ad283fa55bb658511cd80a (patch)
treeab2e3fce62c06c1aac4d9fa469e8bb5481f4ceb0
parenta9d5901c59eb668a72b522d7fe19b6389d27ece8 (diff)
downloadlibass-4f35eedd3f074d0a95ad283fa55bb658511cd80a.tar.bz2
libass-4f35eedd3f074d0a95ad283fa55bb658511cd80a.tar.xz
fuzz: perform basic sanity checks on bitmaps
This checks the properties promised in our docs are met and shouldn't impact performance much.
-rw-r--r--fuzz/fuzz.c31
1 files changed, 26 insertions, 5 deletions
diff --git a/fuzz/fuzz.c b/fuzz/fuzz.c
index 3791397..c271109 100644
--- a/fuzz/fuzz.c
+++ b/fuzz/fuzz.c
@@ -16,6 +16,7 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
+#include <assert.h>
#include <stdarg.h>
#include <stdbool.h>
#include <stdio.h>
@@ -35,6 +36,8 @@
ASS_Library *ass_library = NULL;
ASS_Renderer *ass_renderer = NULL;
+uint8_t hval = 0;
+
void msg_callback(int level, const char *fmt, va_list va, void *data)
{
#if ASS_FUZZMODE == FUZZMODE_STANDALONE
@@ -45,6 +48,9 @@ void msg_callback(int level, const char *fmt, va_list va, void *data)
#endif
}
+static const int RWIDTH = 854;
+static const int RHEIGHT = 480;
+
static bool init_renderer(void)
{
if (ass_renderer)
@@ -56,8 +62,8 @@ static bool init_renderer(void)
ass_set_fonts(ass_renderer, NULL, "sans-serif",
ASS_FONTPROVIDER_AUTODETECT, NULL, 1);
- ass_set_frame_size(ass_renderer, 854, 480);
- ass_set_storage_size(ass_renderer, 854, 480);
+ ass_set_frame_size(ass_renderer, RWIDTH, RHEIGHT);
+ ass_set_storage_size(ass_renderer, RWIDTH, RHEIGHT);
return true;
}
@@ -82,15 +88,30 @@ static bool init(void)
return true;
}
+
+static inline void process_image(ASS_Image* imgs)
+{
+ for (; imgs; imgs = imgs->next) {
+ assert(imgs->w >= 0 && imgs->h >= 0 &&
+ imgs->dst_x >= 0 && imgs->dst_y >= 0 &&
+ imgs->dst_x + imgs->w <= RWIDTH &&
+ imgs->dst_y + imgs->h <= RHEIGHT &&
+ imgs->stride >= imgs->w);
+ // Check last pixel to probe for out-of-bounds errors
+ if (imgs->w && imgs->h)
+ hval ^= *(imgs->bitmap + imgs->stride * (imgs->h - 1) + imgs->w - 1);
+ }
+}
+
static void consume_track(ASS_Renderer *renderer, ASS_Track *track)
{
for (int n = 0; n < track->n_events; ++n) {
int change;
ASS_Event event = track->events[n];
- ass_render_frame(ass_renderer, track, event.Start, &change);
+ process_image(ass_render_frame(ass_renderer, track, event.Start, &change));
if (event.Duration > 1) {
- ass_render_frame(ass_renderer, track, event.Start + event.Duration/2, &change);
- ass_render_frame(ass_renderer, track, event.Start + event.Duration-1, &change);
+ process_image(ass_render_frame(ass_renderer, track, event.Start + event.Duration/2, &change));
+ process_image(ass_render_frame(ass_renderer, track, event.Start + event.Duration-1, &change));
}
}
}