From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from AS2PR08MB9222.eurprd08.prod.outlook.com (2603:10a6:20b:59e::10) by PAXPR08MB6942.eurprd08.prod.outlook.com with HTTPS; Mon, 31 Aug 2026 14:07:08 +0000 Received: from AS9P194CA0018.EURP194.PROD.OUTLOOK.COM (2603:10a6:20b:46d::30) by AS2PR08MB9222.eurprd08.prod.outlook.com (2603:10a6:20b:59e::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.382.10; Mon, 31 Aug 2026 14:07:00 +0000 Received: from AM4PEPF00027A61.eurprd04.prod.outlook.com (2603:10a6:20b:46d:cafe::90) by AS9P194CA0018.outlook.office365.com (2603:10a6:20b:46d::30) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.360.13 via Frontend Transport; Mon, 31 Aug 2026 14:07:00 +0000 Authentication-Results: spf=softfail (sender IP is 99.81.216.78) smtp.mailfrom=openvz.org; dkim=pass (signature was verified) header.d=openvz.org;dmarc=pass action=none header.from=openvz.org;compauth=pass reason=100 Received-SPF: SoftFail (protection.outlook.com: domain of transitioning openvz.org discourages use of 99.81.216.78 as permitted sender) Received: from nat.eu.perception-point.io (99.81.216.78) by AM4PEPF00027A61.mail.protection.outlook.com (10.167.16.70) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.382.8 via Frontend Transport; Mon, 31 Aug 2026 14:07:00 +0000 X-PERCEPTION-POINT-VERDICT: CLN X-PERCEPTION-POINT-SPF: X-PERCEPTION-POINT-SPAM: PASS X-PERCEPTION-POINT-SENDER-IP: 2a00:1450:4864:20::336 X-PP-Forefront-Antispam-Report: CIP:2a00:1450:4864:20::336;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail-wm1-x336.google.com;PTR:mail-wm1-x336.google.com;CAT:NONE;SFS:(13230040)(43022699015)(6059299003)(82310400026)(12012899012)(3072899012)(2092899012)(10067099003)(19002099009)(55112099003)(18002099003)(16102099003)(57112099003)(22082099003)(5063699009);DIR:INB; Received: from AS8PR07CU003.outbound.protection.outlook.com (mail-as8pr07cu00305.outbound.protection.outlook.com [40.93.65.53]) by inbound-smtp.eu-west-1.amazonaws.com with SMTP id imu3dnh0unt8l0gi8ns4dtqjc601pip57orqf681; Mon, 31 Aug 2026 14:06:57 +0000 (UTC) X-SES-Spam-Verdict: PASS X-SES-Virus-Verdict: PASS Received-SPF: softfail (spfCheck: transitioning domain of openvz.org does not designate 40.93.65.53 as permitted sender) client-ip=40.93.65.53; envelope-from=den@openvz.org; helo=AS8PR07CU003.outbound.protection.outlook.com; Authentication-Results-Original: amazonses.com; spf=softfail (spfCheck: transitioning domain of openvz.org does not designate 40.93.65.53 as permitted sender) client-ip=40.93.65.53; envelope-from=den@openvz.org; helo=AS8PR07CU003.outbound.protection.outlook.com; dkim=pass header.i=@openvz.org; dmarc=pass header.from=openvz.org; X-SES-RECEIPT: AEFBQUFBQUFBQUFGaWpSR3JiRWVQUURhNEpwOXh4YTdGaG1rSW1FeDl6bll4aDFJN05wNWoyUEVRUEdwbWlTa0tzSmFYeWwzRC9IODVZTlRKelAyalp1ZG56dTM5ZDhhQzdTZUZnc09LUmhOL1NXWDVFTGdJcjc0VnJ1U1VMK2dDK3UwYXhUQm9hSkRyUmE5SkJOYkpxVDl0Znh1WFROY0ErMnEvR1R1bnFzdnU2V2VjZzZOc3UrdWpvUXNUbmJ4VFNjdy84ZGFnY29YYjNYTG4reUVIcVdKdWFvVlZpZlg4eHFBeGdUYVd4cjBQazBwQmpxYnpFb0duNkhmSFBjc1ZGaWxrUGY5R1NtNHh0cmhHdmo4bU9KdW0xWTZZMTkvOXJ1UjBkR29hU0JmVDhsaHh4amxyUGc9PQ== X-SES-DKIM-SIGNATURE: a=rsa-sha256; q=dns/txt; b=YB4A9QAiSzlA+ZhDkKnppWIl+B1IXh5Q5TXtFKHkjxZMEo6BISe2GFT/T/3H/8+1djM972QEbI0Oswbmh2pKu0Ee+nxHSqmGAjZsP6+vWbDj8NiZRJlmNkG5tOPZckoPK/RIZMmZbp9lT/pp70QZqu0ABW+WJCEieSdBawQD8ks=; c=relaxed/simple; s=shh3fegwg5fppqsuzphvschd53n6ihuv; d=amazonses.com; t=1788185218; v=1; bh=28F5EHn0lRV2pPuOu3L5cJ36IMHLCZ4U8w6q7WSDudA=; h=From:To:Cc:Bcc:Subject:Date:Message-ID:MIME-Version:Content-Type:X-SES-RECEIPT; Received: from DUZPR01CA0258.eurprd01.prod.exchangelabs.com (2603:10a6:10:4b5::18) by PR3PR08MB5867.eurprd08.prod.outlook.com (2603:10a6:102:87::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.382.10; Mon, 31 Aug 2026 14:06:53 +0000 Received: from DU2PEPF00028D01.eurprd03.prod.outlook.com (2603:10a6:10:4b5:cafe::65) by DUZPR01CA0258.outlook.office365.com (2603:10a6:10:4b5::18) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.360.13 via Frontend Transport; Mon, 31 Aug 2026 14:06:53 +0000 Authentication-Results-Original: spf=pass (sender IP is 2a00:1450:4864:20::336) smtp.mailfrom=openvz.org; dkim=pass (signature was verified) header.d=openvz.org;dmarc=pass action=none header.from=openvz.org;compauth=pass reason=100 Received-SPF: Pass (protection.outlook.com: domain of openvz.org designates 2a00:1450:4864:20::336 as permitted sender) receiver=protection.outlook.com; client-ip=2a00:1450:4864:20::336; helo=mail-wm1-x336.google.com; pr=C Received: from mail-wm1-x336.google.com (2a00:1450:4864:20::336) by DU2PEPF00028D01.mail.protection.outlook.com (2603:10a6:18:3::6b9) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.382.8 via Frontend Transport; Mon, 31 Aug 2026 14:06:51 +0000 Received: by mail-wm1-x336.google.com with SMTP id 5b1f17b1804b1-49b8f86c6deso20660925e9.0 for ; Mon, 31 Aug 2026 07:06:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz.org; s=google; t=1788185211; x=1788790011; darn=virtuozzo.com; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:from:to:cc:subject :date:message-id:reply-to:content-type; bh=SH0WHwuMWHc0Jb11bBt6tge+LZ8fQLNjb97xXcms91Q=; b=pQ1VhFELgC3gXqQ7XQjiKMhTgmxPsrD7IyoaHhR/20FWdYmdJIwaQj/V18/Kb0BbXa UXCCCH9zjMOTCEux3PW3oonMpEbQVxLEpeH4RwYIIVklsJZfCZEjgDBsQ5XH1G46ojJ1 zoys6muKSTrqY7LYkB7yhu0GBZrktzvrGmBiz9KM3jrhL6htXOV1qqSu+5DjqG+hdCG1 wWa7u8rfADvWPolhRYO77UfXpqMb9fuYZ2kQKoLxNx64GQptLfMyJ6Qsw1MIPSgcYaZF 830LTJmpAz9I/p8hCUX3v/kACop/8U12Cf/kW/ZUhzlDMtL2aumWk0GhqB8AxVuaoXp9 o0ww== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788185211; x=1788790011; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=SH0WHwuMWHc0Jb11bBt6tge+LZ8fQLNjb97xXcms91Q=; b=ssv+bNudEF5Bfm7+0axfJ6N3y4ImFXilzwQNnnNlARBGcUO+agoyFHFsgLvvx0WBmq jww4eVLRV6xQ+TdrGKC0llUlY0AJChTwCNsc1t4U0X3beLlt0xIwaYreTA+9OfXiGYJs ymIAxvtXYnQE8HQQvLGwWarkHNM33RmX0dGIs0LRUNW5eCpYkShKn9GGZYC9C3QreVR1 6BYKoKJ/UGwCpm1VN341t4YAndLFjiH1vt1tQncLZVpxWO45y+80NYQRX32H+LUgqK1i svq72V+Zot/sRe0FEzRsUKd+R8LFxueOLM1urxPm2XUWgsMeSVhWbHp0IAWLbCNgsDsM 4HtA== X-Gm-Message-State: AFuF++mBpLXRDpekDDCovJaAYuP1n4dz4p23+76CIs+mfJruxYPvvM+Y PDAgr3R9+gNTGUDdzWTzaiZopPOQqQ6XbmBQdEEWFvkLWw9ek2GHdVymDbaCBT29TUncN1sJdAT iGpuedQM= X-Gm-Gg: AR+sD10WHkBq7wEJ6Nm6RVCrB1I2MkwjmJ0obrT4CRVvDELsg4xGVZFe5pedef6Bq1N taU7oG++Yq8xBDPhBsZ/wMlxQ4MYsUUsAyp3mX3TU27epnpgXaNrzQ45D1k1kh0NHc+/40L9laS F+poRv2XXNDT/E0YiJBH65lr6s4rSy0egV1u9XeM/aF3HGqZS1kI6n1HONfmh7b9736ofrOq4ca z722qC0a0ze3Y/h+oMIeJ6fjBWE0APO7saGH0mJAeYEEL5wmZX3FN579JrOK96AJr0wo3MvYvjp ncFozE9DeTrcjFXRErBZc261U0LiZraZBSw1a0+R0x5GWaa3Uf/WiIezxDkPeZTL+bB3WMxivAc mE4LvVdTagoTJyh3RQ37DwARKMeZiyZ4KilVoArXYjsFBafkH+m2jPvtb7kAHOTQi3WFxNuDDf0 T706zAX8vk2/qYY0nB5cPkxWUrHBqpCXSENSamOH65yyaRV+0WnZG6pYDr X-Received: by 2002:a05:600c:354f:b0:493:c47f:3c55 with SMTP id 5b1f17b1804b1-49b91c1ece1mr461397645e9.5.1788185211101; Mon, 31 Aug 2026 07:06:51 -0700 (PDT) Received: from athena.sw.ru ([2a06:5b06:b600:300:3bc1:c53b:30b:203e]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49cd2fa779esm133185495e9.2.2026.08.31.07.06.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 31 Aug 2026 07:06:50 -0700 (PDT) From: "Denis V. Lunev" To: svt-core@virtuozzo.com Cc: andrey.drobyshev@virtuozzo.com, den@openvz.org Subject: [PATCH hci-8.1 6/6] tests/unit: cover blocked IO during the websock handshake #VSTOR-143316 Date: Mon, 31 Aug 2026 16:06:37 +0200 Message-ID: <20260831140637.1204714-7-den@openvz.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260831140637.1204714-1-den@openvz.org> References: <20260831140637.1204714-1-den@openvz.org> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-EOPAttributedMessage: 1 X-EOPTenantAttributedMessage: 0bc7f26d-0264-416e-a6fc-8352af79c58f:1 X-MS-TrafficTypeDiagnostic: DU2PEPF00028D01:EE_|PR3PR08MB5867:EE_|AM4PEPF00027A61:EE_|AS2PR08MB9222:EE_|PAXPR08MB6942:EE_ X-MS-Office365-Filtering-Correlation-Id: d23f2b43-02be-4e19-532a-08df07692077 X-LD-Processed: 0bc7f26d-0264-416e-a6fc-8352af79c58f,ExtAddr X-MS-Exchange-AtpMessageProperties: SA|SL X-PERCEPTION-POINT-CUSTOM: vzpp X-Microsoft-Antispam-Untrusted: BCL:0;ARA:13230040|43022699015|6059299003|82310400026|12012899012|3072899012|2092899012|10067099003|19002099009|55112099003|18002099003|16102099003|57112099003|22082099003|5063699009; X-Microsoft-Antispam-Message-Info-Original: =?utf-8?B?N2xsZm8ycmJFQWFTSU5razVGMzJzVUlIMUN0c0k5WEVSK1FHNzk0eGZBeUR5?= =?utf-8?B?RzB6Qy95ejhnWVNJdExScDNIZXI5VDhsbmhQZ1JGcUx2VVNaZEoxY2tvZWJY?= =?utf-8?B?djlBMXVkdVQ5d2ZDTzg1U2tNZW04STZRampsdHFMZCtaWDdFOENia0pUWXB0?= =?utf-8?B?dlRPUFRMaDY4MHlpZEg1MkhRRnpUck9GN09UdFBUblhwbS8reTl6VUl2OGtu?= =?utf-8?B?dElwVCsxMlpxWlU3UmEvWW5EaVltc2h2SklNbmtUSVFBVEZtYWszRVFnVWE5?= =?utf-8?B?dUpoT3lBdldNK3VZMGZsMDRBSC9XRXp2ZUFZYWxaUWZYak4wZVcveGVjNk9W?= =?utf-8?B?ZTJnTUV2T2I1RG5BRnBvdUVGYUU5TGxZMi8yQWVHNEl3MDRNMVYzYnhCNm9i?= =?utf-8?B?WGlmNHBlVmVoN0JHNS9UL2FLYkpTRVFQUXlTakpLemNFVXg4d0Rnb0VNZWRU?= =?utf-8?B?enIwMGhlRGkwSDBlTFI3dDV2dHZJU2Exei9pREdmak9wT0EvWnZDMVNhbWt0?= =?utf-8?B?Z1gwMVo0ZVBEL2NTSlIwdWFxWTBrb254NjdqbGxVdGJLNDZYNFlEYThwRzJT?= =?utf-8?B?VWtVMUFFZ3k3eCtpZmZ3OHdGLyt2dkdFU0JGTWZwS2hrK2RneVcyemxla1JL?= =?utf-8?B?MUlRZk1nd1dMcExiVmlmemNGVlNvTGR3VjdMUjZVMFkwdVN3dlB4bTR2dm0r?= =?utf-8?B?c0tZM3lnaEhBYVZUYUFUVHhlbEkvWWVrVkc1Q2hpMG9MZmtoSGdQa2NzdHJY?= =?utf-8?B?M1BHemtCTkttc3h6RHJZRVRtRFY3aW9WaGdsOVRjSGRobGg3UzVuVktXSENr?= =?utf-8?B?YS9yWVpQR1hWbE96V0JKUUVlR2JyZlFMdHRZK1ROblpJMFhOc2JBNFp4Tmcz?= =?utf-8?B?Q2xhV0FaZnF3VTAyV0RVaCs4RFNnV3FHOXVZOXJ3NjVqcWtjRUlsN012WlZP?= =?utf-8?B?VWY5d1UxTU1HLzQ1RGYzZ01XejdESTJaRWgvTjBUSS9BZ09DSlM2QVVaYUh4?= =?utf-8?B?MFhvTm5kYmEyNGdqcDc3Tktrd0FVaWpIY2hBRnJicEluMmtXeTdQYWRISnRY?= =?utf-8?B?ZnpUbXVNOXdFeU1leWMrbW9wbUQvYVliZkRPanlKVXBxT0JndDJhWDBaYTJ4?= =?utf-8?B?a2JZeGZMSW51L1BnYUhtaEVmeDdmc2kwdmhaSGxkNGp1Nk5PR3JLVjZlN0Nr?= =?utf-8?B?U3ZWZ0VhbmhLd0RIYWgySjQwZ3dDRlZpanZWdDBqaDRodnlpNnIyb1BQVnVQ?= =?utf-8?B?MlNmQng3R1IzT2E0TnZDaGkzdzlhMmhSR1NoOVpxQVJldkp0VDFUTUN3azYw?= =?utf-8?B?Sk92MCtzYXpSNHN6elhxV3FpWjY4R0JoSHpseHFvZHc5NTlQWTNBaDVwanVq?= =?utf-8?B?NXNLU2UvQ3BUMEt3TWtNVjJ4SmVXbkJEblBpMTd1cFYxb1pnZzlKNVkzR2pX?= =?utf-8?B?MUtRb1pYZWhjUCs0SE1NVGdXV0dwbGdCRE15VXBZUVRadllXZFZDOTJNL01r?= =?utf-8?B?WFRUNFQvMTRLVzg0b20zeDJ0Sm9XM0pmZHVjYWg3M1k4S2x3U0FWSDVWekFz?= =?utf-8?B?N2Z4Tk1tWDZUK0VISmZLYWQ1OFRndFRLTlRvMFRubU1yY0RvTTNMMCtoWFBp?= =?utf-8?B?SU9NVzQzcWkxMWhESFdLaG1zUnJLZWFIaTFUMHQ2dDRuVWNhbzA2QVRQcEpl?= =?utf-8?B?MTdmNTVKOEl3djFaRU9kQUVTN1BPc0dsdTZJWXBWelJwMnJjZXlVRDJNTkhK?= =?utf-8?B?azZGQUEvZDVSN29yczRoWURaT2E4SlNQSVc2MnBBUy9zOXJ2anNGdVVDaXQ2?= =?utf-8?B?cWNLamo5dVNJVFVURHRjUnY3ZFJMenZLMGtLVWpSaXVBQWg3K0RKUExNNUky?= =?utf-8?B?cXlLTis2ekVTcWd5VVJhYStwOTFYYjBiRGx5NkNqTXJIaElOSXhhOWZYSWJp?= =?utf-8?B?R0xvdUlWc0thWWJScWRBSm1RbEt6dEdocXhZUUxWUCsyZitjbW10Q1BrSDVD?= =?utf-8?B?TEhGUEVwdjl2NXlxU0xJNWVwU1NMMERUeUJQNnBQMHVXVm10ZDVZSi9mMjNB?= =?utf-8?B?TXNyYXR2VnkyRmRLT2VEYUU5YkVOZEhZL3VyS25hVlh2NEp2VjkwT2lpUzBY?= =?utf-8?B?NzlYQ2UzaHRWMVFNRUpkdjQ2S3B1aFJ2ZUZmaVhJK2xBSTE3MndlaTNxVnNN?= =?utf-8?B?RDl6dEJCSHdFcDdSZk1yTk9YcVp3NEF4bmRpaE9RKzRXTWFqc2k0UHFhcEtU?= =?utf-8?B?YXBEUUlXUXM1Y1ZHeGIzL2wxRk9UU25BS1VLNW5aTzVWbTFaNGNYaEtZcm5W?= =?utf-8?B?QlRyeTRYT2w1Rkl1Tlh3WVpPWWRGM2k1Q0xRQklOZlF3MldYT3ppMWsvZFV0?= =?utf-8?B?NGtvaDJjTlk0N1VrN0xRNWt6a0Z4QlhXQW5sT3l2R1hFVkcyZ3ZDSDZWMDNI?= =?utf-8?B?bTdPODZrZUtreXlNL3NUbmlVSXlob3BlUGR4dFNmVFFJRFVENXFRdW1wTitH?= =?utf-8?B?T0ZBb0ttaERSVGFMR2VLSENUWWhxMnJaTHpEenFRVFRLeWJNRnZJSGx3enhX?= =?utf-8?B?ZEJ1OFJ3RFpBL2taUVlISlkwNW5xbW5HeERYNmFGeTdtYWVtR3RXbXZWazdL?= =?utf-8?B?ZHRLS2plWVRlMTBmZWk3SlhOMVVpamU1MHFOUXVKVzFsenI2UzB5RCtSd3Yr?= =?utf-8?B?cU9uZ1ZOUmFsTnBYNERxWHg5bkFqcm9mNGNxb1RHcGVvVUdyQ1pWNk80bzlD?= =?utf-8?B?b1ZUSWZFVlYydXJJWmFMRlhDWmhjVW5mb1JQa296cHN3R1BiYmx5aDVUV3hP?= =?utf-8?B?a0JRVVp6cVREQ2tEemhBODJIZlZXMnd0SUkxTCtKaHI3VjdFRStsNThOYnpO?= =?utf-8?B?Sms2WXVPdlFhcXhpOTFXMy93S25DYnUxUHF1dW9lUjk0djFBaWYveG5nOFFv?= =?utf-8?B?c2pTZkFrWFlvYmlRd3JtSWZ1eEZKQi9SV1RsYzgwNnVyTnhPQUE9PQ==?= X-Forefront-Antispam-Report-Untrusted: CIP:2a00:1450:4864:20::336;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail-wm1-x336.google.com;PTR:mail-wm1-x336.google.com;CAT:NONE;SFS:(13230040)(43022699015)(6059299003)(82310400026)(12012899012)(3072899012)(2092899012)(10067099003)(19002099009)(55112099003)(18002099003)(16102099003)(57112099003)(22082099003)(5063699009);DIR:INB; X-Auto-Response-Suppress: DR, OOF, AutoReply X-Exchange-RoutingPolicyChecked: UP3cn0TZ8aLoGBJoYK1HzyibVp2pDwYto5xyqZNJQ/yfzYIoVEKzYZXUkaBs/WSP8Je7v8rISr5LdELiHzAXIvHBfbzmXlz1K1WDSeue9WOfQ8bOO7zfSJwYQcjCycFQpgj6f65+4VEIBOlLXuYcrhFnusxXtWIP+sGHcYQmnVmvlyd3+/iVu1zC44MauhFT/gnU9teGSSbnMSrwgvY3kq2ccdOedyBQwZ4ULQvhTUf4gfVhX71XhJanD8htFKRGkBjSILgRtG5uapohn4fMZsYaZ1ozPWXQAuG/Ur5ZpNk+BdBlYI+Q/Xv6S3zIfuShCPRxcVERdbrjXDbW+w0ZbQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PR3PR08MB5867 X-MS-Exchange-Organization-ExpirationStartTime: 31 Aug 2026 14:07:00.7551 (UTC) X-MS-Exchange-Organization-ExpirationStartTimeReason: OriginalSubmit X-MS-Exchange-Organization-ExpirationInterval: 1:00:00:00.0000000 X-MS-Exchange-Organization-ExpirationIntervalReason: OriginalSubmit X-MS-Exchange-Organization-Network-Message-Id: d23f2b43-02be-4e19-532a-08df07692077 X-MS-Exchange-Organization-MessageDirectionality: Incoming X-MS-Exchange-Transport-CrossTenantHeadersStripped: AM4PEPF00027A61.eurprd04.prod.outlook.com X-MS-PublicTrafficType: Email X-MS-Exchange-Organization-AuthSource: AM4PEPF00027A61.eurprd04.prod.outlook.com X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Office365-Filtering-Correlation-Id-Prvs: 5594c61f-cb6b-4222-1101-08df07691b25 X-MS-Exchange-Organization-SCL: -1 X-Microsoft-Antispam: BCL:0;ARA:13230040|82310400026|6059299003|12012899012|3072899012|35042699022|43022699015|2092899012|5133699003|22082099003|55112099003|57112099003|16102099003|18003699003|5063699009|19002099009|10067099003; X-Forefront-Antispam-Report: CIP:99.81.216.78;CTRY:IE;LANG:en;SCL:-1;SRV:;IPV:CAL;SFV:SKN;H:nat.eu.perception-point.io;PTR:nat2.eu.perception-point.io;CAT:NONE;SFS:(13230040)(82310400026)(6059299003)(12012899012)(3072899012)(35042699022)(43022699015)(2092899012)(5133699003)(22082099003)(55112099003)(57112099003)(16102099003)(18003699003)(5063699009)(19002099009)(10067099003);DIR:INB; X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 Aug 2026 14:07:00.1984 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: d23f2b43-02be-4e19-532a-08df07692077 X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-CrossTenant-AuthSource: AM4PEPF00027A61.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: Internet X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS2PR08MB9222 X-MS-Exchange-Transport-EndToEndLatency: 00:00:08.7032503 X-MS-Exchange-Processed-By-BccFoldering: 15.21.0382.004 X-Microsoft-Antispam-Mailbox-Delivery: ucf:0;jmr:0;auth:0;dest:I;ENG:(910005)(944506478)(944626604)(920097)(930201)(20251009189)(140003); X-Microsoft-Antispam-Message-Info: =?utf-8?B?TjRtdnArVEEwM2dlSFE0ZEpJWUN1N0E1VHNLeFdYdzJqMnpKZmZDL3BIT3gw?= =?utf-8?B?RTQ4c0xBUVUyN0MyQnc1enRSYTBKQnNHcGt5OXpDcVd6Y0JoanpyZTRqb0pU?= =?utf-8?B?bDhOaGNBY3M2dEpOVExOUUMxZHhXTW4zQ3N4NXJBOVVnSnFzN1E3K3lYYXE3?= =?utf-8?B?c0k1Y0dFd3ByZlNOcEkwNEhTRjhPTVNUT3FJUmVGeENnZUQzcHpJUDNuTTND?= =?utf-8?B?RjhCRktRaEhmSTdVbFRxTzF0R004bzU5VnQ0TmhleEZVdzJVOEhuTlJRYzJT?= =?utf-8?B?Y2tFUmZtbXVjaDhDekdOZC94UjY2VUlGR2VtcHg3VTJ3SURWYmEyRm16cGRs?= =?utf-8?B?UzdKWlFZcjlaZzdpcUVTZ3hhOTFEZklJTU5qV0Zsenpic3lUN0F2QnJRK3Ji?= =?utf-8?B?RlVBN0l4M1V4TFhGZmsyb0pBN01ETFdNWGdYaGpYMmZMWXpicXlhWGVTMHBC?= =?utf-8?B?MHc4VTFwUy9PbUJpbUM5UTdtdVJmNFFmeVZIQjNsOWhCNUwzTWFmVlRsMWgx?= =?utf-8?B?cGNVcFB0a1JzMlJLODF4bk1DZHZWck9HV2l2a0pvbTNmQ0g2VHA3WjhSV2I5?= =?utf-8?B?QS9uUGdiNkV6SzVSL0Z5SHoxeHFObmhISXNHNE10UEdwSW51ZlZxc3BYZW1M?= =?utf-8?B?aHNaS21KSVovd2p6UEduMjJYWlBFNVQydlBKeEt2dmZlUVVVdUI3UWxCaWJ4?= =?utf-8?B?c0p5NUhyUlZoOHhFbUlxTjNTYlhTYi8xSTV3UkhvcSt3UmJHa240amhVUnBt?= =?utf-8?B?bXBta3J5cklIMFlZNFRoSmJDUkg5ZS9LZk9FQzJScjBoT2xiUWl2YVJOalVF?= =?utf-8?B?aGxZU2k2RFUzZlBocVVDQndkNEJpaTFQekZwNENidWhvU2R3UHdWZGNHelVs?= =?utf-8?B?ZjVwWFJNMm5EajBJeHowOGNidnhYZUJuZm9uVTR2NHQzZ1NCRVFnWXQ5N29E?= =?utf-8?B?ZVgwcUNIZ0paS0V2MDRsSFMrbUphNnh1Mkl0MW1wQS94ZjRMWk9vR1VRRmlu?= =?utf-8?B?clVDdUJrU1ptQ2Y0WUhUZVQxQ3JKNC9IM2c5VHJRNmlQcjlkVlNDTnl6R2Rv?= =?utf-8?B?MmgwK3M3VGYzdmRoRGpmWFNzYUVRUTNhR3lCa3pNRXVxaCs0LzRoN3AzWGNn?= =?utf-8?B?WXdiaTdROEE0ajdhMlljS1NXOVdqN3BFS0JCdmZaeDFqQUZmTkFpT0tHcXBx?= =?utf-8?B?UzhHNzdnbllhdzJTUEhWdHpkNGU4a3FmWWo4dUZRYXhxWU15dCtEbUc2TnZZ?= =?utf-8?B?cm1UQk9VZjhKdjZGcy9OMXozTGtJb3B5MDNEZENVblZWZTZkbzlVOElwMGNN?= =?utf-8?B?Z3h6NEpvRU9XTTVGaXNiano3cHhrTjNMS2tVdFlQRHVSOFdJNGdwRVkzMU51?= =?utf-8?B?UnJ5cnk4b2pUb0VZNVRqK3p5ZXliRlErUEF0RzFSSHF3Wmg5RkErTlExOW8w?= =?utf-8?B?TUlKSHhmM3o2SjF1dTJxZk0yWElONk8rZHlMRzJoNEFSVGJjaTZ1QmcrVjlF?= =?utf-8?B?U2M2Z1BwY09LcVROdkgwUWpkaXJnRjBnZ2RUY2NqcjFWV0ZrbnVLVjMraGFN?= =?utf-8?B?SDZXSW1PUm1jRkpNYjg4R2Z4ekFrcW9vcEg0NlBkaGlkaWtuZG9idFhNRzdK?= =?utf-8?B?LytXK3huOFZUKzBmNEFWOUZVZC93WUY4WjJaUk85TURjR3hBMjRHQjJ1ZnRq?= =?utf-8?B?ZUZ0djkrZS8wdjNBWlY2SmYrMGl2SWxMc3RTZU5ZaEgzWVlJUDFUT25WN0lW?= =?utf-8?B?M0phTXBqMTdtWVBydmk5UXdFK1JyM2ttdnlvek9pV3VYZEw4Vzczb3p2TXpt?= =?utf-8?B?S0dNaE1aRDlRMHpIK1daWnFDTnAzUk4zWjJTekFybTJ6OTkvQUgwNlF6ZnJ6?= =?utf-8?B?Zkd1aTZiaEpiM2tkUkJscVJCQjFpUDc0T0xhVW9UQVFGTVMyZDdxSDd6UFRU?= =?utf-8?B?bkNuRTg0cGJqQzBUMXRDZzdmeEhFWUkrZlZrSWVXbitFdUw2WkFPL2t6ZzZ3?= =?utf-8?B?VmVUVVBGT0FzMWo2QkdjaGxHVG8wc0FadTNFMklJeVI2UnJVTGhHSTc5aldm?= =?utf-8?B?dmVrVW1yWGd3R3dvQmd5RnJPRnRSOG8wUmRaOGFsemRFM09NUm9IcWpRcDB4?= =?utf-8?B?cjZkZlMzRHFPMnJHY2dhSTdLMjhscThXOThleXlzdWk5WWh3TERmcHhRYTVP?= =?utf-8?B?VXBzVGZUY3FWV21DcUU0Q0RnSW9nMkNqdTVoRGhzbXM2TkxHU1F5Z0tCbGgv?= =?utf-8?B?Q09ZMlZFSmUyMlU1ck9xRk9HSjFSd1BYT2s2ZXZwY1Zzck96dHdRUHJBZjBH?= =?utf-8?B?Ti9jK3ZUdXdpcEExa3RoUUtydzNNWWdjMGxwTDBQNXNTVDVjeWljL01NN0Fl?= =?utf-8?B?cnZIVks3eElabGpFNXBrbkVKc0ZHVWNwRlI5RU03T2IxV3pvT1B0OFFsK0I0?= =?utf-8?B?b2ROWEUxenJIUm0vcTdtTmMrWHpRdG1HVDgzT3BvY2hTV0lYaVF1L0xpd3hR?= =?utf-8?B?YlRqcEViQXp4V090YnZmZk4yS1FWYSsza0diOVFtTUtVc0tLYkZBSm44UFJ1?= =?utf-8?B?amVPOXNsUHY5ZDliZzZBOWpUdWc2dGJYTk4rd1gxTlZoVjVsNzZGdmZEQTdK?= =?utf-8?B?RmJYcHlXa0JHZmFubHgzcktnOVZreCtkSVF0NFpKTEtDMSs0NkpaRmpMN1VZ?= =?utf-8?B?VVlPWXdKd2FmVFZkVFROVGE4aWZJYlNheU9Odmtya0QrYnNVRTF6TVRqWFBs?= =?utf-8?B?RjMrTnpDa2x2Sno2ZU1UbnJOZk9CeGRtWEloSHkzNXFjVkt4QlRyVGdrYW9y?= =?utf-8?B?SmlBYng2bjUyMGZucFJXU24xWGVCRUU2YTcxM1VoM0FGampHRUgvQTF3ZTNP?= =?utf-8?B?cTh4RUdyUUVtYXIxQmlQR3NCSlVyaUV1aTFHVGdWdkNRVEF4YXQyZ2Vxd3Qv?= =?utf-8?B?SXBUYmZzNzRWS21YZmFtZmptSG5vMDFoUTRyQlFPUFVwTzNLN1pmWklmSjBT?= =?utf-8?B?Q3Mrdjh2ZnV0N0xhN3dBSzhhQktOOFpOcE1DVXJaWC9MbzRMaGNPdysvdmE0?= =?utf-8?B?Zkd2Y3hxZ2FjdVJPQ25ETzFlTld3U1VKSkpmUmZXcjlZOFBZcUlIcjVqSWo3?= =?utf-8?B?WlFHc0dTMWNSbUpBSmtlOGE4S1YxRUo0ZWlHNmd1YmVEZTMzMXpQRnRORXpE?= =?utf-8?B?NUR2YVZaOUh4b3VsSGpJVmE0eDQvSVdKNWFWU3J4Q3VZQmxMc05jcEZQKzkv?= =?utf-8?B?L0VWNkRPYXpISGVTOGVQeFQyaWpTak1MNXNrdk5oemtxZHpIckxaeTBUbWR1?= =?utf-8?B?ZEZhc2xLYWY2YmlBVVBQVUpDM0ZUTzlrUkRkUTBJYW1TNVR1cjd5L2FTT2xC?= =?utf-8?B?NytKbWZaU29LRFJWS0o3bFJkVjN1bXNZVG9wVkJ5aWliMlhaVGdYWlRaa3Az?= =?utf-8?B?YVh5TWl2RXljb25FbW9qZEpwSWxzb3lLNFhlY0tWTWx5UWNubjF4QnM0VDFy?= =?utf-8?B?bTR4Q0NwWUwyeGFCakN1L1UyUzZib3o0MEVnVTBhVzBaS2JsakxXODlha3Z6?= =?utf-8?Q?iKr31rWdsv36zK?= MIME-Version: 1.0 X-getmail-retrieved-from-mailbox: QEMU List-Id: From: Denis V. Lunev Add a channel which reports QIO_CHANNEL_ERR_BLOCK on demand, the way a TLS channel does when a record arrives split across segments or when the socket cannot take the whole reply at once, and drive the server handshake through it in both directions. Without the fixes each direction dereferences a NULL Error and the test dies on SIGSEGV. Cc: Daniel P. Berrangé Message-ID: <20260831100151.914178-7-den@openvz.org> Reviewed-by: Marc-André Lureau Signed-off-by: Denis V. Lunev --- tests/unit/test-io-channel-websock.c | 150 ++++++++++++++++++++++++++- 1 file changed, 147 insertions(+), 3 deletions(-) diff --git a/tests/unit/test-io-channel-websock.c b/tests/unit/test-io-channel-websock.c index 2a55a4bcdf8..88da24f993d 100644 --- a/tests/unit/test-io-channel-websock.c +++ b/tests/unit/test-io-channel-websock.c @@ -12,6 +12,123 @@ #include "qapi/error.h" #include "qemu/module.h" #include "qemu/sockets.h" +#include "qom/object.h" + +#define TYPE_QIO_CHANNEL_STALL "qio-channel-stall" +OBJECT_DECLARE_SIMPLE_TYPE(QIOChannelStall, QIO_CHANNEL_STALL) + +/* + * Reports QIO_CHANNEL_ERR_BLOCK for the first @rstalls reads and @wstalls + * writes, the way a TLS channel does when a record arrives split across TCP + * segments or the socket cannot take the whole reply at once. + */ +struct QIOChannelStall { + QIOChannel parent; + QIOChannel *master; + unsigned rstalls; + unsigned wstalls; +}; + +static ssize_t qio_channel_stall_readv(QIOChannel *ioc, + const struct iovec *iov, + size_t niov, + int **fds, + size_t *nfds, + int flags, + Error **errp) +{ + QIOChannelStall *sioc = QIO_CHANNEL_STALL(ioc); + + if (sioc->rstalls) { + sioc->rstalls--; + return QIO_CHANNEL_ERR_BLOCK; + } + return qio_channel_readv_full(sioc->master, iov, niov, fds, nfds, + flags, errp); +} + +static ssize_t qio_channel_stall_writev(QIOChannel *ioc, + const struct iovec *iov, + size_t niov, + int *fds, + size_t nfds, + int flags, + Error **errp) +{ + QIOChannelStall *sioc = QIO_CHANNEL_STALL(ioc); + + if (sioc->wstalls) { + sioc->wstalls--; + return QIO_CHANNEL_ERR_BLOCK; + } + return qio_channel_writev_full(sioc->master, iov, niov, fds, nfds, + flags, errp); +} + +static int qio_channel_stall_set_blocking(QIOChannel *ioc, bool enabled, + Error **errp) +{ + QIOChannelStall *sioc = QIO_CHANNEL_STALL(ioc); + + return qio_channel_set_blocking(sioc->master, enabled, errp) ? 0 : -1; +} + +static int qio_channel_stall_close(QIOChannel *ioc, Error **errp) +{ + QIOChannelStall *sioc = QIO_CHANNEL_STALL(ioc); + + return qio_channel_close(sioc->master, errp); +} + +static GSource *qio_channel_stall_create_watch(QIOChannel *ioc, + GIOCondition condition) +{ + QIOChannelStall *sioc = QIO_CHANNEL_STALL(ioc); + + return qio_channel_create_watch(sioc->master, condition); +} + +static void qio_channel_stall_finalize(Object *obj) +{ + QIOChannelStall *sioc = QIO_CHANNEL_STALL(obj); + + object_unref(OBJECT(sioc->master)); +} + +static void qio_channel_stall_class_init(ObjectClass *klass, + const void *class_data G_GNUC_UNUSED) +{ + QIOChannelClass *ioc_klass = QIO_CHANNEL_CLASS(klass); + + ioc_klass->io_writev = qio_channel_stall_writev; + ioc_klass->io_readv = qio_channel_stall_readv; + ioc_klass->io_set_blocking = qio_channel_stall_set_blocking; + ioc_klass->io_close = qio_channel_stall_close; + ioc_klass->io_create_watch = qio_channel_stall_create_watch; +} + +static const TypeInfo qio_channel_stall_info = { + .parent = TYPE_QIO_CHANNEL, + .name = TYPE_QIO_CHANNEL_STALL, + .instance_size = sizeof(QIOChannelStall), + .instance_finalize = qio_channel_stall_finalize, + .class_init = qio_channel_stall_class_init, +}; + +static QIOChannelStall *qio_channel_stall_new(QIOChannel *master, + unsigned rstalls, + unsigned wstalls) +{ + QIOChannelStall *sioc = QIO_CHANNEL_STALL( + object_new(TYPE_QIO_CHANNEL_STALL)); + + object_ref(OBJECT(master)); + sioc->master = master; + sioc->rstalls = rstalls; + sioc->wstalls = wstalls; + + return sioc; +} typedef struct { bool finished; @@ -31,10 +148,12 @@ static void test_websock_handshake_done(QIOTask *task, gpointer opaque) * the server wrote back, NUL terminated. The handshake is expected to * fail; the point of the test is the HTTP response that goes with it. */ -static char *test_websock_handshake_reply(const char *request) +static char *test_websock_handshake_reply(const char *request, + unsigned rstalls, unsigned wstalls) { QIOChannelWebsockHandshake res = { false, false }; QIOChannelSocket *cli, *srv; + QIOChannelStall *stall; QIOChannelWebsock *wioc; GMainContext *mainloop; int channel[2]; @@ -48,7 +167,8 @@ static char *test_websock_handshake_reply(const char *request) qio_channel_set_blocking(QIO_CHANNEL(srv), false, &error_abort); qio_channel_set_blocking(QIO_CHANNEL(cli), false, &error_abort); - wioc = qio_channel_websock_new_server(QIO_CHANNEL(srv)); + stall = qio_channel_stall_new(QIO_CHANNEL(srv), rstalls, wstalls); + wioc = qio_channel_websock_new_server(QIO_CHANNEL(stall)); qio_channel_websock_handshake(wioc, test_websock_handshake_done, &res, NULL); @@ -68,6 +188,7 @@ static char *test_websock_handshake_reply(const char *request) } object_unref(OBJECT(wioc)); + object_unref(OBJECT(stall)); object_unref(OBJECT(srv)); object_unref(OBJECT(cli)); @@ -77,7 +198,23 @@ static char *test_websock_handshake_reply(const char *request) static void test_websock_bad_request(const void *opaque) { const char *request = opaque; - g_autofree char *reply = test_websock_handshake_reply(request); + g_autofree char *reply = test_websock_handshake_reply(request, 0, 0); + + g_assert_true(g_str_has_prefix(reply, "HTTP/1.1 400 Bad Request\r\n")); +} + +static void test_websock_stalled_read(const void *opaque) +{ + const char *request = opaque; + g_autofree char *reply = test_websock_handshake_reply(request, 1, 0); + + g_assert_true(g_str_has_prefix(reply, "HTTP/1.1 400 Bad Request\r\n")); +} + +static void test_websock_stalled_write(const void *opaque) +{ + const char *request = opaque; + g_autofree char *reply = test_websock_handshake_reply(request, 0, 1); g_assert_true(g_str_has_prefix(reply, "HTTP/1.1 400 Bad Request\r\n")); } @@ -85,6 +222,7 @@ static void test_websock_bad_request(const void *opaque) int main(int argc, char **argv) { module_call_init(MODULE_INIT_QOM); + type_register_static(&qio_channel_stall_info); g_test_init(&argc, &argv, NULL); #define TEST_BAD_REQUEST(name, request) \ @@ -101,5 +239,11 @@ int main(int argc, char **argv) TEST_BAD_REQUEST("bad-method", "POST / HTTP/1.1\r\nx: y\r\n\r\n"); TEST_BAD_REQUEST("bad-version", "GET / HTTP/1.0\r\nx: y\r\n\r\n"); + /* A read which blocks before any header arrives is not a fatal error. */ + g_test_add_data_func("/io/channel/websock/stalled-read", + "stats\r\nx\r\n\r\n", test_websock_stalled_read); + g_test_add_data_func("/io/channel/websock/stalled-write", + "stats\r\nx\r\n\r\n", test_websock_stalled_write); + return g_test_run(); } -- 2.53.0