MagicStack / MagicStack/uvloop

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

未關閉
#539 0 則留言 0 個 reaction 已指派 0 人 在 GitHub 檢視

還沒有人認領這個 Issue。

主要語言
Cython
星號
11.9k
分支
616
PR 合併指標
30 天內沒有已合併 PR

描述

* **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())
```

貢獻指南

這個儲存庫沒有索引到貢獻指南

從這裡開始

  1. 先讀完整個 Issue,再讀專案的貢獻指南。
  2. 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
  3. Fork 儲存庫,在一個分支上完成修改。
  4. 送出 Pull Request,並在描述裡引用這個 Issue 編號。

研究方向

首先,在 Linux 上使用鏈路本地 IPv6 位址執行提供的重現腳本,將 uvloop 與 vanilla asyncio 和 socket.getaddrinfo() 進行比較。當 uvloop 為 SOCK_STREAM 回傳正確的非零範圍 ID,並與其他實作一致時,問題即告解決。

由索引模型根據 Issue 內容生成。

評估

技術堆疊
python
領域
networking
Issue 類型
缺陷
難度
4/5
預估耗時
3-5 天
活躍度
停滯
描述清晰度
基本清楚
新手友好度
35/100

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。