fstests.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/2] add tests for race between xattr read and write
@ 2020-07-17  8:44 Hou Tao
  2020-07-17  8:44 ` [PATCH 1/2] generic: add test for race between listxattr and setxatr Hou Tao
  2020-07-17  8:44 ` [PATCH 2/2] generic: add test for race between getxattr and setxattr Hou Tao
  0 siblings, 2 replies; 10+ messages in thread
From: Hou Tao @ 2020-07-17  8:44 UTC (permalink / raw)
  To: guaneryu, Richard Weinberger; +Cc: fstests, houtao1

Hi,

These two test cases are reproducers for xattr bugs [1] on ubifs.
Although these bugs are ubifs specific, I still place these test cases
under generic directory, because we can ensure other filesystems implement
concurrent xattr read and write op correctly.

Comments are welcome.

Regards,
Tao

[1]: https://lore.kernel.org/linux-mtd/20200630130438.141649-1-houtao1@huawei.com/

Hou Tao (2):
  generic: add test for race between listxattr and setxatr
  generic: add test for race between getxattr and setxattr

 tests/generic/998     | 64 ++++++++++++++++++++++++++++++++++++++++
 tests/generic/998.out |  2 ++
 tests/generic/999     | 68 +++++++++++++++++++++++++++++++++++++++++++
 tests/generic/999.out |  2 ++
 tests/generic/group   |  2 ++
 5 files changed, 138 insertions(+)
 create mode 100644 tests/generic/998
 create mode 100644 tests/generic/998.out
 create mode 100644 tests/generic/999
 create mode 100644 tests/generic/999.out

-- 
2.25.0.4.g0ad7144999


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH 1/2] generic: add test for race between listxattr and setxatr
  2020-07-17  8:44 [PATCH 0/2] add tests for race between xattr read and write Hou Tao
@ 2020-07-17  8:44 ` Hou Tao
  2020-07-20  3:40   ` Chao Yu
  2020-07-17  8:44 ` [PATCH 2/2] generic: add test for race between getxattr and setxattr Hou Tao
  1 sibling, 1 reply; 10+ messages in thread
From: Hou Tao @ 2020-07-17  8:44 UTC (permalink / raw)
  To: guaneryu, Richard Weinberger; +Cc: fstests, houtao1

Add reproducer for a bug on ubifs where listxattr() copies
the newly created xattr names regardless of the remaining
buffer size, fails the assertion of used buffer size,
and may corrupt buffer memory.

Signed-off-by: Hou Tao <houtao1@huawei.com>
---
 tests/generic/998     | 64 +++++++++++++++++++++++++++++++++++++++++++
 tests/generic/998.out |  2 ++
 tests/generic/group   |  1 +
 3 files changed, 67 insertions(+)
 create mode 100644 tests/generic/998
 create mode 100644 tests/generic/998.out

diff --git a/tests/generic/998 b/tests/generic/998
new file mode 100644
index 00000000..b108a969
--- /dev/null
+++ b/tests/generic/998
@@ -0,0 +1,64 @@
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2020 Huawei. All Rights Reserved.
+#
+# FS QA Test 998
+#
+# Test race between listxattr() and setxattr(). It reproduces a bug
+# on UBIFS where listxattr() copies the newly created xattr names
+# regardless of the remaining buffer size, fails the assertion of
+# used buffer size, and may corrupt buffer memory.
+#
+seq=`basename $0`
+seqres=$RESULT_DIR/$seq
+echo "QA output created by $seq"
+
+here=`pwd`
+tmp=/tmp/$$
+status=1	# failure is the default!
+trap "_cleanup; exit \$status" 0 1 2 3 15
+
+_cleanup()
+{
+	cd /
+	rm -f $tmp.*
+	rm -f $TEST_DIR/$seq
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/attr
+
+# remove previous $seqres.full before test
+rm -f $seqres.full
+
+# real QA test starts here
+_supported_fs generic
+_supported_os Linux
+_require_attrs
+
+target=$TEST_DIR/$seq
+touch $target
+
+# start a background listxattr
+runfile="$tmp.listxattr"
+touch $runfile
+while [ -e $runfile ]; do
+	${GETFATTR_PROG} $target >/dev/null 2>&1
+done &
+
+# add new xattr continuously
+largename=`for i in $(seq 0 128); do echo -n a; done`
+for i in $(seq 0 99); do
+	${SETFATTR_PROG} -n user.${largename}.$i -v $i $target
+done
+
+rm -f $runfile
+wait > /dev/null 2>&1
+rm -f $target
+
+echo Silence is golden
+
+# success, all done
+status=0
+exit
diff --git a/tests/generic/998.out b/tests/generic/998.out
new file mode 100644
index 00000000..d2679ae0
--- /dev/null
+++ b/tests/generic/998.out
@@ -0,0 +1,2 @@
+QA output created by 998
+Silence is golden
diff --git a/tests/generic/group b/tests/generic/group
index d9ab9a31..62697ac5 100644
--- a/tests/generic/group
+++ b/tests/generic/group
@@ -605,3 +605,4 @@
 600 auto quick quota
 601 auto quick quota
 602 auto quick encrypt
+998 auto quick attr
-- 
2.25.0.4.g0ad7144999


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 2/2] generic: add test for race between getxattr and setxattr
  2020-07-17  8:44 [PATCH 0/2] add tests for race between xattr read and write Hou Tao
  2020-07-17  8:44 ` [PATCH 1/2] generic: add test for race between listxattr and setxatr Hou Tao
