Coverage Report

Created: 2026-09-03 06:13

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libtiff/contrib/oss-fuzz/write_fuzzer.cc
Line
Count
Source
1
// Copyright 2022 Google LLC
2
//
3
// Licensed under the Apache License, Version 2.0 (the "License");
4
// you may not use this file except in compliance with the License.
5
// You may obtain a copy of the License at
6
//
7
//      http://www.apache.org/licenses/LICENSE-2.0
8
//
9
// Unless required by applicable law or agreed to in writing, software
10
// distributed under the License is distributed on an "AS IS" BASIS,
11
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
// See the License for the specific language governing permissions and
13
// limitations under the License.
14
//
15
////////////////////////////////////////////////////////////////////////////////
16
17
#include <cstdint>
18
#include <cstdio>
19
#include <cstdlib>
20
#include <cstring>
21
#include <sstream>
22
#include <tiffio.h>
23
#include <tiffio.hxx>
24
25
#include <fuzzer/FuzzedDataProvider.h>
26
27
0
extern "C" void handle_error(const char *, const char *, va_list) { return; }
28
29
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size)
30
213
{
31
213
    if (Size < 5)
32
4
    {
33
4
        return 0;
34
4
    }
35
209
    FuzzedDataProvider fdp(Data, Size);
36
209
    uint32_t width = 10;
37
209
    const uint32_t length = 40;
38
209
    const uint32_t rows_per_strip = 1;
39
40
209
    const char *filename = "test_packbits.tif";
41
209
    TIFF *tif1 = TIFFOpen(filename, "w");
42
209
    if (!tif1)
43
0
    {
44
0
        fprintf(stderr, "Can't create test TIFF file %s.\n", filename);
45
0
        return 1;
46
0
    }
47
48
209
    switch (fdp.ConsumeIntegralInRange(0, 2))
49
209
    {
50
156
        case 0:
51
156
            if (!TIFFSetField(tif1, TIFFTAG_COMPRESSION, COMPRESSION_PACKBITS))
52
0
            {
53
0
                fprintf(stderr, "Can't set Compression tag.\n");
54
0
                TIFFClose(tif1);
55
0
                return 0;
56
0
            }
57
156
            if (!TIFFSetField(tif1, TIFFTAG_IMAGEWIDTH, width))
58
0
            {
59
0
                fprintf(stderr, "Can't set ImageWidth tag.\n");
60
0
                TIFFClose(tif1);
61
0
                return 0;
62
0
            }
63
156
            if (!TIFFSetField(tif1, TIFFTAG_IMAGELENGTH, length))
64
0
            {
65
0
                fprintf(stderr, "Can't set ImageLength tag.\n");
66
0
                TIFFClose(tif1);
67
0
                return 0;
68
0
            }
69
156
            if (!TIFFSetField(tif1, TIFFTAG_BITSPERSAMPLE, 8))
70
0
            {
71
0
                fprintf(stderr, "Can't set BitsPerSample tag.\n");
72
0
                TIFFClose(tif1);
73
0
                return 0;
74
0
            }
75
156
            if (!TIFFSetField(tif1, TIFFTAG_SAMPLESPERPIXEL, 1))
76
0
            {
77
0
                fprintf(stderr, "Can't set SamplesPerPixel tag.\n");
78
0
                TIFFClose(tif1);
79
0
                return 0;
80
0
            }
81
156
            if (!TIFFSetField(tif1, TIFFTAG_ROWSPERSTRIP, rows_per_strip))
82
0
            {
83
0
                fprintf(stderr, "Can't set SamplesPerPixel tag.\n");
84
0
                TIFFClose(tif1);
85
0
                return 0;
86
0
            }
87
156
            if (!TIFFSetField(tif1, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG))
88
0
            {
89
0
                fprintf(stderr, "Can't set PlanarConfiguration tag.\n");
90
0
                TIFFClose(tif1);
91
0
                return 0;
92
0
            }
93
203
        case 1:
94
203
            if (!TIFFSetField(tif1, TIFFTAG_COMPRESSION, COMPRESSION_NONE))
95
0
            {
96
0
                fprintf(stderr, "Can't set Compression tag.\n");
97
0
                TIFFClose(tif1);
98
0
                return 0;
99
0
            }
100
203
            if (!TIFFSetField(tif1, TIFFTAG_IMAGEWIDTH, width))
101
0
            {
102
0
                fprintf(stderr, "Can't set ImageWidth tag.\n");
103
0
                TIFFClose(tif1);
104
0
                return 0;
105
0
            }
106
203
            if (!TIFFSetField(tif1, TIFFTAG_IMAGELENGTH, length))
107
0
            {
108
0
                fprintf(stderr, "Can't set ImageWidth tag.\n");
109
0
                TIFFClose(tif1);
110
0
                return 0;
111
0
            }
112
203
            TIFFSetField(tif1, TIFFTAG_BITSPERSAMPLE, 8);
113
203
            TIFFSetField(tif1, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK);
114
203
            TIFFSetField(tif1, TIFFTAG_SAMPLESPERPIXEL, 1);
115
203
            TIFFSetField(tif1, TIFFTAG_ROWSPERSTRIP, 1);
116
209
    }
117
118
209
    tsize_t stripsize = TIFFStripSize(tif1);
119
209
    tstrip_t stripcount = TIFFNumberOfStrips(tif1);
120
209
    std::vector<uint8_t> rBytes = fdp.ConsumeRemainingBytes<uint8_t>();
121
122
209
    TIFFWriteEncodedStrip(tif1, tstrip_t(0), static_cast<void *>(rBytes.data()),
123
209
                          static_cast<int>(rBytes.size()));
124
209
    TIFFClose(tif1);
125
126
209
    return 0;
127
209
}