All of lore.kernel.org
 help / color / mirror / Atom feed
From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: stable@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	patches@lists.linux.dev,
	Rasmus Villemoes <linux@rasmusvillemoes.dk>,
	"Gustavo A. R. Silva" <gustavoars@kernel.org>,
	Nathan Chancellor <nathan@kernel.org>,
	Jason Gunthorpe <jgg@ziepe.ca>,
	Nick Desaulniers <ndesaulniers@google.com>,
	Leon Romanovsky <leon@kernel.org>,
	Keith Busch <kbusch@kernel.org>, Len Baker <len.baker@gmx.com>,
	Kees Cook <keescook@chromium.org>,
	Sasha Levin <sashal@kernel.org>
Subject: [PATCH 5.10 013/191] overflow: Implement size_t saturating arithmetic helpers
Date: Wed, 15 Nov 2023 15:44:48 -0500	[thread overview]
Message-ID: <20231115204645.306955467@linuxfoundation.org> (raw)
In-Reply-To: <20231115204644.490636297@linuxfoundation.org>

5.10-stable review patch.  If anyone has any objections, please let me know.

------------------

From: Kees Cook <keescook@chromium.org>

[ Upstream commit e1be43d9b5d0d1310dbd90185a8e5c7145dde40f ]

In order to perform more open-coded replacements of common allocation
size arithmetic, the kernel needs saturating (SIZE_MAX) helpers for
multiplication, addition, and subtraction. For example, it is common in
allocators, especially on realloc, to add to an existing size:

    p = krealloc(map->patch,
                 sizeof(struct reg_sequence) * (map->patch_regs + num_regs),
                 GFP_KERNEL);

There is no existing saturating replacement for this calculation, and
just leaving the addition open coded inside array_size() could
potentially overflow as well. For example, an overflow in an expression
for a size_t argument might wrap to zero:

    array_size(anything, something_at_size_max + 1) == 0

Introduce size_mul(), size_add(), and size_sub() helpers that
implicitly promote arguments to size_t and saturated calculations for
use in allocations. With these helpers it is also possible to redefine
array_size(), array3_size(), flex_array_size(), and struct_size() in
terms of the new helpers.

As with the check_*_overflow() helpers, the new helpers use __must_check,
though what is really desired is a way to make sure that assignment is
only to a size_t lvalue. Without this, it's still possible to introduce
overflow/underflow via type conversion (i.e. from size_t to int).
Enforcing this will currently need to be left to static analysis or
future use of -Wconversion.

Additionally update the overflow unit tests to force runtime evaluation
for the pathological cases.

Cc: Rasmus Villemoes <linux@rasmusvillemoes.dk>
Cc: Gustavo A. R. Silva <gustavoars@kernel.org>
Cc: Nathan Chancellor <nathan@kernel.org>
Cc: Jason Gunthorpe <jgg@ziepe.ca>
Cc: Nick Desaulniers <ndesaulniers@google.com>
Cc: Leon Romanovsky <leon@kernel.org>
Cc: Keith Busch <kbusch@kernel.org>
Cc: Len Baker <len.baker@gmx.com>
Signed-off-by: Kees Cook <keescook@chromium.org>
Stable-dep-of: d692873cbe86 ("gve: Use size_add() in call to struct_size()")
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
 Documentation/process/deprecated.rst |  20 ++++-
 include/linux/overflow.h             | 110 +++++++++++++++++----------
 lib/test_overflow.c                  |  98 ++++++++++++++++++++++++
 3 files changed, 184 insertions(+), 44 deletions(-)

diff --git a/Documentation/process/deprecated.rst b/Documentation/process/deprecated.rst
index 9d83b8db88740..86ea327b7e3a7 100644
--- a/Documentation/process/deprecated.rst
+++ b/Documentation/process/deprecated.rst
@@ -70,6 +70,9 @@ Instead, the 2-factor form of the allocator should be used::
 
 	foo = kmalloc_array(count, size, GFP_KERNEL);
 
+Specifically, kmalloc() can be replaced with kmalloc_array(), and
+kzalloc() can be replaced with kcalloc().
+
 If no 2-factor form is available, the saturate-on-overflow helpers should
 be used::
 
@@ -90,9 +93,20 @@ Instead, use the helper::
         array usage and switch to a `flexible array member
         <#zero-length-and-one-element-arrays>`_ instead.
 
-See array_size(), array3_size(), and struct_size(),
-for more details as well as the related check_add_overflow() and
-check_mul_overflow() family of functions.
+For other calculations, please compose the use of the size_mul(),
+size_add(), and size_sub() helpers. For example, in the case of::
+
+	foo = krealloc(current_size + chunk_size * (count - 3), GFP_KERNEL);
+
+Instead, use the helpers::
+
+	foo = krealloc(size_add(current_size,
+				size_mul(chunk_size,
+					 size_sub(count, 3))), GFP_KERNEL);
+
+For more details, also see array3_size() and flex_array_size(),
+as well as the related check_mul_overflow(), check_add_overflow(),
+check_sub_overflow(), and check_shl_overflow() family of functions.
 
 simple_strtol(), simple_strtoll(), simple_strtoul(), simple_strtoull()
 ----------------------------------------------------------------------
