Hi Jeff,
Jeff King wrote:
When we pull the user's name from the GECOS field of the
passwd file (or generate an email address based on their
username and hostname), we put the result into a
static buffer.
[...]
The conversion is mostly mechanical: replace string copies
with strbuf equivalents, and access the strbuf.buf directly.
There are a few exceptions:
This broke /etc/mailname handling. Before:
$ git var GIT_COMMITTER_IDENT
Jonathan Nieder [off-list ref] 1359069165 -0800
After:
$ git var GIT_COMMITTER_IDENT
Jonathan Nieder <mailname.example.com> 1359069192 -0800
The cause:
[...]
quoted hunk ↗ jump to hunk
--- a/ident.c
+++ b/ident.c
@@ -19,42 +18,27 @@ int user_ident_explicitly_given;
[...]
quoted hunk ↗ jump to hunk
-static int add_mailname_host(char *buf, size_t len)
+static int add_mailname_host(struct strbuf *buf)
{
FILE *mailname;
@@ -65,7 +49,7 @@ static int add_mailname_host(char *buf, size_t len)
strerror(errno));
return -1;
}
- if (!fgets(buf, len, mailname)) {
+ if (strbuf_getline(buf, mailname, '\n') == EOF) {
This clears the strbuf.
How about something like this as a quick fix?
Reported-by: Mihai Rusu <redacted>
Signed-off-by: Jonathan Nieder <redacted>
diff --git a/ident.c b/ident.c
index 73a06a1..cabd73f 100644
--- a/ident.c
+++ b/ident.c
@@ -41,6 +41,7 @@ static void copy_gecos(const struct passwd *w, struct strbuf *name)
static int add_mailname_host(struct strbuf *buf)
{
FILE *mailname;
+ struct strbuf mailnamebuf = STRBUF_INIT;
mailname = fopen("/etc/mailname", "r");
if (!mailname) {@@ -49,14 +50,17 @@ static int add_mailname_host(struct strbuf *buf)
strerror(errno));
return -1;
}
- if (strbuf_getline(buf, mailname, '\n') == EOF) {
+ if (strbuf_getline(&mailnamebuf, mailname, '\n') == EOF) {
if (ferror(mailname))
warning("cannot read /etc/mailname: %s",
strerror(errno));
+ strbuf_release(&mailnamebuf);
fclose(mailname);
return -1;
}
/* success! */
+ strbuf_addbuf(buf, &mailnamebuf);
+ strbuf_release(&mailnamebuf);
fclose(mailname);
return 0;
}