/src/cms_virtual_profile_fuzzer.c
Line | Count | Source (jump to first uncovered line) |
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.44k | int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { |
17 | | |
18 | 5.44k | if (size < 16) { |
19 | 6 | return 0; |
20 | 6 | } |
21 | | |
22 | 5.43k | cmsHPROFILE hInProfile = cmsOpenProfileFromMem(data, size); |
23 | 5.43k | if (!hInProfile) { |
24 | 766 | return 0; |
25 | 766 | } |
26 | | |
27 | 4.67k | cmsHPROFILE hOutProfile = cmsCreate_sRGBProfile(); |
28 | 4.67k | if (!hOutProfile) { |
29 | 0 | cmsCloseProfile(hInProfile); |
30 | 0 | return 0; |
31 | 0 | } |
32 | 4.67k | cmsColorSpaceSignature srcCS = cmsGetColorSpace(hInProfile); |
33 | 4.67k | cmsUInt32Number nSrcComponents = cmsChannelsOf(srcCS); |
34 | 4.67k | cmsUInt32Number srcFormat; |
35 | 4.67k | if (srcCS == cmsSigLabData) { |
36 | 80 | srcFormat = |
37 | 80 | COLORSPACE_SH(PT_Lab) | CHANNELS_SH(nSrcComponents) | BYTES_SH(0); |
38 | 4.59k | } else { |
39 | 4.59k | srcFormat = |
40 | 4.59k | COLORSPACE_SH(PT_ANY) | CHANNELS_SH(nSrcComponents) | BYTES_SH(1); |
41 | 4.59k | } |
42 | 4.67k | cmsHTRANSFORM hTransform = cmsCreateTransform( |
43 | 4.67k | hInProfile, srcFormat, hOutProfile, TYPE_BGR_8, |
44 | 4.67k | *((const uint32_t *)data + 3) % 16, *((const uint32_t *)data + 2)); |
45 | | |
46 | 4.67k | cmsCloseProfile(hInProfile); |
47 | 4.67k | cmsCloseProfile(hOutProfile); |
48 | 4.67k | if (!hTransform) { |
49 | 4.00k | return 0; |
50 | 4.00k | } |
51 | | |
52 | 670 | cmsFloat64Number version; |
53 | 670 | if (*((const uint32_t *)data + 3) % 2 == 0) { |
54 | 510 | version = 3.4; |
55 | 510 | } else { |
56 | 160 | version = 4.4; |
57 | 160 | } |
58 | | |
59 | | // cmsTransform2DeviceLink |
60 | 670 | cmsHPROFILE devicelinkProfile = cmsTransform2DeviceLink( |
61 | 670 | hTransform, version, *((const uint32_t *)data + 2)); |
62 | | |
63 | | // clean up |
64 | 670 | cmsDeleteTransform(hTransform); |
65 | 670 | if (devicelinkProfile) { |
66 | 576 | cmsCloseProfile(devicelinkProfile); |
67 | 576 | } |
68 | | |
69 | | // cmsCreateLinearizationDeviceLink |
70 | 670 | cmsToneCurve *tone = cmsBuildGamma(NULL, *((const uint32_t *)data + 3)); |
71 | 670 | if (!tone) { |
72 | 0 | return 0; |
73 | 0 | } |
74 | | // 15 curves, so it can handle all color spaces |
75 | 670 | cmsToneCurve *rgb_curves[15] = {tone, tone, tone, tone, tone, |
76 | 670 | tone, tone, tone, tone, tone, |
77 | 670 | tone, tone, tone, tone, tone}; |
78 | 670 | cmsHPROFILE linearizationDeviceLinkProfile = |
79 | 670 | cmsCreateLinearizationDeviceLink(srcCS, rgb_curves); |
80 | | |
81 | 670 | cmsFreeToneCurve(tone); |
82 | | |
83 | 670 | if (linearizationDeviceLinkProfile) { |
84 | 652 | cmsCloseProfile(linearizationDeviceLinkProfile); |
85 | 652 | } |
86 | | |
87 | 670 | return 0; |
88 | 670 | } |