Coverage Report

Created: 2025-07-12 06:24

/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
}