mirror of
https://github.com/git/git.git
synced 2025-03-16 12:35:18 +00:00
This reverts commit 31b49d9b653803e7c7fd18b21c8bdd86e3421668. That commit taught do_askpass to hand ownership of our buffer back to the caller rather than simply return a pointer into our internal strbuf. What it failed to notice, though, was that our internal strbuf is static, because we are trying to emulate the getpass() interface. By handing off ownership, we created a memory leak that cannot be solved. Sometimes git_prompt returns a static buffer from getpass() (or our smarter git_terminal_prompt wrapper), and sometimes it returns an allocated string from do_askpass. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
74 lines
1.4 KiB
C
74 lines
1.4 KiB
C
#include "cache.h"
|
|
#include "run-command.h"
|
|
#include "strbuf.h"
|
|
#include "prompt.h"
|
|
#include "compat/terminal.h"
|
|
|
|
static char *do_askpass(const char *cmd, const char *prompt)
|
|
{
|
|
struct child_process pass;
|
|
const char *args[3];
|
|
static struct strbuf buffer = STRBUF_INIT;
|
|
int err = 0;
|
|
|
|
args[0] = cmd;
|
|
args[1] = prompt;
|
|
args[2] = NULL;
|
|
|
|
memset(&pass, 0, sizeof(pass));
|
|
pass.argv = args;
|
|
pass.out = -1;
|
|
|
|
if (start_command(&pass))
|
|
return NULL;
|
|
|
|
strbuf_reset(&buffer);
|
|
if (strbuf_read(&buffer, pass.out, 20) < 0)
|
|
err = 1;
|
|
|
|
close(pass.out);
|
|
|
|
if (finish_command(&pass))
|
|
err = 1;
|
|
|
|
if (err) {
|
|
error("unable to read askpass response from '%s'", cmd);
|
|
strbuf_release(&buffer);
|
|
return NULL;
|
|
}
|
|
|
|
strbuf_setlen(&buffer, strcspn(buffer.buf, "\r\n"));
|
|
|
|
return buffer.buf;
|
|
}
|
|
|
|
char *git_prompt(const char *prompt, int flags)
|
|
{
|
|
char *r = NULL;
|
|
|
|
if (flags & PROMPT_ASKPASS) {
|
|
const char *askpass;
|
|
|
|
askpass = getenv("GIT_ASKPASS");
|
|
if (!askpass)
|
|
askpass = askpass_program;
|
|
if (!askpass)
|
|
askpass = getenv("SSH_ASKPASS");
|
|
if (askpass && *askpass)
|
|
r = do_askpass(askpass, prompt);
|
|
}
|
|
|
|
if (!r)
|
|
r = git_terminal_prompt(prompt, flags & PROMPT_ECHO);
|
|
if (!r) {
|
|
/* prompts already contain ": " at the end */
|
|
die("could not read %s%s", prompt, strerror(errno));
|
|
}
|
|
return r;
|
|
}
|
|
|
|
char *git_getpass(const char *prompt)
|
|
{
|
|
return git_prompt(prompt, PROMPT_ASKPASS);
|
|
}
|