更新ID(KYUA-202409-1094)
- 更新简述:
- 修复tcp模块listen接口回退问题
- 影响操作系统版本:
- 银河麒麟高级服务器操作系统 V10 SP1
银河麒麟高级服务器操作系统 V10 SP2
银河麒麟高级服务器操作系统 V10 SP32303
- 更新类型:
- 功能增强
- 发布时间:
- 2024-09-14
- 更新描述:
- 影响软件详情(产品名称 对应架构 软件包 修复版本)
银河麒麟高级服务器操作系统 V10 SP1 x86_64,aarch64,mips64el kernel 4.19.90-23.51.v2101.ky10
银河麒麟高级服务器操作系统 V10 SP2 x86_64,aarch64 4.19.90-25.43.v2101
银河麒麟高级服务器操作系统 V10 SP3 2303 x86_64,aarch64 ,loongarch
4.19.90-52.41.v2207
详细介绍
1.问题复现方法:
4.19.90-23.33~23.50;4.19.90-25.25~25.42;4.19.90-52.21~52.40内核版本,在调用listen()接口时,如果满足下面两个条件,会出现listen()接口返回值不预期的问题:
1.调用者都主动开启了SO_REUSEADDR;
2.出现如下调用sequence:
t1_a时刻: a调用者调用bind()绑定到端口P;
t2_a时刻:a调用者开始调用listen()开始监听端口P;
t1_b时刻:b调用者调用bind()绑定到相同端口P;
t2_b时刻:b调用者开始调用listen()开始监听相同端口P;
只要下面条件成立,就满足第二个条件:
t1_a和t1_b两个时刻(不考虑顺序)发生在t2_a和t2_b两个时刻(不考虑顺序)前
这里的含义是:t1_x时刻,两个调用者都用bind()绑定了相同端口P,由于开启了SO_REUSEADDR所以不会在bind阶段报错冲突,t2_x时刻,两个调用者开始监听端口,正常逻辑来看,这里预期应该出现端口冲突,但内核并不会抛出报错而是正常返回,这会使得调用者以为socket正常监听,但实际上业务并不可用。
2.问题分析结果:
这个问题是因为上游社区backport补丁dadd0dcaa67d ("net/ulp: prevent ULP without clone op fromentering the LISTEN status")所引入的,它regression了inet_csk_listen_start()函数中对返回值的初始化,造成返回值出现不预期;
3.补丁及下载地址:
从软件仓库更新
4.修复和更新方法:
(用root权限执行以下命令):
yum update kernel