mirror of
https://gitlab.com/mishakmak/pam-fprint-grosshack.git
synced 2026-04-09 04:13:33 +02:00
main: Fix memory leak when a save fails
and simplify the flow of that function. From https://bugs.launchpad.net/ubuntu/+source/fprintd/+bug/1745455/comments/7
This commit is contained in:
@ -95,16 +95,16 @@ int file_storage_print_data_save(struct fp_print_data *data,
|
|||||||
enum fp_finger finger, const char *username)
|
enum fp_finger finger, const char *username)
|
||||||
{
|
{
|
||||||
GError *err = NULL;
|
GError *err = NULL;
|
||||||
char *path, *dirpath, *buf;
|
char *path, *dirpath;
|
||||||
size_t len;
|
size_t len;
|
||||||
int r;
|
int r;
|
||||||
char *base_store = NULL;
|
char *base_store = NULL;
|
||||||
|
char *buf = NULL;
|
||||||
|
|
||||||
r = file_storage_get_basestore_for_username(username, &base_store);
|
r = file_storage_get_basestore_for_username(username, &base_store);
|
||||||
|
|
||||||
if (r < 0) {
|
if (r < 0)
|
||||||
return r;
|
goto out;
|
||||||
}
|
|
||||||
|
|
||||||
len = fp_print_data_get_data(data, (guchar **) &buf);
|
len = fp_print_data_get_data(data, (guchar **) &buf);
|
||||||
if (!len) {
|
if (!len) {
|
||||||
@ -115,27 +115,27 @@ int file_storage_print_data_save(struct fp_print_data *data,
|
|||||||
path = __get_path_to_print(fp_print_data_get_driver_id(data), fp_print_data_get_devtype(data), finger, base_store);
|
path = __get_path_to_print(fp_print_data_get_driver_id(data), fp_print_data_get_devtype(data), finger, base_store);
|
||||||
dirpath = g_path_get_dirname(path);
|
dirpath = g_path_get_dirname(path);
|
||||||
r = g_mkdir_with_parents(dirpath, DIR_PERMS);
|
r = g_mkdir_with_parents(dirpath, DIR_PERMS);
|
||||||
if (r < 0) {
|
|
||||||
g_free(base_store);
|
|
||||||
g_free(path);
|
|
||||||
g_free(dirpath);
|
g_free(dirpath);
|
||||||
return r;
|
if (r < 0) {
|
||||||
|
g_free(path);
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
//fp_dbg("saving to %s", path);
|
//fp_dbg("saving to %s", path);
|
||||||
g_file_set_contents(path, buf, len, &err);
|
g_file_set_contents(path, buf, len, &err);
|
||||||
free(buf);
|
|
||||||
g_free(dirpath);
|
|
||||||
g_free(path);
|
g_free(path);
|
||||||
if (err) {
|
if (err) {
|
||||||
r = err->code;
|
r = err->code;
|
||||||
//fp_err("save failed: %s", err->message);
|
//fp_err("save failed: %s", err->message);
|
||||||
g_error_free(err);
|
g_error_free(err);
|
||||||
/* FIXME interpret error codes */
|
/* FIXME interpret error codes */
|
||||||
return r;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
out:
|
||||||
|
g_clear_pointer(&buf, free);
|
||||||
|
g_clear_pointer(&base_store, g_free);
|
||||||
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int load_from_file(char *path, struct fp_print_data **data)
|
static int load_from_file(char *path, struct fp_print_data **data)
|
||||||
|
|||||||
Reference in New Issue
Block a user