save-git: allocate user_info members on the heap

subsurface_user_info() only works on Linux (linux.c),
but it doesn't allocate values on the heap.

Solve this ownership problem by always allocating
.name and .email on the heap in subsurface_user_info()
and freeing in the caller.

If subsurface_user_info() did not modify any of the
values from NULL, use default ones, but allocate them
on the heap too.

Ref #1346

Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com>
This commit is contained in:
Lubomir I. Ivanov 2018-07-08 00:26:24 +03:00 committed by Dirk Hohndel
parent 2de5b95acf
commit 94d6e5d851
3 changed files with 14 additions and 12 deletions

View file

@ -712,8 +712,8 @@ int cylinderuse_from_text(const char *text);
struct user_info { struct user_info {
const char *name; char *name;
const char *email; char *email;
}; };
extern void subsurface_user_info(struct user_info *); extern void subsurface_user_info(struct user_info *);

View file

@ -39,7 +39,7 @@ void subsurface_user_info(struct user_info *user)
if (pwd) { if (pwd) {
if (!empty_string(pwd->pw_gecos)) if (!empty_string(pwd->pw_gecos))
user->name = pwd->pw_gecos; user->name = strdup(pwd->pw_gecos);
if (!username) if (!username)
username = pwd->pw_name; username = pwd->pw_name;
} }
@ -48,8 +48,7 @@ void subsurface_user_info(struct user_info *user)
struct membuffer mb = {}; struct membuffer mb = {};
gethostname(hostname, sizeof(hostname)); gethostname(hostname, sizeof(hostname));
put_format(&mb, "%s@%s", username, hostname); put_format(&mb, "%s@%s", username, hostname);
user->email = mb_cstring(&mb); user->email = mb_cstring(&mb); // 'email' is heap allocated
free_buffer(&mb);
} }
} }

View file

@ -1054,16 +1054,19 @@ static int get_authorship(git_repository *repo, git_signature **authorp)
if (git_signature_default(authorp, repo) == 0) if (git_signature_default(authorp, repo) == 0)
return 0; return 0;
#endif #endif
/* Default name information, with potential OS overrides */ /* try to fetch the user info from the OS, otherwise use default values. */
struct user_info user = { struct user_info user = { .name = NULL, .email = NULL };
.name = "Subsurface",
.email = "subsurface-app-account@subsurface-divelog.org"
};
subsurface_user_info(&user); subsurface_user_info(&user);
if (!user.name)
user.name = strdup("Subsurface");
if (!user.email)
user.email = strdup("subsurface-app-account@subsurface-divelog.org");
/* git_signature_default() is too recent */ /* git_signature_default() is too recent */
return git_signature_now(authorp, user.name, user.email); int ret = git_signature_now(authorp, user.name, user.email);
free((void *)user.name);
free((void *)user.email);
return ret;
} }
static void create_commit_message(struct membuffer *msg, bool create_empty) static void create_commit_message(struct membuffer *msg, bool create_empty)