@ 2020-07-17  8:44 ` Hou Tao
  1 sibling, 0 replies; 10+ messages in thread
From: Hou Tao @ 2020-07-17  8:44 UTC (permalink / raw)
  To: guaneryu, Richard Weinberger; +Cc: fstests, houtao1

Add reproducer for a bug on UBIFS where getxattr() may fail
the assertions about the size of xattr value when the xattr
is being modified or deleted simultaneously.

Signed-off-by: Hou Tao <houtao1@huawei.com>
---
 tests/generic/999     | 68 +++++++++++++++++++++++++++++++++++++++++++
 tests/generic/999.out |  2 ++
 tests/generic/group   |  1 +
 3 files changed, 71 insertions(+)
 create mode 100644 tests/generic/999
 create mode 100644 tests/generic/999.out

diff --git a/tests/generic/999 b/tests/generic/999
new file mode 100644
index 00000000..5223d4aa
--- /dev/null
+++ b/tests/generic/999
@@ -0,0 +1,68 @@
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2020 Huawei. All Rights Reserved.
+#
+# FS QA Test 999
+#
+# Test race between getxattr() and setxattr(). It reproduces a bug
+# on UBIFS where getxattr() may fail the assertions about the size of
+# xattr value when the xattr is being modified or deleted simultaneously.
+#
+seq=`basename $0`
+seqres=$RESULT_DIR/$seq
+echo "QA output created by $seq"
+
+here=`pwd`
+tmp=/tmp/$$
+status=1	# failure is the default!
+trap "_cleanup; exit \$status" 0 1 2 3 15
+
+_cleanup()
+{
+	cd /
+	rm -f $tmp.*
+	rm -f $TEST_DIR/$seq
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/attr
+
+# remove previous $seqres.full before test
+rm -f $seqres.full
+
+# real QA test starts here
+_supported_fs generic
+_supported_os Linux
+_require_attrs
+
+target=$TEST_DIR/$seq
+touch $target
+
+xattr=user.test
+${SETFATTR_PROG} -n $xattr -v 1 $target
+
+# start a background getxattr
+runfile="$tmp.getxattr"
+touch $runfile
+while [ -e $runfile ]; do
+	${GETFATTR_PROG} -n $xattr $target >/dev/null 2>&1
+done &
+
+# modify and remove xattr repeatedly
+largeval=`for i in $(seq 0 128); do echo -n a; done`
+for i in $(seq 0 99); do
+	${SETFATTR_PROG} -n $xattr -v $largeval $target
+	${SETFATTR_PROG} -x $xattr $target
+	${SETFATTR_PROG} -n $xattr -v 1 $target
+done
+
+rm -f $runfile
+wait > /dev/null 2>&1
+rm -f $target
+
+echo Silence is golden
+
+# success, all done
+status=0
+exit
diff --git a/tests/generic/999.out b/tests/generic/999.out
new file mode 100644
index 00000000..3b276ca8
--- /dev/null
+++ b/tests/generic/999.out
@@ -0,0 +1,2 @@
+QA output created by 999
+Silence is golden
diff --git a/tests/generic/group b/tests/generic/group
index 62697ac5..368399f1 100644
--- a/tests/generic/group
+++ b/tests/generic/group
@@ -606,3 +606,4 @@
 601 auto quick quota
 602 auto quick encrypt
 998 auto quick attr
+999 auto quick attr
-- 
2.25.0.4.g0ad7144999


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCH 1/2] generic: add test for race between listxattr and setxatr
  2020-07-17  8:44 ` [PATCH 1/2] generic: add test for race between listxattr and setxatr Hou Tao
