basebuilder_pel7ppc64bebuilder0
7 years ago
1 changed files with 51 additions and 0 deletions
@ -0,0 +1,51 @@
@@ -0,0 +1,51 @@
|
||||
From 7a1a825c7b77785f256e05b1e3ac7676c7485a5c Mon Sep 17 00:00:00 2001 |
||||
From: Karel Zak <kzak@redhat.com> |
||||
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 <kzak@redhat.com> |
||||
--- |
||||
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 |
Loading…
Reference in new issue