| /* Copyright 2020 Google Inc. |
| |
| Licensed under the Apache License, Version 2.0 (the "License"); |
| you may not use this file except in compliance with the License. |
| You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| */ |
| |
| #include "sysdep.h" |
| #include "bfd.h" |
| |
| #include <stdint.h> |
| #include <stdio.h> |
| #include <unistd.h> |
| |
| static int bufferToFile(char * name, const uint8_t *Data, size_t Size) { |
| int fd = mkstemp(name); |
| if (fd < 0) { |
| printf("failed mkstemp, errno=%d\n", errno); |
| return -2; |
| } |
| if (write (fd, Data, Size) != Size) { |
| printf("failed write, errno=%d\n", errno); |
| close(fd); |
| return -3; |
| } |
| close(fd); |
| return 0; |
| } |
| |
| static int initialized = 0; |
| //TODO? part of fuzzing |
| char *target = NULL; |
| |
| int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { |
| char tmpfilename[32]; |
| if (initialized == 0) { |
| if (bfd_init () != BFD_INIT_MAGIC) { |
| abort(); |
| } |
| initialized = 1; |
| } |
| |
| strncpy(tmpfilename, "/tmp/fuzz.bfd-XXXXXX", 31); |
| if (bufferToFile(tmpfilename, Data, Size) < 0) { |
| return 0; |
| } |
| bfd *file = bfd_openr (tmpfilename, target); |
| if (file == NULL) |
| { |
| remove(tmpfilename); |
| return 0; |
| } |
| bfd_check_format (file, bfd_archive); |
| //TODO loop over subfiles and more processing |
| bfd_close (file); |
| remove(tmpfilename); |
| |
| return 0; |
| } |