@ 2020-07-20  3:40   ` Chao Yu
  2020-08-22 11:41     ` [PATCH v2 " Hou Tao
  0 siblings, 1 reply; 10+ messages in thread
From: Chao Yu @ 2020-07-20  3:40 UTC (permalink / raw)
  To: Hou Tao, guaneryu, Richard Weinberger; +Cc: fstests

Hi Tao,

On 2020/7/17 16:44, Hou Tao wrote:
> Add reproducer for a bug on ubifs where listxattr() copies
> the newly created xattr names regardless of the remaining
> buffer size, fails the assertion of used buffer size,
> and may corrupt buffer memory.
> 
> Signed-off-by: Hou Tao <houtao1@huawei.com>
> ---
>   tests/generic/998     | 64 +++++++++++++++++++++++++++++++++++++++++++
>   tests/generic/998.out |  2 ++
>   tests/generic/group   |  1 +
>   3 files changed, 67 insertions(+)
>   create mode 100644 tests/generic/998
>   create mode 100644 tests/generic/998.out
> 
> diff --git a/tests/generic/998 b/tests/generic/998
> new file mode 100644
> index 00000000..b108a969
> --- /dev/null
> +++ b/tests/generic/998
> @@ -0,0 +1,64 @@
> +#! /bin/bash
> +# SPDX-License-Identifier: GPL-2.0
> +# Copyright (c) 2020 Huawei. All Rights Reserved.
> +#
> +# FS QA Test 998
> +#
> +# Test race between listxattr() and setxattr(). It reproduces a bug
> +# on UBIFS where listxattr() copies the newly created xattr names
> +# regardless of the remaining buffer size, fails the assertion of
> +# used buffer size, and may corrupt buffer memory.
> +#
> +seq=`basename $0`
> +seqres=$RESULT_DIR/$seq
> +echo "QA output created by $seq"
> +
> +here=`pwd`
> +tmp=/tmp/$$
> +status=1	# failure is the default!
> +trap "_cleanup; exit \$status" 0 1 2 3 15
> +
> +_cleanup()
> +{
> +	cd /
> +	rm -f $tmp.*
> +	rm -f $TEST_DIR/$seq
> +}
> +
> +# get standard environment, filters and checks
> +. ./common/rc
> +. ./common/attr
> +
> +# remove previous $seqres.full before test
> +rm -f $seqres.full
> +
> +# real QA test starts here
> +_supported_fs generic
> +_supported_os Linux
> +_require_attrs
> +
> +target=$TEST_DIR/$seq
> +touch $target
> +
> +# start a background listxattr
> +runfile="$tmp.listxattr"
> +touch $runfile
> +while [ -e $runfile ]; do
> +	${GETFATTR_PROG} $target >/dev/null 2>&1
> +done &
> +
> +# add new xattr continuously
> +largename=`for i in $(seq 0 128); do echo -n a; done`
> +for i in $(seq 0 99); do
> +	${SETFATTR_PROG} -n user.${largename}.$i -v $i $target

Now, f2fs just supports storing xattr in one 4KB size xattr block +
inline space in inode, so this testcase will always fail with f2fs,
would you please consider adjusting parameter to cover f2fs case?

Thanks,

> +done
> +
> +rm -f $runfile
> +wait > /dev/null 2>&1
> +rm -f $target
> +
> +echo Silence is golden
> +
> +# success, all done
> +status=0
> +exit
> diff --git a/tests/generic/998.out b/tests/generic/998.out
> new file mode 100644
> index 00000000..d2679ae0
> --- /dev/null
> +++ b/tests/generic/998.out
> @@ -0,0 +1,2 @@
> +QA output created by 998
> +Silence is golden
> diff --git a/tests/generic/group b/tests/generic/group
> index d9ab9a31..62697ac5 100644
> --- a/tests/generic/group
> +++ b/tests/generic/group
> @@ -605,3 +605,4 @@
>   600 auto quick quota
>   601 auto quick quota
>   602 auto quick encrypt
> +998 auto quick attr
> 

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH v2 1/2] generic: add test for race between listxattr and setxatr
  2020-07-20  3:40   ` Chao Yu
@ 2020-08-22 11:41     ` Hou Tao
  2020-08-30 16:23       ` Eryu Guan
  2020-09-02 16:43       ` Darrick J. Wong
  0 siblings, 2 replies; 10+ messages in thread
From: Hou Tao @ 2020-08-22 11:41 UTC (permalink / raw)
  To: guaneryu, richard, yuchao0; +Cc: fstests

Add reproducer for a bug on ubifs where listxattr() copies
the newly created xattr names regardless of the remaining
buffer size, fails the assertion of used buffer size,
and may corrupt buffer memory.

Signed-off-by: Hou Tao <houtao1@huawei.com>
---
v2: accommodate f2fs by reducing the number of created xattrs for f2fs

 tests/generic/998     | 67 +++++++++++++++++++++++++++++++++++++++++++
 tests/generic/998.out |  2 ++
 tests/generic/group   |  1 +
 3 files changed, 70 insertions(+)
 create mode 100644 tests/generic/998
 create mode 100644 tests/generic/998.out

