/src/cups/ossfuzz/fuzz_array.c
Line | Count | Source (jump to first uncovered line) |
1 | | // |
2 | | // Array fuzz program for CUPS. |
3 | | // |
4 | | // Copyright © 2020-2024 by OpenPrinting. |
5 | | // Copyright © 2007-2014 by Apple Inc. |
6 | | // Copyright © 1997-2006 by Easy Software Products. |
7 | | // |
8 | | // Licensed under Apache License v2.0. See the file "LICENSE" for more |
9 | | // information. |
10 | | // |
11 | | |
12 | | #include "string-private.h" |
13 | | #include "debug-private.h" |
14 | | #include "cups.h" |
15 | | #include "dir.h" |
16 | | #include "test-internal.h" |
17 | | |
18 | | // |
19 | | // Local functions... |
20 | | // |
21 | | |
22 | | // static double get_seconds(void); |
23 | | // static int load_words(const char *filename, cups_array_t *array); |
24 | | |
25 | | typedef struct { |
26 | | char* str1; |
27 | | char* str2; |
28 | | } FuzzArray; |
29 | | |
30 | | extern void generate_fuzz_array_data(const unsigned char *data, size_t size, FuzzArray *outData); |
31 | | extern void free_fuzz_array_data(FuzzArray *data); |
32 | | |
33 | | // fuzz entry point |
34 | 118 | int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { |
35 | 118 | int i; // Looping var |
36 | 118 | cups_array_t *array, // Test array |
37 | 118 | *dup_array; // Duplicate array |
38 | 118 | int status; // Exit status |
39 | 118 | char *text; // Text from array |
40 | | // int string_size; |
41 | 118 | char *saved[32]; // Saved entries |
42 | | |
43 | | // No errors so far... |
44 | 118 | status = 0; |
45 | | |
46 | 118 | if (Size < 4) { |
47 | 2 | return 0; |
48 | 2 | } |
49 | | |
50 | 116 | FuzzArray fuzzInput; |
51 | 116 | generate_fuzz_array_data(Data, Size, &fuzzInput); |
52 | 116 | char* first_string = fuzzInput.str1; |
53 | 116 | char* second_string = fuzzInput.str2; |
54 | | |
55 | | // cupsArrayNew() |
56 | 116 | array = cupsArrayNew3((cups_array_func_t)_cupsArrayStrcmp, (void *)first_string, NULL, 0, (cups_acopy_cb_t)_cupsArrayStrdup, (cups_afree_cb_t)_cupsArrayFree); |
57 | | |
58 | 116 | if (!array) |
59 | 0 | { |
60 | 0 | printf("returned NULL, expected pointer"); |
61 | 0 | abort(); |
62 | 0 | } |
63 | | |
64 | | // cupsArrayGetUserData() |
65 | 116 | if (cupsArrayGetUserData(array) != first_string) |
66 | 0 | { |
67 | 0 | printf("returned %p instead of %p", cupsArrayGetUserData(array), first_string); |
68 | 0 | abort(); |
69 | 0 | } |
70 | | |
71 | | // cupsArrayAdd() |
72 | 116 | if (!cupsArrayAdd(array, second_string)) |
73 | 0 | { |
74 | 0 | printf("Add String Error"); |
75 | 0 | abort(); |
76 | 0 | } |
77 | | |
78 | | // cupsArrayGetCount() |
79 | 116 | cupsArrayGetCount(array); |
80 | | |
81 | | // cupsArrayGetFirst() |
82 | 116 | text = (char *)cupsArrayGetFirst(array); |
83 | 116 | if (text == NULL) |
84 | 0 | { |
85 | 0 | printf("Error Reading"); |
86 | 0 | } |
87 | | |
88 | | // cupsArrayGetNext() |
89 | 116 | text = (char *)cupsArrayGetNext(array); |
90 | 116 | if (text == NULL) |
91 | 116 | { |
92 | 116 | printf("Error Reading"); |
93 | 116 | } |
94 | | |
95 | | // cupsArrayGetLast() |
96 | 116 | text = (char *)cupsArrayGetLast(array); |
97 | 116 | if (text == NULL) |
98 | 0 | { |
99 | 0 | printf("Error Reading"); |
100 | 0 | } |
101 | | |
102 | | // cupsArrayGetPrev() |
103 | 116 | text = (char *)cupsArrayGetPrev(array); |
104 | 116 | if (text == NULL) |
105 | 116 | { |
106 | 116 | printf("Error Reading"); |
107 | 116 | } |
108 | | |
109 | | // cupsArrayFind() |
110 | 116 | text = (char *)cupsArrayFind(array, second_string); |
111 | 116 | if (text == NULL) |
112 | 0 | { |
113 | 0 | printf("Error Finding"); |
114 | 0 | } |
115 | | |
116 | | // cupsArrayGetCurrent() |
117 | 116 | text = (char *)cupsArrayGetCurrent(array); |
118 | 116 | if (text == NULL) |
119 | 0 | { |
120 | 0 | printf("Error Finding"); |
121 | 0 | } |
122 | | |
123 | | // cupsArrayDup() |
124 | 116 | dup_array = cupsArrayDup(array); |
125 | | |
126 | | // cupsArrayRemove() |
127 | 116 | if (!cupsArrayRemove(array, first_string)) |
128 | 86 | { |
129 | 86 | printf("Error Finding"); |
130 | 86 | } |
131 | | |
132 | | // cupsArrayClear() |
133 | 116 | cupsArrayClear(array); |
134 | 116 | if (cupsArrayGetCount(array) != 0) |
135 | 0 | { |
136 | 0 | printf("Error Clearing"); |
137 | 0 | } |
138 | | |
139 | | // Test save/restore... |
140 | 3.82k | for (i = 0, text = (char *)cupsArrayGetFirst(array); i < 32; i ++, text = (char *)cupsArrayGetNext(array)) |
141 | 3.71k | { |
142 | 3.71k | saved[i] = text; |
143 | | |
144 | 3.71k | if (!cupsArraySave(array)) |
145 | 0 | break; |
146 | 3.71k | } |
147 | | |
148 | 3.82k | while (i > 0) |
149 | 3.71k | { |
150 | 3.71k | i --; |
151 | | |
152 | 3.71k | text = cupsArrayRestore(array); |
153 | 3.71k | if (text != saved[i]) |
154 | 0 | break; |
155 | 3.71k | } |
156 | | |
157 | | // Delete the arrays... |
158 | 116 | cupsArrayDelete(array); |
159 | 116 | cupsArrayDelete(dup_array); |
160 | | |
161 | 116 | free(first_string); |
162 | 116 | free(second_string); |
163 | | |
164 | 116 | if (status != 0) { |
165 | 0 | abort(); |
166 | 0 | } |
167 | | |
168 | 116 | return 0; |
169 | 116 | } |