From: Junio C Hamano Date: Mon, 21 Dec 2015 18:59:07 +0000 (-0800) Subject: Merge branch 'jk/ident-loosen-getpwuid' X-Git-Tag: v2.7.0-rc2~5 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/5498c57cdd637eb4f42ce8e296ce9ca4ab66e289?ds=inline;hp=--cc Merge branch 'jk/ident-loosen-getpwuid' When getpwuid() on the system returned NULL (e.g. the user is not in the /etc/passwd file or other uid-to-name mappings), the codepath to find who the user is to record it in the reflog barfed and died. Loosen the check in this codepath, which already accepts questionable ident string (e.g. host part of the e-mail address is obviously bogus), and in general when we operate fmt_ident() function in non-strict mode. * jk/ident-loosen-getpwuid: ident: loosen getpwuid error in non-strict mode ident: keep a flag for bogus default_email ident: make xgetpwuid_self() a static local helper --- 5498c57cdd637eb4f42ce8e296ce9ca4ab66e289 diff --cc ident.c index 00a62e0c42,bb1b174352..daf7e1ea83 --- a/ident.c +++ b/ident.c @@@ -70,35 -91,10 +91,35 @@@ static int add_mailname_host(struct str return 0; } +static int canonical_name(const char *host, struct strbuf *out) +{ + int status = -1; + +#ifndef NO_IPV6 + struct addrinfo hints, *ai; + memset (&hints, '\0', sizeof (hints)); + hints.ai_flags = AI_CANONNAME; + if (!getaddrinfo(host, NULL, &hints, &ai)) { + if (ai && strchr(ai->ai_canonname, '.')) { + strbuf_addstr(out, ai->ai_canonname); + status = 0; + } + freeaddrinfo(ai); + } +#else + struct hostent *he = gethostbyname(host); + if (he && strchr(he->h_name, '.')) { + strbuf_addstr(out, he->h_name); + status = 0; + } +#endif /* NO_IPV6 */ + + return status; +} + - static void add_domainname(struct strbuf *out) + static void add_domainname(struct strbuf *out, int *is_bogus) { char buf[1024]; - struct hostent *he; if (gethostname(buf, sizeof(buf))) { warning("cannot get host name: %s", strerror(errno)); @@@ -107,11 -104,16 +129,14 @@@ } if (strchr(buf, '.')) strbuf_addstr(out, buf); - else if (canonical_name(buf, out) < 0) - else if ((he = gethostbyname(buf)) && strchr(he->h_name, '.')) - strbuf_addstr(out, he->h_name); - else { ++ else if (canonical_name(buf, out) < 0) { strbuf_addf(out, "%s.(none)", buf); + *is_bogus = 1; + } } - static void copy_email(const struct passwd *pw, struct strbuf *email) + static void copy_email(const struct passwd *pw, struct strbuf *email, + int *is_bogus) { /* * Make up a fake email address