diff --git a/include/linux/overflow.h b/include/linux/overflow.h
index ef74051d5cfed..35af574d006f5 100644
--- a/include/linux/overflow.h
+++ b/include/linux/overflow.h
@@ -250,81 +250,94 @@ static inline bool __must_check __must_check_overflow(bool overflow)
 }))
 
 /**
- * array_size() - Calculate size of 2-dimensional array.
- *
- * @a: dimension one
- * @b: dimension two
+ * size_mul() - Calculate size_t multiplication with saturation at SIZE_MAX
  *
- * Calculates size of 2-dimensional array: @a * @b.
+ * @factor1: first factor
+ * @factor2: second factor
  *
- * Returns: number of bytes needed to represent the array or SIZE_MAX on
- * overflow.
+ * Returns: calculate @factor1 * @factor2, both promoted to size_t,
+ * with any overflow causing the return value to be SIZE_MAX. The
+ * lvalue must be size_t to avoid implicit type conversion.
  */
-static inline __must_check size_t array_size(size_t a, size_t b)
+static inline size_t __must_check size_mul(size_t factor1, size_t factor2)
 {
 	size_t bytes;
 
-	if (check_mul_overflow(a, b, &bytes))
+	if (check_mul_overflow(factor1, factor2, &bytes))
 		return SIZE_MAX;
 
 	return bytes;
 }
 
 /**
- * array3_size() - Calculate size of 3-dimensional array.
+ * size_add() - Calculate size_t addition with saturation at SIZE_MAX
  *
- * @a: dimension one
- * @b: dimension two
- * @c: dimension three
- *
- * Calculates size of 3-dimensional array: @a * @b * @c.
+ * @addend1: first addend
+ * @addend2: second addend
  *
- * Returns: number of bytes needed to represent the array or SIZE_MAX on
- * overflow.
+ * Returns: calculate @addend1 + @addend2, both promoted to size_t,
+ * with any overflow causing the return value to be SIZE_MAX. The
+ * lvalue must be size_t to avoid implicit type conversion.
  */
-static inline __must_check size_t array3_size(size_t a, size_t b, size_t c)
+static inline size_t __must_check size_add(size_t addend1, size_t addend2)
 {
 	size_t bytes;
 
-	if (check_mul_overflow(a, b, &bytes))
-		return SIZE_MAX;
-	if (check_mul_overflow(bytes, c, &bytes))
+	if (check_add_overflow(addend1, addend2, &bytes))
 		return SIZE_MAX;
 
 	return bytes;
 }
 
-/*
- * Compute a*b+c, returning SIZE_MAX on overflow. Internal helper for
- * struct_size() below.
+/**
+ * size_sub() - Calculate size_t subtraction with saturation at SIZE_MAX
+ *
+ * @minuend: value to subtract from
+ * @subtrahend: value to subtract from @minuend
+ *
+ * Returns: calculate @minuend - @subtrahend, both promoted to size_t,
+ * with any overflow causing the return value to be SIZE_MAX. For
+ * composition with the size_add() and size_mul() helpers, neither
+ * argument may be SIZE_MAX (or the result with be forced to SIZE_MAX).
+ * The lvalue must be size_t to avoid implicit type conversion.
  */
-static inline __must_check size_t __ab_c_size(size_t a, size_t b, size_t c)
+static inline size_t __must_check size_sub(size_t minuend, size_t subtrahend)
 {
 	size_t bytes;
 
-	if (check_mul_overflow(a, b, &bytes))
-		return SIZE_MAX;
-	if (check_add_overflow(bytes, c, &bytes))
+	if (minuend == SIZE_MAX || subtrahend == SIZE_MAX ||
+	    check_sub_overflow(minuend, subtrahend, &bytes))
 		return SIZE_MAX;
 
 	return bytes;
 }
 
 /**
- * struct_size() - Calculate size of structure with trailing array.
- * @p: Pointer to the structure.
- * @member: Name of the array member.
- * @count: Number of elements in the array.
+ * array_size() - Calculate size of 2-dimensional array.
  *
- * Calculates size of memory needed for structure @p followed by an
- * array of @count number of @member elements.
+ * @a: dimension one
+ * @b: dimension two
  *
- * Return: number of bytes needed or SIZE_MAX on overflow.
+ * Calculates size of 2-dimensional array: @a * @b.
+ *
+ * Returns: number of bytes needed to represent the array or SIZE_MAX on
+ * overflow.
  */
