Coverage Report

Created: 2025-10-30 06:33

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/cms_virtual_profile_fuzzer.c
Line
Count
Source
1
/* Copyright 2023 Google LLC
2
Licensed under the Apache License, Version 2.0 (the "License");
3
you may not use this file except in compliance with the License.
4
You may obtain a copy of the License at
5
      http://www.apache.org/licenses/LICENSE-2.0
6
Unless required by applicable law or agreed to in writing, software
7
distributed under the License is distributed on an "AS IS" BASIS,
8
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
9
See the License for the specific language governing permissions and
10
limitations under the License.
11
*/
12
13
#include "lcms2.h"
14
#include <stdint.h>
15
16
5.16k
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
17
18
5.16k
  if (size < 16) {
19
6
    return 0;
20
6
  }
21
22
5.16k
  cmsHPROFILE hInProfile = cmsOpenProfileFromMem(data, size);
23
5.16k
  if (!hInProfile) {
24
652
    return 0;
25
652
  }
26
27
4.51k
  cmsHPROFILE hOutProfile = cmsCreate_sRGBProfile();
28
4.51k
  if (!hOutProfile) {
29
0
    cmsCloseProfile(hInProfile);
30
0
    return 0;
31
0
  }
32
4.51k
  cmsColorSpaceSignature srcCS = cmsGetColorSpace(hInProfile);
33
4.51k
  cmsUInt32Number nSrcComponents = cmsChannelsOf(srcCS);
34
4.51k
  cmsUInt32Number srcFormat;
35
4.51k
  if (srcCS == cmsSigLabData) {
36
102
    srcFormat =
37
102
        COLORSPACE_SH(PT_Lab) | CHANNELS_SH(nSrcComponents) | BYTES_SH(0);
38
4.40k
  } else {
39
4.40k
    srcFormat =
40
4.40k
        COLORSPACE_SH(PT_ANY) | CHANNELS_SH(nSrcComponents) | BYTES_SH(1);
41
4.40k
  }
42
4.51k
  cmsHTRANSFORM hTransform = cmsCreateTransform(
43
4.51k
      hInProfile, srcFormat, hOutProfile, TYPE_BGR_8,
44
4.51k
      *((const uint32_t *)data + 3) % 16, *((const uint32_t *)data + 2));
45
46
4.51k
  cmsCloseProfile(hInProfile);
47
4.51k
  cmsCloseProfile(hOutProfile);
48
4.51k
  if (!hTransform) {
49
3.75k
    return 0;
50
3.75k
  }
51
52
755
  cmsFloat64Number version;
53
755
  if (*((const uint32_t *)data + 3) % 2 == 0) {
54
603
    version = 3.4;
55
603
  } else {
56
152
    version = 4.4;
57
152
  }
58
59
  // cmsTransform2DeviceLink
60
755
  cmsHPROFILE devicelinkProfile = cmsTransform2DeviceLink(
61
755
      hTransform, version, *((const uint32_t *)data + 2));
62
63
  // clean up
64
755
  cmsDeleteTransform(hTransform);
65
755
  if (devicelinkProfile) {
66
636
    cmsCloseProfile(devicelinkProfile);
67
636
  }
68
69
  // cmsCreateLinearizationDeviceLink
70
755
  cmsToneCurve *tone = cmsBuildGamma(NULL, *((const uint32_t *)data + 3));
71
755
  if (!tone) {
72
0
    return 0;
73
0
  }
74
  // 15 curves, so it can handle all color spaces
75
755
  cmsToneCurve *rgb_curves[15] = {tone, tone, tone, tone, tone,
76
755
                                  tone, tone, tone, tone, tone,
77
755
                                  tone, tone, tone, tone, tone};
78
755
  cmsHPROFILE linearizationDeviceLinkProfile =
79
755
      cmsCreateLinearizationDeviceLink(srcCS, rgb_curves);
80
81
755
  cmsFreeToneCurve(tone);
82
83
755
  if (linearizationDeviceLinkProfile) {
84
742
    cmsCloseProfile(linearizationDeviceLinkProfile);
85
742
  }
86
87
755
  return 0;
88
755
}