• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /** \file test-null.c
2  * \brief Pass NULL values into libexif APIs and ensure it doesn't crash.
3  *
4  * Copyright (C) 2019 Dan Fandrich <dan@coneharvesters.com>
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the
18  * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19  * Boston, MA  02110-1301  USA.
20  *
21  */
22 
23 #include "libexif/exif-data.h"
24 #include "libexif/exif-entry.h"
25 #include "libexif/exif-loader.h"
26 #include "libexif/exif-mnote-data.h"
27 
28 #include <stdio.h>
29 #include <stdlib.h>
30 
loader_null_test(void)31 static void loader_null_test(void)
32 {
33 	ExifLoader *l;
34 	ExifData *d;
35 	unsigned char ret;
36 	const unsigned char *ccp;
37 	unsigned int i;
38 
39 	l = exif_loader_new_mem(NULL);
40 	if (l) {
41 		fprintf(stderr, "Unexpected success in %s\n", "exif_loader_new_mem");
42 		exit(13);
43 	}
44 
45 	exif_loader_ref(NULL);
46 
47 	exif_loader_unref(NULL);
48 
49 	exif_loader_write_file(NULL, "test");
50 
51 	exif_loader_write_file(NULL, NULL);
52 
53 	ret = exif_loader_write(NULL, (unsigned char *)"x", 1);
54 	if (ret) {
55 		fprintf(stderr, "Unexpected success in %s\n", "exif_loader_write");
56 		exit(13);
57 	}
58 
59 	exif_loader_write(NULL, NULL, 123);
60 
61 	exif_loader_reset(NULL);
62 
63 	d = exif_loader_get_data(NULL);
64 	if (d) {
65 		fprintf(stderr, "Unexpected success in %s\n", "exif_loader_get_data");
66 		exit(13);
67 	}
68 
69 	exif_loader_get_buf(NULL, NULL, NULL);
70 
71 	exif_loader_log(NULL, NULL);
72 
73 	l = exif_loader_new();
74 	if (!l) {
75 		fprintf(stderr, "Out of memory\n");
76 		exit(13);
77 	}
78 
79 	exif_loader_write_file(l, NULL);
80 
81 	exif_loader_write(l, NULL, 0);
82 	exif_loader_write(l, NULL, 1);
83 
84 	exif_loader_get_buf(l, NULL, NULL);
85 	exif_loader_get_buf(l, &ccp, NULL);
86 	exif_loader_get_buf(l, NULL, &i);
87 
88 	exif_loader_log(l, NULL);
89 
90 	exif_loader_unref(l);
91 }
92 
data_null_test(void)93 static void data_null_test(void)
94 {
95 	/* exif_data_new_from_file() is untested since it doesn't check path */
96 
97 	ExifData *d;
98 	ExifByteOrder bo;
99 	ExifMnoteData *m;
100 	ExifDataType dt;
101 	unsigned char *buf;
102 	unsigned int len;
103 
104 	d = exif_data_new_mem(NULL);
105 	if (d) {
106 		fprintf(stderr, "Unexpected success in %s\n", "exif_data_new_mem");
107 		exit(13);
108 	}
109 
110 	d = exif_data_new_from_data(NULL, 123);
111 	if (d) {
112 		exif_data_unref(d);
113 	}
114 
115 	bo = exif_data_get_byte_order(NULL);
116 	(void) bo;
117 
118 	exif_data_set_byte_order(NULL, EXIF_BYTE_ORDER_MOTOROLA);
119 
120 	m = exif_data_get_mnote_data(NULL);
121 	if (m) {
122 		fprintf(stderr, "Unexpected success in %s\n", "exif_data_get_mnote_data");
123 		exit(13);
124 	}
125 
126 	exif_data_fix(NULL);
127 
128 	exif_data_foreach_content(NULL, NULL, NULL);
129 
130 	exif_data_set_option(NULL, EXIF_DATA_OPTION_FOLLOW_SPECIFICATION);
131 
132 	exif_data_unset_option(NULL, EXIF_DATA_OPTION_FOLLOW_SPECIFICATION);
133 
134 	exif_data_set_data_type(NULL, EXIF_DATA_TYPE_UNCOMPRESSED_CHUNKY);
135 
136 	dt = exif_data_get_data_type(NULL);
137 	(void) dt;
138 
139 	exif_data_load_data(NULL, NULL, 123);
140 
141 	exif_data_save_data(NULL, NULL, NULL);
142 
143 	exif_data_log(NULL, NULL);
144 
145 	exif_data_dump(NULL);
146 
147 	exif_data_ref(NULL);
148 
149 	exif_data_unref(NULL);
150 
151 	d = exif_data_new();
152 	if (!d) {
153 		fprintf(stderr, "Out of memory\n");
154 		exit(13);
155 	}
156 
157 	exif_data_load_data(d, NULL, 123);
158 
159 	exif_data_save_data(d, NULL, &len);
160 	exif_data_save_data(d, &buf, NULL);
161 	exif_data_save_data(d, NULL, NULL);
162 
163 	exif_data_foreach_content(d, NULL, NULL);
164 
165 	exif_data_log(d, NULL);
166 
167 	exif_data_unref(d);
168 }
169 
content_null_test(void)170 static void content_null_test(void)
171 {
172 	ExifContent *c;
173 	ExifIfd i;
174 
175 	c = exif_content_new_mem(NULL);
176 	if (c) {
177 		fprintf(stderr, "Unexpected success in %s\n", "exif_content_new_mem");
178 		exit(13);
179 	}
180 
181 	exif_content_ref(NULL);
182 
183 	exif_content_unref(NULL);
184 
185 	exif_content_free(NULL);
186 
187 	exif_content_get_entry(NULL, EXIF_TAG_COMPRESSION);
188 
189 	exif_content_fix(NULL);
190 
191 	exif_content_foreach_entry(NULL, NULL, NULL);
192 
193 	i = exif_content_get_ifd(NULL);
194 	(void) i;
195 
196 	exif_content_dump(NULL, 0);
197 
198 	exif_content_add_entry(NULL, NULL);
199 
200 	exif_content_remove_entry(NULL, NULL);
201 
202 	exif_content_log(NULL, NULL);
203 
204 	c = exif_content_new();
205 	if (!c) {
206 		fprintf(stderr, "Out of memory\n");
207 		exit(13);
208 	}
209 
210 	exif_content_add_entry(c, NULL);
211 
212 	exif_content_remove_entry(c, NULL);
213 
214 	exif_content_log(c, NULL);
215 
216 	exif_content_foreach_entry(c, NULL, NULL);
217 
218 	exif_content_unref(c);
219 }
220 
entry_null_test(void)221 static void entry_null_test(void)
222 {
223 	ExifEntry *e;
224 	const char *v = NULL;
225 	char buf[] = {0};
226 	ExifData *d;
227 
228 	e = exif_entry_new_mem(NULL);
229 	if (e) {
230 		fprintf(stderr, "Unexpected success in %s\n", "exif_entry_new_mem");
231 		exit(13);
232 	}
233 
234 	exif_entry_ref(NULL);
235 
236 	exif_entry_unref(NULL);
237 
238 	exif_entry_free(NULL);
239 
240 	exif_entry_initialize(NULL, EXIF_TAG_COMPRESSION);
241 
242 	exif_entry_fix(NULL);
243 
244 	v = exif_entry_get_value(NULL, NULL, 123);
245 	if (v) {
246 		fprintf(stderr, "Unexpected success in %s\n", "exif_entry_get_value");
247 		exit(13);
248 	}
249 
250 	v = exif_entry_get_value(NULL, buf, 1);
251 	if (v != buf) {
252 		fprintf(stderr, "Unexpected value in %s\n", "exif_entry_get_value");
253 		exit(13);
254 	}
255 
256 	exif_entry_dump(NULL, 0);
257 
258 	/* Creating a plain ExifEntry isn't enough, since some functions require
259 	 * that it exists in an IFD.
260 	 */
261 	d = exif_data_new();
262 	if (!d) {
263 		fprintf(stderr, "Out of memory\n");
264 		exit(13);
265 	}
266 	/* Create the mandatory EXIF fields so we have something to work with */
267 	exif_data_fix(d);
268 	e = exif_content_get_entry (d->ifd[EXIF_IFD_0], EXIF_TAG_X_RESOLUTION);
269 
270 	(void) exif_entry_get_value(e, NULL, 0);
271 	(void) exif_entry_get_value(e, NULL, 123);
272 
273 	exif_data_unref(d);
274 }
275 
mnote_null_test(void)276 static void mnote_null_test(void)
277 {
278 	/* Note that these APIs aren't tested with a real ExifMnoteData pointer
279 	 * because it's impossible to create one without real data.
280 	 */
281 	exif_mnote_data_ref(NULL);
282 
283 	exif_mnote_data_unref(NULL);
284 
285 	exif_mnote_data_load(NULL, NULL, 123);
286 
287 	exif_mnote_data_load(NULL, (const unsigned char *)"x", 1);
288 
289 	exif_mnote_data_save(NULL, NULL, NULL);
290 
291 	exif_mnote_data_count(NULL);
292 
293 	exif_mnote_data_get_id(NULL, 0);
294 
295 	exif_mnote_data_get_name(NULL, 0);
296 
297 	exif_mnote_data_get_title(NULL, 0);
298 
299 	exif_mnote_data_get_description(NULL, 0);
300 
301 	exif_mnote_data_get_value(NULL, 0, NULL, 123);
302 
303 	exif_mnote_data_log(NULL, NULL);
304 }
305 
log_null_test(void)306 static void log_null_test(void)
307 {
308 	ExifLog *l;
309 	static va_list va;
310 
311 	l = exif_log_new_mem(NULL);
312 	if (l) {
313 		fprintf(stderr, "Unexpected success in %s\n", "exif_log_new_mem");
314 		exit(13);
315 	}
316 
317 	exif_log_ref(NULL);
318 
319 	exif_log_unref(NULL);
320 
321 	exif_log_free(NULL);
322 
323 	exif_log_set_func(NULL, NULL, NULL);
324 
325 	exif_log(NULL, EXIF_LOG_CODE_CORRUPT_DATA, "XXX", "YYY");
326 
327 	exif_logv(NULL, EXIF_LOG_CODE_CORRUPT_DATA, "XXX", "YYY", va);
328 
329 	l = exif_log_new();
330 	if (!l) {
331 		fprintf(stderr, "Out of memory\n");
332 		exit(13);
333 	}
334 
335 	exif_log_set_func(l, NULL, NULL);
336 
337 	exif_log_unref(l);
338 }
339 
main(void)340 int main(void)
341 {
342 	loader_null_test();
343 	data_null_test();
344 	content_null_test();
345 	entry_null_test();
346 	mnote_null_test();
347 	log_null_test();
348 
349 	/* If it gets here, we didn't get a SIGSEGV, so success! */
350 	return 0;
351 }
352