diff --git a/tests/generic/998 b/tests/generic/998
new file mode 100644
index 00000000..26a5b620
--- /dev/null
+++ b/tests/generic/998
@@ -0,0 +1,67 @@
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2020 Huawei. All Rights Reserved.
+#
+# FS QA Test 998
+#
+# Test race between listxattr() and setxattr(). It reproduces a bug
+# on UBIFS where listxattr() copies the newly created xattr names
+# regardless of the remaining buffer size, fails the assertion of
+# used buffer size, and may corrupt buffer memory.
+#
+seq=`basename $0`
+seqres=$RESULT_DIR/$seq
+echo "QA output created by $seq"
+
+here=`pwd`
+tmp=/tmp/$$
+status=1	# failure is the default!
+trap "_cleanup; exit \$status" 0 1 2 3 15
+
+_cleanup()
+{
+	cd /
+	rm -f $tmp.*
+	rm -f $TEST_DIR/$seq
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/attr
+
+# remove previous $seqres.full before test
+rm -f $seqres.full
+
+# real QA test starts here
+_supported_fs generic
+_supported_os Linux
+_require_attrs
+
+target=$TEST_DIR/$seq
+touch $target
+
+# start a background listxattr
+runfile="$tmp.listxattr"
+touch $runfile
+while [ -e $runfile ]; do
+	${GETFATTR_PROG} $target >/dev/null 2>&1
+done &
+
+# add new xattr continuously
+largename=`for i in $(seq 0 128); do echo -n a; done`
+cnt=100
+# f2fs has limited spaces for xattr
+[ $FSTYP == "f2fs" ] && cnt=30
+for i in $(seq 1 $cnt); do
+	${SETFATTR_PROG} -n user.${largename}.$i -v $i $target
+done
+
+rm -f $runfile
+wait > /dev/null 2>&1
+rm -f $target
+
+echo Silence is golden
+
+# success, all done
+status=0
+exit
diff --git a/tests/generic/998.out b/tests/generic/998.out
new file mode 100644
index 00000000..d2679ae0
--- /dev/null
+++ b/tests/generic/998.out
@@ -0,0 +1,2 @@
+QA output created by 998
+Silence is golden
diff --git a/tests/generic/group b/tests/generic/group
index d9ab9a31..62697ac5 100644
--- a/tests/generic/group
+++ b/tests/generic/group
@@ -605,3 +605,4 @@
 600 auto quick quota
 601 auto quick quota
 602 auto quick encrypt
+998 auto quick attr
-- 
2.25.0.4.g0ad7144999


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCH v2 1/2] generic: add test for race between listxattr and setxatr
  2020-08-22 11:41     ` [PATCH v2 " Hou Tao
@ 2020-08-30 16:23       ` Eryu Guan
  2020-08-31  1:19         ` Chao Yu
  2020-08-31  3:01         ` Hou Tao
  2020-09-02 16:43       ` Darrick J. Wong
  1 sibling, 2 replies; 10+ messages in thread
From: Eryu Guan @ 2020-08-30 16:23 UTC (permalink / raw)
  To: Hou Tao; +Cc: guaneryu, richard, yuchao0, fstests

On Sat, Aug 22, 2020 at 07:41:32PM +0800, Hou Tao wrote:
> Add reproducer for a bug on ubifs where listxattr() copies
> the newly created xattr names regardless of the remaining
> buffer size, fails the assertion of used buffer size,
> and may corrupt buffer memory.
> 
> Signed-off-by: Hou Tao <houtao1@huawei.com>
> ---
> v2: accommodate f2fs by reducing the number of created xattrs for f2fs

Thanks for the test and revision! Is there a fix available for the ubifs
bug? If so would you please mention the kernel commit ID in commit log
as well?

Chao, would you please help check the update regarding to f2fs? Thanks!

Eryu

> 
>  tests/generic/998     | 67 +++++++++++++++++++++++++++++++++++++++++++
>  tests/generic/998.out |  2 ++
>  tests/generic/group   |  1 +
>  3 files changed, 70 insertions(+)
>  create mode 100644 tests/generic/998
>  create mode 100644 tests/generic/998.out
> 
> diff --git a/tests/generic/998 b/tests/generic/998
> new file mode 100644
> index 00000000..26a5b620
> --- /dev/null
> +++ b/tests/generic/998
> @@ -0,0 +1,67 @@
> +#! /bin/bash
> +# SPDX-License-Identifier: GPL-2.0
> +# Copyright (c) 2020 Huawei. All Rights Reserved.
> +#
> +# FS QA Test 998
> +#
> +# Test race between listxattr() and setxattr(). It reproduces a bug
> +# on UBIFS where listxattr() copies the newly created xattr names
> +# regardless of the remaining buffer size, fails the assertion of
> +# used buffer size, and may corrupt buffer memory.
> +#
> +seq=`basename $0`
> +seqres=$RESULT_DIR/$seq
> +echo "QA output created by $seq"
> +
> +here=`pwd`
> +tmp=/tmp/$$
> +status=1	# failure is the default!
> +trap "_cleanup; exit \$status" 0 1 2 3 15
> +
> +_cleanup()
> +{
> +	cd /
> +	rm -f $tmp.*
> +	rm -f $TEST_DIR/$seq
> +}
> +
> +# get standard environment, filters and checks
> +. ./common/rc
> +. ./common/attr
> +
> +# remove previous $seqres.full before test
> +rm -f $seqres.full
> +
> +# real QA test starts here
> +_supported_fs generic
> +_supported_os Linux
> +_require_attrs
> +
> +target=$TEST_DIR/$seq
> +touch $target
> +
> +# start a background listxattr
> +runfile="$tmp.listxattr"
> +touch $runfile
> +while [ -e $runfile ]; do
> +	${GETFATTR_PROG} $target >/dev/null 2>&1
> +done &
> +
> +# add new xattr continuously
> +largename=`for i in $(seq 0 128); do echo -n a; done`
> +cnt=100
> +# f2fs has limited spaces for xattr
> +[ $FSTYP == "f2fs" ] && cnt=30
> +for i in $(seq 1 $cnt); do
> +	${SETFATTR_PROG} -n user.${largename}.$i -v $i $target
> +done
> +
> +rm -f $runfile
> +wait > /dev/null 2>&1
> +rm -f $target
> +
> +echo Silence is golden
> +
> +# success, all done
> +status=0
> +exit
> diff --git a/tests/generic/998.out b/tests/generic/998.out
> new file mode 100644
> index 00000000..d2679ae0
> --- /dev/null
> +++ b/tests/generic/998.out
> @@ -0,0 +1,2 @@
> +QA output created by 998
> +Silence is golden
> diff --git a/tests/generic/group b/tests/generic/group
> index d9ab9a31..62697ac5 100644
> --- a/tests/generic/group
> +++ b/tests/generic/group
> @@ -605,3 +605,4 @@
>  600 auto quick quota
>  601 auto quick quota
>  602 auto quick encrypt
> +998 auto quick attr
> -- 
> 2.25.0.4.g0ad7144999

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v2 1/2] generic: add test for race between listxattr and setxatr
  2020-08-30 16:23       ` Eryu Guan