-#define struct_size(p, member, count)					\
-	__ab_c_size(count,						\
-		    sizeof(*(p)->member) + __must_be_array((p)->member),\
-		    sizeof(*(p)))
+#define array_size(a, b)	size_mul(a, b)
+
+/**
+ * array3_size() - Calculate size of 3-dimensional array.
+ *
+ * @a: dimension one
+ * @b: dimension two
+ * @c: dimension three
+ *
+ * Calculates size of 3-dimensional array: @a * @b * @c.
+ *
+ * Returns: number of bytes needed to represent the array or SIZE_MAX on
+ * overflow.
+ */
+#define array3_size(a, b, c)	size_mul(size_mul(a, b), c)
 
 /**
  * flex_array_size() - Calculate size of a flexible array member
@@ -340,7 +353,22 @@ static inline __must_check size_t __ab_c_size(size_t a, size_t b, size_t c)
  * Return: number of bytes needed or SIZE_MAX on overflow.
  */
 #define flex_array_size(p, member, count)				\
-	array_size(count,						\
-		    sizeof(*(p)->member) + __must_be_array((p)->member))
+	size_mul(count,							\
+		 sizeof(*(p)->member) + __must_be_array((p)->member))
+
+/**
+ * struct_size() - Calculate size of structure with trailing flexible array.
+ *
+ * @p: Pointer to the structure.
+ * @member: Name of the array member.
+ * @count: Number of elements in the array.
+ *
+ * Calculates size of memory needed for structure @p followed by an
+ * array of @count number of @member elements.
+ *
+ * Return: number of bytes needed or SIZE_MAX on overflow.
+ */
+#define struct_size(p, member, count)					\
+	size_add(sizeof(*(p)), flex_array_size(p, member, count))
 
 #endif /* __LINUX_OVERFLOW_H */
diff --git a/lib/test_overflow.c b/lib/test_overflow.c
index 7a4b6f6c5473c..7a5a5738d2d21 100644
--- a/lib/test_overflow.c
+++ b/lib/test_overflow.c
@@ -588,12 +588,110 @@ static int __init test_overflow_allocation(void)
 	return err;
 }
 
