From: Junio C Hamano Date: Mon, 4 Jan 2016 22:02:57 +0000 (-0800) Subject: Merge branch 'jk/ident-loosen-getpwuid' into maint X-Git-Tag: v2.6.5~3 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=e54d0f5a025e124b27aab3381711721b73d5b68e;p=thirdparty%2Fgit.git Merge branch 'jk/ident-loosen-getpwuid' into maint 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 --- e54d0f5a025e124b27aab3381711721b73d5b68e 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