@ 2020-08-31  1:19         ` Chao Yu
  2020-08-31  3:01         ` Hou Tao
  1 sibling, 0 replies; 10+ messages in thread
From: Chao Yu @ 2020-08-31  1:19 UTC (permalink / raw)
  To: Eryu Guan, Hou Tao; +Cc: guaneryu, richard, fstests

On 2020/8/31 0:23, Eryu Guan wrote:
> On Sat, Aug 22, 2020 at 07:41:32PM +0800, Hou Tao wrote:
>> Add reproducer for a bug on ubifs where listxattr() copies
>> the newly created xattr names regardless of the remaining
>> buffer size, fails the assertion of used buffer size,
>> and may corrupt buffer memory.
>>
>> Signed-off-by: Hou Tao <houtao1@huawei.com>
>> ---
>> v2: accommodate f2fs by reducing the number of created xattrs for f2fs
> 
> Thanks for the test and revision! Is there a fix available for the ubifs
> bug? If so would you please mention the kernel commit ID in commit log
> as well?
> 
> Chao, would you please help check the update regarding to f2fs? Thanks!

Hi, all,

Sorry for the delay.

I've ran the test, it looks fine to f2fs, and also parameter value 'cnt=30'
is just touch upper boundary of xattr space size. :)

Reviewed-by: Chao Yu <yuchao0@huawei.com>

Thanks,

