Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wD1WF-002Wug-2a for pgsql-hackers@arkaria.postgresql.org; Wed, 15 Apr 2026 14:47:08 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wD1WE-00HTym-1z for pgsql-hackers@arkaria.postgresql.org; Wed, 15 Apr 2026 14:47:06 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wBJgi-00Ecys-37 for pgsql-hackers@lists.postgresql.org; Fri, 10 Apr 2026 21:46:54 +0000 Received: from dispatch1-usg1.ppe-hosted.com ([205.220.189.237]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.98.2) (envelope-from ) id 1wBJgf-00000000Om3-43wj for pgsql-hackers@lists.postgresql.org; Fri, 10 Apr 2026 21:46:52 +0000 Received: from m0423791.ppops.net (ip6-localhost [127.0.0.1]) by engine.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTP id 0C77720065 for ; Fri, 10 Apr 2026 21:46:49 +0000 (UTC) X-Virus-Scanned: Proofpoint Essentials engine Received: from CO1PR03CU002.outbound.protection.outlook.com (mail-westus2azon11020130.outbound.protection.outlook.com [52.101.46.130]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-384) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mx1-usg1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 8BF088C005B for ; Fri, 10 Apr 2026 21:46:47 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=cg6Em+QN+9g1paj79X7MK8RsHwCHkBI6ybRG68YB+cpujPW6hxQFeZCx8fJ2jfYuJOXA2VU6EcyNy+112afTVw1o8z30aYNFLheNAaOlCQsY5NntG9P2dL1AbzLCHud2524MUWKd5hYeicU+OfbucnjSB/cRsrOboRzd9bVNxJ2MvBSns7xOi7tuWXVndpPMIm0FcrCORz00FoJz8JnoNBxF2nKAv9vX6Q5fX40+UgI1Lat9vMy7X/BOvrUb0ItlhMwOLkTQ/vZ9O4r9tt5ufaD5stcjEiSXxkj+A6TuCVBQyPemTGHl3xU4BARE3hv1e28iTW3hr759agsjT0zihQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=+EoHIdPRno8RWDAl9fvx+HFuHJ2Ka014AIL1GjZX5jE=; b=eQI0n3AN1KmmySrE00ta/hAdrhlsrJITmc3Bb9Abr7zN8bKE+KbBJPaEvoOi3fbT8S7en7a+wZlhCpocATlnL9ZehAcOUxfS9DDrlwVvkj+sHwe7CYT6yEOjptvTjOffQLUyjWSfqqMSllRHYY3mzm9mmy2pTQmIsIYAXiZ/TwNjahZZ4RDZiQyKv545xNQV48IbuFoqoeT5s3JabYFeiP4Lz8n9ZjNWuXnMgkFwT2Jeh4hV6wUauxzX/1KhX2scpVHHkSKUv8/mt63f6FAztQsp41vvIRl2evkJUyly3GPUJydQjV+YYKwF5j/5b5hxbYRhi3fFQU22K79epqmkqQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=lamco.io; dmarc=pass action=none header.from=lamco.io; dkim=pass header.d=lamco.io; arc=none Received: from IA1PR07MB9830.namprd07.prod.outlook.com (2603:10b6:208:44b::14) by LV9PR07MB11383.namprd07.prod.outlook.com (2603:10b6:408:2bd::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9769.45; Fri, 10 Apr 2026 21:46:44 +0000 Received: from IA1PR07MB9830.namprd07.prod.outlook.com ([fe80::f922:baa4:8809:8cda]) by IA1PR07MB9830.namprd07.prod.outlook.com ([fe80::f922:baa4:8809:8cda%6]) with mapi id 15.20.9769.044; Fri, 10 Apr 2026 21:46:44 +0000 From: Greg Lamberson To: "pgsql-hackers@lists.postgresql.org" Subject: Extensible sync handler registration (register_sync_handler) Thread-Topic: Extensible sync handler registration (register_sync_handler) Thread-Index: AQHcyTMYRAZdF36FZU+IBSlZxjzqzQ== Date: Fri, 10 Apr 2026 21:46:44 +0000 Message-ID: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: yes X-MS-TNEF-Correlator: msip_labels: authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=lamco.io; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: IA1PR07MB9830:EE_|LV9PR07MB11383:EE_ x-ms-office365-filtering-correlation-id: 8fd428ba-4117-4845-c2b5-08de974aa86f x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0;ARA:13230040|376014|6049299003|1800799024|366016|10070799003|56012099003|18002099003|38070700021|4053099003|8096899003; x-microsoft-antispam-message-info: 88HyCb+kwL0y5BQlPZlwA7opw+q3/alSGGPbvPyz50wJzYJLQb563vtCOuqVEkrnamqrrz0DdyiRu0laAO34j1YVyC+HWdbZma0OvAF09AbrZmzgmkFODYO6Wfwwbl8iExNEJI5iKM6eN4lZZ+EfyEl8/hkKSqb45UZ0qwgO3m1yHnnJgKAw7F8MW1WuWWixzlWV4/hydvXEPJyPfzJf4GiThFMelD4hhrcFf5acZQGOxFWyH7SJmg0ibAW/zZBuwwes64nSqS1jWS+0jSohJpyK5hcUMfquU1NEuBBOSOaOHX+dHocpx+62ULK4Bny59XK9a6ORFz4l+TyG1gRlH3s2RnkQjecrZN14IK8cdH6ySmJB5+DUlH/8hp59+nJbBU0+Ficb9nRTqnOxN86sM3ZEGeZFbRDKZZsGqWcHAEETZHiKnDXEtewWrA4NWiawH7bbgb/aVX0b+E/nrY5Cwaz/aaqZ7mdCbhGc6cZpUwpv5hrBK7Mtih1SPTKty0/jjRnV9b3zN9lf5qpa1mVjn77LosiM1aKgCI9Qudhdvs/hShrNVeYHVadlmRZBLeKuzjpBRVGWgaMXK9vwL/xS8rte3OX8z9u0+YqwQgqQhUDof6Hwd+lqTWAsuNIHIGlLFv9rV6wkQPjveV/+S+KrPg1tNbV8iydq5ekaWD1yurz81soSX7DD5KsgOOklBg+a9iEZTj/GDFDlAv2XuCrIo/4xRZc1ruXzoOdzUgk5lxeAAyWNnic2NWnk3NEmB7EPsSRd9YfMNF1z0ETpAtG77hu1R2+sy884ZxiBCYwO3RU= x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:IA1PR07MB9830.namprd07.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(6049299003)(1800799024)(366016)(10070799003)(56012099003)(18002099003)(38070700021)(4053099003)(8096899003);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?Q?fCfl5uzWSdttdY76JVsoy9PGw3h5hP/uZGYfWWx58fGxwrWlodwg3UuBqF?= =?iso-8859-1?Q?h0hnnDQcoUo0JiMPznzLqz6Id9ForFkrtfUaCW7N4yML4LpnPx3+Xlh5YW?= =?iso-8859-1?Q?BiXzs8I7dzYXpEaJSHmd3iPenVTgPdSczKf1wxw9vwxo9PYeAMlY0hDQhd?= =?iso-8859-1?Q?R6tcHPVlXkdPIXD1c4ToULlt+7YwMS5cIF2wXhGIRGugjgICBO6hRsRYK7?= =?iso-8859-1?Q?POfc5ZSHctwMMkF92DQ0VSF2EGv8AuEl7GkkT/kGAFDeVq0zn5FjnwIuZX?= =?iso-8859-1?Q?vi23VLKyx4wVvc+4E3Ktdbpyg1dtH5/vFWORXOgrqbJNNjNETrYFVax6C2?= =?iso-8859-1?Q?qoIXltm6EF0rRZ9oWdKC3JCuesB5u8ji2cajYLXM47ObrNkmNM8joPbODv?= =?iso-8859-1?Q?osQwg+OLX7zNbfFP4eQP0x/zsM7/llH5naZyvDgNC3leN7sGqpNgB+RAnt?= =?iso-8859-1?Q?nkXLSujeTkBP8fMWcbogOPG0Hw6Lt9Cwz77kx8tWeHcVjMPSDlZ7Mu5X3n?= =?iso-8859-1?Q?UpZuUzDHWiSP9qxbTfTjiTKKFiFPSMhEedd2TBry+958UcLdSp9Dp4L2Sx?= =?iso-8859-1?Q?CsL7pWIua1Lsqh7vIR2A0KwHvXcwSIXMNCHPKJsvHQcWvdbbUzy1dbh/f2?= =?iso-8859-1?Q?FlBI4AjrNNUyJDwd0W7Meyj0/ivuTI7ZgpTnzE9W1j21AupfIhOogrwEfS?= =?iso-8859-1?Q?IRsVYAqBYw0uiWkXN3n+6WrnCam2yqeTta8xqt5vyjzQdN6fXaLkWKTK7i?= =?iso-8859-1?Q?72hwgf6+QRxK2SR8ZgnpKRC5rYIyxqC2DrH17pv/1Egmz9jVIyXZjjM0vs?= =?iso-8859-1?Q?KIjL3jZyeIEfs+s2YZJKN2BFH5DDmzXCXGPZlTK41OS9/yViP4s91ajzeN?= =?iso-8859-1?Q?HfmAJWwL07hHnQC/NL7INmWMz2r3RcKdVHLE7sXrDlCy4JN3IgXnBW3vYE?= =?iso-8859-1?Q?wRN6roS9Fu164WU83mbzv9p9fflEi9mB5fCwKjFgjf7lrIGDStoGrdnpPV?= =?iso-8859-1?Q?Yk+541Jm1h6qCJlRTWvAiBsVPBNnCxV5xOecwEnWazVY3gLivJXJL3Flnc?= =?iso-8859-1?Q?2LMzwK0/uhiuRo2hsQecGSdnOUHcfP0WzgS8YrI1SmGLZ5W9rYa8vDgq/N?= =?iso-8859-1?Q?lciYCAFUZhwIW9VPv4ZCSD553JCroTU3vgwbRtHcBhMSRSvviSPpkSTuxP?= =?iso-8859-1?Q?giziyTVrZkvZeOVu+elkeBDzqfiABPhsZXIwhbCtL1IBBGf1j0A63VxMuq?= =?iso-8859-1?Q?wWehRLn+9eB2OEzpKGoo+m7Z6IzrnZkFX+OKc/SNAf1PiA+APtP6okaW68?= =?iso-8859-1?Q?bbWTPJIl2Crt9f2MffiRw+Hdgqw4BhVa09l5iSWSGxPLd3IOkxl8d8S2Sc?= =?iso-8859-1?Q?4V7nFYBiXmFEQzHIFRoHFwEe5iyMeeVAsm++z7lUdUY+i8X09nD7wuZm89?= =?iso-8859-1?Q?Ff0EVmwGacVHooRkIRpQ2DlRICPWqWeSaZBp3w2evr8MvHVE5q24A08pev?= =?iso-8859-1?Q?r6ZjAfeoacV4o0mhFhh4ESMG6tvJZuPVqpZl/EfRh0nQww4GHSnsMVcn3T?= =?iso-8859-1?Q?nVBpQeb2ks0jehQdi/0VOvJumMP+8JTZmEHxQ1eD6Tt9E1J+Fm5u627m4B?= =?iso-8859-1?Q?rEvu+9qUOs5chmiuNjoQhzQXsFYEBnsI+PoYp0tyyZP6qzjdr8j+uWfIN3?= =?iso-8859-1?Q?c7quE8534Kzw8I1YrldnVQZFZ5Lopkcwh+ynB6CiLt/vgro2nOlqNVFoXT?= =?iso-8859-1?Q?pcn1v7u96c0Knh5IOz3ZGD2sF/MhUaQ7kfM9722cPPYolu03RBf4MHQ8aD?= =?iso-8859-1?Q?2+96WzM36PJ8tXLpzMGpODsyB09Aasc=3D?= Content-Type: multipart/mixed; boundary="_005_IA1PR07MB983072521EE7FDEE98902534A9592IA1PR07MB9830namp_" MIME-Version: 1.0 X-Exchange-RoutingPolicyChecked: WESnGWbrLPWbg3VyEAopWgvN0OufCcc/Er68Mq/K0ubb6Q+G0x7x56Zu2bSoOsQPljJh7TRKUDQu2nANbXI/VjYggZGZTcTd9ZZK7gxwzjUKekWUYZcnCGDaqrSflYmpXwjkq+iovnK/RdRP8egMrd6Xmx8HC787Kt6NWYR2ZbVwhGUgyjznAKYj1EDputFI4tsOXxV4+5XwjNfe/3Rz4td0Tfk2cowsC/h+KWIdtKRm8gEsm0D7WbuXiNYbZlmMiasqO4HbSupNkAL9JYjxDmK8PNbv0zyzOPAp+TYBiE849cCTYtJqVvLzPtt0/ZcJm+TkZ1ZYxXamWT3OVyRwtA== X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: AhCHjzYIIOaEFIhAwgZYj/31C70+EZxnHCxvHim0lvNGoWu8rZkCweN6ZFcrPAOo63gWliJGw1zEr1mxA232tdpyOwa9nfqRMnCs9EfpBlhqSvjQbkDqOzMsqc82XJdiqXjW9mtsONZRfFxEOrMiFuRPHS/dvNd7ApZeYOdDxRntDg8ILiPKYkLkIpNx0xSsYMX1tLP5va4x5W9rEzRd9gQBOayhZr1hj6bigDMpOE5f1k3zWwccghZDo6nLWjZzmS253Cc2lt8fvMMkcTK7sP/PPMaK4N52vDRo9XjC73Jpx7+HG/kO5eZ7vh3pxH2RcjJj1r2y1eB/kgUz6E7qcs/v9Itp1BYsg9s6JcCm5X04KYvfec1NmepWdhY1nJIMjuLJzjVbui1w5MC/Ju2zxVkz8cVV5eQKa741RXWC/+3Ik4soiU/QzeB/8ZxhOo2YVn3Vhcf4uhfZT2vf+XApDgPK8nfgKBMhBXtpfqNsUiu791M1Ub/3EHWh4aRv5H4T1FpHy7kk8ZXmTeLAkJuA9JLgH9YN76uSjq1HShsio9w4hlb4gXVOzC59zNv2xeZXTkpu7Q6Zi8iIr/dzqwEGvQgnDWcxemVcqG7kclNzD6U= X-OriginatorOrg: lamco.io X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: IA1PR07MB9830.namprd07.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 8fd428ba-4117-4845-c2b5-08de974aa86f X-MS-Exchange-CrossTenant-originalarrivaltime: 10 Apr 2026 21:46:44.2244 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 41970caf-9d15-4ba7-bce3-02b104df56b0 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: PKoi1M3nBNSTWDzhyw1xF8fFLT6M6IGV77BNwJ1JB8PW0IEDX6wrMn14lBhQHzxN X-MS-Exchange-Transport-CrossTenantHeadersStamped: LV9PR07MB11383 X-MDID: 1775857608-7GBq9pbZKMy1 X-PPE-STACK: {"stack":"usg1"} X-MDID-O: usg1;us-east-1d;1775857608;7GBq9pbZKMy1;;e34c3635e614851549967d21ccd44f17 X-PPE-TRUSTED: V=1;DIR=OUT; List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --_005_IA1PR07MB983072521EE7FDEE98902534A9592IA1PR07MB9830namp_ Content-Type: multipart/alternative; boundary="_000_IA1PR07MB983072521EE7FDEE98902534A9592IA1PR07MB9830namp_" --_000_IA1PR07MB983072521EE7FDEE98902534A9592IA1PR07MB9830namp_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Hackers, Motivation: I am working on Lamstore, an extent based storage backend whose data lives at byte offsets inside a volume file rather than as md segment files. Lamstore uses a custom storage manager to route backend I/O, which works today against stock PostgreSQL and Percona Server for PostgreSQL 18. The checkpoint fsync pipeline, however, is a dead end: syncsw[] in sync.c is a static const SyncOps[] indexed by the SyncRequestHandler enum, and there is no way for an extension to install its own dispatch entry. An extension cannot reuse SYNC_HANDLER_MD because mdsyncfiletag() resolves paths via relpathperm() plus OpenTransientFile() plus fsync(), which does not reach Lamstore storage. The attached two patch series adds a dynamic register_sync_handler() API to sync.c, parallel to RegisterCustomRmgr and the smgr_register shape being developed on CF 5616. Built in handlers (MD, CLOG, commit_ts, multixact_offset, multixact_member) keep their existing enum indices 0 through 4. Extensions get IDs starting at a new SYNC_HANDLER_FIRST_DYNAMIC. The patch is strictly additive: zero WAL format changes, zero FileTag layout changes, zero shared memory changes, zero catalog involvement. Background: Thomas Munro's 2019 refactor of the checkpointer fsync queue (commit 3eb77eba5a5, PG12) explicitly anticipated non md consumers. The commit message reads: "For now only md.c uses the new interface, but other users are being proposed. Since there may be use cases that are not strictly SMGR implementations, use a new function table for sync handlers rather than extending the traditional SMGR one." Seven years later the framework is in place but the registration mechanism has never been added. This patch closes that gap. Two reviewers have already voiced needs that this API makes trivial. In Tristan Partin's 2024-01-12 message on the CF 5616 thread (CAEze2WgMySu2suO_TLvFyGY3URa4mAx22WeoEicnK=3DPCNWEMrA@mail.gmail.com), Heikki Linnakangas wrote: "[I would like] a debugging tool that checks that we're not missing any fsyncs. I bumped into a few missing fsync bugs with unlogged tables lately and a tool like that would've been very helpful." And Andres Freund wrote: "I've been thinking that we need a validation layer for fsyncs, it's too hard to get right without testing. My thought was that we could keep a shared hash table of all files created / dirtied at the fd layer, with the filename as key and the value the current LSN. We'd delete files from it when they're fsynced." Both needs become straightforward with register_sync_handler(): a validation extension loads in shared_preload_libraries, registers its own handler, and observes every sync request flowing through ProcessSyncRequests() regardless of the underlying storage manager. This is strictly stronger than the fsync_checker extension in CF 5616 v5+, which wraps md and can only observe md backed data. What it does now: syncsw[] is declared as: static const SyncOps syncsw[] =3D { [SYNC_HANDLER_MD] =3D { mdsyncfiletag, ... }, [SYNC_HANDLER_CLOG] =3D { clogsyncfiletag, ... }, [SYNC_HANDLER_COMMIT_TS] =3D { committssyncfiletag, ... }, [SYNC_HANDLER_MULTIXACT_OFFSET] =3D { multixactoffsetssyncfiletag, ..= . }, [SYNC_HANDLER_MULTIXACT_MEMBER] =3D { multixactmemberssyncfiletag, ..= . }, }; Adding a new handler requires patching core. No extension path exists. What it will do: The patch converts syncsw[] from static const SyncOps[] to a heap allocated static SyncOps * grown via doubling repalloc, bounded by shared_preload_libraries count. Built in handlers are pre-registered at their existing enum indices by a new InitSyncHandlers() called from PostmasterMain before process_shared_preload_libraries(). Extensions call register_sync_handler() from _PG_init and receive a stable int16 handler ID, which they store in their FileTag.handler field at register time: /* src/include/storage/sync.h */ typedef struct SyncOps { int (*sync_syncfiletag) (const FileTag *ftag, char *path); int (*sync_unlinkfiletag) (const FileTag *ftag, char *path); bool (*sync_filetagmatches)(const FileTag *ftag, const FileTag *candi= date); } SyncOps; extern int16 register_sync_handler(const SyncOps *ops, const char *name); typedef enum SyncRequestHandler { SYNC_HANDLER_MD =3D 0, SYNC_HANDLER_CLOG =3D 1, SYNC_HANDLER_COMMIT_TS =3D 2, SYNC_HANDLER_MULTIXACT_OFFSET =3D 3, SYNC_HANDLER_MULTIXACT_MEMBER =3D 4, SYNC_HANDLER_FIRST_DYNAMIC =3D 5, SYNC_HANDLER_MAX =3D INT16_MAX, SYNC_HANDLER_NONE =3D -1, } SyncRequestHandler; Dispatch is syncsw[idx].fn() both before and after. Each caller that dispatches through the table (ProcessSyncRequests, SyncPostCheckpoint, RememberSyncRequest) caches the base pointer in a local SyncOps *ops at function entry so the compiler keeps it in a register for the lifetime of the function, matching the register allocation the pre-patch static const array received. Verified with objdump on GCC 14.2 at -O2 that the per-dispatch instruction sequence (movswq, mov, mov, lea, call *(%r14,%rax,8)) is byte identical between stock and patched builds. The only remaining delta is one additional memory load at function entry to fetch the syncsw pointer (mov 0x0(%rip),%r14 versus stock's lea 0x0(%rip),%r14): a single L1 cache hit, paid once per call to ProcessSyncRequests, not per dispatch. The 0002 patch adds src/test/modules/test_sync_handler with a TAP test verifying registration, dispatch, HASH_BLOBS coalescing, and cycle_ctr skip semantics. Test layout mirrors fsync_checker in CF 5616 v5+. Risk: Strictly additive. Zero WAL format changes. Zero FileTag layout changes. Zero shared memory changes. Zero catalog involvement. Per-dispatch assembly is byte identical to stock (see above). Built in enum values (SYNC_HANDLER_MD=3D0 et al) are preserved. ABI safe. Recovery path unaffected: extensions cannot register during recovery because InitSyncHandlers() runs in PostmasterMain before any child process, and the built ins are all pre-registered at fixed IDs. No behaviour change when no extension registers. Pre-empting Andres Freund's 2023 objections to CF 4428 v1: Your four review comments on the earlier smgr_register prototype (postgrespro.com thread id 2654666, 2023-07-01) apply here by analogy. Addressing them directly: 1. "Not a good place to initialize, we'll need it in multiple places that way. How about putting it into BaseInit()?" Our InitSyncHandlers() is called from a single site, PostmasterMain, immediately before process_shared_preload_libraries(). Built ins register via a private sync_handler_register_internal() from that one site. Child processes inherit the array via fork(), which is a full POSIX memory barrier. No per-process re-initialization. This is the same lifecycle pattern as RegisterCustomRmgr. 2. "This adds another level of indirection. I would rather limit the number of registerable smgrs than do that." Doubling repalloc is bounded by shared_preload_libraries count (small). Amortized O(1) cost at preload time. Registration happens exactly once per extension per postmaster startup, before any backend exists. Per-dispatch hot path cost is zero by construction: each caller hoists syncsw into a local SyncOps *ops at function entry, so the compiler keeps the base pointer in a register and the per-entry dispatch compiles to byte-identical assembly as the pre-patch static const array (verified with objdump, see Risk paragraph above). The only measurable delta is one additional memory load at function entry, paid once per ProcessSyncRequests call (not per dispatch). If you still prefer a hard cap I am happy to add SYNC_HANDLER_MAX_DYNAMIC as a compile-time constant. 3. "Huh, what's that about?" (on pg_compiler_barrier in registration) Not included. Registration is single threaded during preload. No barrier needed. 4. "It looked to me like you determined this globally, why do we need it in every entry then?" (on per entry size fields) Not applicable. SyncOps is pure function pointers. No per entry size tracking. Relationship to CF 5616: This patch is a narrow focused companion to CF 5616 (Extensible storage manager API), not a dependency or replacement. CF 5616 makes smgrsw[] dynamic; this patch does the same for syncsw[]. The two are orthogonal: none of 5616 v6's six sub patches touch sync.c or sync.h. This patch applies cleanly against master today without 5616, and introduces none of 5616's unresolved design questions (hook-vs-registration, catalog recovery, per tablespace vs per relation config, GUC chaining). If 5616 lands later the two compose naturally: extensions call smgr_register() and register_sync_handler() back to back in their _PG_init. Percona carryover: The patch also applies cleanly to percona/postgres PSP_REL_18_STABLE for our production deployment. sync.c and sync.h have no Percona specific changes on that branch (verified via gh api), so the same patch applies identically modulo mechanical offsets. Upstream master is the primary submission venue. A companion PR against Percona's branch will reference this thread. Verified locally: * make check-world green on master (PG 19devel) with both patches applied * make -C src/test/modules/test_sync_handler check green on both upstream master and percona/postgres PSP_REL_18_STABLE I will open a CF 59 (PG20-1) entry today and link this thread's Message-Id. Thanks for reading. Feedback, counterproposals, and design pushback all welcome. Greg Lamberson Lamco Development greg@lamco.io --_000_IA1PR07MB983072521EE7FDEE98902534A9592IA1PR07MB9830namp_ Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
Hackers,

Motivation:

I am working on Lamstore, an extent based storage backend whose data lives<= br> at byte offsets inside a volume file rather than as md segment files.
Lamstore uses a custom storage manager to route backend I/O, which works today against stock PostgreSQL and Percona Server for PostgreSQL 18. The checkpoint fsync pipeline, however, is a dead end: syncsw[] in sync.c is a static const SyncOps[] indexed by the SyncRequestHandler enum, and there<= br> is no way for an extension to install its own dispatch entry. An extension<= br> cannot reuse SYNC_HANDLER_MD because mdsyncfiletag() resolves paths via
relpathperm() plus OpenTransientFile() plus fsync(), which does not reach Lamstore storage.

The attached two patch series adds a dynamic register_sync_handler() API to sync.c, parallel to RegisterCustomRmgr and the smgr_register shape
being developed on CF 5616. Built in handlers (MD, CLOG, commit_ts,
multixact_offset, multixact_member) keep their existing enum indices 0
through 4. Extensions get IDs starting at a new SYNC_HANDLER_FIRST_DYNAMIC.=
The patch is strictly additive: zero WAL format changes, zero FileTag
layout changes, zero shared memory changes, zero catalog involvement.

Background:

Thomas Munro's 2019 refactor of the checkpointer fsync queue (commit
3eb77eba5a5, PG12) explicitly anticipated non md consumers. The commit
message reads:

  "For now only md.c uses the new interface, but other users are = being
  proposed. Since there may be use cases that are not strictly SMGR   implementations, use a new function table for sync handlers rather   than extending the traditional SMGR one."

Seven years later the framework is in place but the registration
mechanism has never been added. This patch closes that gap.

Two reviewers have already voiced needs that this API makes trivial. In
Tristan Partin's 2024-01-12 message on the CF 5616 thread
(CAEze2WgMySu2suO_TLvFyGY3URa4mAx22WeoEicnK=3DPCNWEMrA@mail.gmail.com),
Heikki Linnakangas wrote:

  "[I would like] a debugging tool that checks that we're not mis= sing
  any fsyncs. I bumped into a few missing fsync bugs with unlogged
  tables lately and a tool like that would've been very helpful."=

And Andres Freund wrote:

  "I've been thinking that we need a validation layer for fsyncs,= it's
  too hard to get right without testing. My thought was that we could<= br>   keep a shared hash table of all files created / dirtied at the fd   layer, with the filename as key and the value the current LSN. We'd<= br>   delete files from it when they're fsynced."

Both needs become straightforward with register_sync_handler(): a
validation extension loads in shared_preload_libraries, registers its
own handler, and observes every sync request flowing through
ProcessSyncRequests() regardless of the underlying storage manager.
This is strictly stronger than the fsync_checker extension in CF 5616
v5+, which wraps md and can only observe md backed data.

What it does now:

syncsw[] is declared as:

  static const SyncOps syncsw[] =3D {
      [SYNC_HANDLER_MD]    &nb= sp;          =3D { mdsyncfilet= ag, ... },
      [SYNC_HANDLER_CLOG]    &= nbsp;        =3D { clogsyncfiletag, ... = },
      [SYNC_HANDLER_COMMIT_TS]   &n= bsp;    =3D { committssyncfiletag, ... },
      [SYNC_HANDLER_MULTIXACT_OFFSET] =3D { multix= actoffsetssyncfiletag, ... },
      [SYNC_HANDLER_MULTIXACT_MEMBER] =3D { multix= actmemberssyncfiletag, ... },
  };

Adding a new handler requires patching core. No extension path exists.

What it will do:

The patch converts syncsw[] from static const SyncOps[] to a heap
allocated static SyncOps * grown via doubling repalloc, bounded by
shared_preload_libraries count. Built in handlers are pre-registered at
their existing enum indices by a new InitSyncHandlers() called from
PostmasterMain before process_shared_preload_libraries(). Extensions
call register_sync_handler() from _PG_init and receive a stable int16
handler ID, which they store in their FileTag.handler field at register
time:

  /* src/include/storage/sync.h */
  typedef struct SyncOps {
      int  (*sync_syncfiletag)   (c= onst FileTag *ftag, char *path);
      int  (*sync_unlinkfiletag) (const FileT= ag *ftag, char *path);
      bool (*sync_filetagmatches)(const FileTag *f= tag, const FileTag *candidate);
  } SyncOps;

  extern int16 register_sync_handler(const SyncOps *ops, const char *n= ame);

  typedef enum SyncRequestHandler {
      SYNC_HANDLER_MD     = ;          =3D 0,
      SYNC_HANDLER_CLOG    &nb= sp;        =3D 1,
      SYNC_HANDLER_COMMIT_TS   &nbs= p;    =3D 2,
      SYNC_HANDLER_MULTIXACT_OFFSET =3D 3,
      SYNC_HANDLER_MULTIXACT_MEMBER =3D 4,
      SYNC_HANDLER_FIRST_DYNAMIC   = =3D 5,
      SYNC_HANDLER_MAX    &nbs= p;         =3D INT16_MAX,
      SYNC_HANDLER_NONE    &nb= sp;        =3D -1,
  } SyncRequestHandler;

Dispatch is syncsw[idx].fn() both before and after. Each caller that
dispatches through the table (ProcessSyncRequests, SyncPostCheckpoint,
RememberSyncRequest) caches the base pointer in a local SyncOps *ops
at function entry so the compiler keeps it in a register for the
lifetime of the function, matching the register allocation the
pre-patch static const array received. Verified with objdump on GCC
14.2 at -O2 that the per-dispatch instruction sequence (movswq, mov,
mov, lea, call *(%r14,%rax,8)) is byte identical between stock and
patched builds. The only remaining delta is one additional memory
load at function entry to fetch the syncsw pointer (mov 0x0(%rip),%r14
versus stock's lea 0x0(%rip),%r14): a single L1 cache hit, paid once
per call to ProcessSyncRequests, not per dispatch.

The 0002 patch adds src/test/modules/test_sync_handler with a TAP test
verifying registration, dispatch, HASH_BLOBS coalescing, and cycle_ctr
skip semantics. Test layout mirrors fsync_checker in CF 5616 v5+.

Risk:

Strictly additive. Zero WAL format changes. Zero FileTag layout
changes. Zero shared memory changes. Zero catalog involvement.
Per-dispatch assembly is byte identical to stock (see above). Built
in enum values (SYNC_HANDLER_MD=3D0 et al) are preserved. ABI safe.
Recovery path unaffected: extensions cannot register during recovery
because InitSyncHandlers() runs in PostmasterMain before any child
process, and the built ins are all pre-registered at fixed IDs. No
behaviour change when no extension registers.

Pre-empting Andres Freund's 2023 objections to CF 4428 v1:

Your four review comments on the earlier smgr_register prototype
(postgrespro.com thread id 2654666, 2023-07-01) apply here by analogy.
Addressing them directly:

1. "Not a good place to initialize, we'll need it in multiple places    that way. How about putting it into BaseInit()?"

   Our InitSyncHandlers() is called from a single site, Postmaste= rMain,
   immediately before process_shared_preload_libraries(). Built i= ns
   register via a private sync_handler_register_internal() from t= hat
   one site. Child processes inherit the array via fork(), which = is a
   full POSIX memory barrier. No per-process re-initialization. T= his
   is the same lifecycle pattern as RegisterCustomRmgr.

2. "This adds another level of indirection. I would rather limit the    number of registerable smgrs than do that."

   Doubling repalloc is bounded by shared_preload_libraries count=
   (small). Amortized O(1) cost at preload time. Registration hap= pens
   exactly once per extension per postmaster startup, before any<= br>    backend exists. Per-dispatch hot path cost is zero by construc= tion:
   each caller hoists syncsw into a local SyncOps *ops at functio= n
   entry, so the compiler keeps the base pointer in a register an= d
   the per-entry dispatch compiles to byte-identical assembly as = the
   pre-patch static const array (verified with objdump, see Risk<= br>    paragraph above). The only measurable delta is one additional<= br>    memory load at function entry, paid once per ProcessSyncReques= ts
   call (not per dispatch). If you still prefer a hard cap I am h= appy
   to add SYNC_HANDLER_MAX_DYNAMIC as a compile-time constant.
3. "Huh, what's that about?" (on pg_compiler_barrier in registrat= ion)

   Not included. Registration is single threaded during preload. = No
   barrier needed.

4. "It looked to me like you determined this globally, why do we need<= br>    it in every entry then?" (on per entry size fields)

   Not applicable. SyncOps is pure function pointers. No per entr= y
   size tracking.

Relationship to CF 5616:

This patch is a narrow focused companion to CF 5616 (Extensible storage
manager API), not a dependency or replacement. CF 5616 makes smgrsw[]
dynamic; this patch does the same for syncsw[]. The two are orthogonal:
none of 5616 v6's six sub patches touch sync.c or sync.h. This patch
applies cleanly against master today without 5616, and introduces none
of 5616's unresolved design questions (hook-vs-registration, catalog
recovery, per tablespace vs per relation config, GUC chaining). If 5616
lands later the two compose naturally: extensions call smgr_register()
and register_sync_handler() back to back in their _PG_init.

Percona carryover:

The patch also applies cleanly to percona/postgres PSP_REL_18_STABLE
for our production deployment. sync.c and sync.h have no Percona
specific changes on that branch (verified via gh api), so the same
patch applies identically modulo mechanical offsets. Upstream master
is the primary submission venue. A companion PR against Percona's
branch will reference this thread.

Verified locally:

  * make check-world green on master (PG 19devel) with both patches     applied
  * make -C src/test/modules/test_sync_handler check green on both
    upstream master and percona/postgres PSP_REL_18_STABLE
I will open a CF 59 (PG20-1) entry today and link this thread's
Message-Id.

Thanks for reading. Feedback, counterproposals, and design pushback
all welcome.

Greg Lamberson
Lamco Development
greg@lamco.io

--_000_IA1PR07MB983072521EE7FDEE98902534A9592IA1PR07MB9830namp_-- --_005_IA1PR07MB983072521EE7FDEE98902534A9592IA1PR07MB9830namp_ Content-Type: application/octet-stream; name="v1-0001-Make-sync.c-syncsw-extensible-via-register_sync_h.patch" Content-Description: v1-0001-Make-sync.c-syncsw-extensible-via-register_sync_h.patch Content-Disposition: attachment; filename="v1-0001-Make-sync.c-syncsw-extensible-via-register_sync_h.patch"; size=21609; creation-date="Fri, 10 Apr 2026 21:44:50 GMT"; modification-date="Fri, 10 Apr 2026 21:45:22 GMT" Content-Transfer-Encoding: base64 RnJvbSAwMDIyYWM4MWY5ZWI0ZjE1ZDdhYzQzZTUyNzY3ZjQ0NmU1OGRmMWZjIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBHcmVnIExhbWJlcnNvbiA8Z3JlZ0BsYW1jby5pbz4KRGF0ZTog RnJpLCAxMCBBcHIgMjAyNiAwNzoyNzoxNCAtMDUwMApTdWJqZWN0OiBbUEFUQ0ggdjEgMS8yXSBN YWtlIHN5bmMuYyBzeW5jc3dbXSBleHRlbnNpYmxlIHZpYQogcmVnaXN0ZXJfc3luY19oYW5kbGVy KCkKCnN5bmMuYydzIHN5bmNzd1tdIGRpc3BhdGNoIHRhYmxlIGlzIGN1cnJlbnRseSBhIHN0YXRp YyBjb25zdCBhcnJheQppbmRleGVkIGJ5IHRoZSBTeW5jUmVxdWVzdEhhbmRsZXIgZW51bS4gRXh0 ZW5zaW9uLXByb3ZpZGVkIHN0b3JhZ2UKbWFuYWdlcnMgY2Fubm90IGFkZCB0aGVpciBvd24gc3lu YyBoYW5kbGVyczogdGhlIG9ubHkgb3B0aW9ucyBhcmUgdG8KZmFrZSBiZWluZyBTWU5DX0hBTkRM RVJfTUQgKHdoaWNoIG9ubHkgd29ya3MgaWYgdGhlIGV4dGVuc2lvbidzIGRhdGEKbGl2ZXMgYXMg bWQgc2VnbWVudCBmaWxlcykgb3IgdG8gYnlwYXNzIHN5bmMuYyBlbnRpcmVseSAobG9zaW5nCmNo ZWNrcG9pbnQgYmF0Y2hpbmcsIGN5Y2xlX2N0ciBzZW1hbnRpY3MsIFNZTkNfRk9SR0VUX1JFUVVF U1QgYW5kClNZTkNfRklMVEVSX1JFUVVFU1QgY2FuY2VsbGF0aW9uLCBhbmQgdGhlIGV4aXN0aW5n IHJpbmctYnVmZmVyCnByb3RvY29sKS4KClRoaXMgY29tbWl0IGFkZHMgYSBwdWJsaWMgcmVnaXN0 ZXJfc3luY19oYW5kbGVyKCkgQVBJIHBhcmFsbGVsIHRvCnNtZ3JfcmVnaXN0ZXIoKSwgY29udmVy dHMgc3luY3N3W10gdG8gYSBoZWFwLWFsbG9jYXRlZCBkeW5hbWljIGFycmF5LAphbmQgcHJlLXJl Z2lzdGVycyB0aGUgZml2ZSBidWlsdC1pbiBoYW5kbGVycyAoTUQsIENMT0csIGNvbW1pdF90cywK bXVsdGl4YWN0X29mZnNldCwgbXVsdGl4YWN0X21lbWJlcikgc28gdGhlaXIgY2Fub25pY2FsIGVu dW0gdmFsdWVzCjAuLjQgYXJlIHByZXNlcnZlZCBleGFjdGx5LgoKRXh0ZW5zaW9uIElEcyBzdGFy dCBhdCBTWU5DX0hBTkRMRVJfRklSU1RfRFlOQU1JQy4gRXh0ZW5zaW9ucyBjYWxsCnJlZ2lzdGVy X3N5bmNfaGFuZGxlcigpIGZyb20gX1BHX2luaXQoKSBkdXJpbmcgc2hhcmVkX3ByZWxvYWRfbGli cmFyaWVzCmxvYWQ7IGxhdGUgY2FsbHMgcmFpc2UgRkFUQUwuIEJ1aWx0LWluIHJlZ2lzdHJhdGlv biB1c2VzIGEgcHJpdmF0ZQpzeW5jX2hhbmRsZXJfcmVnaXN0ZXJfaW50ZXJuYWwoKSBoZWxwZXIg dGhhdCBieXBhc3NlcyB0aGUgcHJlbG9hZC1waGFzZQpndWFyZCwgYmVjYXVzZSBJbml0U3luYygp IHJ1bnMgaW4gYXV4aWxpYXJ5IHByb2Nlc3NlcyBhZnRlciBwcmVsb2FkIGlzCmRvbmUgKGZvciBp ZGVtcG90ZW5jeTogdGhlIE5TeW5jSGFuZGxlcnMgPT0gMCBndWFyZCBtYWtlcyByZXBlYXRlZApj YWxscyBzYWZlKS4KCkJ1aWx0LWluIHJlZ2lzdHJhdGlvbiBoYXBwZW5zIGluIHRoZSBwb3N0bWFz dGVyIGJlZm9yZQpwcm9jZXNzX3NoYXJlZF9wcmVsb2FkX2xpYnJhcmllcygpIHJ1bnMsIHNvIHRo ZSBmaXZlIGJ1aWx0LWlucyBhbHdheXMKb2NjdXB5IElEcyAwLi40IGJlZm9yZSBhbnkgZXh0ZW5z aW9uIGdldHMgYSBjaGFuY2UgdG8gY2xhaW0gYW4gSUQuClRoaXMgaXMgdGhlIGtleSBvcmRlcmlu ZyBjb25zdHJhaW50OiB0aGUgZW51bSB2YWx1ZXMgU1lOQ19IQU5ETEVSX01EPTAKZXQgYWwuIGFy ZSBjb21waWxlLXRpbWUgY29uc3RhbnRzIHRoYXQgdGhlIHJlc3Qgb2YgdGhlIHRyZWUgc3RpbGwK dXNlcywgc28gdGhlIHJ1bnRpbWUgdGFibGUgbXVzdCBiZSBwb3B1bGF0ZWQgaW4gdGhhdCBleGFj dCBvcmRlci4KCkRlc2lnbiBub3RlczoKCi0gU3luY09wcyBpcyBtb3ZlZCB0byBhIHB1YmxpYyB0 eXBlZGVmIGluIHN5bmMuaCBzbyBleHRlbnNpb25zIGNhbgogIGRlY2xhcmUgY29uc3QgU3luY09w cyBhdCBmaWxlIHNjb3BlLiBJdCBpcyBwbGFjZWQgYWZ0ZXIgRmlsZVRhZwogIGJlY2F1c2UgaXRz IGZ1bmN0aW9uLXBvaW50ZXIgZmllbGRzIHRha2UgY29uc3QgRmlsZVRhZyAqLgotIFNZTkNfSEFO RExFUl9OT05FIGJlY29tZXMgLTEgKHNlbnRpbmVsKSBpbnN0ZWFkIG9mIDUuCiAgU1lOQ19IQU5E TEVSX0ZJUlNUX0RZTkFNSUMgdGFrZXMgdGhlIHBvc3QtTVVMVElYQUNUX01FTUJFUiBzbG90CiAg dGhhdCBTWU5DX0hBTkRMRVJfTk9ORSB1c2VkIHRvIG9jY3VweS4KLSBBc3NlcnQoTlN5bmNIYW5k bGVycyA9PSBTWU5DX0hBTkRMRVJfRklSU1RfRFlOQU1JQykgZW5mb3JjZXMgdGhlCiAgaW52YXJp YW50OiBpZiBhIG5ldyBidWlsdC1pbiBpcyBhZGRlZCB0byB0aGUgZW51bSwgdGhlIGJ1aWxkCiAg ZmFpbC1mYXN0cyBhdCBmaXJzdCBib290IHVudGlsIGEgbWF0Y2hpbmcgc3luY19oYW5kbGVyX3Jl Z2lzdGVyXwogIGludGVybmFsKCkgY2FsbCBpcyBhZGRlZCB0byBJbml0U3luY0hhbmRsZXJzKCku Ci0gUHJvY2Vzc1N5bmNSZXF1ZXN0cygpIGFuZCByZWxhdGVkIGRpc3BhdGNoIHNpdGVzIGdhaW4g ZGVmZW5zaXZlCiAgYm91bmRzLWNoZWNrIEFzc2VydHMuCi0gTm8gV0FMIGZvcm1hdCBjaGFuZ2Vz LiBObyBGaWxlVGFnIGxheW91dCBjaGFuZ2VzLiBObyBzaGFyZWQgbWVtb3J5CiAgY2hhbmdlcy4K CkRpc3BhdGNoIGhvdCBwYXRoOiBiZWNhdXNlIHN5bmNzdyBpcyBub3cgYSBtdXRhYmxlIHN0YXRp YyBwb2ludGVyCmluc3RlYWQgb2YgYSBjb25zdCBhcnJheSwgR0NDIGNhbm5vdCBob2lzdCB0aGUg YmFzZS1hZGRyZXNzIGxvYWQgb3V0Cm9mIHRoZSBkaXNwYXRjaCBsb29wIG9uIGl0cyBvd24gKGl0 IG11c3QgY29uc2VydmF0aXZlbHkgYXNzdW1lIHRoZQpwb2ludGVyIGNvdWxkIGNoYW5nZSBiZXR3 ZWVuIGl0ZXJhdGlvbnMpLiBUbyByZWNvdmVyIHRoZSBzdG9jayByZWdpc3RlcgphbGxvY2F0aW9u LCBlYWNoIGNhbGxlciB0aGF0IGRpc3BhdGNoZXMgdGhyb3VnaCB0aGUgdGFibGUgY2FjaGVzIHRo ZQpiYXNlIHBvaW50ZXIgaW4gYSBsb2NhbCBhdCBmdW5jdGlvbiBlbnRyeToKCiAgICBTeW5jT3Bz ICpvcHMgPSBzeW5jc3c7CiAgICAuLi4KICAgIGlmIChvcHNbZW50cnktPnRhZy5oYW5kbGVyXS5z eW5jX3N5bmNmaWxldGFnKCZlbnRyeS0+dGFnLCBwYXRoKSA9PSAwKQoKVGhpcyBhcHBsaWVzIHRv IFByb2Nlc3NTeW5jUmVxdWVzdHMoKSBhbmQgU3luY1Bvc3RDaGVja3BvaW50KCkuIFRoZQpTWU5D X0ZJTFRFUl9SRVFVRVNUIGJyYW5jaCBvZiBSZW1lbWJlclN5bmNSZXF1ZXN0KCkgY2FjaGVzIHRo ZSBwZXItCmhhbmRsZXIgZmlsZXRhZ21hdGNoZXMgZnVuY3Rpb24gcG9pbnRlciBkaXJlY3RseSBz aW5jZSBib3RoIG1hdGNoCmxvb3BzIGNhbGwgdGhlIHNhbWUgb25lLiBXaXRoIHRoaXMgaG9pc3Rp bmcsIHRoZSBwZXItZGlzcGF0Y2ggaW5zdHJ1Y3Rpb24Kc2VxdWVuY2UgY29tcGlsZXMgdG8gYnl0 ZS1pZGVudGljYWwgYXNzZW1ibHkgYXMgdGhlIHByZS1wYXRjaCBzdGF0aWMKY29uc3QgYXJyYXkg KHZlcmlmaWVkIHdpdGggb2JqZHVtcCBvbiBHQ0MgMTQuMiBhdCAtTzIpLiBUaGUgb25seQpyZW1h aW5pbmcgZGVsdGEgaXMgb25lIGFkZGl0aW9uYWwgbWVtb3J5IGxvYWQgYXQgZnVuY3Rpb24gZW50 cnkgdG8KZmV0Y2ggdGhlIHN5bmNzdyBwb2ludGVyOiBhIHNpbmdsZSBMMS1jYWNoZSBoaXQsIHBh aWQgb25jZSBwZXIgY2FsbAp0byBQcm9jZXNzU3luY1JlcXVlc3RzLCBub3QgcGVyIGRpc3BhdGNo LgoKTW90aXZhdGluZyB1c2UgY2FzZTogbGFtc3RvcmUsIGEgbmV3IGV4dGVudC1iYXNlZCBzdG9y YWdlIGJhY2tlbmQKd2hvc2UgZGF0YSBsaXZlcyBhdCBieXRlIG9mZnNldHMgaW5zaWRlIGEgdm9s dW1lIHJhdGhlciB0aGFuIGFzIG1kCnNlZ21lbnQgZmlsZXMuIEFkZGl0aW9uYWwgYmVuZWZpY2lh cmllcyBpbmNsdWRlIHRoZSBmc3luYyB2YWxpZGF0aW9uCnRvb2xpbmcgSGVpa2tpIExpbm5ha2Fu Z2FzIGFuZCBBbmRyZXMgRnJldW5kIGhhdmUgYXNrZWQgZm9yIGluCnBhc3NpbmcgKHF1b3RlZCBp biBUcmlzdGFuIFBhcnRpbidzIDIwMjQtMDEtMTIgbWVzc2FnZSBpbiB0aGUgQ0YgNTYxNgp0aHJl YWQpOiB3aXRoIHRoaXMgQVBJLCBhIHZhbGlkYXRpb24gZXh0ZW5zaW9uIGNhbiByZWdpc3RlciBp dHMgb3duCmhhbmRsZXIgYW5kIG9ic2VydmUgZXZlcnkgc3luYyByZXF1ZXN0IHJlZ2FyZGxlc3Mg b2YgdGhlIHVuZGVybHlpbmcKc3RvcmFnZSBtYW5hZ2VyLgoKUmVsYXRpb25zaGlwIHRvIGNvbW1p dGZlc3QgNTYxNiAnRXh0ZW5zaWJsZSBzdG9yYWdlIG1hbmFnZXIgQVBJJzoKdGhpcyBpcyBhIG5h cnJvdywgZm9jdXNlZCBjb21wYW5pb24sIG5vdCBhIGRlcGVuZGVuY3kgb3IgcmVwbGFjZW1lbnQu CjU2MTYgbWFrZXMgc21ncnN3W10gZHluYW1pYzsgdGhpcyBwYXRjaCBkb2VzIHRoZSBzYW1lIGZv ciBzeW5jc3dbXS4KVGhlIHR3byBhcmUgb3J0aG9nb25hbDogdGhpcyBwYXRjaCBhcHBsaWVzIGNs ZWFubHkgYWdhaW5zdCBtYXN0ZXIKdG9kYXkgd2l0aG91dCA1NjE2LCBhbmQgZG9lcyBub3QgZGVw ZW5kIG9uIGFueSBvZiA1NjE2J3MgdW5yZXNvbHZlZApkZXNpZ24gcXVlc3Rpb25zIChjYXRhbG9n IHJlY292ZXJ5LCBHVUMgY2hhaW5pbmcsIHBlci10YWJsZXNwYWNlIHZzCnBlci1yZWxhdGlvbiBj b25maWd1cmF0aW9uLCBwZXJmb3JtYW5jZSBiZW5jaG1hcmtzKS4gSWYgNTYxNiBsYW5kcwpsYXRl ciwgdGhlIHR3byBwYXRjaGVzIGNvbXBvc2UgbmF0dXJhbGx5OiBleHRlbnNpb25zIHdpbGwgY2Fs bApzbWdyX3JlZ2lzdGVyKCkgYW5kIHJlZ2lzdGVyX3N5bmNfaGFuZGxlcigpIGJhY2sgdG8gYmFj ayBpbiB0aGVpcgpfUEdfaW5pdC4KClRlc3RlZDogbWFrZSBjaGVjay13b3JsZCBwYXNzZXMuIFNl ZSB0aGUgbmV4dCBjb21taXQgd2hpY2ggYWRkcwpzcmMvdGVzdC9tb2R1bGVzL3Rlc3Rfc3luY19o YW5kbGVyLCBhIG1pbmltYWwgZXh0ZW5zaW9uIGFuZCBUQVAgdGVzdApleGVyY2lzaW5nIHJlZ2lz dHJhdGlvbiwgZGlzcGF0Y2gsIEhBU0hfQkxPQlMgY29hbGVzY2luZywgYW5kCmN5Y2xlX2N0ciBz a2lwIGJlaGF2aW9yLgoKU2lnbmVkLW9mZi1ieTogR3JlZyBMYW1iZXJzb24gPGdyZWdAbGFtY28u aW8+Ci0tLQogc3JjL2JhY2tlbmQvcG9zdG1hc3Rlci9wb3N0bWFzdGVyLmMgfCAgMTEgKysKIHNy Yy9iYWNrZW5kL3N0b3JhZ2Uvc3luYy9zeW5jLmMgICAgIHwgMjU5ICsrKysrKysrKysrKysrKysr KysrKysrKy0tLS0KIHNyYy9pbmNsdWRlL3N0b3JhZ2Uvc3luYy5oICAgICAgICAgIHwgIDY0ICsr KysrKy0KIDMgZmlsZXMgY2hhbmdlZCwgMjkzIGluc2VydGlvbnMoKyksIDQxIGRlbGV0aW9ucygt KQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3Bvc3RtYXN0ZXIvcG9zdG1hc3Rlci5jIGIvc3Jj L2JhY2tlbmQvcG9zdG1hc3Rlci9wb3N0bWFzdGVyLmMKaW5kZXggNmUwZjQxZDI2NjEuLjhkMmFi MzdjZTI2IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9wb3N0bWFzdGVyL3Bvc3RtYXN0ZXIuYwor KysgYi9zcmMvYmFja2VuZC9wb3N0bWFzdGVyL3Bvc3RtYXN0ZXIuYwpAQCAtMTE2LDYgKzExNiw3 IEBACiAjaW5jbHVkZSAic3RvcmFnZS9wbXNpZ25hbC5oIgogI2luY2x1ZGUgInN0b3JhZ2UvcHJv Yy5oIgogI2luY2x1ZGUgInN0b3JhZ2Uvc2htZW1faW50ZXJuYWwuaCIKKyNpbmNsdWRlICJzdG9y YWdlL3N5bmMuaCIKICNpbmNsdWRlICJ0Y29wL2JhY2tlbmRfc3RhcnR1cC5oIgogI2luY2x1ZGUg InRjb3AvdGNvcHByb3QuaCIKICNpbmNsdWRlICJ1dGlscy9kYXRldGltZS5oIgpAQCAtOTI5LDYg KzkzMCwxNiBAQCBQb3N0bWFzdGVyTWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQogCSAqLwog CVJlZ2lzdGVyQnVpbHRpblNobWVtQ2FsbGJhY2tzKCk7CiAKKwkvKgorCSAqIFJlZ2lzdGVyIHRo ZSBidWlsdC1pbiBzeW5jIGhhbmRsZXJzIChtZCwgQ0xPRywgY29tbWl0X3RzLAorCSAqIG11bHRp eGFjdF9vZmZzZXQsIG11bHRpeGFjdF9tZW1iZXIpLiAgVGhpcyBtdXN0IGhhcHBlbiBiZWZvcmUK KwkgKiBwcm9jZXNzX3NoYXJlZF9wcmVsb2FkX2xpYnJhcmllcygpIHNvIHRoYXQgZXh0ZW5zaW9u cyB3aGljaAorCSAqIGNhbGwgcmVnaXN0ZXJfc3luY19oYW5kbGVyKCkgZnJvbSB0aGVpciBfUEdf aW5pdCgpIHJlY2VpdmUgSURzCisJICogc3RhcnRpbmcgYXQgU1lOQ19IQU5ETEVSX0ZJUlNUX0RZ TkFNSUMgaW5zdGVhZCBvZiBjb2xsaWRpbmcKKwkgKiB3aXRoIHRoZSBidWlsdC1pbiBzbG90cy4K KwkgKi8KKwlJbml0U3luY0hhbmRsZXJzKCk7CisKIAkvKgogCSAqIHByb2Nlc3MgYW55IGxpYnJh cmllcyB0aGF0IHNob3VsZCBiZSBwcmVsb2FkZWQgYXQgcG9zdG1hc3RlciBzdGFydAogCSAqLwpk aWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvc3RvcmFnZS9zeW5jL3N5bmMuYyBiL3NyYy9iYWNrZW5k L3N0b3JhZ2Uvc3luYy9zeW5jLmMKaW5kZXggMmM5NjRiNmYzZDkuLjIyMjgyOTMxMGNmIDEwMDY0 NAotLS0gYS9zcmMvYmFja2VuZC9zdG9yYWdlL3N5bmMvc3luYy5jCisrKyBiL3NyYy9iYWNrZW5k L3N0b3JhZ2Uvc3luYy9zeW5jLmMKQEAgLTgwLDUwICs4MCwyMDAgQEAgc3RhdGljIEN5Y2xlQ3Ry IGNoZWNrcG9pbnRfY3ljbGVfY3RyID0gMDsKICNkZWZpbmUgVU5MSU5LU19QRVJfQUJTT1JCCQkx MAogCiAvKgotICogRnVuY3Rpb24gcG9pbnRlcnMgZm9yIGhhbmRsaW5nIHN5bmMgYW5kIHVubGlu ayByZXF1ZXN0cy4KKyAqIFN5bmMgaGFuZGxlciBkaXNwYXRjaCB0YWJsZS4KKyAqCisgKiBQb3B1 bGF0ZWQgYnkgcmVnaXN0ZXJfc3luY19oYW5kbGVyKCksIHdoaWNoIGlzIGNhbGxlZCBmcm9tIElu aXRTeW5jKCkKKyAqIGZvciB0aGUgYnVpbHQtaW4gaGFuZGxlcnMgYW5kIGZyb20gZXh0ZW5zaW9u IF9QR19pbml0KCkgZnVuY3Rpb25zCisgKiBmb3IgZXh0ZW5zaW9uIGhhbmRsZXJzLiAgQWZ0ZXIg c2hhcmVkX3ByZWxvYWRfbGlicmFyaWVzIGZpbmlzaGVzCisgKiBsb2FkaW5nLCBzeW5jc3dbXSBp cyBlZmZlY3RpdmVseSBpbW11dGFibGU6IGV2ZXJ5IGJhY2tlbmQgYW5kIHRoZQorICogY2hlY2tw b2ludGVyIGluaGVyaXQgdGhlIHNhbWUgZnVsbHktcG9wdWxhdGVkIGFycmF5IHZpYSBmb3JrKCkg ZnJvbQorICogdGhlIHBvc3RtYXN0ZXIuCisgKgorICogU3luY09wcyBpdHNlbGYgaXMgZGVmaW5l ZCBpbiBzeW5jLmggc28gdGhhdCBleHRlbnNpb25zIGNhbiBkZWNsYXJlCisgKiBjb25zdCBTeW5j T3BzIGluc3RhbmNlcyBhdCBmaWxlIHNjb3BlLgogICovCi10eXBlZGVmIHN0cnVjdCBTeW5jT3Bz Ci17Ci0JaW50CQkJKCpzeW5jX3N5bmNmaWxldGFnKSAoY29uc3QgRmlsZVRhZyAqZnRhZywgY2hh ciAqcGF0aCk7Ci0JaW50CQkJKCpzeW5jX3VubGlua2ZpbGV0YWcpIChjb25zdCBGaWxlVGFnICpm dGFnLCBjaGFyICpwYXRoKTsKLQlib29sCQkoKnN5bmNfZmlsZXRhZ21hdGNoZXMpIChjb25zdCBG aWxlVGFnICpmdGFnLAotCQkJCQkJCQkJCWNvbnN0IEZpbGVUYWcgKmNhbmRpZGF0ZSk7Ci19IFN5 bmNPcHM7CitzdGF0aWMgU3luY09wcyAqc3luY3N3ID0gTlVMTDsKK3N0YXRpYyBjb25zdCBjaGFy ICoqc3luY19oYW5kbGVyX25hbWVzID0gTlVMTDsKK3N0YXRpYyBpbnQJTlN5bmNIYW5kbGVycyA9 IDA7CitzdGF0aWMgaW50CXN5bmNfaGFuZGxlcnNfY2FwYWNpdHkgPSAwOwogCiAvKgotICogVGhl c2UgaW5kZXhlcyBtdXN0IGNvcnJlc3BvbmQgdG8gdGhlIHZhbHVlcyBvZiB0aGUgU3luY1JlcXVl c3RIYW5kbGVyIGVudW0uCisgKiBCdWlsdC1pbiBTeW5jT3BzLCByZWdpc3RlcmVkIGluIGVudW0g b3JkZXIgZHVyaW5nIEluaXRTeW5jKCkgc28gdGhhdAorICogU1lOQ19IQU5ETEVSX01EID09IDAs IFNZTkNfSEFORExFUl9DTE9HID09IDEsIGV0Yy4KICAqLwotc3RhdGljIGNvbnN0IFN5bmNPcHMg c3luY3N3W10gPSB7Ci0JLyogbWFnbmV0aWMgZGlzayAqLwotCVtTWU5DX0hBTkRMRVJfTURdID0g ewotCQkuc3luY19zeW5jZmlsZXRhZyA9IG1kc3luY2ZpbGV0YWcsCi0JCS5zeW5jX3VubGlua2Zp bGV0YWcgPSBtZHVubGlua2ZpbGV0YWcsCi0JCS5zeW5jX2ZpbGV0YWdtYXRjaGVzID0gbWRmaWxl dGFnbWF0Y2hlcwotCX0sCi0JLyogcGdfeGFjdCAqLwotCVtTWU5DX0hBTkRMRVJfQ0xPR10gPSB7 Ci0JCS5zeW5jX3N5bmNmaWxldGFnID0gY2xvZ3N5bmNmaWxldGFnCi0JfSwKLQkvKiBwZ19jb21t aXRfdHMgKi8KLQlbU1lOQ19IQU5ETEVSX0NPTU1JVF9UU10gPSB7Ci0JCS5zeW5jX3N5bmNmaWxl dGFnID0gY29tbWl0dHNzeW5jZmlsZXRhZwotCX0sCi0JLyogcGdfbXVsdGl4YWN0L29mZnNldHMg Ki8KLQlbU1lOQ19IQU5ETEVSX01VTFRJWEFDVF9PRkZTRVRdID0gewotCQkuc3luY19zeW5jZmls ZXRhZyA9IG11bHRpeGFjdG9mZnNldHNzeW5jZmlsZXRhZwotCX0sCi0JLyogcGdfbXVsdGl4YWN0 L21lbWJlcnMgKi8KLQlbU1lOQ19IQU5ETEVSX01VTFRJWEFDVF9NRU1CRVJdID0gewotCQkuc3lu Y19zeW5jZmlsZXRhZyA9IG11bHRpeGFjdG1lbWJlcnNzeW5jZmlsZXRhZwotCX0KK3N0YXRpYyBj b25zdCBTeW5jT3BzIGJ1aWx0aW5fbWRfb3BzID0geworCS5zeW5jX3N5bmNmaWxldGFnID0gbWRz eW5jZmlsZXRhZywKKwkuc3luY191bmxpbmtmaWxldGFnID0gbWR1bmxpbmtmaWxldGFnLAorCS5z eW5jX2ZpbGV0YWdtYXRjaGVzID0gbWRmaWxldGFnbWF0Y2hlcywKK307CitzdGF0aWMgY29uc3Qg U3luY09wcyBidWlsdGluX2Nsb2dfb3BzID0geworCS5zeW5jX3N5bmNmaWxldGFnID0gY2xvZ3N5 bmNmaWxldGFnLAorfTsKK3N0YXRpYyBjb25zdCBTeW5jT3BzIGJ1aWx0aW5fY29tbWl0dHNfb3Bz ID0geworCS5zeW5jX3N5bmNmaWxldGFnID0gY29tbWl0dHNzeW5jZmlsZXRhZywKK307CitzdGF0 aWMgY29uc3QgU3luY09wcyBidWlsdGluX211bHRpeGFjdF9vZmZzZXRfb3BzID0geworCS5zeW5j X3N5bmNmaWxldGFnID0gbXVsdGl4YWN0b2Zmc2V0c3N5bmNmaWxldGFnLAorfTsKK3N0YXRpYyBj b25zdCBTeW5jT3BzIGJ1aWx0aW5fbXVsdGl4YWN0X21lbWJlcl9vcHMgPSB7CisJLnN5bmNfc3lu Y2ZpbGV0YWcgPSBtdWx0aXhhY3RtZW1iZXJzc3luY2ZpbGV0YWcsCiB9OwogCisvKgorICogSW50 ZXJuYWwgaGVscGVyIHRoYXQgYWRkcyBhbiBlbnRyeSB0byBzeW5jc3dbXSB3aXRob3V0IHBlcmZv cm1pbmcgdGhlCisgKiBwcmVsb2FkLXBoYXNlIGNoZWNrLiAgVXNlZCBieSBJbml0U3luYygpIHRv IGluc3RhbGwgdGhlIGJ1aWx0LWluCisgKiBoYW5kbGVycywgd2hpY2ggbXVzdCBiZSBwcmVzZW50 IGluIGV2ZXJ5IHByb2Nlc3MgdGhhdCBjYWxscyBpbnRvCisgKiBzeW5jLmMgKGluY2x1ZGluZyB0 aGUgY2hlY2twb2ludGVyLCB3aGljaCBydW5zIGFmdGVyCisgKiBzaGFyZWRfcHJlbG9hZF9saWJy YXJpZXMgaGFzIGZpbmlzaGVkIGxvYWRpbmcpLgorICovCitzdGF0aWMgaW50MTYKK3N5bmNfaGFu ZGxlcl9yZWdpc3Rlcl9pbnRlcm5hbChjb25zdCBTeW5jT3BzICpvcHMsIGNvbnN0IGNoYXIgKm5h bWUpCit7CisJaW50MTYJCW15X2lkOworCU1lbW9yeUNvbnRleHQgb2xkOworCisJaWYgKG9wcyA9 PSBOVUxMIHx8IG9wcy0+c3luY19zeW5jZmlsZXRhZyA9PSBOVUxMKQorCQllcmVwb3J0KEZBVEFM LAorCQkJCShlcnJjb2RlKEVSUkNPREVfTlVMTF9WQUxVRV9OT1RfQUxMT1dFRCksCisJCQkJIGVy cm1zZygicmVnaXN0ZXJfc3luY19oYW5kbGVyOiBzeW5jX3N5bmNmaWxldGFnIGlzIHJlcXVpcmVk IikpKTsKKworCWlmIChuYW1lID09IE5VTEwgfHwgKm5hbWUgPT0gJ1wwJykKKwkJZXJlcG9ydChG QVRBTCwKKwkJCQkoZXJyY29kZShFUlJDT0RFX05VTExfVkFMVUVfTk9UX0FMTE9XRUQpLAorCQkJ CSBlcnJtc2coInJlZ2lzdGVyX3N5bmNfaGFuZGxlcjogbmFtZSBtdXN0IGJlIG5vbi1lbXB0eSIp KSk7CisKKwlpZiAoTlN5bmNIYW5kbGVycyA+PSBTWU5DX0hBTkRMRVJfTUFYKQorCQllcmVwb3J0 KEZBVEFMLAorCQkJCShlcnJjb2RlKEVSUkNPREVfQ09ORklHVVJBVElPTl9MSU1JVF9FWENFRURF RCksCisJCQkJIGVycm1zZygidG9vIG1hbnkgc3luYyBoYW5kbGVycyByZWdpc3RlcmVkIChsaW1p dCAlZCkiLAorCQkJCQkJU1lOQ19IQU5ETEVSX01BWCkpKTsKKworCW9sZCA9IE1lbW9yeUNvbnRl eHRTd2l0Y2hUbyhUb3BNZW1vcnlDb250ZXh0KTsKKworCWlmIChOU3luY0hhbmRsZXJzID49IHN5 bmNfaGFuZGxlcnNfY2FwYWNpdHkpCisJeworCQlpbnQJCQluZXdfY2FwID0gKHN5bmNfaGFuZGxl cnNfY2FwYWNpdHkgPT0gMCkKKwkJCT8gOAorCQkJOiBzeW5jX2hhbmRsZXJzX2NhcGFjaXR5ICog MjsKKworCQlpZiAobmV3X2NhcCA+IFNZTkNfSEFORExFUl9NQVgpCisJCQluZXdfY2FwID0gU1lO Q19IQU5ETEVSX01BWDsKKworCQlpZiAoc3luY3N3ID09IE5VTEwpCisJCXsKKwkJCXN5bmNzdyA9 IHBhbGxvYyhzaXplb2YoU3luY09wcykgKiBuZXdfY2FwKTsKKwkJCXN5bmNfaGFuZGxlcl9uYW1l cyA9IHBhbGxvYyhzaXplb2YoY2hhciAqKSAqIG5ld19jYXApOworCQl9CisJCWVsc2UKKwkJewor CQkJc3luY3N3ID0gcmVwYWxsb2Moc3luY3N3LCBzaXplb2YoU3luY09wcykgKiBuZXdfY2FwKTsK KwkJCXN5bmNfaGFuZGxlcl9uYW1lcyA9IHJlcGFsbG9jKHN5bmNfaGFuZGxlcl9uYW1lcywKKwkJ CQkJCQkJCQkgIHNpemVvZihjaGFyICopICogbmV3X2NhcCk7CisJCX0KKwkJc3luY19oYW5kbGVy c19jYXBhY2l0eSA9IG5ld19jYXA7CisJfQorCisJbXlfaWQgPSAoaW50MTYpIE5TeW5jSGFuZGxl cnMrKzsKKwltZW1jcHkoJnN5bmNzd1tteV9pZF0sIG9wcywgc2l6ZW9mKFN5bmNPcHMpKTsKKwlz eW5jX2hhbmRsZXJfbmFtZXNbbXlfaWRdID0gcHN0cmR1cChuYW1lKTsKKworCU1lbW9yeUNvbnRl eHRTd2l0Y2hUbyhvbGQpOworCisJLyoKKwkgKiBObyBiYXJyaWVyIG5lZWRlZDogcmVnaXN0cmF0 aW9uIG9ubHkgaGFwcGVucyBkdXJpbmcKKwkgKiBzaGFyZWRfcHJlbG9hZF9saWJyYXJpZXMgbG9h ZCwgd2hpY2ggaXMgc2luZ2xlLXRocmVhZGVkIGluIHRoZQorCSAqIHBvc3RtYXN0ZXIuICBBbGwg YmFja2VuZHMgYW5kIHRoZSBjaGVja3BvaW50ZXIgaW5oZXJpdCB0aGUKKwkgKiBmdWxseS1wb3B1 bGF0ZWQgYXJyYXkgdmlhIGZvcmsoKSBhZnRlciBwcmVsb2FkIHJldHVybnMuCisJICovCisJcmV0 dXJuIG15X2lkOworfQorCisvKgorICogUHVibGljIHJlZ2lzdHJhdGlvbiBlbnRyeSBwb2ludCBm b3IgZXh0ZW5zaW9ucy4gIFNlZSBzeW5jLmggZm9yIHRoZQorICogY29udHJhY3QuCisgKgorICog RXh0ZW5zaW9ucyBtdXN0IGNhbGwgdGhpcyBmcm9tIHRoZWlyIF9QR19pbml0KCkgd2hpbGUgdGhl IHBvc3RtYXN0ZXIKKyAqIGlzIHN0aWxsIGxvYWRpbmcgc2hhcmVkX3ByZWxvYWRfbGlicmFyaWVz OyBsYXRlIGNhbGxzIHJhaXNlIEZBVEFMLgorICogQnVpbHQtaW4gaGFuZGxlcnMgYnlwYXNzIHRo aXMgZ3VhcmQgdmlhIHN5bmNfaGFuZGxlcl9yZWdpc3Rlcl9pbnRlcm5hbCgpCisgKiBiZWNhdXNl IHRoZSBjaGVja3BvaW50ZXIgYXV4aWxpYXJ5IHByb2Nlc3MgY2FsbHMgSW5pdFN5bmMoKSBhZnRl cgorICogcHJlbG9hZCBoYXMgZmluaXNoZWQsIGFuZCB0aGUgYnVpbHQtaW4gZGlzcGF0Y2ggdGFi bGUgbXVzdCBzdGlsbCBiZQorICogcG9wdWxhdGVkIGluIHRoYXQgcHJvY2Vzcy4KKyAqLworaW50 MTYKK3JlZ2lzdGVyX3N5bmNfaGFuZGxlcihjb25zdCBTeW5jT3BzICpvcHMsIGNvbnN0IGNoYXIg Km5hbWUpCit7CisJaWYgKHByb2Nlc3Nfc2hhcmVkX3ByZWxvYWRfbGlicmFyaWVzX2RvbmUpCisJ CWVyZXBvcnQoRkFUQUwsCisJCQkJKGVycmNvZGUoRVJSQ09ERV9JTlZBTElEX1BBUkFNRVRFUl9W QUxVRSksCisJCQkJIGVycm1zZygic3luYyBoYW5kbGVycyBtdXN0IGJlIHJlZ2lzdGVyZWQgaW4g IgorCQkJCQkJInNoYXJlZF9wcmVsb2FkX2xpYnJhcmllcyBwaGFzZSIpKSk7CisKKwlyZXR1cm4g c3luY19oYW5kbGVyX3JlZ2lzdGVyX2ludGVybmFsKG9wcywgbmFtZSk7Cit9CisKKy8qCisgKiBS ZWdpc3RlciB0aGUgYnVpbHQtaW4gc3luYyBoYW5kbGVycy4KKyAqCisgKiBUaGlzIE1VU1QgcnVu IGJlZm9yZSBhbnkgY2FsbCB0byByZWdpc3Rlcl9zeW5jX2hhbmRsZXIoKSBmcm9tCisgKiBleHRl bnNpb24gX1BHX2luaXQoKSBjb2RlLCBzbyB0aGF0IHRoZSBidWlsdC1pbiBoYW5kbGVycyBvY2N1 cHkKKyAqIHRoZWlyIGNhbm9uaWNhbCBJRHMgKFNZTkNfSEFORExFUl9NRCA9IDAsIFNZTkNfSEFO RExFUl9DTE9HID0gMSwKKyAqIGV0Yy4pIGFuZCBleHRlbnNpb24gaGFuZGxlcnMgYXJlIGFzc2ln bmVkIElEcyA+PQorICogU1lOQ19IQU5ETEVSX0ZJUlNUX0RZTkFNSUMuCisgKgorICogQ2FsbGVk IGZyb206CisgKiAgIC0gUG9zdG1hc3Rlck1haW4oKSwganVzdCBiZWZvcmUgcHJvY2Vzc19zaGFy ZWRfcHJlbG9hZF9saWJyYXJpZXMoKQorICogICAtIEF1eGlsaWFyeVByb2Nlc3NNYWluKCkgKG5v dCBjdXJyZW50bHkgbmVlZGVkIGJlY2F1c2UgYXV4IHByb2NzCisgKiAgICAgZm9yayBmcm9tIHRo ZSBwb3N0bWFzdGVyIHdpdGggc3luY3N3W10gYWxyZWFkeSBwb3B1bGF0ZWQsIGJ1dAorICogICAg IHNlZSB0aGUgaWRlbXBvdGVudCBOU3luY0hhbmRsZXJzPT0wIGd1YXJkIGJlbG93KQorICogICAt IFN0YW5kYWxvbmUgYmFja2VuZCBpbml0ICh2aWEgSW5pdFN5bmMgLT4gSW5pdFN5bmNIYW5kbGVy cykKKyAqCisgKiBJZGVtcG90ZW50OiB0aGUgTlN5bmNIYW5kbGVycyA9PSAwIGd1YXJkIGVuc3Vy ZXMgYnVpbHQtaW5zIGFyZQorICogcmVnaXN0ZXJlZCBleGFjdGx5IG9uY2UgcGVyIHByb2Nlc3Mu IFNhZmUgdG8gY2FsbCBmcm9tIG11bHRpcGxlCisgKiBpbml0IHBhdGhzLgorICovCit2b2lkCitJ bml0U3luY0hhbmRsZXJzKHZvaWQpCit7CisJaWYgKE5TeW5jSGFuZGxlcnMgIT0gMCkKKwkJcmV0 dXJuOworCisJKHZvaWQpIHN5bmNfaGFuZGxlcl9yZWdpc3Rlcl9pbnRlcm5hbCgmYnVpbHRpbl9t ZF9vcHMsICJtZCIpOworCSh2b2lkKSBzeW5jX2hhbmRsZXJfcmVnaXN0ZXJfaW50ZXJuYWwoJmJ1 aWx0aW5fY2xvZ19vcHMsICJjbG9nIik7CisJKHZvaWQpIHN5bmNfaGFuZGxlcl9yZWdpc3Rlcl9p bnRlcm5hbCgmYnVpbHRpbl9jb21taXR0c19vcHMsICJjb21taXRfdHMiKTsKKwkodm9pZCkgc3lu Y19oYW5kbGVyX3JlZ2lzdGVyX2ludGVybmFsKCZidWlsdGluX211bHRpeGFjdF9vZmZzZXRfb3Bz LAorCQkJCQkJCQkJCSAgIm11bHRpeGFjdF9vZmZzZXQiKTsKKwkodm9pZCkgc3luY19oYW5kbGVy X3JlZ2lzdGVyX2ludGVybmFsKCZidWlsdGluX211bHRpeGFjdF9tZW1iZXJfb3BzLAorCQkJCQkJ CQkJCSAgIm11bHRpeGFjdF9tZW1iZXIiKTsKKworCS8qCisJICogRW5mb3JjZSB0aGUgZW51bS10 by1jb3VudCBpbnZhcmlhbnQ6IGlmIGEgbmV3IGJ1aWx0LWluIGlzIGFkZGVkCisJICogdG8gdGhl IFN5bmNSZXF1ZXN0SGFuZGxlciBlbnVtLCB0aGUgYnVpbGQgd2lsbCBmYWlsLWZhc3QgYXQKKwkg KiBmaXJzdCBib290IHVudGlsIGEgbWF0Y2hpbmcgc3luY19oYW5kbGVyX3JlZ2lzdGVyX2ludGVy bmFsKCkKKwkgKiBjYWxsIGlzIGFkZGVkIGhlcmUuCisJICovCisJQXNzZXJ0KE5TeW5jSGFuZGxl cnMgPT0gU1lOQ19IQU5ETEVSX0ZJUlNUX0RZTkFNSUMpOworfQorCiAvKgogICogSW5pdGlhbGl6 ZSBkYXRhIHN0cnVjdHVyZXMgZm9yIHRoZSBmaWxlIHN5bmMgdHJhY2tpbmcuCisgKgorICogVGhp cyBydW5zIGluIHByb2Nlc3NlcyB0aGF0IGFjdHVhbGx5IG5lZWQgdGhlIHBlbmRpbmdPcHMgaGFz aCB0YWJsZQorICogKHN0YW5kYWxvbmUgYmFja2VuZHMgYW5kIHRoZSBjaGVja3BvaW50ZXIpLiBJ dCBhbHNvIGNhbGxzCisgKiBJbml0U3luY0hhbmRsZXJzKCkgZGVmZW5zaXZlbHkgaW4gY2FzZSB0 aGlzIHByb2Nlc3MgcmVhY2hlZCBoZXJlCisgKiB3aXRob3V0IHRoZSBwb3N0bWFzdGVyIGhhdmlu ZyBkb25lIHNvLCBlLmcuLCBzdGFuZGFsb25lIG1vZGUuCiAgKi8KIHZvaWQKIEluaXRTeW5jKHZv aWQpCiB7CisJLyoKKwkgKiBNYWtlIHN1cmUgYnVpbHQtaW4gaGFuZGxlcnMgYXJlIHJlZ2lzdGVy ZWQuIEluIHRoZSBwb3N0bWFzdGVyLAorCSAqIHRoaXMgd2FzIGFscmVhZHkgY2FsbGVkIGZyb20g UG9zdG1hc3Rlck1haW4oKSBiZWZvcmUKKwkgKiBwcm9jZXNzX3NoYXJlZF9wcmVsb2FkX2xpYnJh cmllcygpOyBpbiBzdGFuZGFsb25lIG1vZGUgaXQgaXMKKwkgKiBjYWxsZWQgaGVyZSBmb3IgdGhl IGZpcnN0IChhbmQgb25seSkgdGltZS4gVGhlIE5TeW5jSGFuZGxlcnMKKwkgKiBndWFyZCBpbnNp ZGUgSW5pdFN5bmNIYW5kbGVycygpIG1ha2VzIGl0IGlkZW1wb3RlbnQuCisJICovCisJSW5pdFN5 bmNIYW5kbGVycygpOworCiAJLyoKIAkgKiBDcmVhdGUgcGVuZGluZy1vcGVyYXRpb25zIGhhc2h0 YWJsZSBpZiB3ZSBuZWVkIGl0LiAgQ3VycmVudGx5LCB3ZSBuZWVkCiAJICogaXQgaWYgd2UgYXJl IHN0YW5kYWxvbmUgKG5vdCB1bmRlciBhIHBvc3RtYXN0ZXIpIG9yIGlmIHdlIGFyZSBhCkBAIC0y MDUsNiArMzU1LDE5IEBAIFN5bmNQb3N0Q2hlY2twb2ludCh2b2lkKQogCWludAkJCWFic29yYl9j b3VudGVyOwogCUxpc3RDZWxsICAgKmxjOwogCisJLyoKKwkgKiBDYWNoZSB0aGUgc3luY3N3IGJh c2UgcG9pbnRlciBpbiBhIGxvY2FsIGZvciB0aGUgZHVyYXRpb24gb2YgdGhpcworCSAqIGZ1bmN0 aW9uLiBXaXRob3V0IHRoaXMsIHRoZSBjb21waWxlciBjYW5ub3QgaG9pc3QgdGhlIGxvYWQgb2Yg dGhlCisJICogbXV0YWJsZSBzdGF0aWMgcG9pbnRlciBvdXQgb2YgdGhlIGRpc3BhdGNoIGxvb3As IGFuZCBlYWNoIGRpc3BhdGNoCisJICogY29zdHMgYW4gZXh0cmEgbWVtb3J5IGxvYWQgcGx1cyBh biBhZGRyZXNzLW1hdGVyaWFsaXphdGlvbiBMRUEKKwkgKiAodmVyaWZpZWQgd2l0aCBvYmpkdW1w IG9uIEdDQyAxNC4yIC1PMikuIFdpdGggdGhlIGxvY2FsIGNhY2hlZCwgdGhlCisJICogcGVyLWVu dHJ5IGRpc3BhdGNoIGNvbXBpbGVzIGRvd24gdG8gaWRlbnRpY2FsIGFzc2VtYmx5IGFzIHRoZQor CSAqIHByZS1wYXRjaCBzdGF0aWMtY29uc3QgYXJyYXkuIFNhZmUgYmVjYXVzZSByZWdpc3Rlcl9z eW5jX2hhbmRsZXIoKQorCSAqIGlzIGZvcmJpZGRlbiBhZnRlciBwcm9jZXNzX3NoYXJlZF9wcmVs b2FkX2xpYnJhcmllc19kb25lIGFuZCBzeW5jc3cKKwkgKiBpcyBuZXZlciBtdXRhdGVkIG91dHNp ZGUgcmVnaXN0cmF0aW9uLgorCSAqLworCVN5bmNPcHMgICAgKm9wcyA9IHN5bmNzdzsKKwogCWFi c29yYl9jb3VudGVyID0gVU5MSU5LU19QRVJfQUJTT1JCOwogCWZvcmVhY2gobGMsIHBlbmRpbmdV bmxpbmtzKQogCXsKQEAgLTIyNyw5ICszOTAsMTIgQEAgU3luY1Bvc3RDaGVja3BvaW50KHZvaWQp CiAJCWlmIChlbnRyeS0+Y3ljbGVfY3RyID09IGNoZWNrcG9pbnRfY3ljbGVfY3RyKQogCQkJYnJl YWs7CiAKKwkJQXNzZXJ0KGVudHJ5LT50YWcuaGFuZGxlciA+PSAwICYmCisJCQkgICBlbnRyeS0+ dGFnLmhhbmRsZXIgPCBOU3luY0hhbmRsZXJzKTsKKwogCQkvKiBVbmxpbmsgdGhlIGZpbGUgKi8K LQkJaWYgKHN5bmNzd1tlbnRyeS0+dGFnLmhhbmRsZXJdLnN5bmNfdW5saW5rZmlsZXRhZygmZW50 cnktPnRhZywKLQkJCQkJCQkJCQkJCQkJICBwYXRoKSA8IDApCisJCWlmIChvcHNbZW50cnktPnRh Zy5oYW5kbGVyXS5zeW5jX3VubGlua2ZpbGV0YWcoJmVudHJ5LT50YWcsCisJCQkJCQkJCQkJCQkJ ICAgcGF0aCkgPCAwKQogCQl7CiAJCQkvKgogCQkJICogVGhlcmUncyBhIHJhY2UgY29uZGl0aW9u LCB3aGVuIHRoZSBkYXRhYmFzZSBpcyBkcm9wcGVkIGF0IHRoZQpAQCAtMzAxLDYgKzQ2Nyw5IEBA IFByb2Nlc3NTeW5jUmVxdWVzdHModm9pZCkKIAl1aW50NjQJCWxvbmdlc3QgPSAwOwogCXVpbnQ2 NAkJdG90YWxfZWxhcHNlZCA9IDA7CiAKKwkvKiBTZWUgY29tbWVudCBpbiBTeW5jUG9zdENoZWNr cG9pbnQoKSBhYm92ZS4gKi8KKwlTeW5jT3BzICAgICpvcHMgPSBzeW5jc3c7CisKIAkvKgogCSAq IFRoaXMgaXMgb25seSBjYWxsZWQgZHVyaW5nIGNoZWNrcG9pbnRzLCBhbmQgY2hlY2twb2ludHMg c2hvdWxkIG9ubHkKIAkgKiBvY2N1ciBpbiBwcm9jZXNzZXMgdGhhdCBoYXZlIGNyZWF0ZWQgYSBw ZW5kaW5nT3BzLgpAQCAtNDEyLDkgKzU4MSwxMiBAQCBQcm9jZXNzU3luY1JlcXVlc3RzKHZvaWQp CiAJCQl7CiAJCQkJY2hhcgkJcGF0aFtNQVhQR1BBVEhdOwogCisJCQkJQXNzZXJ0KGVudHJ5LT50 YWcuaGFuZGxlciA+PSAwICYmCisJCQkJCSAgIGVudHJ5LT50YWcuaGFuZGxlciA8IE5TeW5jSGFu ZGxlcnMpOworCiAJCQkJSU5TVFJfVElNRV9TRVRfQ1VSUkVOVChzeW5jX3N0YXJ0KTsKLQkJCQlp ZiAoc3luY3N3W2VudHJ5LT50YWcuaGFuZGxlcl0uc3luY19zeW5jZmlsZXRhZygmZW50cnktPnRh ZywKLQkJCQkJCQkJCQkJCQkJCQlwYXRoKSA9PSAwKQorCQkJCWlmIChvcHNbZW50cnktPnRhZy5o YW5kbGVyXS5zeW5jX3N5bmNmaWxldGFnKCZlbnRyeS0+dGFnLAorCQkJCQkJCQkJCQkJCQkJIHBh dGgpID09IDApCiAJCQkJewogCQkJCQkvKiBTdWNjZXNzOyB1cGRhdGUgc3RhdGlzdGljcyBhYm91 dCBzeW5jIHRpbWluZyAqLwogCQkJCQlJTlNUUl9USU1FX1NFVF9DVVJSRU5UKHN5bmNfZW5kKTsK QEAgLTUwNiwxMyArNjc4LDI0IEBAIFJlbWVtYmVyU3luY1JlcXVlc3QoY29uc3QgRmlsZVRhZyAq ZnRhZywgU3luY1JlcXVlc3RUeXBlIHR5cGUpCiAJCUhBU0hfU0VRX1NUQVRVUyBoc3RhdDsKIAkJ UGVuZGluZ0ZzeW5jRW50cnkgKnBmZTsKIAkJTGlzdENlbGwgICAqY2VsbDsKKwkJYm9vbAkJKCpm aWxldGFnbWF0Y2hlcykgKGNvbnN0IEZpbGVUYWcgKmZ0YWcsCisJCQkJCQkJCQkgICBjb25zdCBG aWxlVGFnICpjYW5kaWRhdGUpOworCisJCUFzc2VydChmdGFnLT5oYW5kbGVyID49IDAgJiYgZnRh Zy0+aGFuZGxlciA8IE5TeW5jSGFuZGxlcnMpOworCisJCS8qCisJCSAqIENhY2hlIHRoZSBwZXIt aGFuZGxlciBmaWxldGFnbWF0Y2hlcyBmdW5jdGlvbiBwb2ludGVyIG9uY2Ugc28KKwkJICogYm90 aCBtYXRjaCBsb29wcyBrZWVwIGl0IGluIGEgcmVnaXN0ZXIuIFNlZSBjb21tZW50IGluCisJCSAq IFN5bmNQb3N0Q2hlY2twb2ludCgpLgorCQkgKi8KKwkJZmlsZXRhZ21hdGNoZXMgPSBzeW5jc3db ZnRhZy0+aGFuZGxlcl0uc3luY19maWxldGFnbWF0Y2hlczsKIAogCQkvKiBDYW5jZWwgbWF0Y2hp bmcgZnN5bmMgcmVxdWVzdHMgKi8KIAkJaGFzaF9zZXFfaW5pdCgmaHN0YXQsIHBlbmRpbmdPcHMp OwogCQl3aGlsZSAoKHBmZSA9IChQZW5kaW5nRnN5bmNFbnRyeSAqKSBoYXNoX3NlcV9zZWFyY2go JmhzdGF0KSkgIT0gTlVMTCkKIAkJewogCQkJaWYgKHBmZS0+dGFnLmhhbmRsZXIgPT0gZnRhZy0+ aGFuZGxlciAmJgotCQkJCXN5bmNzd1tmdGFnLT5oYW5kbGVyXS5zeW5jX2ZpbGV0YWdtYXRjaGVz KGZ0YWcsICZwZmUtPnRhZykpCisJCQkJZmlsZXRhZ21hdGNoZXMoZnRhZywgJnBmZS0+dGFnKSkK IAkJCQlwZmUtPmNhbmNlbGVkID0gdHJ1ZTsKIAkJfQogCkBAIC01MjIsNyArNzA1LDcgQEAgUmVt ZW1iZXJTeW5jUmVxdWVzdChjb25zdCBGaWxlVGFnICpmdGFnLCBTeW5jUmVxdWVzdFR5cGUgdHlw ZSkKIAkJCVBlbmRpbmdVbmxpbmtFbnRyeSAqcHVlID0gKFBlbmRpbmdVbmxpbmtFbnRyeSAqKSBs Zmlyc3QoY2VsbCk7CiAKIAkJCWlmIChwdWUtPnRhZy5oYW5kbGVyID09IGZ0YWctPmhhbmRsZXIg JiYKLQkJCQlzeW5jc3dbZnRhZy0+aGFuZGxlcl0uc3luY19maWxldGFnbWF0Y2hlcyhmdGFnLCAm cHVlLT50YWcpKQorCQkJCWZpbGV0YWdtYXRjaGVzKGZ0YWcsICZwdWUtPnRhZykpCiAJCQkJcHVl LT5jYW5jZWxlZCA9IHRydWU7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9zdG9y YWdlL3N5bmMuaCBiL3NyYy9pbmNsdWRlL3N0b3JhZ2Uvc3luYy5oCmluZGV4IDg4MjkwNTAwYmM5 Li41NDUyZWI3MTRkYSAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvc3RvcmFnZS9zeW5jLmgKKysr IGIvc3JjL2luY2x1ZGUvc3RvcmFnZS9zeW5jLmgKQEAgLTI5LDggKzI5LDEzIEBAIHR5cGVkZWYg ZW51bSBTeW5jUmVxdWVzdFR5cGUKIH0gU3luY1JlcXVlc3RUeXBlOwogCiAvKgotICogV2hpY2gg c2V0IG9mIGZ1bmN0aW9ucyB0byB1c2UgdG8gaGFuZGxlIGEgZ2l2ZW4gcmVxdWVzdC4gIFRoZSB2 YWx1ZXMgb2YKLSAqIHRoZSBlbnVtZXJhdG9ycyBtdXN0IG1hdGNoIHRoZSBpbmRleGVzIG9mIHRo ZSBmdW5jdGlvbiB0YWJsZSBpbiBzeW5jLmMuCisgKiBXaGljaCBzZXQgb2YgZnVuY3Rpb25zIHRv IHVzZSB0byBoYW5kbGUgYSBnaXZlbiByZXF1ZXN0LiAgQnVpbHQtaW4KKyAqIGhhbmRsZXJzIG9j Y3VweSB0aGUgZml4ZWQgZW51bSB2YWx1ZXMgYmVsb3c7IGV4dGVuc2lvbnMgcmVnaXN0ZXIKKyAq IGFkZGl0aW9uYWwgaGFuZGxlcnMgdmlhIHJlZ2lzdGVyX3N5bmNfaGFuZGxlcigpIGR1cmluZwor ICogc2hhcmVkX3ByZWxvYWRfbGlicmFyaWVzIGluaXRpYWxpemF0aW9uIGFuZCByZWNlaXZlIElE cyBzdGFydGluZworICogYXQgU1lOQ19IQU5ETEVSX0ZJUlNUX0RZTkFNSUMuIFRoZSB2YWx1ZXMg b2YgdGhlIGJ1aWx0LWluCisgKiBlbnVtZXJhdG9ycyBtdXN0IG1hdGNoIHRoZSBvcmRlciBpbiB3 aGljaCBJbml0U3luYygpIHByZS1yZWdpc3RlcnMKKyAqIHRoZSBjb3JyZXNwb25kaW5nIFN5bmNP cHMgc3RydWN0cyBpbiBzeW5jLmMuCiAgKi8KIHR5cGVkZWYgZW51bSBTeW5jUmVxdWVzdEhhbmRs ZXIKIHsKQEAgLTM5LDkgKzQ0LDE5IEBAIHR5cGVkZWYgZW51bSBTeW5jUmVxdWVzdEhhbmRsZXIK IAlTWU5DX0hBTkRMRVJfQ09NTUlUX1RTLAogCVNZTkNfSEFORExFUl9NVUxUSVhBQ1RfT0ZGU0VU LAogCVNZTkNfSEFORExFUl9NVUxUSVhBQ1RfTUVNQkVSLAotCVNZTkNfSEFORExFUl9OT05FLAor CisJLyogRXh0ZW5zaW9ucycgZHluYW1pYyBoYW5kbGVyIElEcyBzdGFydCBoZXJlLiAqLworCVNZ TkNfSEFORExFUl9GSVJTVF9EWU5BTUlDLAorCisJLyoKKwkgKiBTZW50aW5lbCBmb3IgIm5vIGhh bmRsZXIiOiBmaXRzIGluIGludDE2LCBvdXRzaWRlIHRoZSB2YWxpZCBJRAorCSAqIHJhbmdlIHNv IGl0IGNhbm5vdCBiZSBjb25mdXNlZCB3aXRoIGFueSByZWdpc3RlcmVkIGhhbmRsZXIuCisJICov CisJU1lOQ19IQU5ETEVSX05PTkUgPSAtMSwKIH0gU3luY1JlcXVlc3RIYW5kbGVyOwogCisjZGVm aW5lIFNZTkNfSEFORExFUl9NQVgJSU5UMTZfTUFYCisKIC8qCiAgKiBBIHRhZyBpZGVudGlmeWlu ZyBhIGZpbGUuICBDdXJyZW50bHkgaXQgaGFzIHRoZSBtZW1iZXJzIHJlcXVpcmVkIGZvciBtZC5j J3MKICAqIHVzYWdlLCBidXQgc3luYy5jIGhhcyBubyBrbm93bGVkZ2Ugb2YgdGhlIGludGVybmFs IHN0cnVjdHVyZSwgYW5kIGl0IGlzCkBAIC01NSw2ICs3MCwyNSBAQCB0eXBlZGVmIHN0cnVjdCBG aWxlVGFnCiAJdWludDY0CQlzZWdubzsKIH0gRmlsZVRhZzsKIAorLyoKKyAqIERpc3BhdGNoIHRh YmxlIGVudHJ5IGZvciBhIHN5bmMgaGFuZGxlci4gIFB1YmxpYyBzbyBleHRlbnNpb25zIGNhbgor ICogZGVmaW5lIHRoZWlyIG93biBTeW5jT3BzIGFuZCBwYXNzIHRoZW0gdG8gcmVnaXN0ZXJfc3lu Y19oYW5kbGVyKCkuCisgKgorICogc3luY19zeW5jZmlsZXRhZyBpcyByZXF1aXJlZC4gIHN5bmNf dW5saW5rZmlsZXRhZyBhbmQKKyAqIHN5bmNfZmlsZXRhZ21hdGNoZXMgbWF5IGJlIE5VTEwgaWYg dGhlIGhhbmRsZXIgZG9lcyBub3Qgc3VwcG9ydAorICogU1lOQ19VTkxJTktfUkVRVUVTVCBvciBT WU5DX0ZJTFRFUl9SRVFVRVNUIHJlc3BlY3RpdmVseSwgbWF0Y2hpbmcKKyAqIHRoZSBwYXR0ZXJu IG9mIHRoZSBidWlsdC1pbiBDTE9HL2NvbW1pdF90cy9tdWx0aXhhY3QgaGFuZGxlcnMgd2hpY2gK KyAqIG9ubHkgZGVmaW5lIHN5bmNfc3luY2ZpbGV0YWcuCisgKi8KK3R5cGVkZWYgc3RydWN0IFN5 bmNPcHMKK3sKKwlpbnQJCQkoKnN5bmNfc3luY2ZpbGV0YWcpIChjb25zdCBGaWxlVGFnICpmdGFn LCBjaGFyICpwYXRoKTsKKwlpbnQJCQkoKnN5bmNfdW5saW5rZmlsZXRhZykgKGNvbnN0IEZpbGVU YWcgKmZ0YWcsIGNoYXIgKnBhdGgpOworCWJvb2wJCSgqc3luY19maWxldGFnbWF0Y2hlcykgKGNv bnN0IEZpbGVUYWcgKmZ0YWcsCisJCQkJCQkJCQkJY29uc3QgRmlsZVRhZyAqY2FuZGlkYXRlKTsK K30gU3luY09wczsKKworZXh0ZXJuIHZvaWQgSW5pdFN5bmNIYW5kbGVycyh2b2lkKTsKIGV4dGVy biB2b2lkIEluaXRTeW5jKHZvaWQpOwogZXh0ZXJuIHZvaWQgU3luY1ByZUNoZWNrcG9pbnQodm9p ZCk7CiBleHRlcm4gdm9pZCBTeW5jUG9zdENoZWNrcG9pbnQodm9pZCk7CkBAIC02Myw0ICs5Nywy OCBAQCBleHRlcm4gdm9pZCBSZW1lbWJlclN5bmNSZXF1ZXN0KGNvbnN0IEZpbGVUYWcgKmZ0YWcs IFN5bmNSZXF1ZXN0VHlwZSB0eXBlKTsKIGV4dGVybiBib29sIFJlZ2lzdGVyU3luY1JlcXVlc3Qo Y29uc3QgRmlsZVRhZyAqZnRhZywgU3luY1JlcXVlc3RUeXBlIHR5cGUsCiAJCQkJCQkJCWJvb2wg cmV0cnlPbkVycm9yKTsKIAorLyoKKyAqIFJlZ2lzdGVyIGEgY3VzdG9tIHN5bmMgaGFuZGxlci4g IFJldHVybnMgdGhlIGFzc2lnbmVkIGhhbmRsZXIgSUQKKyAqIHdoaWNoIHRoZSBleHRlbnNpb24g c3RvcmVzIGluIEZpbGVUYWcuaGFuZGxlciB3aGVuIHF1ZXVlaW5nIHN5bmMKKyAqIHJlcXVlc3Rz IHZpYSBSZWdpc3RlclN5bmNSZXF1ZXN0KCkuCisgKgorICogTVVTVCBiZSBjYWxsZWQgZHVyaW5n IHNoYXJlZF9wcmVsb2FkX2xpYnJhcmllcyBpbml0aWFsaXphdGlvbgorICogKGJlZm9yZSBwcm9j ZXNzX3NoYXJlZF9wcmVsb2FkX2xpYnJhcmllc19kb25lIGlzIHNldCk7IGxhdGVyIGNhbGxzCisg KiByYWlzZSBGQVRBTC4gIGBuYW1lYCBpcyB1c2VkIGZvciBlcnJvciBtZXNzYWdlcyBhbmQgaXMg cHN0cmR1cCdkCisgKiBpbnRvIFRvcE1lbW9yeUNvbnRleHQgYnkgdGhlIGNhbGxlcjsgY2FsbGVy cyBkbyBub3QgbmVlZCB0byBrZWVwCisgKiB0aGUgYnVmZmVyIGFsaXZlLgorICoKKyAqIGBvcHMt PnN5bmNfc3luY2ZpbGV0YWdgIGlzIHJlcXVpcmVkOyB0aGUgb3RoZXIgdHdvIHBvaW50ZXJzIG1h eQorICogYmUgTlVMTCBpZiB0aGUgaGFuZGxlciBkb2VzIG5vdCBwYXJ0aWNpcGF0ZSBpbiBTWU5D X1VOTElOS19SRVFVRVNUCisgKiBvciBTWU5DX0ZJTFRFUl9SRVFVRVNUIGZsb3dzLgorICoKKyAq IFRoZSByZXR1cm5lZCBJRCBpcyBzdGFibGUgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgcG9zdG1h c3Rlci4KKyAqIFN5bmMgcmVxdWVzdHMgbGl2ZSBvbmx5IGluIHRoZSBjaGVja3BvaW50ZXIncyBp bi1tZW1vcnkgcGVuZGluZ09wcworICogaGFzaCB0YWJsZSAodGhleSBhcmUgbm90IHBlcnNpc3Rl ZCBhY3Jvc3MgcmVzdGFydHMpLCBzbyB0aGVyZSBpcworICogbm8gY3Jvc3MtcmVzdGFydCBzdGFi aWxpdHkgcmVxdWlyZW1lbnQgYmV5b25kIHRoZSBzYW1lCisgKiBzaGFyZWRfcHJlbG9hZF9saWJy YXJpZXMgb3JkZXIgdGhhdCBzbWdyX3JlZ2lzdGVyKCkgYWxyZWFkeSByZWxpZXMKKyAqIG9uLgor ICovCitleHRlcm4gaW50MTYgcmVnaXN0ZXJfc3luY19oYW5kbGVyKGNvbnN0IFN5bmNPcHMgKm9w cywgY29uc3QgY2hhciAqbmFtZSk7CisKICNlbmRpZgkJCQkJCQkvKiBTWU5DX0ggKi8KLS0gCjIu NDcuMwoK --_005_IA1PR07MB983072521EE7FDEE98902534A9592IA1PR07MB9830namp_ Content-Type: application/octet-stream; name="v1-0002-Add-test-module-for-sync-handler-registration.patch" Content-Description: v1-0002-Add-test-module-for-sync-handler-registration.patch Content-Disposition: attachment; filename="v1-0002-Add-test-module-for-sync-handler-registration.patch"; size=16962; creation-date="Fri, 10 Apr 2026 21:44:50 GMT"; modification-date="Fri, 10 Apr 2026 21:45:22 GMT" Content-Transfer-Encoding: base64 RnJvbSA0N2U4MWM5YjYwMDFmOTMwNDFjNTI3MDhiM2MyYzBhNDQ0MTk0YzQxIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBHcmVnIExhbWJlcnNvbiA8Z3JlZ0BsYW1jby5pbz4KRGF0ZTog RnJpLCAxMCBBcHIgMjAyNiAwNzoyNzo0NCAtMDUwMApTdWJqZWN0OiBbUEFUQ0ggdjEgMi8yXSBB ZGQgdGVzdCBtb2R1bGUgZm9yIHN5bmMgaGFuZGxlciByZWdpc3RyYXRpb24KCkFkZHMgc3JjL3Rl c3QvbW9kdWxlcy90ZXN0X3N5bmNfaGFuZGxlciwgYSBtaW5pbWFsIGV4dGVuc2lvbiB0aGF0CmV4 ZXJjaXNlcyB0aGUgcmVnaXN0ZXJfc3luY19oYW5kbGVyKCkgQVBJIGludHJvZHVjZWQgaW4gdGhl IHByZXZpb3VzCmNvbW1pdC4gVGhlIG1vZHVsZToKCi0gUmVnaXN0ZXJzIGEgdHJpdmlhbCBTeW5j T3BzIHZpYSByZWdpc3Rlcl9zeW5jX2hhbmRsZXIoKSBhdAogIF9QR19pbml0KCkgdGltZSBhbmQg c3RvcmVzIHRoZSByZXR1cm5lZCBoYW5kbGVyIElELgotIEV4cG9zZXMgU1FMLWNhbGxhYmxlIHRl c3Rfc3luY19oYW5kbGVyX3JlZ2lzdGVyKHNlZyBiaWdpbnQpIHRoYXQKICBxdWV1ZXMgYSBGaWxl VGFnIHZpYSBSZWdpc3RlclN5bmNSZXF1ZXN0KFNZTkNfUkVRVUVTVCkuCi0gVHJhY2tzIHRoZSBu dW1iZXIgb2Ygc3luY19zeW5jZmlsZXRhZyBjYWxsYmFjayBpbnZvY2F0aW9ucyBpbiBhCiAgc2hh cmVkLW1lbW9yeSBjb3VudGVyICh2aWEgR2V0TmFtZWREU01TZWdtZW50KSBzbyB0aGF0IHRoZQog IGNoZWNrcG9pbnRlcidzIGluY3JlbWVudHMgYXJlIHZpc2libGUgdG8gdGhlIGJhY2tlbmQgdGhh dCBjYWxscwogIHRlc3Rfc3luY19oYW5kbGVyX2NvdW50KCkuCgpUaGUgVEFQIHRlc3QgaW4gdC8w MDFfYmFzaWMucGwgdmVyaWZpZXM6CgotIFRoZSByZWdpc3RlcmVkIGhhbmRsZXIgSUQgaXMgPj0g U1lOQ19IQU5ETEVSX0ZJUlNUX0RZTkFNSUMsIHByb3ZpbmcKICB0aGF0IGJ1aWx0LWluIGhhbmRs ZXJzIHN0aWxsIG9jY3VweSBJRHMgMC4uNC4KLSBRdWV1aW5nIDUgZGlzdGluY3QgRmlsZVRhZ3Mg cHJvZHVjZXMgNSBjYWxsYmFjayBpbnZvY2F0aW9ucyBhZnRlcgogIENIRUNLUE9JTlQsIGNvbmZp cm1pbmcgdGhhdCBkaXNwYXRjaCBmbG93cyB0aHJvdWdoIHRoZSBuZXcgZHluYW1pYwogIHRhYmxl IGZvciBleHRlbnNpb24tcmVnaXN0ZXJlZCBoYW5kbGVycy4KLSBRdWV1aW5nIDEwIGlkZW50aWNh bCBGaWxlVGFncyBwcm9kdWNlcyBvbmx5IDEgYWRkaXRpb25hbCBjYWxsYmFjawogIGludm9jYXRp b24sIGNvbmZpcm1pbmcgdGhhdCBIQVNIX0JMT0JTIGNvYWxlc2Npbmcgc3RpbGwgd29ya3MKICBj b3JyZWN0bHkgd2l0aCBleHRlbnNpb24tYXNzaWduZWQgaGFuZGxlciBJRHMuCi0gQW4gaWRsZSBD SEVDS1BPSU5UICh3aXRoIG5vIG5ldyBxdWV1ZWQgZW50cmllcykgZG9lcyBub3QgcmUtaW52b2tl CiAgdGhlIGNhbGxiYWNrLCBjb25maXJtaW5nIGN5Y2xlX2N0ciBza2lwIHNlbWFudGljcy4KCk1v ZHVsZSBsYXlvdXQgZm9sbG93cyB0aGUgcGF0dGVybiBlc3RhYmxpc2hlZCBieQpzcmMvdGVzdC9t b2R1bGVzL3Rlc3Rfc2xydS4gVGhlIHRlc3Qgc2V0cyBmc3luYz1vbiBpbiBpdHMgVEFQIGNsdXN0 ZXIKY29uZmlnIChvdmVycmlkaW5nIHRoZSBkZWZhdWx0IGZzeW5jPW9mZiB0aGF0IFRBUCBjbHVz dGVycyB1c2UgZm9yCnNwZWVkKSBiZWNhdXNlIFByb2Nlc3NTeW5jUmVxdWVzdHMgc2tpcHMgZGlz cGF0Y2ggZW50aXJlbHkgd2hlbgpmc3luYyBpcyBvZmYuCgpUaGlzIG1pcnJvcnMgaG93IGZzeW5j X2NoZWNrZXIgaXMgc3RydWN0dXJlZCBpbiBDRiA1NjE2IHY1KzogYQptaW5pbWFsIHJlZmVyZW5j ZSBjb25zdW1lciB0aGF0IGRlbW9uc3RyYXRlcyB0aGUgQVBJIHN1cmZhY2UsIGxpdmVzCmluIHNy Yy90ZXN0L21vZHVsZXMgc28gaW5zdGFsbGNoZWNrIHVzZXJzIGRvbid0IG5lZWQgdG8gcHJlbG9h ZCBpdCwKYW5kIGhhcyBhIGZvY3VzZWQgVEFQIHRlc3QuCgpTaWduZWQtb2ZmLWJ5OiBHcmVnIExh bWJlcnNvbiA8Z3JlZ0BsYW1jby5pbz4KLS0tCiBzcmMvdGVzdC9tb2R1bGVzL01ha2VmaWxlICAg ICAgICAgICAgICAgICAgICAgfCAgIDEgKwogc3JjL3Rlc3QvbW9kdWxlcy9tZXNvbi5idWlsZCAg ICAgICAgICAgICAgICAgIHwgICAxICsKIHNyYy90ZXN0L21vZHVsZXMvdGVzdF9zeW5jX2hhbmRs ZXIvLmdpdGlnbm9yZSB8ICAgNCArCiBzcmMvdGVzdC9tb2R1bGVzL3Rlc3Rfc3luY19oYW5kbGVy L01ha2VmaWxlICAgfCAgMjcgKysrCiAuLi4vbW9kdWxlcy90ZXN0X3N5bmNfaGFuZGxlci9tZXNv bi5idWlsZCAgICAgfCAgMzMgKysrKwogLi4uL21vZHVsZXMvdGVzdF9zeW5jX2hhbmRsZXIvdC8w MDFfYmFzaWMucGwgIHwgIDk2ICsrKysrKysrKwogLi4uL3Rlc3Rfc3luY19oYW5kbGVyLS0xLjAu c3FsICAgICAgICAgICAgICAgIHwgIDEzICsrCiAuLi4vdGVzdF9zeW5jX2hhbmRsZXIvdGVzdF9z eW5jX2hhbmRsZXIuYyAgICAgfCAxODcgKysrKysrKysrKysrKysrKysrCiAuLi4vdGVzdF9zeW5j X2hhbmRsZXIuY29udHJvbCAgICAgICAgICAgICAgICAgfCAgIDQgKwogOSBmaWxlcyBjaGFuZ2Vk LCAzNjYgaW5zZXJ0aW9ucygrKQogY3JlYXRlIG1vZGUgMTAwNjQ0IHNyYy90ZXN0L21vZHVsZXMv dGVzdF9zeW5jX2hhbmRsZXIvLmdpdGlnbm9yZQogY3JlYXRlIG1vZGUgMTAwNjQ0IHNyYy90ZXN0 L21vZHVsZXMvdGVzdF9zeW5jX2hhbmRsZXIvTWFrZWZpbGUKIGNyZWF0ZSBtb2RlIDEwMDY0NCBz cmMvdGVzdC9tb2R1bGVzL3Rlc3Rfc3luY19oYW5kbGVyL21lc29uLmJ1aWxkCiBjcmVhdGUgbW9k ZSAxMDA2NDQgc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X3N5bmNfaGFuZGxlci90LzAwMV9iYXNpYy5w bAogY3JlYXRlIG1vZGUgMTAwNjQ0IHNyYy90ZXN0L21vZHVsZXMvdGVzdF9zeW5jX2hhbmRsZXIv dGVzdF9zeW5jX2hhbmRsZXItLTEuMC5zcWwKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvdGVzdC9t b2R1bGVzL3Rlc3Rfc3luY19oYW5kbGVyL3Rlc3Rfc3luY19oYW5kbGVyLmMKIGNyZWF0ZSBtb2Rl IDEwMDY0NCBzcmMvdGVzdC9tb2R1bGVzL3Rlc3Rfc3luY19oYW5kbGVyL3Rlc3Rfc3luY19oYW5k bGVyLmNvbnRyb2wKCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9tb2R1bGVzL01ha2VmaWxlIGIvc3Jj L3Rlc3QvbW9kdWxlcy9NYWtlZmlsZQppbmRleCAwYTc0YWI1Yzg2Zi4uMmEzMzM0ZDc1MDggMTAw NjQ0Ci0tLSBhL3NyYy90ZXN0L21vZHVsZXMvTWFrZWZpbGUKKysrIGIvc3JjL3Rlc3QvbW9kdWxl cy9NYWtlZmlsZQpAQCAtNTIsNiArNTIsNyBAQCBTVUJESVJTID0gXAogCQkgIHRlc3Rfc2htZW0g XAogCQkgIHRlc3Rfc2htX21xIFwKIAkJICB0ZXN0X3NscnUgXAorCQkgIHRlc3Rfc3luY19oYW5k bGVyIFwKIAkJICB0ZXN0X3RpZHN0b3JlIFwKIAkJICB1bnNhZmVfdGVzdHMgXAogCQkgIHdvcmtl cl9zcGkgXApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvbW9kdWxlcy9tZXNvbi5idWlsZCBiL3NyYy90 ZXN0L21vZHVsZXMvbWVzb24uYnVpbGQKaW5kZXggNGJjYTQyYmIzNzAuLjAwYmM3NDU0Y2M4IDEw MDY0NAotLS0gYS9zcmMvdGVzdC9tb2R1bGVzL21lc29uLmJ1aWxkCisrKyBiL3NyYy90ZXN0L21v ZHVsZXMvbWVzb24uYnVpbGQKQEAgLTUzLDYgKzUzLDcgQEAgc3ViZGlyKCd0ZXN0X3Nhc2xwcmVw JykKIHN1YmRpcigndGVzdF9zaG1lbScpCiBzdWJkaXIoJ3Rlc3Rfc2htX21xJykKIHN1YmRpcign dGVzdF9zbHJ1JykKK3N1YmRpcigndGVzdF9zeW5jX2hhbmRsZXInKQogc3ViZGlyKCd0ZXN0X3Rp ZHN0b3JlJykKIHN1YmRpcigndHlwY2FjaGUnKQogc3ViZGlyKCd1bnNhZmVfdGVzdHMnKQpkaWZm IC0tZ2l0IGEvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X3N5bmNfaGFuZGxlci8uZ2l0aWdub3JlIGIv c3JjL3Rlc3QvbW9kdWxlcy90ZXN0X3N5bmNfaGFuZGxlci8uZ2l0aWdub3JlCm5ldyBmaWxlIG1v ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi41ZGNiM2ZmOTcyMwotLS0gL2Rldi9udWxsCisr KyBiL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9zeW5jX2hhbmRsZXIvLmdpdGlnbm9yZQpAQCAtMCww ICsxLDQgQEAKKyMgR2VuZXJhdGVkIHN1YmRpcmVjdG9yaWVzCisvbG9nLworL3Jlc3VsdHMvCisv dG1wX2NoZWNrLwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X3N5bmNfaGFuZGxl ci9NYWtlZmlsZSBiL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9zeW5jX2hhbmRsZXIvTWFrZWZpbGUK bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjIyMzI2YTQ3ZTljCi0tLSAv ZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X3N5bmNfaGFuZGxlci9NYWtlZmls ZQpAQCAtMCwwICsxLDI3IEBACisjIHNyYy90ZXN0L21vZHVsZXMvdGVzdF9zeW5jX2hhbmRsZXIv TWFrZWZpbGUKKworTU9EVUxFX2JpZyA9IHRlc3Rfc3luY19oYW5kbGVyCitPQkpTID0gXAorCSQo V0lOMzJSRVMpIFwKKwl0ZXN0X3N5bmNfaGFuZGxlci5vCitQR0ZJTEVERVNDID0gInRlc3Rfc3lu Y19oYW5kbGVyIC0gdGVzdCBtb2R1bGUgZm9yIHN5bmMgaGFuZGxlciByZWdpc3RyYXRpb24iCisK K0VYVEVOU0lPTiA9IHRlc3Rfc3luY19oYW5kbGVyCitEQVRBID0gdGVzdF9zeW5jX2hhbmRsZXIt LTEuMC5zcWwKKworVEFQX1RFU1RTID0gMQorCisjIFRlc3RzIHJlcXVpcmUgc2hhcmVkX3ByZWxv YWRfbGlicmFyaWVzPXRlc3Rfc3luY19oYW5kbGVyIHdoaWNoIHR5cGljYWwKKyMgaW5zdGFsbGNo ZWNrIHVzZXJzIGRvIG5vdCBoYXZlLiBNYXRjaCB0ZXN0X3NscnUncyBjb252ZW50aW9uLgorTk9f SU5TVEFMTENIRUNLID0gMQorCitpZmRlZiBVU0VfUEdYUworUEdfQ09ORklHID0gcGdfY29uZmln CitQR1hTIDo9ICQoc2hlbGwgJChQR19DT05GSUcpIC0tcGd4cykKK2luY2x1ZGUgJChQR1hTKQor ZWxzZQorc3ViZGlyID0gc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X3N5bmNfaGFuZGxlcgordG9wX2J1 aWxkZGlyID0gLi4vLi4vLi4vLi4KK2luY2x1ZGUgJCh0b3BfYnVpbGRkaXIpL3NyYy9NYWtlZmls ZS5nbG9iYWwKK2luY2x1ZGUgJCh0b3Bfc3JjZGlyKS9jb250cmliL2NvbnRyaWItZ2xvYmFsLm1r CitlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X3N5bmNfaGFuZGxlci9t ZXNvbi5idWlsZCBiL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9zeW5jX2hhbmRsZXIvbWVzb24uYnVp bGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLmU3ZjAzNjE2YmEwCi0t LSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X3N5bmNfaGFuZGxlci9tZXNv bi5idWlsZApAQCAtMCwwICsxLDMzIEBACisjIENvcHlyaWdodCAoYykgMjAyNiwgUG9zdGdyZVNR TCBHbG9iYWwgRGV2ZWxvcG1lbnQgR3JvdXAKKwordGVzdF9zeW5jX2hhbmRsZXJfc291cmNlcyA9 IGZpbGVzKAorICAndGVzdF9zeW5jX2hhbmRsZXIuYycsCispCisKK2lmIGhvc3Rfc3lzdGVtID09 ICd3aW5kb3dzJworICB0ZXN0X3N5bmNfaGFuZGxlcl9zb3VyY2VzICs9IHJjX2xpYl9nZW4ucHJv Y2Vzcyh3aW4zMnZlcl9yYywgZXh0cmFfYXJnczogWworICAgICctLU5BTUUnLCAndGVzdF9zeW5j X2hhbmRsZXInLAorICAgICctLUZJTEVERVNDJywgJ3Rlc3Rfc3luY19oYW5kbGVyIC0gdGVzdCBt b2R1bGUgZm9yIHN5bmMgaGFuZGxlciByZWdpc3RyYXRpb24nLF0pCitlbmRpZgorCit0ZXN0X3N5 bmNfaGFuZGxlciA9IHNoYXJlZF9tb2R1bGUoJ3Rlc3Rfc3luY19oYW5kbGVyJywKKyAgdGVzdF9z eW5jX2hhbmRsZXJfc291cmNlcywKKyAga3dhcmdzOiBwZ190ZXN0X21vZF9hcmdzLAorKQordGVz dF9pbnN0YWxsX2xpYnMgKz0gdGVzdF9zeW5jX2hhbmRsZXIKKwordGVzdF9pbnN0YWxsX2RhdGEg Kz0gZmlsZXMoCisgICd0ZXN0X3N5bmNfaGFuZGxlci5jb250cm9sJywKKyAgJ3Rlc3Rfc3luY19o YW5kbGVyLS0xLjAuc3FsJywKKykKKwordGVzdHMgKz0geworICAnbmFtZSc6ICd0ZXN0X3N5bmNf aGFuZGxlcicsCisgICdzZCc6IG1lc29uLmN1cnJlbnRfc291cmNlX2RpcigpLAorICAnYmQnOiBt ZXNvbi5jdXJyZW50X2J1aWxkX2RpcigpLAorICAndGFwJzogeworICAgICd0ZXN0cyc6IFsKKyAg ICAgICd0LzAwMV9iYXNpYy5wbCcsCisgICAgXSwKKyAgfSwKK30KZGlmZiAtLWdpdCBhL3NyYy90 ZXN0L21vZHVsZXMvdGVzdF9zeW5jX2hhbmRsZXIvdC8wMDFfYmFzaWMucGwgYi9zcmMvdGVzdC9t b2R1bGVzL3Rlc3Rfc3luY19oYW5kbGVyL3QvMDAxX2Jhc2ljLnBsCm5ldyBmaWxlIG1vZGUgMTAw NjQ0CmluZGV4IDAwMDAwMDAwMDAwLi4yOWMwZmMzYzYxZQotLS0gL2Rldi9udWxsCisrKyBiL3Ny Yy90ZXN0L21vZHVsZXMvdGVzdF9zeW5jX2hhbmRsZXIvdC8wMDFfYmFzaWMucGwKQEAgLTAsMCAr MSw5NiBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMjYsIFBvc3RncmVTUUwgR2xvYmFsIERldmVsb3Bt ZW50IEdyb3VwCisjCisjIEJhc2ljIHRlc3QgZm9yIHJlZ2lzdGVyX3N5bmNfaGFuZGxlcigpIGRp c3BhdGNoLgorIworIyBWZXJpZmllcyB0aGF0IGEgY3VzdG9tIHN5bmMgaGFuZGxlciByZWdpc3Rl cmVkIHZpYSByZWdpc3Rlcl9zeW5jX2hhbmRsZXIoKQorIyBpbiBfUEdfaW5pdCgpIHJlY2VpdmVz IGNhbGxiYWNrIGludm9jYXRpb25zIGZyb20gUHJvY2Vzc1N5bmNSZXF1ZXN0cygpIGF0CisjIENI RUNLUE9JTlQgdGltZSwgdGhhdCBpZGVudGljYWwgRmlsZVRhZ3MgY29hbGVzY2UgdmlhIEhBU0hf QkxPQlMKKyMgZGVkdXBsaWNhdGlvbiwgdGhhdCBkaXN0aW5jdCBGaWxlVGFncyBwcm9kdWNlIGRp c3RpbmN0IGNhbGxiYWNrcywgYW5kCisjIHRoYXQgYW4gaWRsZSBjaGVja3BvaW50IGRvZXMgbm90 IHJlLWRpc3BhdGNoIGVudHJpZXMgdGhhdCB3ZXJlIGFscmVhZHkKKyMgcHJvY2Vzc2VkIChjeWNs ZV9jdHIgc2tpcCkuCisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3MgRkFUQUwgPT4gJ2FsbCc7 CisKK3VzZSBQb3N0Z3JlU1FMOjpUZXN0OjpDbHVzdGVyOwordXNlIFBvc3RncmVTUUw6OlRlc3Q6 OlV0aWxzOwordXNlIFRlc3Q6Ok1vcmU7CisKK215ICRub2RlID0gUG9zdGdyZVNRTDo6VGVzdDo6 Q2x1c3Rlci0+bmV3KCdzeW5jX2hhbmRsZXInKTsKKyRub2RlLT5pbml0OworJG5vZGUtPmFwcGVu ZF9jb25mKAorCSdwb3N0Z3Jlc3FsLmNvbmYnLCBxeworc2hhcmVkX3ByZWxvYWRfbGlicmFyaWVz ID0gJ3Rlc3Rfc3luY19oYW5kbGVyJworIyBUQVAgY2x1c3RlcnMgc2V0IGZzeW5jID0gb2ZmIGJ5 IGRlZmF1bHQgZm9yIHNwZWVkOyByZS1lbmFibGUgaGVyZSBzbworIyB0aGF0IFByb2Nlc3NTeW5j UmVxdWVzdHMgYWN0dWFsbHkgZGlzcGF0Y2hlcyBvdXIgc3luYyBoYW5kbGVyIGNhbGxiYWNrLgor ZnN5bmMgPSBvbgorfSk7Ciskbm9kZS0+c3RhcnQ7Ciskbm9kZS0+c2FmZV9wc3FsKCdwb3N0Z3Jl cycsICdDUkVBVEUgRVhURU5TSU9OIHRlc3Rfc3luY19oYW5kbGVyJyk7CisKKyMgVGhlIGhhbmRs ZXIgSUQgbXVzdCBiZSA+PSBTWU5DX0hBTkRMRVJfRklSU1RfRFlOQU1JQy4gQnVpbHQtaW5zCisj IGN1cnJlbnRseSBvY2N1cHkgSURzIDAuLjQsIHNvIHRoZSBmaXJzdCBleHRlbnNpb24gaGFuZGxl ciBzaG91bGQgYmUKKyMgYXQgbGVhc3QgNS4KK215ICRpZCA9ICRub2RlLT5zYWZlX3BzcWwoJ3Bv c3RncmVzJywgJ1NFTEVDVCB0ZXN0X3N5bmNfaGFuZGxlcl9pZCgpJyk7CitvaygkaWQgPj0gNSwK KwkiaGFuZGxlciBpZCAkaWQgaXMgPj0gU1lOQ19IQU5ETEVSX0ZJUlNUX0RZTkFNSUMgKGJ1aWx0 LWlucyA9IDUpIikKKyAgb3IgZGlhZygiZ290IGlkPSRpZCIpOworCisjIEJhc2VsaW5lOiBubyBk aXNwYXRjaGVzIGJlZm9yZSB3ZSBxdWV1ZSBhbnl0aGluZy4KK215ICRiYXNlbGluZSA9CisgICRu b2RlLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywgJ1NFTEVDVCB0ZXN0X3N5bmNfaGFuZGxlcl9jb3Vu dCgpJyk7CitpcygkYmFzZWxpbmUsICcwJywgJ2Jhc2VsaW5lIGRpc3BhdGNoIGNvdW50IGlzIHpl cm8nKTsKKworIyBRdWV1ZSA1IGRpc3RpbmN0IEZpbGVUYWdzIChkaWZmZXJpbmcgaW4gc2Vnbm8g b25seSkgYW5kIGNoZWNrcG9pbnQuCisjIEV4cGVjdCA1IGNhbGxiYWNrIGludm9jYXRpb25zIHNp bmNlIHRoZXkgYXJlIGFsbCBkaXN0aW5jdCBoYXNoIGtleXMuCiskbm9kZS0+c2FmZV9wc3FsKAor CSdwb3N0Z3JlcycsIHF7CitTRUxFQ1QgdGVzdF9zeW5jX2hhbmRsZXJfcmVnaXN0ZXIoMSk7CitT RUxFQ1QgdGVzdF9zeW5jX2hhbmRsZXJfcmVnaXN0ZXIoMik7CitTRUxFQ1QgdGVzdF9zeW5jX2hh bmRsZXJfcmVnaXN0ZXIoMyk7CitTRUxFQ1QgdGVzdF9zeW5jX2hhbmRsZXJfcmVnaXN0ZXIoNCk7 CitTRUxFQ1QgdGVzdF9zeW5jX2hhbmRsZXJfcmVnaXN0ZXIoNSk7Cit9KTsKKyRub2RlLT5zYWZl X3BzcWwoJ3Bvc3RncmVzJywgJ0NIRUNLUE9JTlQnKTsKK215ICRhZnRlcl9kaXN0aW5jdCA9Cisg ICRub2RlLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywgJ1NFTEVDVCB0ZXN0X3N5bmNfaGFuZGxlcl9j b3VudCgpJyk7CitpcygkYWZ0ZXJfZGlzdGluY3QsICc1JywKKwknNSBkaXN0aW5jdCBGaWxlVGFn cyBwcm9kdWNlIDUgc3luY19zeW5jZmlsZXRhZyBjYWxsYmFja3MnKQorICBvciBkaWFnKCJnb3Qg JGFmdGVyX2Rpc3RpbmN0Iik7CisKKyMgUXVldWUgMTAgZHVwbGljYXRlIEZpbGVUYWdzIChzYW1l IHNlZ25vIDQyKSBhbmQgY2hlY2twb2ludC4KKyMgRXhwZWN0IGV4YWN0bHkgMSBhZGRpdGlvbmFs IGNhbGxiYWNrIGJlY2F1c2UgcGVuZGluZ09wcyB1c2VzIEhBU0hfQkxPQlMKKyMgYW5kIGNvbGxh cHNlcyBpZGVudGljYWwgRmlsZVRhZ3MgaW50byBhIHNpbmdsZSBoYXNoIGVudHJ5LgorJG5vZGUt PnNhZmVfcHNxbCgKKwkncG9zdGdyZXMnLCBxeworU0VMRUNUIHRlc3Rfc3luY19oYW5kbGVyX3Jl Z2lzdGVyKDQyKTsKK1NFTEVDVCB0ZXN0X3N5bmNfaGFuZGxlcl9yZWdpc3Rlcig0Mik7CitTRUxF Q1QgdGVzdF9zeW5jX2hhbmRsZXJfcmVnaXN0ZXIoNDIpOworU0VMRUNUIHRlc3Rfc3luY19oYW5k bGVyX3JlZ2lzdGVyKDQyKTsKK1NFTEVDVCB0ZXN0X3N5bmNfaGFuZGxlcl9yZWdpc3Rlcig0Mik7 CitTRUxFQ1QgdGVzdF9zeW5jX2hhbmRsZXJfcmVnaXN0ZXIoNDIpOworU0VMRUNUIHRlc3Rfc3lu Y19oYW5kbGVyX3JlZ2lzdGVyKDQyKTsKK1NFTEVDVCB0ZXN0X3N5bmNfaGFuZGxlcl9yZWdpc3Rl cig0Mik7CitTRUxFQ1QgdGVzdF9zeW5jX2hhbmRsZXJfcmVnaXN0ZXIoNDIpOworU0VMRUNUIHRl c3Rfc3luY19oYW5kbGVyX3JlZ2lzdGVyKDQyKTsKK30pOworJG5vZGUtPnNhZmVfcHNxbCgncG9z dGdyZXMnLCAnQ0hFQ0tQT0lOVCcpOworbXkgJGFmdGVyX2NvYWxlc2NlID0KKyAgJG5vZGUtPnNh ZmVfcHNxbCgncG9zdGdyZXMnLCAnU0VMRUNUIHRlc3Rfc3luY19oYW5kbGVyX2NvdW50KCknKTsK K2lzKCRhZnRlcl9jb2FsZXNjZSwgJzYnLAorCScxMCBkdXBsaWNhdGUgRmlsZVRhZ3MgY29hbGVz Y2UgdmlhIEhBU0hfQkxPQlMgdG8gMSBhZGRpdGlvbmFsIGNhbGxiYWNrJykKKyAgb3IgZGlhZygi Z290ICRhZnRlcl9jb2FsZXNjZSIpOworCisjIFNlY29uZCBDSEVDS1BPSU5UIHdpdGggbm8gbmV3 IHJlcXVlc3RzLiBUaGUgY291bnQgbXVzdCBzdGF5IHRoZSBzYW1lOgorIyBldmVyeSBlbnRyeSBm cm9tIHRoZSBwcmV2aW91cyBjaGVja3BvaW50IHdhcyBwcm9jZXNzZWQgYW5kIHJlbW92ZWQKKyMg ZnJvbSBwZW5kaW5nT3BzLCBhbmQgbm8gbmV3IGVudHJpZXMgaGF2ZSBiZWVuIHF1ZXVlZCwgc28K KyMgUHJvY2Vzc1N5bmNSZXF1ZXN0cyBoYXMgbm90aGluZyB0byBkaXNwYXRjaC4KKyRub2RlLT5z YWZlX3BzcWwoJ3Bvc3RncmVzJywgJ0NIRUNLUE9JTlQnKTsKK215ICRhZnRlcl9pZGxlID0KKyAg JG5vZGUtPnNhZmVfcHNxbCgncG9zdGdyZXMnLCAnU0VMRUNUIHRlc3Rfc3luY19oYW5kbGVyX2Nv dW50KCknKTsKK2lzKCRhZnRlcl9pZGxlLCAnNicsICdpZGxlIGNoZWNrcG9pbnQgZG9lcyBub3Qg cmUtZGlzcGF0Y2gnKQorICBvciBkaWFnKCJnb3QgJGFmdGVyX2lkbGUiKTsKKworJG5vZGUtPnN0 b3A7CisKK2RvbmVfdGVzdGluZygpOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0 X3N5bmNfaGFuZGxlci90ZXN0X3N5bmNfaGFuZGxlci0tMS4wLnNxbCBiL3NyYy90ZXN0L21vZHVs ZXMvdGVzdF9zeW5jX2hhbmRsZXIvdGVzdF9zeW5jX2hhbmRsZXItLTEuMC5zcWwKbmV3IGZpbGUg bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjA3ZWEyOTdmMTVmCi0tLSAvZGV2L251bGwK KysrIGIvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X3N5bmNfaGFuZGxlci90ZXN0X3N5bmNfaGFuZGxl ci0tMS4wLnNxbApAQCAtMCwwICsxLDEzIEBACisvKiBzcmMvdGVzdC9tb2R1bGVzL3Rlc3Rfc3lu Y19oYW5kbGVyL3Rlc3Rfc3luY19oYW5kbGVyLS0xLjAuc3FsICovCisKKy0tIGNvbXBsYWluIGlm IHNjcmlwdCBpcyBzb3VyY2VkIGluIHBzcWwsIHJhdGhlciB0aGFuIHZpYSBDUkVBVEUgRVhURU5T SU9OCitcZWNobyBVc2UgIkNSRUFURSBFWFRFTlNJT04gdGVzdF9zeW5jX2hhbmRsZXIiIHRvIGxv YWQgdGhpcyBmaWxlLiBccXVpdAorCitDUkVBVEUgRlVOQ1RJT04gdGVzdF9zeW5jX2hhbmRsZXJf aWQoKSBSRVRVUk5TIGludDQKKyAgQVMgJ01PRFVMRV9QQVRITkFNRScsICd0ZXN0X3N5bmNfaGFu ZGxlcl9pZCcgTEFOR1VBR0UgQyBTVFJJQ1Q7CisKK0NSRUFURSBGVU5DVElPTiB0ZXN0X3N5bmNf aGFuZGxlcl9yZWdpc3RlcihzZWcgYmlnaW50KSBSRVRVUk5TIHZvaWQKKyAgQVMgJ01PRFVMRV9Q QVRITkFNRScsICd0ZXN0X3N5bmNfaGFuZGxlcl9yZWdpc3RlcicgTEFOR1VBR0UgQyBTVFJJQ1Q7 CisKK0NSRUFURSBGVU5DVElPTiB0ZXN0X3N5bmNfaGFuZGxlcl9jb3VudCgpIFJFVFVSTlMgYmln aW50CisgIEFTICdNT0RVTEVfUEFUSE5BTUUnLCAndGVzdF9zeW5jX2hhbmRsZXJfY291bnQnIExB TkdVQUdFIEMgU1RSSUNUOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X3N5bmNf aGFuZGxlci90ZXN0X3N5bmNfaGFuZGxlci5jIGIvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X3N5bmNf aGFuZGxlci90ZXN0X3N5bmNfaGFuZGxlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw MDAwMDAwMDAwLi4wNTVkOTBiNTVkZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L21vZHVs ZXMvdGVzdF9zeW5jX2hhbmRsZXIvdGVzdF9zeW5jX2hhbmRsZXIuYwpAQCAtMCwwICsxLDE4NyBA QAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIHRlc3Rfc3luY19oYW5kbGVyLmMKKyAqCQlN aW5pbWFsIGV4dGVuc2lvbiBleGVyY2lzaW5nIHJlZ2lzdGVyX3N5bmNfaGFuZGxlcigpICsgZGlz cGF0Y2guCisgKgorICogVGhpcyBtb2R1bGUgZGVtb25zdHJhdGVzIHRoZSBzeW5jLmMgZXh0ZW5z aWJpbGl0eSBBUEkgYnkgcmVnaXN0ZXJpbmcgYQorICogdHJpdmlhbCBTeW5jT3BzIGR1cmluZyBf UEdfaW5pdCgpLCBleHBvc2luZyBTUUwtY2FsbGFibGUgaGVscGVycyB0bworICogcXVldWUgRmls ZVRhZ3MgZm9yIHRoZSByZWdpc3RlcmVkIGhhbmRsZXIsIGFuZCB0cmFja2luZyBob3cgbWFueSB0 aW1lcworICogdGhlIGhhbmRsZXIncyBzeW5jX3N5bmNmaWxldGFnIGNhbGxiYWNrIGlzIGludm9r ZWQuCisgKgorICogQmVjYXVzZSBzeW5jX3N5bmNmaWxldGFnIHJ1bnMgaW4gdGhlIGNoZWNrcG9p bnRlciBwcm9jZXNzIGJ1dAorICogdGVzdF9zeW5jX2hhbmRsZXJfY291bnQoKSBydW5zIGluIGEg cmVndWxhciBiYWNrZW5kLCB0aGUgY2FsbCBjb3VudGVyCisgKiBsaXZlcyBpbiBzaGFyZWQgbWVt b3J5IHZpYSBHZXROYW1lZERTTVNlZ21lbnQoKS4KKyAqCisgKiBUaGUgVEFQIHRlc3QgaW4gdC8w MDFfYmFzaWMucGwgdXNlcyB0aGlzIG1vZHVsZSB0byB2ZXJpZnk6CisgKiAgIC0gcmVnaXN0ZXJf c3luY19oYW5kbGVyKCkgcmV0dXJucyBhbiBJRCA+PSBTWU5DX0hBTkRMRVJfRklSU1RfRFlOQU1J QworICogICAtIFF1ZXVlZCBGaWxlVGFncyByb3VuZC10cmlwIHRocm91Z2ggdGhlIGNoZWNrcG9p bnRlciBhbmQgbGFuZCBpbgorICogICAgIHRoZSByZWdpc3RlcmVkIHN5bmNfc3luY2ZpbGV0YWcg Y2FsbGJhY2sgYXQgQ0hFQ0tQT0lOVCB0aW1lCisgKiAgIC0gSWRlbnRpY2FsIEZpbGVUYWdzIGNv YWxlc2NlIHZpYSBIQVNIX0JMT0JTIGRlZHVwbGljYXRpb24gaW4KKyAqICAgICBwZW5kaW5nT3Bz IChOIGR1cGxpY2F0ZXMgLT4gMSBjYWxsYmFjaykKKyAqICAgLSBEaXN0aW5jdCBGaWxlVGFncyBw cm9kdWNlIGRpc3RpbmN0IGNhbGxiYWNrcworICogICAtIElkbGUgY2hlY2twb2ludHMgZG8gbm90 IHJlLWRpc3BhdGNoIChjeWNsZV9jdHIgc2tpcCkKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMjYs IFBvc3RncmVTUUwgR2xvYmFsIERldmVsb3BtZW50IEdyb3VwCisgKgorICogSURFTlRJRklDQVRJ T04KKyAqCQlzcmMvdGVzdC9tb2R1bGVzL3Rlc3Rfc3luY19oYW5kbGVyL3Rlc3Rfc3luY19oYW5k bGVyLmMKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpbmNsdWRlICJwb3N0Z3Jlcy5o IgorCisjaW5jbHVkZSAiZm1nci5oIgorI2luY2x1ZGUgIm1pc2NhZG1pbi5oIgorI2luY2x1ZGUg InBnX2NvbmZpZy5oIgorI2luY2x1ZGUgInBvcnQvYXRvbWljcy5oIgorI2luY2x1ZGUgInN0b3Jh Z2UvZHNtX3JlZ2lzdHJ5LmgiCisjaW5jbHVkZSAic3RvcmFnZS9zeW5jLmgiCisjaW5jbHVkZSAi dXRpbHMvYnVpbHRpbnMuaCIKKworUEdfTU9EVUxFX01BR0lDOworCit2b2lkCQlfUEdfaW5pdCh2 b2lkKTsKKwordHlwZWRlZiBzdHJ1Y3QgVHNoU2hhcmVkU3RhdGUKK3sKKwlwZ19hdG9taWNfdWlu dDY0IGNhbGxfY291bnQ7Cit9IFRzaFNoYXJlZFN0YXRlOworCitzdGF0aWMgaW50MTYgdHNoX2hh bmRsZXJfaWQgPSAtMTsKK3N0YXRpYyBUc2hTaGFyZWRTdGF0ZSAqdHNoX3NoYXJlZCA9IE5VTEw7 CisKKy8qCisgKiBHZXROYW1lZERTTVNlZ21lbnQncyBpbml0X2NhbGxiYWNrIHNpZ25hdHVyZSBn YWluZWQgYW4gZXh0cmEgYGFyZ2AKKyAqIHBhcmFtZXRlciBpbiBQRyAxOWRldmVsLiBQcm92aWRl IGJvdGggc2hhcGVzIHNvIHRoZSB0ZXN0IG1vZHVsZSBpcworICogYnVpbGRhYmxlIGFjcm9zcyAx OCBhbmQgMTkuCisgKi8KKyNpZiBQR19WRVJTSU9OX05VTSA+PSAxOTAwMDAKK3N0YXRpYyB2b2lk Cit0c2hfaW5pdF9zaG1lbSh2b2lkICpwdHIsIHZvaWQgKmFyZykKKyNlbHNlCitzdGF0aWMgdm9p ZAordHNoX2luaXRfc2htZW0odm9pZCAqcHRyKQorI2VuZGlmCit7CisJVHNoU2hhcmVkU3RhdGUg KnN0YXRlID0gKFRzaFNoYXJlZFN0YXRlICopIHB0cjsKKworCXBnX2F0b21pY19pbml0X3U2NCgm c3RhdGUtPmNhbGxfY291bnQsIDApOworfQorCitzdGF0aWMgdm9pZAordHNoX2F0dGFjaF9zaG1l bSh2b2lkKQoreworCWJvb2wJCWZvdW5kOworCisJaWYgKHRzaF9zaGFyZWQgIT0gTlVMTCkKKwkJ cmV0dXJuOworI2lmIFBHX1ZFUlNJT05fTlVNID49IDE5MDAwMAorCXRzaF9zaGFyZWQgPSBHZXRO YW1lZERTTVNlZ21lbnQoInRlc3Rfc3luY19oYW5kbGVyIiwKKwkJCQkJCQkJCXNpemVvZihUc2hT aGFyZWRTdGF0ZSksCisJCQkJCQkJCQl0c2hfaW5pdF9zaG1lbSwKKwkJCQkJCQkJCSZmb3VuZCwK KwkJCQkJCQkJCU5VTEwpOworI2Vsc2UKKwl0c2hfc2hhcmVkID0gR2V0TmFtZWREU01TZWdtZW50 KCJ0ZXN0X3N5bmNfaGFuZGxlciIsCisJCQkJCQkJCQlzaXplb2YoVHNoU2hhcmVkU3RhdGUpLAor CQkJCQkJCQkJdHNoX2luaXRfc2htZW0sCisJCQkJCQkJCQkmZm91bmQpOworI2VuZGlmCit9CisK K3N0YXRpYyBpbnQKK3Rlc3Rfc3luY19zeW5jZmlsZXRhZyhjb25zdCBGaWxlVGFnICpmdGFnLCBj aGFyICpwYXRoKQoreworCS8qCisJICogVGhpcyBydW5zIGluIHRoZSBjaGVja3BvaW50ZXIgcHJv Y2Vzcy4gQXR0YWNoIHRvIHRoZSBzaGFyZWQKKwkgKiBtZW1vcnkgc2VnbWVudCB0aGUgZmlyc3Qg dGltZSB3ZSdyZSBjYWxsZWQgc28gdGhhdCBjb3VudGVyCisJICogaW5jcmVtZW50cyBhcmUgdmlz aWJsZSB0byB0aGUgYmFja2VuZCB0aGF0IHF1ZXJpZXMKKwkgKiB0ZXN0X3N5bmNfaGFuZGxlcl9j b3VudCgpLgorCSAqLworCXRzaF9hdHRhY2hfc2htZW0oKTsKKwlwZ19hdG9taWNfZmV0Y2hfYWRk X3U2NCgmdHNoX3NoYXJlZC0+Y2FsbF9jb3VudCwgMSk7CisKKwlpZiAocGF0aCAhPSBOVUxMKQor CQlzbnByaW50ZihwYXRoLCBNQVhQR1BBVEgsICJ0ZXN0X3N5bmNfaGFuZGxlcjpzZWclbGx1IiwK KwkJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZykgZnRhZy0+c2Vnbm8pOworCXJldHVybiAwOworfQor CitzdGF0aWMgaW50Cit0ZXN0X3N5bmNfdW5saW5rZmlsZXRhZyhjb25zdCBGaWxlVGFnICpmdGFn LCBjaGFyICpwYXRoKQoreworCWlmIChwYXRoICE9IE5VTEwpCisJCXNucHJpbnRmKHBhdGgsIE1B WFBHUEFUSCwgInRlc3Rfc3luY19oYW5kbGVyOnVubGluayIpOworCXJldHVybiAwOworfQorCitz dGF0aWMgYm9vbAordGVzdF9zeW5jX2ZpbGV0YWdtYXRjaGVzKGNvbnN0IEZpbGVUYWcgKmZ0YWcs IGNvbnN0IEZpbGVUYWcgKmNhbmRpZGF0ZSkKK3sKKwkvKgorCSAqIE1hdGNoIG9uIGRiT2lkLCBt aXJyb3JpbmcgbWQuYydzIERST1AgREFUQUJBU0Ugc2VtYW50aWNzLiBUaGUKKwkgKiB0ZXN0IGRv ZXNuJ3QgZXhlcmNpc2UgdGhlIGZpbHRlciBwYXRoIHRvZGF5LCBidXQgdGhlIGNhbGxiYWNrCisJ ICogaXMgZGVmaW5lZCBzbyBleHRlbnNpb25zIGNhbiB1c2UgdGhpcyBtb2R1bGUgYXMgYSBjb3B5 LXBhc3RlCisJICogc3RhcnRpbmcgcG9pbnQuCisJICovCisJcmV0dXJuIGZ0YWctPnJsb2NhdG9y LmRiT2lkID09IGNhbmRpZGF0ZS0+cmxvY2F0b3IuZGJPaWQ7Cit9CisKK3N0YXRpYyBjb25zdCBT eW5jT3BzIHRlc3Rfc3luY19vcHMgPSB7CisJLnN5bmNfc3luY2ZpbGV0YWcgPSB0ZXN0X3N5bmNf c3luY2ZpbGV0YWcsCisJLnN5bmNfdW5saW5rZmlsZXRhZyA9IHRlc3Rfc3luY191bmxpbmtmaWxl dGFnLAorCS5zeW5jX2ZpbGV0YWdtYXRjaGVzID0gdGVzdF9zeW5jX2ZpbGV0YWdtYXRjaGVzLAor fTsKKwordm9pZAorX1BHX2luaXQodm9pZCkKK3sKKwl0c2hfaGFuZGxlcl9pZCA9IHJlZ2lzdGVy X3N5bmNfaGFuZGxlcigmdGVzdF9zeW5jX29wcywgInRlc3Rfc3luY19oYW5kbGVyIik7CisJZWxv ZyhMT0csICJ0ZXN0X3N5bmNfaGFuZGxlcjogcmVnaXN0ZXJlZCBhcyBpZCAlZCIsCisJCSAoaW50 KSB0c2hfaGFuZGxlcl9pZCk7Cit9CisKK1BHX0ZVTkNUSU9OX0lORk9fVjEodGVzdF9zeW5jX2hh bmRsZXJfaWQpOworRGF0dW0KK3Rlc3Rfc3luY19oYW5kbGVyX2lkKFBHX0ZVTkNUSU9OX0FSR1Mp Cit7CisJUEdfUkVUVVJOX0lOVDMyKChpbnQzMikgdHNoX2hhbmRsZXJfaWQpOworfQorCitQR19G VU5DVElPTl9JTkZPX1YxKHRlc3Rfc3luY19oYW5kbGVyX3JlZ2lzdGVyKTsKK0RhdHVtCit0ZXN0 X3N5bmNfaGFuZGxlcl9yZWdpc3RlcihQR19GVU5DVElPTl9BUkdTKQoreworCWludDY0CQlzZWcg PSBQR19HRVRBUkdfSU5UNjQoMCk7CisJRmlsZVRhZwkJdGFnOworCisJaWYgKHRzaF9oYW5kbGVy X2lkIDwgMCkKKwkJZXJlcG9ydChFUlJPUiwKKwkJCQkoZXJybXNnKCJ0ZXN0X3N5bmNfaGFuZGxl cjogcmVnaXN0cmF0aW9uIGZhaWxlZCBhdCBfUEdfaW5pdCIpKSk7CisKKwkvKgorCSAqIE1hbmRh dG9yeSBtZW1zZXQ6IHBlbmRpbmdPcHMgdXNlcyBIQVNIX0JMT0JTIHdoaWNoIGhhc2hlcyBldmVy eQorCSAqIGJ5dGUgb2YgdGhlIEZpbGVUYWcuIFVuaW5pdGlhbGl6ZWQgcGFkZGluZyB3b3VsZCBi cmVhayBjb2FsZXNjaW5nLgorCSAqLworCW1lbXNldCgmdGFnLCAwLCBzaXplb2YoRmlsZVRhZykp OworCXRhZy5oYW5kbGVyID0gdHNoX2hhbmRsZXJfaWQ7CisJdGFnLmZvcmtudW0gPSAwOworCXRh Zy5ybG9jYXRvci5zcGNPaWQgPSAxOworCXRhZy5ybG9jYXRvci5kYk9pZCA9IE15RGF0YWJhc2VJ ZDsKKwl0YWcucmxvY2F0b3IucmVsTnVtYmVyID0gMTsKKwl0YWcuc2Vnbm8gPSAodWludDY0KSBz ZWc7CisKKwlpZiAoIVJlZ2lzdGVyU3luY1JlcXVlc3QoJnRhZywgU1lOQ19SRVFVRVNULCB0cnVl IC8qIHJldHJ5T25FcnJvciAqLykpCisJCWVyZXBvcnQoRVJST1IsCisJCQkJKGVycm1zZygidGVz dF9zeW5jX2hhbmRsZXI6IFJlZ2lzdGVyU3luY1JlcXVlc3QgZmFpbGVkIikpKTsKKworCVBHX1JF VFVSTl9WT0lEKCk7Cit9CisKK1BHX0ZVTkNUSU9OX0lORk9fVjEodGVzdF9zeW5jX2hhbmRsZXJf Y291bnQpOworRGF0dW0KK3Rlc3Rfc3luY19oYW5kbGVyX2NvdW50KFBHX0ZVTkNUSU9OX0FSR1Mp Cit7CisJdHNoX2F0dGFjaF9zaG1lbSgpOworCVBHX1JFVFVSTl9JTlQ2NCgoaW50NjQpIHBnX2F0 b21pY19yZWFkX3U2NCgmdHNoX3NoYXJlZC0+Y2FsbF9jb3VudCkpOworfQpkaWZmIC0tZ2l0IGEv c3JjL3Rlc3QvbW9kdWxlcy90ZXN0X3N5bmNfaGFuZGxlci90ZXN0X3N5bmNfaGFuZGxlci5jb250 cm9sIGIvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X3N5bmNfaGFuZGxlci90ZXN0X3N5bmNfaGFuZGxl ci5jb250cm9sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi4zZDUyOGY3 YTg2NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9zeW5jX2hhbmRs ZXIvdGVzdF9zeW5jX2hhbmRsZXIuY29udHJvbApAQCAtMCwwICsxLDQgQEAKK2NvbW1lbnQgPSAn VGVzdCBtb2R1bGUgZm9yIHN5bmMgaGFuZGxlciByZWdpc3RyYXRpb24nCitkZWZhdWx0X3ZlcnNp b24gPSAnMS4wJworbW9kdWxlX3BhdGhuYW1lID0gJyRsaWJkaXIvdGVzdF9zeW5jX2hhbmRsZXIn CityZWxvY2F0YWJsZSA9IHRydWUKLS0gCjIuNDcuMwoK --_005_IA1PR07MB983072521EE7FDEE98902534A9592IA1PR07MB9830namp_--