Coverage Report

Created: 2026-10-19 06:48

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/xpdf-4.06/build/fuzz_pdfload.cc
Line
Count
Source
1
/*  Copyright 2020 Google Inc.
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
#include <fuzzer/FuzzedDataProvider.h>
16
17
#include <vector>
18
#include <aconf.h>
19
#include <stdio.h>
20
#include <stdint.h>
21
#include <stdlib.h>
22
#include <stddef.h>
23
#include <string.h>
24
#include <png.h>
25
26
#include "gmem.h"
27
#include "gmempp.h"
28
#include "parseargs.h"
29
#include "GString.h"
30
#include "gfile.h"
31
#include "GlobalParams.h"
32
#include "Object.h"
33
#include "PDFDoc.h"
34
#include "SplashBitmap.h"
35
#include "Splash.h"
36
#include "SplashOutputDev.h"
37
#include "Stream.h"
38
#include "config.h"
39
#include "JBIG2Stream.h"
40
41
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
42
9.52k
{
43
9.52k
    FuzzedDataProvider fdp (data, size);
44
9.52k
    double hdpi = fdp.ConsumeFloatingPoint<double>();
45
9.52k
    double vdpi = fdp.ConsumeFloatingPoint<double>();
46
9.52k
    int rotate = fdp.ConsumeIntegral<int>();
47
9.52k
    bool useMediaBox = fdp.ConsumeBool();
48
9.52k
    bool crop = fdp.ConsumeBool();
49
9.52k
    bool printing = fdp.ConsumeBool();
50
9.52k
    std::vector<char> payload = fdp.ConsumeRemainingBytes<char>();
51
52
9.52k
    Object xpdf_obj;
53
9.52k
    xpdf_obj.initNull();
54
9.52k
    BaseStream *stream = new MemStream(payload.data(), 0, payload.size(), &xpdf_obj);
55
56
9.52k
    Object info, xfa;
57
9.52k
    Object *acroForm;
58
9.52k
    globalParams = new GlobalParams(NULL);
59
9.52k
    globalParams->setErrQuiet(1);
60
9.52k
    globalParams->setupBaseFonts(NULL);
61
9.52k
    char yes[] = "yes";
62
9.52k
    globalParams->setEnableFreeType(yes);  // Yes, it's a string and not a bool.
63
9.52k
    globalParams->setErrQuiet(1);
64
65
9.52k
    PDFDoc *doc = NULL;
66
9.52k
    try {
67
9.52k
      PDFDoc doc(stream);
68
9.52k
        if (doc.isOk() == gTrue)
69
9.39k
        {
70
9.39k
            doc.getNumPages();
71
9.39k
            doc.getOutline();
72
9.39k
            doc.getStructTreeRoot();
73
9.39k
            doc.getXRef();
74
9.39k
            doc.okToPrint(gTrue);
75
9.39k
            doc.okToCopy(gTrue);
76
9.39k
            doc.okToChange(gTrue);
77
9.39k
            doc.okToAddNotes(gTrue);
78
9.39k
            doc.isLinearized();
79
9.39k
            doc.getPDFVersion();
80
81
9.39k
            GString *metadata;
82
9.39k
            if ((metadata = doc.readMetadata())) {
83
853
              (void)metadata->getCString();
84
853
            }
85
9.39k
            delete metadata;
86
87
9.39k
            Object info;
88
9.39k
            doc.getDocInfo(&info);
89
9.39k
            if (info.isDict()) {
90
2.51k
              info.getDict();
91
2.51k
            }
92
9.39k
            info.free();
93
94
9.39k
            if ((acroForm = doc.getCatalog()->getAcroForm())->isDict()) {
95
768
                acroForm->dictLookup("XFA", &xfa);
96
768
                xfa.free();
97
768
            }
98
99
48.0k
            for (size_t i = 1; i <= doc.getNumPages(); i++) {
100
38.6k
              doc.getLinks(i);
101
38.6k
              auto page = doc.getCatalog()->getPage(i);
102
38.6k
              if (!page->isOk()) {
103
0
                continue;
104
0
              }
105
38.6k
              page->getResourceDict();
106
38.6k
              page->getMetadata();
107
38.6k
              page->getResourceDict();
108
38.6k
            }
109
110
9.39k
            SplashColor paperColor = {0xff, 0xff, 0xff};
111
9.39k
            SplashOutputDev *splashOut = new SplashOutputDev(splashModeRGB8, 1, gFalse, paperColor);
112
9.39k
            splashOut->setNoComposite(gTrue);
113
9.39k
            splashOut->startDoc(doc.getXRef());
114
48.0k
            for (size_t i = 1; i <= doc.getNumPages(); ++i) {
115
38.6k
              doc.displayPage(splashOut, NULL, i, hdpi, vdpi, rotate, useMediaBox, crop, printing);
116
38.6k
            }
117
9.39k
            (void)splashOut->getBitmap();
118
119
9.39k
            delete splashOut;
120
9.39k
        }
121
9.52k
    } catch (...) {
122
123
20
    }
124
125
9.52k
    delete globalParams;
126
127
9.52k
    return 0;
128
9.52k
}
129