> 
> Eryu
> 
>>
>>   tests/generic/998     | 67 +++++++++++++++++++++++++++++++++++++++++++
>>   tests/generic/998.out |  2 ++
>>   tests/generic/group   |  1 +
>>   3 files changed, 70 insertions(+)
>>   create mode 100644 tests/generic/998
>>   create mode 100644 tests/generic/998.out
>>
>> diff --git a/tests/generic/998 b/tests/generic/998
>> new file mode 100644
>> index 00000000..26a5b620
>> --- /dev/null
>> +++ b/tests/generic/998
>> @@ -0,0 +1,67 @@
>> +#! /bin/bash
>> +# SPDX-License-Identifier: GPL-2.0
>> +# Copyright (c) 2020 Huawei. All Rights Reserved.
>> +#
>> +# FS QA Test 998
>> +#
>> +# Test race between listxattr() and setxattr(). It reproduces a bug
>> +# on UBIFS where listxattr() copies the newly created xattr names
>> +# regardless of the remaining buffer size, fails the assertion of
>> +# used buffer size, and may corrupt buffer memory.
>> +#
>> +seq=`basename $0`
>> +seqres=$RESULT_DIR/$seq
>> +echo "QA output created by $seq"
>> +
>> +here=`pwd`
>> +tmp=/tmp/$$
>> +status=1	# failure is the default!
>> +trap "_cleanup; exit \$status" 0 1 2 3 15
>> +
>> +_cleanup()
>> +{
>> +	cd /
>> +	rm -f $tmp.*
>> +	rm -f $TEST_DIR/$seq
>> +}
>> +
>> +# get standard environment, filters and checks
>> +. ./common/rc
>> +. ./common/attr
>> +
>> +# remove previous $seqres.full before test
>> +rm -f $seqres.full
>> +
>> +# real QA test starts here
>> +_supported_fs generic
>> +_supported_os Linux
>> +_require_attrs
>> +
>> +target=$TEST_DIR/$seq
>> +touch $target
>> +
>> +# start a background listxattr
>> +runfile="$tmp.listxattr"
>> +touch $runfile
>> +while [ -e $runfile ]; do
>> +	${GETFATTR_PROG} $target >/dev/null 2>&1
>> +done &
>> +
>> +# add new xattr continuously
>> +largename=`for i in $(seq 0 128); do echo -n a; done`
>> +cnt=100
>> +# f2fs has limited spaces for xattr
>> +[ $FSTYP == "f2fs" ] && cnt=30
>> +for i in $(seq 1 $cnt); do
>> +	${SETFATTR_PROG} -n user.${largename}.$i -v $i $target
>> +done
>> +
>> +rm -f $runfile
>> +wait > /dev/null 2>&1
>> +rm -f $target
>> +
>> +echo Silence is golden
>> +
>> +# success, all done
>> +status=0
>> +exit
>> diff --git a/tests/generic/998.out b/tests/generic/998.out
>> new file mode 100644
>> index 00000000..d2679ae0
>> --- /dev/null
>> +++ b/tests/generic/998.out
>> @@ -0,0 +1,2 @@
>> +QA output created by 998
>> +Silence is golden
>> diff --git a/tests/generic/group b/tests/generic/group
>> index d9ab9a31..62697ac5 100644
>> --- a/tests/generic/group
>> +++ b/tests/generic/group
>> @@ -605,3 +605,4 @@
>>   600 auto quick quota
>>   601 auto quick quota
>>   602 auto quick encrypt
>> +998 auto quick attr
>> -- 
>> 2.25.0.4.g0ad7144999
> .
> 

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v2 1/2] generic: add test for race between listxattr and setxatr
  2020-08-30 16:23       ` Eryu Guan
  2020-08-31  1:19         ` Chao Yu
@ 2020-08-31  3:01         ` Hou Tao
  2020-09-02 15:48           ` Eryu Guan
  1 sibling, 1 reply; 10+ messages in thread
From: Hou Tao @ 2020-08-31  3:01 UTC (permalink / raw)
  To: Eryu Guan, richard; +Cc: guaneryu, yuchao0, fstests

Hi,

On 2020/8/31 0:23, Eryu Guan wrote:
> On Sat, Aug 22, 2020 at 07:41:32PM +0800, Hou Tao wrote:
>> Add reproducer for a bug on ubifs where listxattr() copies
>> the newly created xattr names regardless of the remaining
>> buffer size, fails the assertion of used buffer size,
>> and may corrupt buffer memory.
>>
>> Signed-off-by: Hou Tao <houtao1@huawei.com>
>> ---
>> v2: accommodate f2fs by reducing the number of created xattrs for f2fs
> 
> Thanks for the test and revision! Is there a fix available for the ubifs
> bug? If so would you please mention the kernel commit ID in commit log
> as well?
> 
The fixes [1] have not been reviewed yet, so we may need to hold on until the fixes get merged ?

[1]: https://lore.kernel.org/linux-mtd/20200630130438.141649-1-houtao1@huawei.com/

Regards,
Tao

