| 
									
										
										
										
											2016-06-04 23:10:49 +08:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2020-10-15 21:10:06 +08:00
										 |  |  |  * Copyright 2016-2020 The OpenSSL Project Authors. All Rights Reserved. | 
					
						
							| 
									
										
										
										
											2016-06-04 23:10:49 +08:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-12-06 21:07:47 +08:00
										 |  |  |  * Licensed under the Apache License 2.0 (the "License"); | 
					
						
							| 
									
										
										
										
											2016-06-04 23:10:49 +08:00
										 |  |  |  * you may not use this file except in compliance with the License. | 
					
						
							|  |  |  |  * You may obtain a copy of the License at | 
					
						
							|  |  |  |  * https://www.openssl.org/source/license.html
 | 
					
						
							|  |  |  |  * or in the file LICENSE in the source distribution. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Given a list of files, run each of them through the fuzzer.  Note that | 
					
						
							|  |  |  |  * failure will be indicated by some kind of crash. Switching on things like | 
					
						
							|  |  |  |  * asan improves the test. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <stdio.h>
 | 
					
						
							|  |  |  | #include <stdlib.h>
 | 
					
						
							| 
									
										
										
										
											2018-03-28 21:46:28 +08:00
										 |  |  | #include <string.h>
 | 
					
						
							| 
									
										
										
										
											2016-06-04 23:10:49 +08:00
										 |  |  | #include <sys/stat.h>
 | 
					
						
							|  |  |  | #include <openssl/crypto.h>
 | 
					
						
							|  |  |  | #include "fuzzer.h"
 | 
					
						
							| 
									
										
										
										
											2018-03-28 21:46:28 +08:00
										 |  |  | #include "internal/o_dir.h"
 | 
					
						
							| 
									
										
										
										
											2016-06-04 23:10:49 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-11 05:01:32 +08:00
										 |  |  | #if defined(_WIN32) && defined(_MAX_PATH) && !defined(PATH_MAX)
 | 
					
						
							| 
									
										
										
										
											2018-03-28 21:46:28 +08:00
										 |  |  | # define PATH_MAX _MAX_PATH
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2016-06-04 23:10:49 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-28 21:46:28 +08:00
										 |  |  | #ifndef PATH_MAX
 | 
					
						
							|  |  |  | # define PATH_MAX 4096
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2016-06-04 23:10:49 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-28 21:46:28 +08:00
										 |  |  | # if !defined(S_ISREG)
 | 
					
						
							|  |  |  | #   define S_ISREG(m) ((m) & S_IFREG)
 | 
					
						
							|  |  |  | # endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void testfile(const char *pathname) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     struct stat st; | 
					
						
							|  |  |  |     FILE *f; | 
					
						
							|  |  |  |     unsigned char *buf; | 
					
						
							|  |  |  |     size_t s; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (stat(pathname, &st) < 0 || !S_ISREG(st.st_mode)) | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     printf("# %s\n", pathname); | 
					
						
							|  |  |  |     fflush(stdout); | 
					
						
							|  |  |  |     f = fopen(pathname, "rb"); | 
					
						
							|  |  |  |     if (f == NULL) | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     buf = malloc(st.st_size); | 
					
						
							|  |  |  |     if (buf != NULL) { | 
					
						
							| 
									
										
										
										
											2016-06-04 23:10:49 +08:00
										 |  |  |         s = fread(buf, 1, st.st_size, f); | 
					
						
							|  |  |  |         OPENSSL_assert(s == (size_t)st.st_size); | 
					
						
							|  |  |  |         FuzzerTestOneInput(buf, s); | 
					
						
							|  |  |  |         free(buf); | 
					
						
							| 
									
										
										
										
											2018-03-28 21:46:28 +08:00
										 |  |  |     } | 
					
						
							|  |  |  |     fclose(f); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int main(int argc, char **argv) { | 
					
						
							|  |  |  |     int n; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     FuzzerInitialize(&argc, &argv); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for (n = 1; n < argc; ++n) { | 
					
						
							|  |  |  |         size_t dirname_len = strlen(argv[n]); | 
					
						
							|  |  |  |         const char *filename = NULL; | 
					
						
							|  |  |  |         char *pathname = NULL; | 
					
						
							|  |  |  |         OPENSSL_DIR_CTX *ctx = NULL; | 
					
						
							|  |  |  |         int wasdir = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         /*
 | 
					
						
							|  |  |  |          * We start with trying to read the given path as a directory. | 
					
						
							|  |  |  |          */ | 
					
						
							|  |  |  |         while ((filename = OPENSSL_DIR_read(&ctx, argv[n])) != NULL) { | 
					
						
							|  |  |  |             wasdir = 1; | 
					
						
							|  |  |  |             if (pathname == NULL) { | 
					
						
							|  |  |  |                 pathname = malloc(PATH_MAX); | 
					
						
							|  |  |  |                 if (pathname == NULL) | 
					
						
							|  |  |  |                     break; | 
					
						
							|  |  |  |                 strcpy(pathname, argv[n]); | 
					
						
							|  |  |  | #ifdef __VMS
 | 
					
						
							|  |  |  |                 if (strchr(":<]", pathname[dirname_len - 1]) == NULL) | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |                     pathname[dirname_len++] = '/'; | 
					
						
							|  |  |  |                 pathname[dirname_len] = '\0'; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             strcpy(pathname + dirname_len, filename); | 
					
						
							|  |  |  |             testfile(pathname); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         OPENSSL_DIR_end(&ctx); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         /* If it wasn't a directory, treat it as a file instead */ | 
					
						
							|  |  |  |         if (!wasdir) | 
					
						
							|  |  |  |             testfile(argv[n]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         free(pathname); | 
					
						
							| 
									
										
										
										
											2016-06-04 23:10:49 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-11-20 00:13:10 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     FuzzerCleanup(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-04 23:10:49 +08:00
										 |  |  |     return 0; | 
					
						
							|  |  |  | } |