Ticket #11693: target_sws_fuzzer1072.c

File target_sws_fuzzer1072.c, 2.5 KB (added by flyfish101, 12 months ago)

fuzz driver

Line 
1#include <stddef.h>
2#include <stdint.h>
3#include <string.h>
4#include <stdlib.h>
5
6#include <libavutil/imgutils.h>
7#include <libavutil/opt.h>
8#include <libavutil/pixdesc.h>
9#include <libavutil/intreadwrite.h>
10#include <libavutil/mem.h>
11#include <libavutil/avassert.h>
12#include <libswscale/swscale.h>
13#include "libavcodec/bytestream.h"
14
15int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
16 if (size < 128)
17 return 0;
18
19 // Initialize input reader
20 GetByteContext gbc;
21 bytestream2_init(&gbc, data, size);
22
23 // Read parameters from input
24 int srcW = bytestream2_get_le32(&gbc);
25 int srcH = bytestream2_get_le16(&gbc);
26 int dstW = bytestream2_get_le32(&gbc);
27 int dstH = bytestream2_get_le16(&gbc);
28 int flags = bytestream2_get_le32(&gbc);
29 int srcFormat = bytestream2_get_le32(&gbc);
30 int dstFormat = bytestream2_get_le32(&gbc);
31 int64_t flags64 = bytestream2_get_le64(&gbc);
32
33 // New: fuzzed srcSliceY, ensure within valid range
34 int fuzz_srcSliceY = bytestream2_get_le32(&gbc);
35 if (srcH <= 0 || dstH <= 0 || srcW <= 0 || dstW <= 0)
36 return 0;
37
38 fuzz_srcSliceY %= srcH;
39
40 const AVPixFmtDescriptor *desc_src = av_pix_fmt_desc_get(srcFormat);
41 const AVPixFmtDescriptor *desc_dst = av_pix_fmt_desc_get(dstFormat);
42 if (!desc_src || !desc_dst)
43 return 0;
44
45 // Allocate SwsContext
46 struct SwsContext *sws = sws_getContext(
47 srcW, srcH, srcFormat,
48 dstW, dstH, dstFormat,
49 flags, NULL, NULL, NULL
50 );
51 if (!sws)
52 return 0;
53
54 if (sws_init_context(sws, NULL, NULL) < 0)
55 goto end;
56
57 // Allocate image buffers
58 uint8_t *src_data[4] = {0};
59 int src_linesize[4];
60 uint8_t *dst_data[4] = {0};
61 int dst_linesize[4];
62
63 if (av_image_alloc(src_data, src_linesize, srcW, srcH, srcFormat, 1) < 0)
64 goto end;
65 if (av_image_alloc(dst_data, dst_linesize, dstW, dstH, dstFormat, 1) < 0)
66 goto cleanup_src;
67
68 // Copy remaining input data into source buffer
69 size_t remaining = size - bytestream2_tell(&gbc);
70 if (remaining > 0) {
71 size_t copy_size = FFMIN(remaining, av_image_get_buffer_size(srcFormat, srcW, srcH, 1));
72 memcpy(src_data[0], data + bytestream2_tell(&gbc), copy_size);
73 }
74
75 // Call sws_scale with fuzzed srcSliceY
76 sws_scale(sws,
77 (const uint8_t * const*)src_data, src_linesize,
78 fuzz_srcSliceY, srcH,
79 dst_data, dst_linesize);
80
81 av_freep(&dst_data[0]);
82cleanup_src:
83 av_freep(&src_data[0]);
84end:
85 sws_freeContext(sws);
86 return 0;
87}