> Chao, would you please help check the update regarding to f2fs? Thanks!
> 
> Eryu
> 
>>
>>  tests/generic/998     | 67 +++++++++++++++++++++++++++++++++++++++++++
>>  tests/generic/998.out |  2 ++
>>  tests/generic/group   |  1 +
>>  3 files changed, 70 insertions(+)
>>  create mode 100644 tests/generic/998
>>  create mode 100644 tests/generic/998.out
>>
>> diff --git a/tests/generic/998 b/tests/generic/998
>> new file mode 100644
>> index 00000000..26a5b620
>> --- /dev/null
>> +++ b/tests/generic/998
>> @@ -0,0 +1,67 @@
>> +#! /bin/bash
>> +# SPDX-License-Identifier: GPL-2.0
>> +# Copyright (c) 2020 Huawei. All Rights Reserved.
>> +#
>> +# FS QA Test 998
>> +#
>> +# Test race between listxattr() and setxattr(). It reproduces a bug
>> +# on UBIFS where listxattr() copies the newly created xattr names
>> +# regardless of the remaining buffer size, fails the assertion of
>> +# used buffer size, and may corrupt buffer memory.
>> +#
>> +seq=`basename $0`
>> +seqres=$RESULT_DIR/$seq
>> +echo "QA output created by $seq"
>> +
>> +here=`pwd`
>> +tmp=/tmp/$$
>> +status=1	# failure is the default!
>> +trap "_cleanup; exit \$status" 0 1 2 3 15
>> +
>> +_cleanup()
>> +{
>> +	cd /
>> +	rm -f $tmp.*
>> +	rm -f $TEST_DIR/$seq
>> +}
>> +
>> +# get standard environment, filters and checks
>> +. ./common/rc
>> +. ./common/attr
>> +
>> +# remove previous $seqres.full before test
>> +rm -f $seqres.full
>> +
>> +# real QA test starts here
>> +_supported_fs generic
>> +_supported_os Linux
>> +_require_attrs
>> +
>> +target=$TEST_DIR/$seq
>> +touch $target
>> +
>> +# start a background listxattr
>> +runfile="$tmp.listxattr"
>> +touch $runfile
>> +while [ -e $runfile ]; do
>> +	${GETFATTR_PROG} $target >/dev/null 2>&1
>> +done &
>> +
>> +# add new xattr continuously
>> +largename=`for i in $(seq 0 128); do echo -n a; done`
>> +cnt=100
>> +# f2fs has limited spaces for xattr
>> +[ $FSTYP == "f2fs" ] && cnt=30
>> +for i in $(seq 1 $cnt); do
>> +	${SETFATTR_PROG} -n user.${largename}.$i -v $i $target
>> +done
>> +
>> +rm -f $runfile
>> +wait > /dev/null 2>&1
>> +rm -f $target
>> +
>> +echo Silence is golden
>> +
>> +# success, all done
>> +status=0
>> +exit
>> diff --git a/tests/generic/998.out b/tests/generic/998.out
>> new file mode 100644
>> index 00000000..d2679ae0
>> --- /dev/null
>> +++ b/tests/generic/998.out
>> @@ -0,0 +1,2 @@
>> +QA output created by 998
>> +Silence is golden
>> diff --git a/tests/generic/group b/tests/generic/group
>> index d9ab9a31..62697ac5 100644
>> --- a/tests/generic/group
>> +++ b/tests/generic/group
>> @@ -605,3 +605,4 @@
>>  600 auto quick quota
>>  601 auto quick quota
>>  602 auto quick encrypt
>> +998 auto quick attr
>> -- 
>> 2.25.0.4.g0ad7144999
> .
> 

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v2 1/2] generic: add test for race between listxattr and setxatr
  2020-08-31  3:01         ` Hou Tao
@ 2020-09-02 15:48           ` Eryu Guan
  0 siblings, 0 replies; 10+ messages in thread
From: Eryu Guan @ 2020-09-02 15:48 UTC (permalink / raw)
  To: Hou Tao; +Cc: richard, guaneryu, yuchao0, fstests

On Mon, Aug 31, 2020 at 11:01:05AM +0800, Hou Tao wrote:
> Hi,
> 
> On 2020/8/31 0:23, Eryu Guan wrote:
> > On Sat, Aug 22, 2020 at 07:41:32PM +0800, Hou Tao wrote:
> >> Add reproducer for a bug on ubifs where listxattr() copies
> >> the newly created xattr names regardless of the remaining
> >> buffer size, fails the assertion of used buffer size,
> >> and may corrupt buffer memory.
> >>
> >> Signed-off-by: Hou Tao <houtao1@huawei.com>
> >> ---
> >> v2: accommodate f2fs by reducing the number of created xattrs for f2fs
> > 
> > Thanks for the test and revision! Is there a fix available for the ubifs
> > bug? If so would you please mention the kernel commit ID in commit log
> > as well?
> > 
> The fixes [1] have not been reviewed yet, so we may need to hold on until the fixes get merged ?
> 
> [1]: https://lore.kernel.org/linux-mtd/20200630130438.141649-1-houtao1@huawei.com/

It's better to have the fixes merged first, but we do merge tests before
the fixes landed in. But I'd like to see at least some reviews/acks on
the fixes first.

Thanks,
Eryu

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v2 1/2] generic: add test for race between listxattr and setxatr
  2020-08-22 11:41     ` [PATCH v2 " Hou Tao
  2020-08-30 16:23       ` Eryu Guan
