mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
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:
parent
2de5b95acf
commit
94d6e5d851
3 changed files with 14 additions and 12 deletions
|
|
@ -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 *);
|
||||||
|
|
|
||||||
|
|
@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue