From nobody Sun May 24 23:31:33 2026 Received: from mail-dl1-f46.google.com (mail-dl1-f46.google.com [74.125.82.46]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 251BE3EAC84 for ; Wed, 20 May 2026 14:51:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779288667; cv=none; b=YRrL5B26myQGC8SEAAkGJROJ2V4ARvSk+H5Ik3HLNMB4Hgi6D2wTy2vAnaX284UOwZ9gXu2K44cqlk+xgyrXIA7L99ZTS7qppAn3y/6JkNuO2viHxN3/F4OsbuTStqR6REiL0e48Mns1NtrOWqsw94s+0s/sGq+PvE+fzQ+hdig= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779288667; c=relaxed/simple; bh=e2XahwLfjgnbGHXH0VP8xhIvz7Nouf4bBUNY3er2lmg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=qPWXCQmdJOa6Cnki5fcZR4zFspta2FSnOnFKH3Zg+triPI2cZjbxvs5y3PKGDQAWDb8zNZCaQgPVf0dzLpPvWA/07dwRiCt/MKt4+3ml6kdsc6fO9rJSWX3T6StgD06rEiAo/7TFmWVm/eaqP8qqNP7NOE7IEe2DV6vqQqc42xs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=UNsM4N8u; arc=none smtp.client-ip=74.125.82.46 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="UNsM4N8u" Received: by mail-dl1-f46.google.com with SMTP id a92af1059eb24-12c1a170a50so6200602c88.0 for ; Wed, 20 May 2026 07:51:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1779288665; x=1779893465; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=wdQkYsR4QLAUHGmj1zuNkkqwdRGcQivkMOHXJMo1kLw=; b=UNsM4N8u1hCiM5BtDWvNH9ekVXaUvo7oKtzkKJZPwjqFmCL4HHPMVxwiXfn9KGHlJs rDDBNKCLrMsnU0R5oH7xc/qX0PIL2k+QF1zqDgWlwuzwa8JTrCHyxUGOlCHZTDMeVAxe PGFeVLwW5xfIsHEH+E6n1lAyEzWEzt8GiNwvj4uth3mNh/XuWZ6aNbFiUmE048y2APO3 onCi/fUq2qf8LLBkjeDkMla02c8bSzxU7vAjNLmLv02TFZI7GsUnUKwyD3yOw1KT8ukG 23ia2aPoGvhNStNt6tPCPjO+DQdSCUnDWOKk8/IsDbtK5ff5uH62zGW49XKU4xJBkmXJ Q79Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779288665; x=1779893465; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=wdQkYsR4QLAUHGmj1zuNkkqwdRGcQivkMOHXJMo1kLw=; b=bbIHotAg5Z1B3gLN1VyA4SskKW3nM+yublFpxmzHbcim5kcfq27AKGsV2OWvZv6tvx n1u5V+rtOX9PBMwMAjTebMpStF31saUevUN10Ll1yHatI9C156D8esmFd9b0WaugiJQG aUQBo21c4LwvARx0bcUK5k1oj/vckKtmq/yt+LhjolxrBVM+eXnooS29h08LNLtnVqWq MRfv6n5nhw+7dsyeq7SqqnugMQwQck/s9DnJ9JOtJqpKsYxNfH7dJvBz8e54psB3OHxb rBf9gLuAGZukZr7UjFo35Xagg775obllCRIKVHs1wD9brMbPZqy8HOhsU/76HoMFTkzV BvCg== X-Forwarded-Encrypted: i=1; AFNElJ8cp7COefaL4feJeTeyXuk0PrZ/X72SZQd+NF+yrg7l35uF99uiDDI57I5SFIcoYFCzkXQeD/Ipq/mif9c=@vger.kernel.org X-Gm-Message-State: AOJu0Yzbc2GKzGF30FFKK6osE7DqwTIDDYBD0xBN3IParenF70jj7K5Z WuYt69l9i8Nrce+CqLaPpVbu5aTeEoJZq3d+3QtT/PWDfdnReiDiiP1A X-Gm-Gg: Acq92OG3ye+6YR5wPyGo1/KccOvf3CXOPOOQKhTQLUcCN9pi7XRG3VeXF0mV2+8rgNu tU+OucgeEyd7kKG9ROa8kf3iXyUpqcx4JB4y/S3OYQxHFINajLzaQ/1mrwBrfspNiZb9pWXrRzY FLbFjTg91K/PuunsBchr0sEUDN4Q7bDMEYljttn2SD19O2ZQq2cEtcRoMvoUj75ZsgRz842XvyZ bpzMvBxETblT/Im4HYGQqRcZPTNatEhu/e26oBcWSdhtMl+CXdn7Os44sOyzVLv2e9sGDePWrmZ SNIOrudkyYvYo/Sf2eESRsTnOgUh83oEBrrEuRgdq5AmSbpdJfVKQFOxsHjaksh8cSf5r6kCJ+l NIHCMcZ6N0GXsQ4zFyWxzeJI5O4G58MyoLLU5FzPuIuLK0rtElxL3Gc5rMTmvUrMM1MQQm4kWCn MlQdGSNjBZ2MXGuAUe8G+DyiwADCZt12VneBRDKCwHtvJKfFVTzaGoJWk4crqgwkwFp5Opo71HI lhnMoZmrx3T X-Received: by 2002:a05:7022:6621:b0:134:a710:d908 with SMTP id a92af1059eb24-1350451887emr9291142c88.13.1779288664871; Wed, 20 May 2026 07:51:04 -0700 (PDT) Received: from [192.168.1.18] (177-4-162-74.user3p.v-tal.net.br. [177.4.162.74]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-134cbcb93f3sm27334864c88.3.2026.05.20.07.51.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 20 May 2026 07:51:04 -0700 (PDT) From: =?utf-8?q?C=C3=A1ssio_Gabriel?= Date: Wed, 20 May 2026 11:50:55 -0300 Subject: [PATCH v2 1/2] ALSA: hda: cs35l56: Free ACPI _SUB string on errors Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260520-alsa-cs35l56-system-name-leak-v2-1-60f26c159023@gmail.com> References: <20260520-alsa-cs35l56-system-name-leak-v2-0-60f26c159023@gmail.com> In-Reply-To: <20260520-alsa-cs35l56-system-name-leak-v2-0-60f26c159023@gmail.com> To: David Rhodes , Richard Fitzgerald , Takashi Iwai , Jaroslav Kysela , Simon Trimmer , Mark Brown Cc: linux-sound@vger.kernel.org, patches@opensource.cirrus.com, linux-kernel@vger.kernel.org, =?utf-8?q?C=C3=A1ssio_Gabriel?= X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=3244; i=cassiogabrielcontato@gmail.com; h=from:subject:message-id; bh=e2XahwLfjgnbGHXH0VP8xhIvz7Nouf4bBUNY3er2lmg=; b=owGbwMvMwCV2IdZeKur/u2bG02pJDFm8pwJZ7ndtEu6RPsw+rTtLsvXHF0GTJw7PX3ApHdsTe X7Wsg79jlIWBjEuBlkxRZbVSYss93Q9uFoft8IDZg4rE8gQBi5OAZjI+QUMf6Usfs/0e3BCwje8 +daSq4t/P3O8qzb9wx+1Bs329WIXDrgxMhzlN7LZ4ZP6snL6Vf0aNQ3V6qdLv66e3+4kZxz0YL/ yHAYA X-Developer-Key: i=cassiogabrielcontato@gmail.com; a=openpgp; fpr=AB62A239BC8AE0D57F5EA848D05D3F1A5AFFEE83 cs35l56_hda_read_acpi() gets an allocated ACPI _SUB string from acpi_get_subsystem_id(). On success, that string is either used directly as the firmware system name or used to construct a speaker-ID-specific firmware system name. Several error paths after the _SUB lookup can return without releasing the allocated string. This includes speaker ID lookup errors other than -ENOENT, and errors after a firmware system name has been derived but before ownership is transferred to cs35l56->system_name. Use scoped cleanup for the temporary _SUB string and the derived system name, and transfer ownership to cs35l56->system_name only after the remaining failure paths in cs35l56_hda_read_acpi() have completed. Fixes: 6f03b446cbae ("ALSA: hda: cs35l56: Add support for speaker id") Fixes: 40b1c2f9b299 ("ALSA: hda/cs35l56: Workaround bad dev-index on Lenovo= Yoga Book 9i GenX") Signed-off-by: C=C3=A1ssio Gabriel --- sound/hda/codecs/side-codecs/cs35l56_hda.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/sound/hda/codecs/side-codecs/cs35l56_hda.c b/sound/hda/codecs/= side-codecs/cs35l56_hda.c index cdbc576569ef..7c9c98436757 100644 --- a/sound/hda/codecs/side-codecs/cs35l56_hda.c +++ b/sound/hda/codecs/side-codecs/cs35l56_hda.c @@ -1025,7 +1025,7 @@ static int cs35l56_hda_read_acpi(struct cs35l56_hda *= cs35l56, int hid, int id) u32 values[HDA_MAX_COMPONENTS]; char hid_string[8]; struct acpi_device *adev; - const char *property, *sub; + const char *property; int i, ret; =20 /* @@ -1047,7 +1047,9 @@ static int cs35l56_hda_read_acpi(struct cs35l56_hda *= cs35l56, int hid, int id) /* Initialize things that could be overwritten by a fixup */ cs35l56->index =3D -1; =20 - sub =3D acpi_get_subsystem_id(ACPI_HANDLE(cs35l56->base.dev)); + const char *sub __free(kfree) =3D acpi_get_subsystem_id(ACPI_HANDLE(cs35l= 56->base.dev)); + const char *system_name __free(kfree) =3D NULL; + ret =3D cs35l56_hda_apply_platform_fixups(cs35l56, sub, &id); if (ret) return ret; @@ -1095,11 +1097,10 @@ static int cs35l56_hda_read_acpi(struct cs35l56_hda= *cs35l56, int hid, int id) ret =3D cirrus_scodec_get_speaker_id(cs35l56->base.dev, cs35l56->index, cs35l56->num_amps, -1); if (ret =3D=3D -ENOENT) { - cs35l56->system_name =3D sub; + system_name =3D no_free_ptr(sub); } else if (ret >=3D 0) { - cs35l56->system_name =3D kasprintf(GFP_KERNEL, "%s-spkid%d", sub, ret); - kfree(sub); - if (!cs35l56->system_name) + system_name =3D kasprintf(GFP_KERNEL, "%s-spkid%d", sub, ret); + if (!system_name) return -ENOMEM; } else { return ret; @@ -1118,12 +1119,14 @@ static int cs35l56_hda_read_acpi(struct cs35l56_hda= *cs35l56, int hid, int id) * line and reset all the amps */ if (ret !=3D -EBUSY) - return dev_err_probe(cs35l56->base.dev, ret, "Failed to get reset GPIO\= n"); + return dev_err_probe(cs35l56->base.dev, ret, + "Failed to get reset GPIO\n"); =20 dev_info(cs35l56->base.dev, "Reset GPIO busy, assume shared reset\n"); cs35l56->base.reset_gpio =3D NULL; } =20 + cs35l56->system_name =3D no_free_ptr(system_name); return 0; =20 err: --=20 2.54.0 From nobody Sun May 24 23:31:33 2026 Received: from mail-dl1-f45.google.com (mail-dl1-f45.google.com [74.125.82.45]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 446D9351C3D for ; Wed, 20 May 2026 14:51:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779288670; cv=none; b=DvsEGOuZFZYEg0M/hnH+FCuBTXZ5LPG9hV31f1E43/kEv42ut8gr5W0C7csbRW9iGhLp7boc+ns0ZxKwdDPkzFIWY7tW5WAhPOBNRy6Pf4spnb70fSZOcW5DVJgDtmaDjdFIPrF5W7M1ZcbdtYquP90R6IOiAVXHiqzhOwk2UEM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779288670; c=relaxed/simple; bh=CYDldYs/XfyHeESUEuZgI6zHvpGVRgeHUmWISgsC1W8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Hags39zAHVoKuJAxca4yak0DpiIIEv8y9dpM5wZVipPZVWhNynCzGkxDXpsO9g9gz54uQLtbnim+/hKg2cz4C/b21vqV+R7SpqVY2M8iBHF2+5bS5sLYBWIfNe4ItxXaYXt0YEDIU0kjeI+55YMwIfjnQ/4JzgDO81uhb3E+ODQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=rHgxQnT5; arc=none smtp.client-ip=74.125.82.45 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="rHgxQnT5" Received: by mail-dl1-f45.google.com with SMTP id a92af1059eb24-1334825de43so4597328c88.0 for ; Wed, 20 May 2026 07:51:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1779288668; x=1779893468; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=1e7cb5PYNRFBDikndRC9Bh+f5WtQR2K+GB3lpw9q7VU=; b=rHgxQnT51bD5vjSDPDqI4VGkm+ZnYe858C0VsHuLW75Dg9MeXuzUUwK5aOFQ/xEgSY OqHL4r6F8O5kXPUP6Wyq4lxRTsge5E3WW7YXLk0k0id0Tr9beS8XSi6qYyrUpRqYL7Oa dLogLyv9pBNi9B4dHYG+ZIu0h83aw97gWtiLonAopdR0Iabz01abZ4ghSIBfLo2HhCHU Jow/PrVH8k7BaoCHg/y6A/UqZLirRTvOseAc5AE7TiJkddiuBlg//EjWDOQihLSoeZ9Y gjoH39zPtDxPq4G/yKpIX/QixlroWKVY3mfyOMdtBXA9hQg5awuAM6YCa7ozISgxjsW2 RA4Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779288668; x=1779893468; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=1e7cb5PYNRFBDikndRC9Bh+f5WtQR2K+GB3lpw9q7VU=; b=CkXxHN9iKLJJRF9uL0dtfRDNUqjk6/WfvxCl5FfTlc+ml9RS6isOSAqH43NThOweJ4 89b5DHzXXCn2Tt4ymQe05EkGw+wGKJjktEXj8dConKWzLhQnXF6lAp7AI+aTk1hHI7ji LbFPFoms1zQx7/7QFgplnxMrV0i0YAd1FAeP5IqYMaHxIW4JLRtTJRSKwW8ucdSfdNmc k6io6fKT5Ok3/6iprfFdI+xk80lYHDEMsnA38ZcKMWmL0YdDWEWggtIRyxjSgaFqVDb7 4DVs1b5xQDH8GW8BKlY94xKOoFM1RopONYyYs2P/DEnOFYOQomfTlw/2wnz+Ju3bZfe+ ny0w== X-Forwarded-Encrypted: i=1; AFNElJ+uhJdl2DlEB8yxmCLHQTzDMtM+9mhwarOtuTB7KOQJBgMsltZo/DjtBrGPv61owMtbHHHWJIMGAyc5VNA=@vger.kernel.org X-Gm-Message-State: AOJu0Ywok6Yl9cBANQh06cJqLv+5vQ+EjYT9qTJFl0rhly3q3LzmCXwI Z15DJ35E4Flat/U8go/4Xabzu9fP2rO/bWE03Nq/Etzb3MSyAIZxNwKv X-Gm-Gg: Acq92OHiaJnUX4p2oUBsD+Ij4d4+7ZjjuSvy223XXrMs31osNFn+6IA7eOgqbkqoEeu HdDjEk7ZKgVU41xv7B93yxdOyKEcwofJhC3kh5GQLb3Ii9sOXVKit//q8F5JaYyssl/OADst0fC gQyaEqIowtmCHnkDhYp3UdQS+IkOEbVNvIxG6QWEXSckITe9jzPPHmeWVJ7kKCXt1pLhuk/el6q zm2fvTPg7HNV/9IMI02EcSzvi2meYCxeRPFQ1cSpNpT4CxsY8wnwZAmebEOvvOztiQI/i332lbU 4YV6yg+I3cWZa8x9/N1P7vnvrs4XuKI1yUoa0tqfh12dpDX2/QSj0EleezncIbCXtQ+pEpBXKVW yFAa1L4NQFfrvVrFUQTXGpqM8Jo7hGLZmqtS85J3iLu1jbjfjSwvR5qx0G2OqoIfzxNULd0qrhl c22jSgyVbeN/RKOdkNwobAiws0SldDN57sW36ejHOiz2r4JQAXQ1ViG+yctzC+RaGpOmr2Ox4op pWo+ZoPug2r X-Received: by 2002:a05:7022:4184:b0:12d:de3e:86ba with SMTP id a92af1059eb24-13505930870mr10577977c88.42.1779288668332; Wed, 20 May 2026 07:51:08 -0700 (PDT) Received: from [192.168.1.18] (177-4-162-74.user3p.v-tal.net.br. [177.4.162.74]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-134cbcb93f3sm27334864c88.3.2026.05.20.07.51.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 20 May 2026 07:51:07 -0700 (PDT) From: =?utf-8?q?C=C3=A1ssio_Gabriel?= Date: Wed, 20 May 2026 11:50:56 -0300 Subject: [PATCH v2 2/2] ALSA: hda: cs35l56: Free system name on probe errors Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260520-alsa-cs35l56-system-name-leak-v2-2-60f26c159023@gmail.com> References: <20260520-alsa-cs35l56-system-name-leak-v2-0-60f26c159023@gmail.com> In-Reply-To: <20260520-alsa-cs35l56-system-name-leak-v2-0-60f26c159023@gmail.com> To: David Rhodes , Richard Fitzgerald , Takashi Iwai , Jaroslav Kysela , Simon Trimmer , Mark Brown Cc: linux-sound@vger.kernel.org, patches@opensource.cirrus.com, linux-kernel@vger.kernel.org, =?utf-8?q?C=C3=A1ssio_Gabriel?= X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1100; i=cassiogabrielcontato@gmail.com; h=from:subject:message-id; bh=CYDldYs/XfyHeESUEuZgI6zHvpGVRgeHUmWISgsC1W8=; b=owGbwMvMwCV2IdZeKur/u2bG02pJDFm8pwL/nRBT0zh+/CnL2fwpqQKcx5e7TX74bVn1BN5jz YxTxSw2dJSyMIhxMciKKbKsTlpkuafrwdX6uBUeMHNYmUCGMHBxCsBEbk9kZNj/9b/ytuBdcxZ/ UDHmyCrs/zsjXmPOzxNLXxe5ZzHm/OVl+J9naO19VmVt984TOQ8M25t5WGb/W6Ys975pJ+Mc8YU 12ewA X-Developer-Key: i=cassiogabrielcontato@gmail.com; a=openpgp; fpr=AB62A239BC8AE0D57F5EA848D05D3F1A5AFFEE83 cs35l56_hda_read_acpi() stores an allocated firmware system name in cs35l56->system_name. The normal remove path frees it, but remove is not called if cs35l56_hda_common_probe() fails after read_acpi() has succeeded. Free cs35l56->system_name from the common probe error path and clear the pointer. Fixes: 73cfbfa9caea ("ALSA: hda/cs35l56: Add driver for Cirrus Logic CS35L5= 6 amplifier") Signed-off-by: C=C3=A1ssio Gabriel --- sound/hda/codecs/side-codecs/cs35l56_hda.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sound/hda/codecs/side-codecs/cs35l56_hda.c b/sound/hda/codecs/= side-codecs/cs35l56_hda.c index 7c9c98436757..8130ec271165 100644 --- a/sound/hda/codecs/side-codecs/cs35l56_hda.c +++ b/sound/hda/codecs/side-codecs/cs35l56_hda.c @@ -1240,6 +1240,8 @@ int cs35l56_hda_common_probe(struct cs35l56_hda *cs35= l56, int hid, int id) cs_dsp_remove(&cs35l56->cs_dsp); err: gpiod_set_value_cansleep(cs35l56->base.reset_gpio, 0); + kfree(cs35l56->system_name); + cs35l56->system_name =3D NULL; =20 return ret; } --=20 2.54.0