@ 2020-09-02 16:43       ` Darrick J. Wong
  1 sibling, 0 replies; 10+ messages in thread
From: Darrick J. Wong @ 2020-09-02 16:43 UTC (permalink / raw)
  To: Hou Tao; +Cc: guaneryu, richard, yuchao0, fstests

On Sat, Aug 22, 2020 at 07:41:32PM +0800, Hou Tao wrote:
> Add reproducer for a bug on ubifs where listxattr() copies
> the newly created xattr names regardless of the remaining
> buffer size, fails the assertion of used buffer size,
> and may corrupt buffer memory.
> 
> Signed-off-by: Hou Tao <houtao1@huawei.com>
> ---
> v2: accommodate f2fs by reducing the number of created xattrs for f2fs
> 
>  tests/generic/998     | 67 +++++++++++++++++++++++++++++++++++++++++++
>  tests/generic/998.out |  2 ++
>  tests/generic/group   |  1 +
>  3 files changed, 70 insertions(+)
>  create mode 100644 tests/generic/998
>  create mode 100644 tests/generic/998.out
> 
> diff --git a/tests/generic/998 b/tests/generic/998
> new file mode 100644
> index 00000000..26a5b620
> --- /dev/null
> +++ b/tests/generic/998
> @@ -0,0 +1,67 @@
> +#! /bin/bash
> +# SPDX-License-Identifier: GPL-2.0
> +# Copyright (c) 2020 Huawei. All Rights Reserved.
> +#
> +# FS QA Test 998
> +#
> +# Test race between listxattr() and setxattr(). It reproduces a bug
> +# on UBIFS where listxattr() copies the newly created xattr names
> +# regardless of the remaining buffer size, fails the assertion of
> +# used buffer size, and may corrupt buffer memory.
> +#
> +seq=`basename $0`
> +seqres=$RESULT_DIR/$seq
> +echo "QA output created by $seq"
> +
> +here=`pwd`
> +tmp=/tmp/$$
> +status=1	# failure is the default!
> +trap "_cleanup; exit \$status" 0 1 2 3 15
> +
> +_cleanup()
> +{
> +	cd /
> +	rm -f $tmp.*
> +	rm -f $TEST_DIR/$seq
> +}
> +
> +# get standard environment, filters and checks
> +. ./common/rc
> +. ./common/attr
> +
> +# remove previous $seqres.full before test
> +rm -f $seqres.full
> +
> +# real QA test starts here
> +_supported_fs generic
> +_supported_os Linux
> +_require_attrs
> +
> +target=$TEST_DIR/$seq
> +touch $target
> +
> +# start a background listxattr
> +runfile="$tmp.listxattr"
> +touch $runfile
> +while [ -e $runfile ]; do
> +	${GETFATTR_PROG} $target >/dev/null 2>&1

Er, if the listxattr corrupts the buffer memory, how does this test
detect that?  Does the kernel crash or something?

> +done &
> +
> +# add new xattr continuously
> +largename=`for i in $(seq 0 128); do echo -n a; done`
> +cnt=100
> +# f2fs has limited spaces for xattr
> +[ $FSTYP == "f2fs" ] && cnt=30
> +for i in $(seq 1 $cnt); do
> +	${SETFATTR_PROG} -n user.${largename}.$i -v $i $target

Seeing as each filesystem has different xattr limits, I wonder if
instead of special casing of f2fs we ought to capture the
stdout/stderr of SETFATTR_PROG and filter out the ENOSPC message?

AFAICT this test isn't trying to check that setting xattrs succeeds, but
I'm a little confused on how we detect the corrupted buffer...

--D

> +done
> +
> +rm -f $runfile
> +wait > /dev/null 2>&1
> +rm -f $target
> +
> +echo Silence is golden
> +
> +# success, all done
> +status=0
> +exit
> diff --git a/tests/generic/998.out b/tests/generic/998.out
> new file mode 100644
> index 00000000..d2679ae0
> --- /dev/null
> +++ b/tests/generic/998.out
> @@ -0,0 +1,2 @@
> +QA output created by 998
> +Silence is golden
> diff --git a/tests/generic/group b/tests/generic/group
> index d9ab9a31..62697ac5 100644
> --- a/tests/generic/group
> +++ b/tests/generic/group
> @@ -605,3 +605,4 @@
>  600 auto quick quota
>  601 auto quick quota
>  602 auto quick encrypt
> +998 auto quick attr
> -- 
> 2.25.0.4.g0ad7144999
> 

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2020-09-02 16:44 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-07-17  8:44 [PATCH 0/2] add tests for race between xattr read and write Hou Tao
2020-07-17  8:44 ` [PATCH 1/2] generic: add test for race between listxattr and setxatr Hou Tao
2020-07-20  3:40   ` Chao Yu
2020-08-22 11:41     ` [PATCH v2 " Hou Tao
2020-08-30 16:23       ` Eryu Guan
2020-08-31  1:19         ` Chao Yu
2020-08-31  3:01         ` Hou Tao
2020-09-02 15:48           ` Eryu Guan
2020-09-02 16:43       ` Darrick J. Wong
2020-07-17  8:44 ` [PATCH 2/2] generic: add test for race between getxattr and setxattr Hou Tao

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).