MagicStack / MagicStack/uvloop

getaddrinfo() returns wrong scope ID for IPv6 link-local addresses when type=SocketKind.SOCK_STREAM

Abierto
#539 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Lenguaje dominante
Cython
Estrellas
11.9k
Forks
616
Métricas de merge de PR
Sin PR fusionados en 30 d

Descripción

* **uvloop version**: 0.17.0
* **Python version**: 3.11.3
* **Platform**: Linux
* **Can you reproduce the bug with `PYTHONASYNCIODEBUG` in env?**: yes
* **Does uvloop behave differently from vanilla asyncio? How?**: Vanilla asyncio returns the correct scope ID, uvloop returns 0

When passing `type=SocketKind.SOCK_STREAM` to `getaddrinfo()` in uvloop, the scope ID for link-local addresses is left as 0. This works correctly (returns nonzero scope ID) in `socket.getaddrinfo()` and vanilla asyncio's corresponding function.

Repro script (requires `psutil` installed):
```python
from asyncio import get_running_loop, run
from socket import SocketKind

import psutil
import uvloop

async def main():
for ifname, addresses in psutil.net_if_addrs().items():
for addr in addresses:
if addr.address.startswith("fe80::") and "%" in addr.address:
gai_res = await get_running_loop().getaddrinfo(addr.address, 0, type=SocketKind.SOCK_STREAM)
scope_id = gai_res[-1][-1][-1]
print("Scope id for", gai_res[-1], "is", scope_id)
return

print("Could not find a suitable link-local address")

# Comment out this line, and it works fine
uvloop.install()
run(main())
```

Guía de contribución

No hay ninguna guía de contribución indexada para este repositorio

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Línea de trabajo

Comienza ejecutando el script de reproducción proporcionado en Linux con una dirección IPv6 link-local, comparando uvloop con vanilla asyncio y socket.getaddrinfo(). El problema estará resuelto cuando uvloop devuelva el ID de ámbito correcto distinto de cero para SOCK_STREAM, coincidiendo con las otras implementaciones.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
python
Área
networking
Tipo de issue
Error
Dificultad
4/5
Tiempo estimado
3-5 días
Estado de actividad
Estancado
Claridad
Bastante claro
Aptitud para principiantes
35/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.