Skip to content

Commit

Permalink
Allocate a GKeyFile only once we've decided to read the file
Browse files Browse the repository at this point in the history
  • Loading branch information
bgilbert committed Apr 26, 2015
1 parent 4cd4b83 commit 173d52c
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 24 deletions.
7 changes: 3 additions & 4 deletions src/openslide-private.h
Original file line number Diff line number Diff line change
Expand Up @@ -139,10 +139,9 @@ guint _openslide_int64_hash(gconstpointer v);
gboolean _openslide_int64_equal(gconstpointer v1, gconstpointer v2);
void _openslide_int64_free(gpointer data);

/* g_key_file_load_from_file wrapper */
bool _openslide_read_key_file(GKeyFile *key_file, const char *filename,
int32_t max_size, GKeyFileFlags flags,
GError **err);
/* g_key_file_new() + g_key_file_load_from_file() wrapper */
GKeyFile *_openslide_read_key_file(const char *filename, int32_t max_size,
GKeyFileFlags flags, GError **err);

/* fopen() wrapper which properly sets FD_CLOEXEC */
FILE *_openslide_fopen(const char *path, const char *mode, GError **err);
Expand Down
22 changes: 13 additions & 9 deletions src/openslide-util.c
Original file line number Diff line number Diff line change
Expand Up @@ -70,9 +70,8 @@ void _openslide_int64_free(gpointer data) {
g_slice_free(int64_t, data);
}

bool _openslide_read_key_file(GKeyFile *key_file, const char *filename,
int32_t max_size, GKeyFileFlags flags,
GError **err) {
GKeyFile *_openslide_read_key_file(const char *filename, int32_t max_size,
GKeyFileFlags flags, GError **err) {
char *buf = NULL;

/* We load the whole key file into memory and parse it with
Expand All @@ -95,7 +94,7 @@ bool _openslide_read_key_file(GKeyFile *key_file, const char *filename,

FILE *f = _openslide_fopen(filename, "rb", err);
if (f == NULL) {
return false;
return NULL;
}

// get file size and check against maximum
Expand Down Expand Up @@ -143,17 +142,22 @@ bool _openslide_read_key_file(GKeyFile *key_file, const char *filename,
offset = 3;
}

bool result = g_key_file_load_from_data(key_file,
buf + offset, size - offset,
flags, err);
// parse
GKeyFile *key_file = g_key_file_new();
if (!g_key_file_load_from_data(key_file,
buf + offset, size - offset,
flags, err)) {
g_key_file_free(key_file);
goto FAIL;
}
g_free(buf);
fclose(f);
return result;
return key_file;

FAIL:
g_free(buf);
fclose(f);
return false;
return NULL;
}

#undef fopen
Expand Down
17 changes: 9 additions & 8 deletions src/openslide-vendor-hamamatsu.c
Original file line number Diff line number Diff line change
Expand Up @@ -811,11 +811,10 @@ static bool hamamatsu_vms_vmu_detect(const char *filename,
}

// try to parse key file
GKeyFile *key_file = g_key_file_new();
if (!_openslide_read_key_file(key_file, filename, KEY_FILE_MAX_SIZE,
G_KEY_FILE_NONE, err)) {
GKeyFile *key_file = _openslide_read_key_file(filename, KEY_FILE_MAX_SIZE,
G_KEY_FILE_NONE, err);
if (!key_file) {
g_prefix_error(err, "Can't read key file: ");
g_key_file_free(key_file);
return false;
}

Expand Down Expand Up @@ -1815,9 +1814,9 @@ static bool hamamatsu_vms_vmu_open(openslide_t *osr, const char *filename,
bool success = false;

// first, see if it's a VMS/VMU file
GKeyFile *key_file = g_key_file_new();
if (!_openslide_read_key_file(key_file, filename, KEY_FILE_MAX_SIZE,
G_KEY_FILE_NONE, err)) {
GKeyFile *key_file = _openslide_read_key_file(filename, KEY_FILE_MAX_SIZE,
G_KEY_FILE_NONE, err);
if (!key_file) {
g_prefix_error(err, "Can't load key file: ");
goto DONE;
}
Expand Down Expand Up @@ -2086,7 +2085,9 @@ static bool hamamatsu_vms_vmu_open(openslide_t *osr, const char *filename,
}
g_free(image_filenames);
}
g_key_file_free(key_file);
if (key_file) {
g_key_file_free(key_file);
}

return success;
}
Expand Down
6 changes: 3 additions & 3 deletions src/openslide-vendor-mirax.c
Original file line number Diff line number Diff line change
Expand Up @@ -1539,9 +1539,9 @@ static bool mirax_open(openslide_t *osr, const char *filename,
goto FAIL;
}

slidedat = g_key_file_new();
if (!_openslide_read_key_file(slidedat, tmp, SLIDEDAT_MAX_SIZE,
G_KEY_FILE_NONE, err)) {
slidedat = _openslide_read_key_file(tmp, SLIDEDAT_MAX_SIZE,
G_KEY_FILE_NONE, err);
if (!slidedat) {
g_prefix_error(err, "Can't load Slidedat.ini file: ");
goto FAIL;
}
Expand Down

0 comments on commit 173d52c

Please sign in to comment.