From daeaa03ef5ce068fd068fce8246f630c259618a8 Mon Sep 17 00:00:00 2001 From: basebuilder_pel7ppc64bebuilder0 Date: Thu, 17 May 2018 19:13:32 +0200 Subject: [PATCH] util linux patches Signed-off-by: basebuilder_pel7ppc64bebuilder0 --- ...gin-use-IPv4-on-IPv4-mapping-to-IPv6.patch | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 SOURCES/0135-login-use-IPv4-on-IPv4-mapping-to-IPv6.patch diff --git a/SOURCES/0135-login-use-IPv4-on-IPv4-mapping-to-IPv6.patch b/SOURCES/0135-login-use-IPv4-on-IPv4-mapping-to-IPv6.patch new file mode 100644 index 00000000..ccc9335b --- /dev/null +++ b/SOURCES/0135-login-use-IPv4-on-IPv4-mapping-to-IPv6.patch @@ -0,0 +1,51 @@ +From 7a1a825c7b77785f256e05b1e3ac7676c7485a5c Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Tue, 4 Jul 2017 12:50:39 +0200 +Subject: [PATCH 135/135] login: use IPv4 on IPv4-mapping-to-IPv6 + +It seems that on some systems (e.g. RHEL7) the libc function +getaddrinfo() is not able to translate ::ffff: address to IPv4. The +result is 0.0.0.0 host address in the last(1) and utmpdump(1) output. + + /sbin/login -h "::ffff:192.168.1.7" + +utmpdump: + + [7] [03926] [1 ] [user1 ] [pts/1 ] [::ffff:192.168.1.7 ] [0.0.0.0 ] [Thu May 12 17:49:50 2016 ] + +Not sure if this is about order of the getaddrinfo() results, system +configuration or libc version. It's irrelevant for login(1). We have +to be robust enough to write usable address to log files everywhere. + +The solution is to detect IPv4-mapping-to-IPv6 and use IPv4 for utmp. + +Upstream: http://github.com/karelzak/util-linux/commit/1c8792f1ae7fa38cf1d4418ad99c207f65dfdb1a +Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1296233 +Signed-off-by: Karel Zak +--- + login-utils/login.c | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +diff --git a/login-utils/login.c b/login-utils/login.c +index e0e960f88..5c36953ef 100644 +--- a/login-utils/login.c ++++ b/login-utils/login.c +@@ -1101,8 +1101,15 @@ static void init_remote_info(struct login_context *cxt, char *remotehost) + } else if (info->ai_family == AF_INET6) { + struct sockaddr_in6 *sa = + (struct sockaddr_in6 *) info->ai_addr; ++#ifdef IN6_IS_ADDR_V4MAPPED ++ if (IN6_IS_ADDR_V4MAPPED(&sa->sin6_addr)) { ++ const uint8_t *bytes = sa->sin6_addr.s6_addr; ++ struct in_addr addr = { *(const in_addr_t *) (bytes + 12) }; + +- memcpy(cxt->hostaddress, &(sa->sin6_addr), sizeof(sa->sin6_addr)); ++ memcpy(cxt->hostaddress, &addr, sizeof(struct in_addr)); ++ } else ++#endif ++ memcpy(cxt->hostaddress, &(sa->sin6_addr), sizeof(sa->sin6_addr)); + } + freeaddrinfo(info); + } +-- +2.13.6