From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from AM0PR08MB11753.eurprd08.prod.outlook.com (2603:10a6:20b:743::23) by PAXPR08MB6942.eurprd08.prod.outlook.com with HTTPS; Mon, 31 Aug 2026 14:06:52 +0000 Received: from AS4P189CA0019.EURP189.PROD.OUTLOOK.COM (2603:10a6:20b:5db::10) by AM0PR08MB11753.eurprd08.prod.outlook.com (2603:10a6:20b:743::23) 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:46 +0000 Received: from AMS1EPF00000045.eurprd04.prod.outlook.com (2603:10a6:20b:5db:cafe::7d) by AS4P189CA0019.outlook.office365.com (2603:10a6:20b:5db::10) 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:46 +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 AMS1EPF00000045.mail.protection.outlook.com (10.167.16.42) 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:44 +0000 X-PERCEPTION-POINT-VERDICT: CLN X-PERCEPTION-POINT-SPF: X-PERCEPTION-POINT-SPAM: PASS X-PERCEPTION-POINT-SENDER-IP: 2a00:1450:4864:20::431 X-PP-Forefront-Antispam-Report: CIP:2a00:1450:4864:20::431;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail-wr1-x431.google.com;PTR:mail-wr1-x431.google.com;CAT:NONE;SFS:(13230040)(12012899012)(43022699015)(6059299003)(2092899012)(3072899012)(82310400026)(10067099003)(5063699009)(19002099009)(57112099003)(18002099003)(55112099003)(16102099003)(22082099003);DIR:INB; Received: from AS8PR07CU003.outbound.protection.outlook.com (mail-as8pr07cu00302.outbound.protection.outlook.com [40.93.65.50]) by inbound-smtp.eu-west-1.amazonaws.com with SMTP id d5hb2qttujdnecc6m5unojaeq0oqqukl9blnmh81; Mon, 31 Aug 2026 14:06:42 +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.50 as permitted sender) client-ip=40.93.65.50; 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.50 as permitted sender) client-ip=40.93.65.50; 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: AEFBQUFBQUFBQUFGZEVrNjNkOVA1cC9ORnNZbGZQb1pGUisvWHZXcmN1dEcwOHRRdmVWZWRJOGRwZ2FuOWloTlZTU2hHZVVnSzBha2lkd3hFY3h6TjJOOWtPOXY1Wm9HWEgrNGdHcTZjRC9EQjRaTWdudjZVaGJPRCtRNy9GdHNJNzlYWmJqeFBiK1NKZU9BWTlYd0cyZFhnMlZaakhmbjl4UXdRWTZ6b0pPOGRDSDdZTi9Wem5yOUh6Qkc5TmNqell6YlZhcFpBdnBzWGdDTGNZL3NaWmM1aDZ1dG9rSjBxSFFOZlZMZXJ3bTJMOVZOeFZFN0FIdEtmcnNmOEZDZk1oSjVCVllMQ3Q1NDBjeU9wQmN4b0ZpYVlseUJTOWpVKzc0M0x0Z3c5UzRmLzNDR0Y4R0xucVE9PQ== X-SES-DKIM-SIGNATURE: a=rsa-sha256; q=dns/txt; b=nAgY/IlM0M46GvG/dfWXAONDRLWjxMlBmWj6DM/Y5bb2oKydmk41G89ZaIYCGHVCVQzhlSGcTzPGDPukmnnNA41UxTW/mvXV8OUk816vuywQ02RPIDkxxjwBH0lBGRg3bQGkBIIEHRYE4vAJ/uRklc5oN0279KjQSGDwcKFqaF4=; c=relaxed/simple; s=shh3fegwg5fppqsuzphvschd53n6ihuv; d=amazonses.com; t=1788185202; v=1; bh=28F5EHn0lRV2pPuOu3L5cJ36IMHLCZ4U8w6q7WSDudA=; h=From:To:Cc:Bcc:Subject:Date:Message-ID:MIME-Version:Content-Type:X-SES-RECEIPT; Received: from PA7P264CA0304.FRAP264.PROD.OUTLOOK.COM (2603:10a6:102:395::20) by AS2PR08MB9985.eurprd08.prod.outlook.com (2603:10a6:20b:640::11) 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:32 +0000 Received: from AM7PEPF00000054.EURPRD83.prod.outlook.com (2603:10a6:102:395:cafe::6) by PA7P264CA0304.outlook.office365.com (2603:10a6:102:395::20) 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:32 +0000 Authentication-Results-Original: spf=pass (sender IP is 2a00:1450:4864:20::431) 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::431 as permitted sender) receiver=protection.outlook.com; client-ip=2a00:1450:4864:20::431; helo=mail-wr1-x431.google.com; pr=C Received: from mail-wr1-x431.google.com (2a00:1450:4864:20::431) by AM7PEPF00000054.mail.protection.outlook.com (2603:10a6:20f:fff8::218) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.382.0 via Frontend Transport; Mon, 31 Aug 2026 14:06:32 +0000 Received: by mail-wr1-x431.google.com with SMTP id ffacd0b85a97d-48436668d20so885126f8f.3 for ; Mon, 31 Aug 2026 07:06:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz.org; s=google; t=1788185191; x=1788789991; 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=giLVgT8BFBICYbT/68RCRl6SISDf+IXmmIxDGySD2atopgEuxN1mVqWnedcodKlKG8 I6Q2NhWpvAxTpr19iEi8zpCaSBzTi1eN70HII9t8ayqygozTYX0cUkPkuSVmVHl8y5rw yusZG9zosAuxi6PhBuYlhx9QL/Ar+/L46YXexJOGc6k3Fvw0yI2uOJr19wpEMrjJrwGV 7M+PyRk/KYSqHoJEUBxkuTF+726r1aNoki6vnQKKMv9hpbjsWskuDvuGPkPkQbXUAAbs lsVveehS3SFC7gZftartH8BtoKclzYsQaOuXxUS6wjV9U9bzdbvh6JiQiJsWiNimuvgP Vo/A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788185191; x=1788789991; 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=sEgloZGFFl3Q/YkdxqhH3LctkGEGcVc7BrWI0Qz48iSN7Hb55V0rFopQcE8yHnxqPs /Ppuir4ac9gUMwJYCsNwwyb27ItNzQQZxooSQu16OT32XzRCmc1PD5WFMFvEUhwfggIu BSPOnhcsiuEJBkQ8TwDPDU44NME4OBzcwGK7Lv9mDqrH9QGhyRnVxjcvMA6moV8WmVlE fmlvqSMc6t1As3U5dQ9gl+WoetxNQlDoqc2AShIUYHIKRoy0VNxu72GwoMKresJ7qSjW ujZDuekKvpip8Atv03E6j2h2XUzuWSzz7DPZGpoxFZL1SV2UhglSGvLDu22FhTv/lBH8 v3FA== X-Gm-Message-State: AFuF++lz/HDMkdz8wuJsEy34xoo1tpeavxxUVVPZHWytMvt1pvy8FjY3 z7X7DH109q0igBi7JrPN77JZJ0+V5Stt/boMLlMBe6DY1wMwfpzm44jPGMu0APAqtrYVvda1uo5 +EpBJ2hY= X-Gm-Gg: AYBFou3yzmsvaDw5Yn7wcjVJoLs40/kRnx/r0pHszqAHOXtwvWQNSX/TVLDru95cTpe 0nrXmH9iL3S/VJdbDFjss7ou2NQ3sKq5FiYoEuzNjbGRFyFnD8AzeuBYTa6luovJfFzWALB/GDA GwmqDHUW19eX+WPu++BYlwXBlpf0eJpG2AEqmwuLoRjo1vg+TPB+zr+ZqucsPig9su1hwe1bl+6 YBOrXxH16NUr49uGNseWXTwih8M0WscVmwNFNGJ6jAzZFQaCnFaZut5reqrAtrvFTvmvWKqNytO IZmnDUrBsEwtqeNuAFWpAXBeKGXMSZcWJxFJVFn4ego9twiX9uBeb/0h7ms2s/J0LE+qterHsul agz1f363sIrepN+IjdeN2HPcA2KXPaZVr27XR+f03TFv1Q7z491m1ChqsfOGM5SOjTHu1O4iCAf DnPvcWRSroiGeHnnqWwyrdgaVfqTceI38HuSKESvYmX66tokhvmI1LjJe4 X-Received: by 2002:a5d:5d0c:0:b0:482:d94e:f33b with SMTP id ffacd0b85a97d-482f782a855mr42860691f8f.0.1788185191324; Mon, 31 Aug 2026 07:06:31 -0700 (PDT) Received: from athena.sw.ru ([2a06:5b06:b600:300:3bc1:c53b:30b:203e]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-482fbb33070sm23644536f8f.36.2026.08.31.07.06.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 31 Aug 2026 07:06:30 -0700 (PDT) From: "Denis V. Lunev" To: svt-core@virtuozzo.com Cc: andrey.drobyshev@virtuozzo.com, den@openvz.org Subject: [PATCH hci-8.0 6/6] tests/unit: cover blocked IO during the websock handshake #VSTOR-143316 Date: Mon, 31 Aug 2026 16:06:20 +0200 Message-ID: <20260831140620.1204363-7-den@openvz.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260831140620.1204363-1-den@openvz.org> References: <20260831140620.1204363-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: AM7PEPF00000054:EE_|AS2PR08MB9985:EE_|AMS1EPF00000045:EE_|AM0PR08MB11753:EE_|PAXPR08MB6942:EE_ X-MS-Office365-Filtering-Correlation-Id: 8f2fb875-531d-4d50-b786-08df0769175c 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|12012899012|43022699015|6059299003|2092899012|3072899012|82310400026|10067099003|5063699009|19002099009|57112099003|18002099003|55112099003|16102099003|22082099003; X-Microsoft-Antispam-Message-Info-Original: =?utf-8?B?RnZYUTZpcW1FUWdEZUowZnhRUTVUL3RJWmZuVVFuVlphdjczSFZaQVFXVEhS?= =?utf-8?B?VFBkVEJWanNUNXFlVVAyc3hjQUc5UVJBemNDbjZyV3p3cDlMN0wzU1pSQk5u?= =?utf-8?B?TERKd2hCajVpSVlwYXdUOUdMLzM3Uk9EWU55UThLd3RvVnVWV043czF1eUdY?= =?utf-8?B?eHBBSEVVUlN5TWp6SlMyVHNNcG5vdjFmQnFWckM2U2taUitnOHllRHMrRUZC?= =?utf-8?B?S1VGbEtkeVo5WktLbDllQ3NZb1VMYTVLVjV4bEhHeVFvd2pwVGFpNzBvV3U5?= =?utf-8?B?VGhkZzI4WTVEeDJXZ0NVSU5CSU9VTUtzZ1FLZ2hlenA3Z2EvV2hGNWszTTY3?= =?utf-8?B?TXNycWp4MzNzOG95YkFjcmwxRVk1Q0hrQ2JlTmpHemlFWkdSZnBOUmdBY0h4?= =?utf-8?B?Z29jaFBSMjRobWVVUDNWVkFJdldNcmJVQWZRRHVZVGlCUFRTT09BbVFnSHJZ?= =?utf-8?B?QmpDdTM3RDU1NGloVlVNdmpNSnZkQjFDQnAvWlhVVkNBLzFySTJzWW9TZlR4?= =?utf-8?B?MVJjbW5PR1N0YVVzdFNaQjkya1dTTWJVRDU2bkdYN2FSd1hGYURKNlZnUjJB?= =?utf-8?B?R0ZXM09hWVpTcXFMZWJFWFdTaXNqRG9sTUlGeGQ2OWYxRmJaZERGcGx2ZDha?= =?utf-8?B?VEhaVjB6U3dqajJxNjQ5VklOVEVIZUhKS0FDaG55NDlCdE9ka01LNG5kN2Nq?= =?utf-8?B?akZwamZPSVBmcjU4QlZTWXJuam5jVkRHTmtQa0Y0OWV3RjVUQmNPTjYrRmZk?= =?utf-8?B?cGZERXNsa0hxd2JlTGpNTTRsdWRaZDFrT2I4VUo3SkQ0S0lETmRpYVF4Zmoz?= =?utf-8?B?L0g1aDVCN1BTeDJ4dVczN0IrL28rMDhwdml5ZGRjWjdOaTVQUXZkRUJHR3cy?= =?utf-8?B?bGhhdEtjM0g1ekdmY3QxSzgzZHk4c2xDSzF5bDV5UnozVUpmVVJZZGQ1azdq?= =?utf-8?B?Sm5YWE1jNTV0eEN3L3lydEVtL2hiRWF4R1JoVUIvbUVOOTNuMlVTVmFzZjJS?= =?utf-8?B?dCtuaHZxQVBBWnJGSHo0V1ZrS0lYZTRGdEcyQlk0VllEYlAvUmZvSG9oRzlS?= =?utf-8?B?RExIUnluL0o5Wm1MTS80V2lETTA0YldiUUhlbmpIM3VsWElWRFJQNVd0bE5Y?= =?utf-8?B?QndPM1dDQzdvY3FHcjM1SG9tMDdXU2RQNE41WEdhVytJSXlYS0crSW5kRnZm?= =?utf-8?B?ZEtNajMvOW90Q3R4bU9tNXNVM1M2bTFoQmlSdS9uYU5Qbml2Zm9DNUltTURt?= =?utf-8?B?S0V6UzJBOTRkTnlNYkJ6Y3k4QllpT29qcWhRM0JSRFREVnRFdGpGdERneEVX?= =?utf-8?B?RHB0Y1dYNVExVmtJc1VPR2t1Y1BqM054Vy9hYVcvUDQ2cnd4bTlVSVRweVpW?= =?utf-8?B?UmpoMlZFM2Q3Y1VaRHVkamNLZmFUdFFTSVNwQjVQKys3dHNLRXQzQ0xEbTla?= =?utf-8?B?Sks5bWRkZ1hYcGZMNGhTK041V2dGSjI2NjRyVWtyWXJTZlN5WTBLcmNrVWsx?= =?utf-8?B?TXQzMVl1cDYweG5IaXlDb041OEEyMzErR3JYNkhaanVmbitXZlZMdjBSMDRF?= =?utf-8?B?ZCtkVEI4ZHd0MU9lSUF5K09EVnVvL1k1eDdvNldMcGRtUnFuNzQ3YkFpMVBw?= =?utf-8?B?Sk9rUmVOdXM3LzdoMzVMRFFiRXBKMk1lZGc2ekdyQUg1b3pmU3dMdkJBYUY4?= =?utf-8?B?SkxsQkMrTW9wYmtxRTh0WTBiY3hXcmUxeU1aNGt3K3FhS3UxL0twZFNhMGZi?= =?utf-8?B?UjNrVnc3Q25jeUU4TGszclJlQVlOKzBoTVJFTWRxckZyWlFMWDJQTEtyM3NU?= =?utf-8?B?eEFUbXRkamI3U2NKVnYzQXRpZmFmTjJIcWd2eDhRbVhiMURjWFVSUTgzRmZW?= =?utf-8?B?c243RC9KZlVLclQrcm5IaWtiSWlOTWZka0NVdmJPaGgvY1J4N21PYUJMT0h0?= =?utf-8?B?RHI5T243WWh3cmZSVzdMc3BLQ04wS3JBS1NCRkE4TlBZNlNvay9JRmtRejIw?= =?utf-8?B?MTVGYlRrNUlzb2lnQ3R1QUFsckJXYzdhNnVuVEtmVGVjRi9zRUxFZzNwUkZP?= =?utf-8?B?bHMrVU44b0NqeUxQWm1Ja05tSGU3dHEvaTJNNzh3dkFOWXREdUlrYnBWUHdM?= =?utf-8?B?bUZsM2VyMFZHYVJDWGJNZ0p3cUpLRk1kRXE0OERLU05HRWVXMWtpRjdLcGVQ?= =?utf-8?B?VGFualVSZjdPdVhveEJtYk9NQmw2bUc4K2tVQlUrL0U3aUNNQ0c0Vmk2VDQ1?= =?utf-8?B?ZlRQemh4dHRsaWczV2JHWW9uRzQzU2J5TjZpVVEwNGxDc1g0QVBybDVGaloy?= =?utf-8?B?cDRnZVdCWC80c2k1bHlRc2pCdG9tZzNoT2Q3UVRFUFdsLzRhSHNscjdBdmVH?= =?utf-8?B?TTBmei9UT01KOXE2M3NUUTU4SUVtdi96TDFGYmlvQ0RvZzhzSHFQVXl2NVh0?= =?utf-8?B?eFlJR3pHTVpNTGFqR3cyUmlBQ1FNeWZBUzJMZG95dVE5Vm0wc0ludjJIUkkr?= =?utf-8?B?WmNmSkN3bmhYb0tFZG5IWlJjS0ZVUmFLcHNyNFNtMkMrNm5nckY2RTMzVGlX?= =?utf-8?B?TUFXcHovNFdRV3hXcUpXa1hBQVdaNkk5b3h4NVRsb2JTY2JuL01qV0VaRktW?= =?utf-8?B?Rm1QZWpCb25PR0FWakZkRVVFaU9STEJ0YkZBeXcxdHExTFVpRDliajhsK2Vz?= =?utf-8?B?OEZKdnIxSVRpRGJaUTZhcFFDa2Z1bkVwOENPRVVHWnZZRmY0a2ZTbGZmaGo4?= =?utf-8?B?ZU96K2x6T2FVZ3ZWTE5jak9rMUN3R0NuWmlPQTBBYzY0L2xPdWg1dzZrRTZn?= =?utf-8?B?WGVFVFRURHhDVEFLWWFmL2txOTd3UkNwTnVtOWlPTXhaU3lCZFVsRW5zMmU3?= =?utf-8?B?dm5odXc0SmZnSWVzS2JpcnNod3VxNy9rWUloVjJTK2VHcHJSQW9ZOHpOazNx?= =?utf-8?B?emlGYndFbHZpTk1xZFhxdzRVc1RlelhUTlBqWTFSNEp5RDVDWHc9PQ==?= X-Forefront-Antispam-Report-Untrusted: CIP:2a00:1450:4864:20::431;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail-wr1-x431.google.com;PTR:mail-wr1-x431.google.com;CAT:NONE;SFS:(13230040)(12012899012)(43022699015)(6059299003)(2092899012)(3072899012)(82310400026)(10067099003)(5063699009)(19002099009)(57112099003)(18002099003)(55112099003)(16102099003)(22082099003);DIR:INB; X-Auto-Response-Suppress: DR, OOF, AutoReply X-Exchange-RoutingPolicyChecked: S5B96hLbC5+L+s8yKtsr6Se5ADOg8i3qYcge+p/46wse/B2Q+j5V3Qr4ylSqq6my65d6ywMoVJPkNEQC+DHx/8iAUJ0lkYQJ3dKCJ8+0JoAoSSQ5xm+FteDlLbCiEo4KOJvOqcefwJpwpxhnhJMqI//RHwjjc4Lmo7E4MSlXOo9fZeUJz519o2dg9qI8ICgAIOBq+KghNhrSnEyyK8A8QTYD8Bup+pgII2GAxu1IQAo42bn3qAqxjq7t2gZqC9ptyESEGXCEZsksHRXP+v0PlCmm+K/moHSkeJqHJEh5GbjwnGR/Ob5dmR26miNF/Sp7FmqndxP+oxqdMKvWzE1RiA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS2PR08MB9985 X-MS-Exchange-Organization-ExpirationStartTime: 31 Aug 2026 14:06:45.4812 (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: 8f2fb875-531d-4d50-b786-08df0769175c X-MS-Exchange-Organization-MessageDirectionality: Incoming X-MS-Exchange-Transport-CrossTenantHeadersStripped: AMS1EPF00000045.eurprd04.prod.outlook.com X-MS-PublicTrafficType: Email X-MS-Exchange-Organization-AuthSource: AMS1EPF00000045.eurprd04.prod.outlook.com X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Office365-Filtering-Correlation-Id-Prvs: 744cc03b-ac0e-4b15-5476-08df07690f68 X-MS-Exchange-Organization-SCL: -1 X-Microsoft-Antispam: BCL:0;ARA:13230040|43022699015|82310400026|2092899012|3072899012|12012899012|35042699022|6059299003|5133699003|16102099003|19002099009|55112099003|22082099003|57112099003|10067099003|5063699009|18003699003; 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)(43022699015)(82310400026)(2092899012)(3072899012)(12012899012)(35042699022)(6059299003)(5133699003)(16102099003)(19002099009)(55112099003)(22082099003)(57112099003)(10067099003)(5063699009)(18003699003);DIR:INB; X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 Aug 2026 14:06:44.7738 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 8f2fb875-531d-4d50-b786-08df0769175c X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-CrossTenant-AuthSource: AMS1EPF00000045.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: Internet X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM0PR08MB11753 X-MS-Exchange-Transport-EndToEndLatency: 00:00:07.7299829 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?bGZsNkM4WTJ1SVJlaW56T0Joay9jeGdkMzF0M1QrYkdwNUFsS2ZYVU9iRXFR?= =?utf-8?B?TkNyVW53M2JoTmZyTVJRVEVTSlA0M0hHQVJjU3c0K1BGOXVkczNOUGtQdWow?= =?utf-8?B?UmV0d3YzVE1pMDBjV09uQ3pXZ2huN0diNnFxa1Z5YXJvayt1bEtINnlGdlIw?= =?utf-8?B?Z3VnNFNHRVdGMm5aQ1BVMjVTMkhjck1iSHpBdGljTDJTMmlabTJDQW5aVENE?= =?utf-8?B?b0VLNFVpa3B1MVllK09DUURCejA4aXlreSt2dWdkbFE3czdzWUo4R29oWXZF?= =?utf-8?B?UUV4TVU5YkZvRHU2b0p0enRzSVYyK01rM0IySkZhYnJBRWRRNXJBZXBSQUNK?= =?utf-8?B?RkZvdlZaaGNwTnVKU0FyK0QrNzk3OVE3SkhsZVdEeXBPelpUR0dtOVpTUGt4?= =?utf-8?B?MCt4bmQvWHJkQmNyWndLNU1CTFFNbStYVkxBa3phYlY4bjA4UVRMQjQ4a1Jy?= =?utf-8?B?Q1ZLSCtUaDd3a25rNTRIWno2T1FRZVhGbUtyeXhBSmdrYmhIN3JyMnhhUGFM?= =?utf-8?B?WkZ1bmJRTmhCb1A2dmszZ2Y1MXM0aFhYSFZYSDU3YWJ2VFZ1U0NsUUs3dEhI?= =?utf-8?B?S1c2WFRxaEs1bGRqWW9Yay9SaG1LRGkrMmZSUHl4Qk5zMm4wL1R0K0Ivb1ZS?= =?utf-8?B?M1JKcHI3K0gzblFwckdtbkN5bkd1b3hQcFJVRlRHM2dPRUZid2hRSFN6bkhK?= =?utf-8?B?UHJmUXphd0cyYWhWZzhsUG4wWnlJcnBBYzNUN2RFa3RYYTMzNG9oT1hIVDcz?= =?utf-8?B?QWZkSThvU0VlVEJBZWxlckFhTnkraUdpdEF1TWllUFoydnQyRTIzaU43VTJn?= =?utf-8?B?M3NtYWVIVmdFN1JXbTVPVWE0Zjh6THFHbnZrazZlMXQvUElHdmk1TjlsVXFp?= =?utf-8?B?UUdlWllQdDBXNFg3WU1KVVF4N0w1VktDRXBWTi84U2s1eUdZR0VyV0pNU3Rk?= =?utf-8?B?bkNwQ2kyMy9DdElHcFBGV2Vnd2piSjUxbCtPOGppVlUrc2JuNGU4VE83ME1h?= =?utf-8?B?U3JDVStGb1lmOGV0bUNmNCt4T2lNR1I1N252Mk1GeVRsdVpBZ2JjUXpSSTVL?= =?utf-8?B?eTAyZHl6WUJvZGJJc1pIYlVFU2RLT1lmUW9ZS2ZlaEJPRjFRTEk1U2M5WVlN?= =?utf-8?B?WXZOREtrRWhDMHUvK0dLRXlTYUJpZTR0T0xzSGpaSEVmL1NocEo4U0pBeXN3?= =?utf-8?B?elF2UFprTGdDNjM0Ujc3UUtxTXRUaW9pOHRHZ3M1Y1JObG5OdzVDZ2xHbUMw?= =?utf-8?B?UGFhQXBaU2RvN0ZySFA3dFM1Z3pNOUdRRHIwK29Ld1pHdEJXTVZSOVRZbi9D?= =?utf-8?B?cmh4OTU1dE1VOFVISFNJbmNaZzljRjdBNjZVNGJIcG4vUzROczNXZUxOaGEy?= =?utf-8?B?NVRRRGJqMm9EZHVnYURvdElLQnNrK0NhbU1WS05ObXNZcllabFdwYnN6eXp3?= =?utf-8?B?bG1MZDR5eWNyTUE2d3ZkQ0N2a3VBUUdIakFEYnFJYWJKWnVLMmdzc3dqVlhh?= =?utf-8?B?cEtoeFd6Vzh5T0RIdWJOUXY0Skx5bi9VY0tzZlhDcHBpcnphbFEzd2dCODFL?= =?utf-8?B?SmJxaWIwYzZKOUZubTZOVU5sRHA5b1N0UnY3ZjVrQXlwcVNXS2ZsWCs1REdv?= =?utf-8?B?YkRnbTNZNlNETDRFM0NlSGlVV2IzakwwVE90cDFnVlFyYzJFaGpKdHNlUHlS?= =?utf-8?B?aVgvckprcEV5YUYxd2xnTHZmOW9nZkJWbEhQeGVzV01ZbVArVjNJSVhDaEha?= =?utf-8?B?Q24ydHRWczh0c1R4R2U5em9hZDE5bmZzSDRnanJsdWhKc0RsbzJzR1hTZ1hZ?= =?utf-8?B?YlZJTFdKMFFLN0dCQ2VPZVQ0S3RJZi9LVkpoekV6ZEowYmlnYm5HMVdOaVNF?= =?utf-8?B?ZUVhVVZYZk1GcG9XN25BYzlnZzMvSFlycnc3SW9nYkRIb1ZiVHcxemdCWWJE?= =?utf-8?B?dzZlSlFKVW9RVG9QaWJUSjBBL0E1RXlwVHI1d2lON0N5aldpdkZsYS9aSjFE?= =?utf-8?B?TzZuaExZRWViY0JnT2NFaXYvNEExOG9wWXZmYkRhM0pxMmVqeHR1NDdabEF2?= =?utf-8?B?ejU1QzgxUTJoWXNlMDVRUHNQNkxlcVR6T3dSY1Z2VEpTOERHaGd4NUVFOFVr?= =?utf-8?B?dUl0ZUYydlBheStGMlRCeEpVaEx5c0RoM2V6M1hOQzRuM0RLU250WC90Um85?= =?utf-8?B?Z0xoR24wcnFaUVh6My8raVBIMEQ4L2Y3MjNtbUxtOENHekRZbHNUR2VVMmJE?= =?utf-8?B?QkticzBNUlZFd0hlRlRJUkJWODU4YXlDRVBqTkRIbjdmK1dSeCtwbUdKeVpV?= =?utf-8?B?UjF2a1FKVFNKaG1uZ3I3bDNCWkxFV0QvaGV1dithVWpOVjVGU3FoRzdKNTlF?= =?utf-8?B?S25yMFhLVjBpVEVPQkVMQTd3MnkvamFzT25oL1NnUjEzNXgrbkpWa0JMNFRM?= =?utf-8?B?YnZ3T3U1dEQzdnpJWEwwb3hVeDVsWXVuVDYyM3BzSFhNV2lRa1MrNVpyM3Fz?= =?utf-8?B?Znpvb2c0aVBGdmswM1pvQnkxT01JT0hJQ29IOEUvYUlWVlFkTmZrOGdKY2Ju?= =?utf-8?B?RXZESk5LbUhkMXBFK21sdEVCQWdRZHJTQ0krRjFHTzhhSFFCRDZtcEs5Zmw1?= =?utf-8?B?S1d2czhmWTVxbmpaelVJU3c0MEczYUR3ZGw4Qk9wS212K202QVdFUlNBQW1G?= =?utf-8?B?M2xqdEtCQlFoenB0OC9GSHRRSURLN3FDUWI4K0NBb01vdVp4YUZQeElMVWNu?= =?utf-8?B?ZlVoOUZscmRkakZaVDVYblJld1Yrc1N4TmlwNDJQOXpoYUg4THpLejRnQ0h3?= =?utf-8?B?Qk1uWnJrMlRBeVhGOEttdFh4ay92eVBMKzFYc2FJTFlxa0tsRlRWV3FJeDdq?= =?utf-8?B?cGxLYkJGYlFwbGI3aUYrU0I5dnZhLzYxbVQ2ZUh5OTA2UlUyM2tBaTVwNnk4?= =?utf-8?B?R2UzbUtZSDg4UDBsNUhDdWx4NXJ3OFI1QjVvWlhGNkZUM0ZObktTQmcwQ05q?= =?utf-8?B?Q2ZpSEo1TjBIcjNhZkRpaGNDejdwNFBCS1FiQkwxUXUwMFNEN2FGWll6elFW?= =?utf-8?B?dWRSMjJMdTRRbEg2RENISkZzR1J3TWxkMXpsOHBqdXhjOG1XUERVWmFaOWdW?= =?utf-8?B?Snh1ZXl2V3BQMnNLVnFuQ2UySDV4TG9ZeWRLU05PUSt4a1kvWFhkSnFYbS83?= =?utf-8?B?N0g1ZUdzMHRKQm5PdnpudGhPdnNwa2xKTk1lVHROdThlZGFrVmg2QnhDREs3?= =?utf-8?B?LzJQcWtDcXdvQ1NnaDNBYm16SFUxSGh2SkIxZURrV0hodDl6aFQwT094eHZ5?= =?utf-8?B?Uzd5a0E5REpZYXhXWG9DTzZETmNzMXIyem5KMGFUUjlhcjRQUDRBZ2E1Wmw2?= =?utf-8?B?OVFHRjhrZjYrOEQxZWxKMGZsRVJpSGZFVVBDR25JOG1jTHNTc3JSZ0ovK2wv?= =?utf-8?B?RzBla1FhY1ZSVnJkSmRtWWpCdmZnS29NUnhYQkhxd0VNZHE3amUxdTFsVCsw?= =?utf-8?B?MDhEaE9WL3dWaUZhN0FScGJOTHBFL0VsSFlwTWNYRzV3REZtVjMyWTlwTW1P?= =?utf-8?Q?tJr8C/yjdVlzdx?= 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