+struct __test_flex_array {
+	unsigned long flags;
+	size_t count;
+	unsigned long data[];
+};
+
+static int __init test_overflow_size_helpers(void)
+{
+	struct __test_flex_array *obj;
+	int count = 0;
+	int err = 0;
+	int var;
+
+#define check_one_size_helper(expected, func, args...)	({	\
+	bool __failure = false;					\
+	size_t _r;						\
+								\
+	_r = func(args);					\
+	if (_r != (expected)) {					\
+		pr_warn("expected " #func "(" #args ") "	\
+			"to return %zu but got %zu instead\n",	\
+			(size_t)(expected), _r);		\
+		__failure = true;				\
+	}							\
+	count++;						\
+	__failure;						\
+})
+
+	var = 4;
+	err |= check_one_size_helper(20,       size_mul, var++, 5);
+	err |= check_one_size_helper(20,       size_mul, 4, var++);
+	err |= check_one_size_helper(0,	       size_mul, 0, 3);
+	err |= check_one_size_helper(0,	       size_mul, 3, 0);
+	err |= check_one_size_helper(6,	       size_mul, 2, 3);
+	err |= check_one_size_helper(SIZE_MAX, size_mul, SIZE_MAX,  1);
+	err |= check_one_size_helper(SIZE_MAX, size_mul, SIZE_MAX,  3);
+	err |= check_one_size_helper(SIZE_MAX, size_mul, SIZE_MAX, -3);
+
+	var = 4;
+	err |= check_one_size_helper(9,        size_add, var++, 5);
+	err |= check_one_size_helper(9,        size_add, 4, var++);
+	err |= check_one_size_helper(9,	       size_add, 9, 0);
+	err |= check_one_size_helper(9,	       size_add, 0, 9);
+	err |= check_one_size_helper(5,	       size_add, 2, 3);
+	err |= check_one_size_helper(SIZE_MAX, size_add, SIZE_MAX,  1);
+	err |= check_one_size_helper(SIZE_MAX, size_add, SIZE_MAX,  3);
+	err |= check_one_size_helper(SIZE_MAX, size_add, SIZE_MAX, -3);
+
+	var = 4;
+	err |= check_one_size_helper(1,        size_sub, var--, 3);
+	err |= check_one_size_helper(1,        size_sub, 4, var--);
+	err |= check_one_size_helper(1,        size_sub, 3, 2);
+	err |= check_one_size_helper(9,	       size_sub, 9, 0);
+	err |= check_one_size_helper(SIZE_MAX, size_sub, 9, -3);
+	err |= check_one_size_helper(SIZE_MAX, size_sub, 0, 9);
+	err |= check_one_size_helper(SIZE_MAX, size_sub, 2, 3);
+	err |= check_one_size_helper(SIZE_MAX, size_sub, SIZE_MAX,  0);
+	err |= check_one_size_helper(SIZE_MAX, size_sub, SIZE_MAX, 10);
+	err |= check_one_size_helper(SIZE_MAX, size_sub, 0,  SIZE_MAX);
+	err |= check_one_size_helper(SIZE_MAX, size_sub, 14, SIZE_MAX);
+	err |= check_one_size_helper(SIZE_MAX - 2, size_sub, SIZE_MAX - 1,  1);
+	err |= check_one_size_helper(SIZE_MAX - 4, size_sub, SIZE_MAX - 1,  3);
+	err |= check_one_size_helper(1,		size_sub, SIZE_MAX - 1, -3);
+
+	var = 4;
+	err |= check_one_size_helper(4 * sizeof(*obj->data),
+				     flex_array_size, obj, data, var++);
+	err |= check_one_size_helper(5 * sizeof(*obj->data),
+				     flex_array_size, obj, data, var++);
+	err |= check_one_size_helper(0, flex_array_size, obj, data, 0);
+	err |= check_one_size_helper(sizeof(*obj->data),
+				     flex_array_size, obj, data, 1);
+	err |= check_one_size_helper(7 * sizeof(*obj->data),
+				     flex_array_size, obj, data, 7);
+	err |= check_one_size_helper(SIZE_MAX,
+				     flex_array_size, obj, data, -1);
+	err |= check_one_size_helper(SIZE_MAX,
+				     flex_array_size, obj, data, SIZE_MAX - 4);
+
+	var = 4;
+	err |= check_one_size_helper(sizeof(*obj) + (4 * sizeof(*obj->data)),
+				     struct_size, obj, data, var++);
+	err |= check_one_size_helper(sizeof(*obj) + (5 * sizeof(*obj->data)),
+				     struct_size, obj, data, var++);
+	err |= check_one_size_helper(sizeof(*obj), struct_size, obj, data, 0);
+	err |= check_one_size_helper(sizeof(*obj) + sizeof(*obj->data),
+				     struct_size, obj, data, 1);
+	err |= check_one_size_helper(SIZE_MAX,
+				     struct_size, obj, data, -3);
+	err |= check_one_size_helper(SIZE_MAX,
+				     struct_size, obj, data, SIZE_MAX - 3);
+
+	pr_info("%d overflow size helper tests finished\n", count);
+
+	return err;
+}
+
 static int __init test_module_init(void)
 {
 	int err = 0;
 
 	err |= test_overflow_calculation();
 	err |= test_overflow_shift();
+	err |= test_overflow_size_helpers();
 	err |= test_overflow_allocation();
 
 	if (err) {
-- 
2.42.0




  parent reply	other threads:[~2023-11-15 20:53 UTC|newest]

Thread overview: 210+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-11-15 20:44 [PATCH 5.10 000/191] 5.10.201-rc1 review Greg Kroah-Hartman
2023-11-15 20:44 ` [PATCH 5.10 001/191] iov_iter, x86: Be consistent about the __user tag on copy_mc_to_user() Greg Kroah-Hartman
2023-11-15 20:44 ` [PATCH 5.10 002/191] sched/uclamp: Ignore (util == 0) optimization in feec() when p_util_max = 0 Greg Kroah-Hartman
2023-11-15 20:44 ` [PATCH 5.10 003/191] vfs: fix readahead(2) on block devices Greg Kroah-Hartman
2023-11-15 20:44 ` [PATCH 5.10 004/191] x86/srso: Fix SBPB enablement for (possible) future fixed HW Greg Kroah-Hartman
2023-11-15 20:44 ` [PATCH 5.10 005/191] futex: Dont include process MM in futex key on no-MMU Greg Kroah-Hartman
2023-11-15 20:44 ` [PATCH 5.10 006/191] x86/boot: Fix incorrect startup_gdt_descr.size Greg Kroah-Hartman
2023-11-15 20:44 ` [PATCH 5.10 007/191] pstore/platform: Add check for kstrdup Greg Kroah-Hartman
2023-11-15 20:44 ` [PATCH 5.10 008/191] genirq/matrix: Exclude managed interrupts in irq_matrix_allocated() Greg Kroah-Hartman
2023-11-15 20:44 ` [PATCH 5.10 009/191] i40e: fix potential memory leaks in i40e_remove() Greg Kroah-Hartman
2023-11-15 20:44 ` [PATCH 5.10 010/191] wifi: iwlwifi: Use FW rate for non-data frames Greg Kroah-Hartman
2023-11-15 21:35   ` Johannes Berg
2023-11-15 21:45     ` Greg Kroah-Hartman
2023-11-15 20:44 ` [PATCH 5.10 011/191] udp: add missing WRITE_ONCE() around up->encap_rcv Greg Kroah-Hartman
2023-11-15 20:44 ` [PATCH 5.10 012/191] tcp: call tcp_try_undo_recovery when an RTOd TFO SYNACK is ACKed Greg Kroah-Hartman
2023-11-15 20:44 ` Greg Kroah-Hartman [this message]
2023-11-15 20:44 ` [PATCH 5.10 014/191] gve: Use size_add() in call to struct_size() Greg Kroah-Hartman
2023-11-15 20:44 ` [PATCH 5.10 015/191] mlxsw: Use size_mul() " Greg Kroah-Hartman
2023-11-15 20:44 ` [PATCH 5.10 016/191] tipc: Use size_add() in calls " Greg Kroah-Hartman
2023-11-15 20:44 ` [PATCH 5.10 017/191] net: spider_net: Use size_add() in call " Greg Kroah-Hartman
2023-11-15 20:44 ` [PATCH 5.10 018/191] wifi: rtw88: debug: Fix the NULL vs IS_ERR() bug for debugfs_create_file() Greg Kroah-Hartman
2023-11-15 20:44 ` [PATCH 5.10 019/191] wifi: mt76: mt7603: rework/fix rx pse hang check Greg Kroah-Hartman
2023-11-15 20:44 ` [PATCH 5.10 020/191] tcp_metrics: add missing barriers on delete Greg Kroah-Hartman
2023-11-15 20:44 ` [PATCH 5.10 021/191] tcp_metrics: properly set tp->snd_ssthresh in tcp_init_metrics() Greg Kroah-Hartman
2023-11-15 20:44 ` [PATCH 5.10 022/191] tcp_metrics: do not create an entry from tcp_init_metrics() Greg Kroah-Hartman
2023-11-15 20:44 ` [PATCH 5.10 023/191] wifi: rtlwifi: fix EDCA limit set by BT coexistence Greg Kroah-Hartman
2023-11-15 20:44 ` [PATCH 5.10 024/191] can: dev: can_restart(): dont crash kernel if carrier is OK Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 025/191] can: dev: can_restart(): fix race condition between controller restart and netif_carrier_on() Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 026/191] PM / devfreq: rockchip-dfi: Make pmu regmap mandatory Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 027/191] thermal: core: prevent potential string overflow Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 028/191] r8169: use tp_to_dev instead of open code Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 029/191] r8169: fix rare issue with broken rx after link-down on RTL8125 Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 030/191] chtls: fix tp->rcv_tstamp initialization Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 031/191] tcp: fix cookie_init_timestamp() overflows Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 032/191] ACPI: sysfs: Fix create_pnp_modalias() and create_of_modalias() Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 033/191] ipv6: avoid atomic fragment on GSO packets Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 034/191] net: add DEV_STATS_READ() helper Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 035/191] ipvlan: properly track tx_errors Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 036/191] regmap: debugfs: Fix a erroneous check after snprintf() Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 037/191] clk: qcom: clk-rcg2: Fix clock rate overflow for high parent frequencies Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 038/191] clk: qcom: mmcc-msm8998: Add hardware clockgating registers to some clks Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 039/191] clk: qcom: mmcc-msm8998: Dont check halt bit on some branch clks Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 040/191] clk: qcom: mmcc-msm8998: Set bimc_smmu_gdsc always on Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 041/191] clk: qcom: mmcc-msm8998: Fix the SMMU GDSC Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 042/191] clk: qcom: gcc-sm8150: use ARRAY_SIZE instead of specifying num_parents Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 043/191] clk: qcom: gcc-sm8150: Fix gcc_sdcc2_apps_clk_src Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 044/191] clk: imx: Select MXC_CLK for CLK_IMX8QXP Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 045/191] clk: imx: imx8mq: correct error handling path Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 046/191] clk: asm9260: use parent index to link the reference clock Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 047/191] clk: linux/clk-provider.h: fix kernel-doc warnings and typos Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 048/191] spi: nxp-fspi: use the correct ioremap function Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 049/191] clk: keystone: pll: fix a couple NULL vs IS_ERR() checks Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 050/191] clk: ti: Add ti_dt_clk_name() helper to use clock-output-names Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 051/191] clk: ti: Update pll and clockdomain clocks to use ti_dt_clk_name() Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 052/191] clk: ti: Update component " Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 053/191] clk: ti: change ti_clk_register[_omap_hw]() API Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 054/191] clk: ti: fix double free in of_ti_divider_clk_setup() Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 055/191] clk: npcm7xx: Fix incorrect kfree Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 056/191] clk: mediatek: clk-mt6765: Add check for mtk_alloc_clk_data Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 057/191] clk: mediatek: clk-mt6779: " Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 058/191] clk: mediatek: clk-mt6797: " Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 059/191] clk: mediatek: clk-mt7629-eth: " Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 060/191] clk: mediatek: clk-mt7629: " Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 061/191] clk: mediatek: clk-mt2701: " Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 062/191] clk: qcom: config IPQ_APSS_6018 should depend on QCOM_SMEM Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 063/191] platform/x86: wmi: Fix probe failure when failing to register WMI devices Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 064/191] platform/x86: wmi: remove unnecessary initializations Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 065/191] platform/x86: wmi: Fix opening of char device Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 066/191] hwmon: (axi-fan-control) Support temperature vs pwm points Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 067/191] hwmon: (axi-fan-control) Fix possible NULL pointer dereference Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 068/191] hwmon: (coretemp) Fix potentially truncated sysfs attribute name Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 069/191] drm/rockchip: vop: Fix reset of state in duplicate state crtc funcs Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 070/191] drm/rockchip: vop: Fix call to crtc reset helper Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 071/191] drm/radeon: possible buffer overflow Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 072/191] drm/bridge: tc358768: Fix use of uninitialized variable Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 073/191] drm/bridge: tc358768: Disable non-continuous clock mode Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 074/191] drm/bridge: tc358768: Fix bit updates Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 075/191] drm/mediatek: Fix iommu fault during crtc enabling Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 076/191] drm/rockchip: cdn-dp: Fix some error handling paths in cdn_dp_probe() Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 077/191] arm64/arm: xen: enlighten: Fix KPTI checks Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 078/191] drm/rockchip: Fix type promotion bug in rockchip_gem_iommu_map() Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 079/191] xen-pciback: Consider INTx disabled when MSI/MSI-X is enabled Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 080/191] arm64: dts: qcom: msm8916: Fix iommu local address range Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 081/191] arm64: dts: qcom: sdm845-mtp: fix WiFi configuration Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 082/191] ARM: dts: qcom: mdm9615: populate vsdcc fixed regulator Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 083/191] soc: qcom: llcc: Handle a second device without data corruption Greg Kroah-Hartman
2023-11-15 20:45 ` [PATCH 5.10 084/191] firmware: ti_sci: Mark driver as non removable Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 085/191] clk: scmi: Free scmi_clk allocated when the clocks with invalid info are skipped Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 086/191] selftests/pidfd: Fix ksft print formats Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 087/191] selftests/resctrl: Ensure the benchmark commands fits to its array Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 088/191] crypto: hisilicon/hpre - Fix a erroneous check after snprintf() Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 089/191] hwrng: geode - fix accessing registers Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 090/191] libnvdimm/of_pmem: Use devm_kstrdup instead of kstrdup and check its return value Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 091/191] nd_btt: Make BTT lanes preemptible Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 092/191] crypto: caam/qi2 - fix Chacha20 + Poly1305 self test failure Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 093/191] crypto: caam/jr " Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 094/191] crypto: qat - mask device capabilities with soft straps Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 095/191] crypto: qat - increase size of buffers Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 096/191] hid: cp2112: Fix duplicate workqueue initialization Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 097/191] ARM: 9321/1: memset: cast the constant byte to unsigned char Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 098/191] ext4: move ix sanity check to corrent position Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 099/191] ASoC: fsl: mpc5200_dma.c: Fix warning of Function parameter or member not described Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 100/191] IB/mlx5: Fix rdma counter binding for RAW QP Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 101/191] RDMA/hns: Fix uninitialized ucmd in hns_roce_create_qp_common() Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 102/191] RDMA/hns: Fix signed-unsigned mixed comparisons Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 103/191] ASoC: fsl: Fix PM disable depth imbalance in fsl_easrc_probe Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 104/191] scsi: ufs: core: Leave space for \0 in utf8 desc string Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 105/191] RDMA/hfi1: Workaround truncation compilation error Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 106/191] hid: cp2112: Fix IRQ shutdown stopping polling for all IRQs on chip Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 107/191] sh: bios: Revive earlyprintk support Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 108/191] Revert "HID: logitech-hidpp: add a module parameter to keep firmware gestures" Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 109/191] HID: logitech-hidpp: Remove HIDPP_QUIRK_NO_HIDINPUT quirk Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 110/191] HID: logitech-hidpp: Dont restart IO, instead defer hid_connect() only Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 111/191] HID: logitech-hidpp: Revert "Dont restart communication if not necessary" Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 112/191] HID: logitech-hidpp: Move get_wireless_feature_index() check to hidpp_connect_event() Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 113/191] ASoC: Intel: Skylake: Fix mem leak when parsing UUIDs fails Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 114/191] padata: Convert from atomic_t to refcount_t on parallel_data->refcnt Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 115/191] padata: Fix refcnt handling in padata_free_shell() Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 116/191] ASoC: ams-delta.c: use component after check Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 117/191] mfd: core: Un-constify mfd_cell.of_reg Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 118/191] mfd: core: Ensure disabled devices are skipped without aborting Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 119/191] mfd: dln2: Fix double put in dln2_probe Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 120/191] leds: pwm: Dont disable the PWM when the LED should be off Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 121/191] leds: trigger: ledtrig-cpu:: Fix output may be truncated issue for cpu Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 122/191] tty: tty_jobctrl: fix pid memleak in disassociate_ctty() Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 123/191] livepatch: Fix missing newline character in klp_resolve_symbols() Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 124/191] perf evlist: Add evlist__add_dummy_on_all_cpus() Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 125/191] perf tools: Get rid of evlist__add_on_all_cpus() Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 126/191] perf evlist: Avoid frequency mode for the dummy event Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 127/191] usb: dwc2: fix possible NULL pointer dereference caused by driver concurrency Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 128/191] dmaengine: ti: edma: handle irq_of_parse_and_map() errors Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 129/191] misc: st_core: Do not call kfree_skb() under spin_lock_irqsave() Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 130/191] tools: iio: privatize globals and functions in iio_generic_buffer.c file Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 131/191] tools: iio: iio_generic_buffer: Fix some integer type and calculation Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 132/191] tools: iio: iio_generic_buffer ensure alignment Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 133/191] USB: usbip: fix stub_dev hub disconnect Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 134/191] dmaengine: pxa_dma: Remove an erroneous BUG_ON() in pxad_free_desc() Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 135/191] f2fs: fix to initialize map.m_pblk in f2fs_precache_extents() Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 136/191] interconnect: qcom: sc7180: Retire DEFINE_QBCM Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 137/191] interconnect: qcom: sc7180: Set ACV enable_mask Greg Kroah-Hartman
2023-11-20 13:18   ` Sam James
2023-11-24 23:01     ` Sam James
2023-11-15 20:46 ` [PATCH 5.10 138/191] interconnect: qcom: osm-l3: Replace custom implementation of COUNT_ARGS() Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 139/191] modpost: fix tee MODULE_DEVICE_TABLE built on big-endian host Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 140/191] powerpc/40x: Remove stale PTE_ATOMIC_UPDATES macro Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 141/191] powerpc/xive: Fix endian conversion size Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 142/191] powerpc/imc-pmu: Use the correct spinlock initializer Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 143/191] powerpc/pseries: fix potential memory leak in init_cpu_associativity() Greg Kroah-Hartman
2023-11-15 20:46 ` [PATCH 5.10 144/191] xhci: Loosen RPM as default policy to cover for AMD xHC 1.1 Greg Kroah-Hartman
2023-11-15 20:47 ` [PATCH 5.10 145/191] usb: host: xhci-plat: fix possible kernel oops while resuming Greg Kroah-Hartman
2023-11-15 20:47 ` [PATCH 5.10 146/191] perf machine: Avoid out of bounds LBR memory read Greg Kroah-Hartman
2023-11-15 20:47 ` [PATCH 5.10 147/191] perf hist: Add missing puts to hist__account_cycles Greg Kroah-Hartman
2023-11-15 20:47 ` [PATCH 5.10 148/191] i3c: Fix potential refcount leak in i3c_master_register_new_i3c_devs Greg Kroah-Hartman
2023-11-15 20:47 ` [PATCH 5.10 149/191] rtc: pcf85363: fix wrong mask/val parameters in regmap_update_bits call Greg Kroah-Hartman
2023-11-15 20:47 ` [PATCH 5.10 150/191] pcmcia: cs: fix possible hung task and memory leak pccardd() Greg Kroah-Hartman
2023-11-15 20:47 ` [PATCH 5.10 151/191] pcmcia: ds: fix refcount leak in pcmcia_device_add() Greg Kroah-Hartman
2023-11-15 20:47 ` [PATCH 5.10 152/191] pcmcia: ds: fix possible name leak in error path " Greg Kroah-Hartman
2023-11-15 20:47 ` [PATCH 5.10 153/191] media: i2c: max9286: Fix some redundant of_node_put() calls Greg Kroah-Hartman
2023-11-15 20:47 ` [PATCH 5.10 154/191] media: bttv: fix use after free error due to btv->timeout timer Greg Kroah-Hartman
2023-11-15 20:47 ` [PATCH 5.10 155/191] media: s3c-camif: Avoid inappropriate kfree() Greg Kroah-Hartman
2023-11-15 20:47 ` [PATCH 5.10 156/191] media: vidtv: psi: Add check for kstrdup Greg Kroah-Hartman
2023-11-15 20:47 ` [PATCH 5.10 157/191] media: vidtv: mux: Add check and kfree " Greg Kroah-Hartman
2023-11-15 20:47 ` [PATCH 5.10 158/191] media: cedrus: Fix clock/reset sequence Greg Kroah-Hartman
2023-11-15 20:47 ` [PATCH 5.10 159/191] media: dvb-usb-v2: af9035: fix missing unlock Greg Kroah-Hartman
2023-11-15 20:47 ` [PATCH 5.10 160/191] regmap: prevent noinc writes from clobbering cache Greg Kroah-Hartman
2023-11-15 20:47 ` [PATCH 5.10 161/191] pwm: sti: Avoid conditional gotos Greg Kroah-Hartman
2023-11-15 20:47 ` [PATCH 5.10 162/191] pwm: sti: Reduce number of allocations and drop usage of chip_data Greg Kroah-Hartman
2023-11-15 20:47 ` [PATCH 5.10 163/191] pwm: brcmstb: Utilize appropriate clock APIs in suspend/resume Greg Kroah-Hartman
2023-11-15 20:47 ` [PATCH 5.10 164/191] Input: synaptics-rmi4 - fix use after free in rmi_unregister_function() Greg Kroah-Hartman
2023-11-15 20:47 ` [PATCH 5.10 165/191] llc: verify mac len before reading mac header Greg Kroah-Hartman
2023-11-15 20:47 ` [PATCH 5.10 166/191] hsr: Prevent use after free in prp_create_tagged_frame() Greg Kroah-Hartman
2023-11-15 20:47 ` [PATCH 5.10 167/191] tipc: Change nla_policy for bearer-related names to NLA_NUL_STRING Greg Kroah-Hartman
2023-11-15 20:47 ` [PATCH 5.10 168/191] inet: shrink struct flowi_common Greg Kroah-Hartman
2023-11-15 20:47 ` [PATCH 5.10 169/191] dccp: Call security_inet_conn_request() after setting IPv4 addresses Greg Kroah-Hartman
2023-11-15 20:47 ` [PATCH 5.10 170/191] dccp/tcp: Call security_inet_conn_request() after setting IPv6 addresses Greg Kroah-Hartman
2023-11-15 20:47 ` [PATCH 5.10 171/191] net: r8169: Disable multicast filter for RTL8168H and RTL8107E Greg Kroah-Hartman
2023-11-15 20:47 ` [PATCH 5.10 172/191] Fix termination state for idr_for_each_entry_ul() Greg Kroah-Hartman
2023-11-15 20:47 ` [PATCH 5.10 173/191] net: stmmac: xgmac: Enable support for multiple Flexible PPS outputs Greg Kroah-Hartman
2023-11-15 20:47 ` [PATCH 5.10 174/191] net/smc: fix dangling sock under state SMC_APPFINCLOSEWAIT Greg Kroah-Hartman
2023-11-15 20:47 ` [PATCH 5.10 175/191] net/smc: allow cdc msg send rather than drop it with NULL sndbuf_desc Greg Kroah-Hartman
2023-11-15 20:47 ` [PATCH 5.10 176/191] net/smc: put sk reference if close work was canceled Greg Kroah-Hartman
2023-11-15 20:47 ` [PATCH 5.10 177/191] tg3: power down device only on SYSTEM_POWER_OFF Greg Kroah-Hartman
2023-11-15 20:47 ` [PATCH 5.10 178/191] r8169: respect userspace disabling IFF_MULTICAST Greg Kroah-Hartman
2023-11-15 20:47 ` [PATCH 5.10 179/191] netfilter: xt_recent: fix (increase) ipv6 literal buffer length Greg Kroah-Hartman
2023-11-15 20:47 ` [PATCH 5.10 180/191] netfilter: nft_redir: use `struct nf_nat_range2` throughout and deduplicate eval call-backs Greg Kroah-Hartman
2023-11-15 20:47 ` [PATCH 5.10 181/191] netfilter: nat: fix ipv6 nat redirect with mapped and scoped addresses Greg Kroah-Hartman
2023-11-15 20:47 ` [PATCH 5.10 182/191] x86: Share definition of __is_canonical_address() Greg Kroah-Hartman
2023-11-15 20:47 ` [PATCH 5.10 183/191] x86/sev-es: Allow copy_from_kernel_nofault() in earlier boot Greg Kroah-Hartman
2023-11-15 20:47 ` [PATCH 5.10 184/191] drm/syncobj: fix DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE Greg Kroah-Hartman
2023-11-15 20:47 ` [PATCH 5.10 185/191] spi: spi-zynq-qspi: add spi-mem to driver kconfig dependencies Greg Kroah-Hartman
2023-11-15 20:47 ` [PATCH 5.10 186/191] fbdev: imsttfb: Fix error path of imsttfb_probe() Greg Kroah-Hartman
2023-11-15 20:47 ` [PATCH 5.10 187/191] fbdev: imsttfb: fix a resource leak in probe Greg Kroah-Hartman
2023-11-15 20:47 ` [PATCH 5.10 188/191] fbdev: fsl-diu-fb: mark wr_reg_wa() static Greg Kroah-Hartman
2023-11-15 20:47 ` [PATCH 5.10 189/191] tracing/kprobes: Fix the order of argument descriptions Greg Kroah-Hartman
2023-11-15 20:47 ` [PATCH 5.10 190/191] Revert "mmc: core: Capture correct oemid-bits for eMMC cards" Greg Kroah-Hartman
2023-11-15 20:47 ` [PATCH 5.10 191/191] btrfs: use u64 for buffer sizes in the tree search ioctls Greg Kroah-Hartman
2023-11-15 23:09 ` [PATCH 5.10 000/191] 5.10.201-rc1 review Florian Fainelli
2023-11-16  7:21 ` Dominique Martinet
2023-11-16 18:18 ` Naresh Kamboju
2023-11-17  1:13 ` Guenter Roeck
2023-11-17  1:57   ` Dominique Martinet
2023-11-17 15:15     ` Guenter Roeck
2023-11-17  7:41   ` Naresh Kamboju
2023-11-17 14:58     ` Guenter Roeck
2023-11-17 17:06       ` Florian Fainelli
2023-11-20 10:05   ` Greg Kroah-Hartman
2023-11-20 18:17     ` Guenter Roeck
2023-11-20 19:01       ` Holger Hoffstätte
2023-11-17  1:25 ` Guenter Roeck
2023-11-17 17:01 ` Pavel Machek

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20231115204645.306955467@linuxfoundation.org \
    --to=gregkh@linuxfoundation.org \
    --cc=gustavoars@kernel.org \
    --cc=jgg@ziepe.ca \
    --cc=kbusch@kernel.org \
    --cc=keescook@chromium.org \
    --cc=len.baker@gmx.com \
    --cc=leon@kernel.org \
    --cc=linux@rasmusvillemoes.dk \
    --cc=nathan@kernel.org \
    --cc=ndesaulniers@google.com \
    --cc=patches@lists.linux.dev \
    --cc=sashal@kernel.org \
    --cc=stable@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.