From: Jonathan Nieder Date: Thu, 24 Jan 2013 23:21:46 GMT Subject: [regression] Re: [PATCHv2 10/15] drop length limitations on gecos-derived names and emails Message-ID: <20130124232146.GA17458@google.com> In-Reply-To: <20120521231017.GJ10981@sigill.intra.peff.net> 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 1359069165 -0800 After: $ git var GIT_COMMITTER_IDENT Jonathan Nieder 1359069192 -0800 The cause: [...] > --- a/ident.c > +++ b/ident.c > @@ -19,42 +18,27 @@ int user_ident_explicitly_given; [...] > -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 Signed-off-by: Jonathan Nieder 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; }