From 89df598fa192d5d5386c5dea122f8e678af2b5ca Mon Sep 17 00:00:00 2001 From: Noah <33094578+coolreader18@users.noreply.github.com> Date: Wed, 16 Sep 2020 10:56:34 -0500 Subject: [PATCH] Fix ipv6 localhost issue --- .github/workflows/ci.yaml | 1 + vm/src/stdlib/socket.rs | 24 +++++++++++++++--------- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 64d35b13b..40d45fdb0 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -16,6 +16,7 @@ env: -p rustpython-jit -p rustpython-derive -p rustpython + RUSTPYTHON_NO_IPV6: 1 jobs: rust_tests: diff --git a/vm/src/stdlib/socket.rs b/vm/src/stdlib/socket.rs index 31cde78bc..934fdc36e 100644 --- a/vm/src/stdlib/socket.rs +++ b/vm/src/stdlib/socket.rs @@ -1,6 +1,6 @@ use crate::common::cell::{PyRwLock, PyRwLockReadGuard, PyRwLockWriteGuard}; use std::io::{self, prelude::*}; -use std::net::{Ipv4Addr, Ipv6Addr, Shutdown, SocketAddr, ToSocketAddrs}; +use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, Shutdown, SocketAddr, ToSocketAddrs}; use std::time::Duration; use byteorder::{BigEndian, ByteOrder}; @@ -673,21 +673,27 @@ fn socket_getnameinfo( }) } -fn get_addr(vm: &VirtualMachine, addr: T) -> PyResult -where - T: ToSocketAddrs, - I: ExactSizeIterator, -{ +fn get_addr(vm: &VirtualMachine, addr: impl ToSocketAddrs) -> PyResult { match addr.to_socket_addrs() { Ok(mut sock_addrs) => { - if sock_addrs.len() == 0 { + if let Some(mut addr) = sock_addrs.next() { + if option_env!("RUSTPYTHON_NO_IPV6").is_some() { + while addr.ip() == IpAddr::V6(Ipv6Addr::LOCALHOST) { + if let Some(other) = sock_addrs.next() { + addr = other + } else { + break; + } + } + } + + Ok(addr.into()) + } else { let error_type = vm.class("_socket", "gaierror"); Err(vm.new_exception_msg( error_type, "nodename nor servname provided, or not known".to_owned(), )) - } else { - Ok(sock_addrs.next().unwrap().into()) } } Err(e) => {