Browse Source

Guard against reading directories as ROM files.

master
Ben Kurtovic 9 years ago
parent
commit
1601d86349
3 changed files with 26 additions and 9 deletions
  1. +2
    -2
      crater.c
  2. +22
    -5
      src/rom.c
  3. +2
    -2
      src/rom.h

+ 2
- 2
crater.c View File

@@ -150,7 +150,7 @@ int main(int argc, char *argv[])
if (rom_path[0] == '\0') if (rom_path[0] == '\0')
FATAL("no image given") FATAL("no image given")


if (!(rom = open_rom(rom_path))) {
if (!(rom = rom_open(rom_path))) {
if (errno == ENOMEM) if (errno == ENOMEM)
OUT_OF_MEMORY() OUT_OF_MEMORY()
else else
@@ -162,6 +162,6 @@ int main(int argc, char *argv[])


// TODO: start from here // TODO: start from here


close_rom(rom);
rom_close(rom);
return 0; return 0;
} }

+ 22
- 5
src/rom.c View File

@@ -1,34 +1,51 @@
/* Copyright (C) 2014-2015 Ben Kurtovic <ben.kurtovic@gmail.com> /* Copyright (C) 2014-2015 Ben Kurtovic <ben.kurtovic@gmail.com>
Released under the terms of the MIT License. See LICENSE for details. */ Released under the terms of the MIT License. See LICENSE for details. */


#include <errno.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <sys/stat.h>


#include "rom.h" #include "rom.h"


/* Create and return a ROM object located at the given path. Return NULL if /* Create and return a ROM object located at the given path. Return NULL if
there was an error; errno will be set appropriately. */ there was an error; errno will be set appropriately. */
rom_type* open_rom(const char *path)
rom_type* rom_open(const char *path)
{ {
rom_type *rom; rom_type *rom;
FILE* fp; FILE* fp;
struct stat s;


if (!(fp = fopen(path, "r"))) if (!(fp = fopen(path, "r")))
return NULL; return NULL;
if (!(rom = malloc(sizeof(rom_type))))

if (fstat(fileno(fp), &s)) {
fclose(fp);
return NULL;
}
if (!(s.st_mode & S_IFREG)) {
if (s.st_mode & S_IFDIR)
errno = EISDIR;
fclose(fp);
return NULL;
}

if (!(rom = malloc(sizeof(rom_type)))) {
fclose(fp);
return NULL; return NULL;
}
rom->name = malloc(sizeof(char) * (strlen(path) + 1)); rom->name = malloc(sizeof(char) * (strlen(path) + 1));
strcpy(rom->name, path); strcpy(rom->name, path);


// load data from file into a buffer
// TODO: load data from file into a buffer


fclose(fp); fclose(fp);
return rom; return rom;
} }


/* Free a ROM object previously created with open_rom(). */
void close_rom(rom_type *rom)
/* Free a ROM object previously created with rom_open(). */
void rom_close(rom_type *rom)
{ {
free(rom); free(rom);
} }

+ 2
- 2
src/rom.h View File

@@ -12,5 +12,5 @@ typedef struct {


/* Functions */ /* Functions */


rom_type* open_rom(const char*);
void close_rom(rom_type*);
rom_type* rom_open(const char*);
void rom_close(rom_type*);

Loading…
Cancel
Save