[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[committed] Error out on invalid locexpr length



On 07-03-19 08:12, Tom de Vries wrote:
> Hi,
> 
> When invoking dwz with a file containing an invalid locexpr length, we can run
> into this assertion:
> ...
> dwz: dwz.c:1722: read_loclist: Assertion `ptr + len <= endsec' failed.
> Aborted (core dumped)
> ...
> 
> Change the assert into an error:
> ...
> dwz: a.out: locexpr length 0x4ef exceeds .debug_loc section
> ...
> 
> OK for trunk?
> 
> Thanks,
> - Tom
> 

Added:
- test-case
- 'unlikely' around error condition.

Committed as below. [ Including trivial follow-up patch to fix buildbot
failures. ]

Thanks,
- Tom
Error out on invalid locexpr length

When invoking dwz with a file containing an invalid locexpr length, we can run
into this assertion:
...
dwz: dwz.c:1722: read_loclist: Assertion `ptr + len <= endsec' failed.
Aborted (core dumped)
...

Change the assert into an error:
...
dwz: a.out: locexpr length 0x4ef exceeds .debug_loc section
...

2019-04-24  Tom de Vries  <tdevries@suse.de>

	PR dwz/24172
	* dwz.c (read_loclist): Change assert (ptr + len <= endsec) into an
	error.
	* Makefile (TEST_EXECS): Add dw2-skip-prologue.
	(dw2-skip-prologue): New target.
	* testsuite/dwz.tests/dw2-skip-prologue.S: New test source.
	* testsuite/dwz.tests/dw2-skip-prologue.c: New test source.
	* testsuite/dwz.tests/pr24172.sh: New test.

---
 Makefile                                |   7 +-
 dwz.c                                   |   8 +-
 testsuite/dwz.tests/dw2-skip-prologue.S | 402 ++++++++++++++++++++++++++++++++
 testsuite/dwz.tests/dw2-skip-prologue.c |  61 +++++
 testsuite/dwz.tests/pr24172.sh          |  14 ++
 5 files changed, 490 insertions(+), 2 deletions(-)

diff --git a/Makefile b/Makefile
index a9eae7d..33e4009 100644
--- a/Makefile
+++ b/Makefile
@@ -23,7 +23,8 @@ clean:
 PWD:=$(shell pwd -P)
 
 TEST_SRC = $(srcdir)/testsuite/dwz.tests
-TEST_EXECS = hello dw2-restrict py-section-script dwz-for-test min two-typedef
+TEST_EXECS = hello dw2-restrict py-section-script dwz-for-test min two-typedef \
+	dw2-skip-prologue
 
 hello:
 	$(CC) $(TEST_SRC)/hello.c -o $@ -g
@@ -31,6 +32,10 @@ hello:
 dw2-restrict:
 	$(CC) $(TEST_SRC)/dw2-restrict.S -o $@ || touch $@
 
+dw2-skip-prologue:
+	$(CC) $(TEST_SRC)/dw2-skip-prologue.S $(TEST_SRC)/dw2-skip-prologue.c \
+	  -DINLINED -DPTRBITS=64 -o $@ || touch $@
+
 py-section-script:
 	$(CC) $(TEST_SRC)/py-section-script.s -o $@ -g || touch $@
 
diff --git a/dwz.c b/dwz.c
index db5ee10..2c0e4c4 100644
--- a/dwz.c
+++ b/dwz.c
@@ -1765,7 +1765,13 @@ read_loclist (DSO *dso, dw_die_ref die, GElf_Addr offset)
 	continue;
 
       len = read_16 (ptr);
-      assert (ptr + len <= endsec);
+      if (unlikely (!(ptr + len <= endsec)))
+	{
+	  error (0, 0,
+		 "%s: locexpr length 0x%Lx exceeds .debug_loc section",
+		 dso->filename, (long long) len);
+	  return 1;
+	}
 
       if (read_exprloc (dso, die, ptr, len, &need_adjust))
 	return 1;
diff --git a/testsuite/dwz.tests/dw2-skip-prologue.S b/testsuite/dwz.tests/dw2-skip-prologue.S
new file mode 100644
index 0000000..f249ac0
--- /dev/null
+++ b/testsuite/dwz.tests/dw2-skip-prologue.S
@@ -0,0 +1,402 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2011-2019 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+   This was copied from the git://sourceware.org/git/binutils-gdb.git
+   repository, file gdb/testsuite/gdb.dwarf2/dw2-skip-prologue.S.  */
+
+#if PTRBITS == 64
+# define PTRBYTE .8byte
+#elif PTRBITS == 32
+# define PTRBYTE .4byte
+#else
+# error "Unsupported pointer size"
+#endif
+
+	.section .debug_info
+.Lcu1_begin:
+	/* CU header */
+	.4byte	.Lcu1_end - .Lcu1_start		/* Length of Compilation Unit */
+.Lcu1_start:
+	.2byte	2				/* DWARF Version */
+	.4byte	.Labbrev1_begin			/* Offset into abbrev section */
+	.byte	PTRBITS / 8			/* Pointer size */
+
+	/* CU die */
+	.uleb128 1				/* Abbrev: DW_TAG_compile_unit */
+	.4byte	.Lline1_begin			/* DW_AT_stmt_list */
+	PTRBYTE	func_start			/* DW_AT_low_pc */
+	PTRBYTE	func_end			/* DW_AT_high_pc */
+	.ascii	"main.c\0"			/* DW_AT_name */
+	.ascii	"GNU C 4.5.0\0"			/* DW_AT_producer must be >= 4.5  */
+	.byte	2				/* DW_AT_language (DW_LANG_C) */
+
+	.uleb128	2			/* Abbrev: DW_TAG_subprogram */
+	.byte		1			/* DW_AT_external */
+	.ascii		"func\0"		/* DW_AT_name */
+	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
+	PTRBYTE		func_start		/* DW_AT_low_pc */
+	PTRBYTE		func_end		/* DW_AT_high_pc */
+
+/* GDB `has_loclist' detection of -O2 -g code needs to see a DW_AT_location
+   location list.  There may exist -O2 -g CUs still not needing/using any such
+   location list - exactly like this CU.  Make one up.  */
+
+	.uleb128	0x7			/* (DIE (0x42) DW_TAG_formal_parameter) */
+	.ascii		"param\0"		/* DW_AT_name */
+	.4byte		.Ltype_int - .Lcu1_begin	/* DW_AT_type */
+	.4byte		loclist			/* DW_AT_location */
+
+	.uleb128	4			/* Abbrev: DW_TAG_inlined_subroutine */
+	.ascii		"inlined\0"		/* DW_AT_name */
+	PTRBYTE		func0			/* DW_AT_low_pc */
+	PTRBYTE		func1			/* DW_AT_high_pc */
+	.byte		3			/* DW_AT_inline (DW_INL_declared_inlined) */
+	.byte		1			/* DW_AT_call_file */
+	.byte		8			/* DW_AT_call_line */
+
+	.uleb128	4			/* Abbrev: DW_TAG_inlined_subroutine */
+	.ascii		"inlined2\0"		/* DW_AT_name */
+	PTRBYTE		func2			/* DW_AT_low_pc */
+	PTRBYTE		func3			/* DW_AT_high_pc */
+	.byte		3			/* DW_AT_inline (DW_INL_declared_inlined) */
+	.byte		1			/* DW_AT_call_file */
+	.byte		11			/* DW_AT_call_line */
+
+#ifdef INLINED
+	.uleb128	4			/* Abbrev: DW_TAG_inlined_subroutine */
+	.ascii		"otherinline\0"		/* DW_AT_name */
+	PTRBYTE		func3			/* DW_AT_low_pc */
+	PTRBYTE		func_end		/* DW_AT_high_pc */
+	.byte		3			/* DW_AT_inline (DW_INL_declared_inlined) */
+	.byte		1			/* DW_AT_call_file */
+	.byte		9			/* DW_AT_call_line */
+#endif
+
+#ifdef LEXICAL
+	.uleb128	5			/* Abbrev: DW_TAG_lexical_block */
+	PTRBYTE		func3			/* DW_AT_low_pc */
+	PTRBYTE		func_end		/* DW_AT_high_pc */
+
+	/* GDB would otherwise ignore the DW_TAG_lexical_block.  */
+	.uleb128	6			/* Abbrev: DW_TAG_variable */
+	.ascii		"lexicalvar\0"		/* DW_AT_name */
+	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
+
+	.byte		0			/* End of children of DW_TAG_lexical_block */
+#endif
+
+	.byte		0			/* End of children of DW_TAG_subprogram */
+
+/* Simulate `fund' is also named `func' so that the function name matches and
+   fund's SAL is not discarded in expand_line_sal_maybe.  */
+
+	.uleb128	2			/* Abbrev: DW_TAG_subprogram */
+	.byte		1			/* DW_AT_external */
+	.ascii		"func\0"		/* DW_AT_name */
+	.4byte		.Ltype_int-.Lcu1_begin	/* DW_AT_type */
+	PTRBYTE		fund_start		/* DW_AT_low_pc */
+	PTRBYTE		fund_end		/* DW_AT_high_pc */
+
+	.byte		0			/* End of children of DW_TAG_subprogram */
+
+.Ltype_int:
+	.uleb128	3			/* Abbrev: DW_TAG_base_type */
+	.ascii		"int\0"			/* DW_AT_name */
+	.byte		4			/* DW_AT_byte_size */
+	.byte		5			/* DW_AT_encoding */
+
+	.byte		0			/* End of children of CU */
+
+.Lcu1_end:
+
+	.section	.debug_loc
+loclist:
+	/* Reset the location list base address first.  */
+	.4byte		-1, 0
+
+	PTRBYTE		func_start, func_end
+	.2byte		2f-1f
+1:	.byte		0x50	/* DW_OP_reg0 */
+2:
+	/* Location list end.  */
+	.4byte	0, 0
+
+/* Abbrev table */
+	.section .debug_abbrev
+.Labbrev1_begin:
+	.uleb128	1			/* Abbrev code */
+	.uleb128	0x11			/* DW_TAG_compile_unit */
+	.byte		1			/* has_children */
+	.uleb128	0x10			/* DW_AT_stmt_list */
+	.uleb128	0x6			/* DW_FORM_data4 */
+	.uleb128	0x11			/* DW_AT_low_pc */
+	.uleb128	0x1			/* DW_FORM_addr */
+	.uleb128	0x12			/* DW_AT_high_pc */
+	.uleb128	0x1			/* DW_FORM_addr */
+	.uleb128	0x3			/* DW_AT_name */
+	.uleb128	0x8			/* DW_FORM_string */
+	.uleb128	0x25			/* DW_AT_producer */
+	.uleb128	0x8			/* DW_FORM_string */
+	.uleb128	0x13			/* DW_AT_language */
+	.uleb128	0xb			/* DW_FORM_data1 */
+	.byte		0x0			/* Terminator */
+	.byte		0x0			/* Terminator */
+
+	.uleb128	2			/* Abbrev code */
+	.uleb128	0x2e			/* DW_TAG_subprogram */
+	.byte		1			/* has_children */
+	.uleb128	0x3f			/* DW_AT_external */
+	.uleb128	0xc			/* DW_FORM_flag */
+	.uleb128	0x3			/* DW_AT_name */
+	.uleb128	0x8			/* DW_FORM_string */
+	.uleb128	0x49			/* DW_AT_type */
+	.uleb128	0x13			/* DW_FORM_ref4 */
+	.uleb128	0x11			/* DW_AT_low_pc */
+	.uleb128	0x1			/* DW_FORM_addr */
+	.uleb128	0x12			/* DW_AT_high_pc */
+	.uleb128	0x1			/* DW_FORM_addr */
+	.byte		0x0			/* Terminator */
+	.byte		0x0			/* Terminator */
+
+	.uleb128	3			/* Abbrev code */
+	.uleb128	0x24			/* DW_TAG_base_type */
+	.byte		0			/* has_children */
+	.uleb128	0x3			/* DW_AT_name */
+	.uleb128	0x8			/* DW_FORM_string */
+	.uleb128	0xb			/* DW_AT_byte_size */
+	.uleb128	0xb			/* DW_FORM_data1 */
+	.uleb128	0x3e			/* DW_AT_encoding */
+	.uleb128	0xb			/* DW_FORM_data1 */
+	.byte		0x0			/* Terminator */
+	.byte		0x0			/* Terminator */
+
+	.uleb128	4			/* Abbrev code */
+	.uleb128	0x1d			/* DW_TAG_inlined_subroutine */
+	.byte		0			/* has_children */
+	.uleb128	0x3			/* DW_AT_name */
+	.uleb128	0x8			/* DW_FORM_string */
+	.uleb128	0x11			/* DW_AT_low_pc */
+	.uleb128	0x1			/* DW_FORM_addr */
+	.uleb128	0x12			/* DW_AT_high_pc */
+	.uleb128	0x1			/* DW_FORM_addr */
+	.uleb128	0x20			/* DW_AT_inline */
+	.uleb128	0xb			/* DW_FORM_data1 */
+	.uleb128	0x58			/* DW_AT_call_file */
+	.uleb128	0xb			/* DW_FORM_data1 */
+	.uleb128	0x59			/* DW_AT_call_line */
+	.uleb128	0xb			/* DW_FORM_data1 */
+	.byte		0x0			/* Terminator */
+	.byte		0x0			/* Terminator */
+
+	.uleb128	5			/* Abbrev code */
+	.uleb128	0x0b			/* DW_TAG_lexical_block */
+	.byte		1			/* has_children */
+	.uleb128	0x11			/* DW_AT_low_pc */
+	.uleb128	0x1			/* DW_FORM_addr */
+	.uleb128	0x12			/* DW_AT_high_pc */
+	.uleb128	0x1			/* DW_FORM_addr */
+	.byte		0x0			/* Terminator */
+	.byte		0x0			/* Terminator */
+
+	.uleb128	6			/* Abbrev code */
+	.uleb128	0x34			/* DW_TAG_variable */
+	.byte		0			/* has_children */
+	.uleb128	0x3			/* DW_AT_name */
+	.uleb128	0x8			/* DW_FORM_string */
+	.uleb128	0x49			/* DW_AT_type */
+	.uleb128	0x13			/* DW_FORM_ref4 */
+	.byte		0x0			/* Terminator */
+	.byte		0x0			/* Terminator */
+
+	.uleb128	0x7			/* (abbrev code) */
+	.uleb128	0x5			/* (TAG: DW_TAG_formal_parameter) */
+	.byte		0x0			/* DW_children_no */
+	.uleb128	0x3			/* DW_AT_name */
+	.uleb128	0x8			/* DW_FORM_string */
+	.uleb128	0x49			/* (DW_AT_type) */
+	.uleb128	0x13			/* (DW_FORM_ref4) */
+	.uleb128	0x02			/* (DW_AT_location) */
+	.uleb128	0x06			/* (DW_FORM_data4) */
+	.byte		0x0
+	.byte		0x0
+
+	.byte		0x0			/* Terminator */
+	.byte		0x0			/* Terminator */
+
+/* Line table */
+	.section .debug_line
+.Lline1_begin:
+	.4byte		.Lline1_end - .Lline1_start	/* Initial length */
+.Lline1_start:
+	.2byte		2			/* Version */
+	.4byte		.Lline1_lines - .Lline1_hdr	/* header_length */
+.Lline1_hdr:
+	.byte		1			/* Minimum insn length */
+	.byte		1			/* default_is_stmt */
+	.byte		1			/* line_base */
+	.byte		1			/* line_range */
+	.byte		0x10			/* opcode_base */
+
+	/* Standard lengths */
+	.byte		0
+	.byte		1
+	.byte		1
+	.byte		1
+	.byte		1
+	.byte		0
+	.byte		0
+	.byte		0
+	.byte		1
+	.byte		0
+	.byte		0
+	.byte		1
+	.byte		0
+	.byte		0
+	.byte		0
+
+	/* Include directories */
+	.byte		0
+
+	/* File names */
+	.ascii		"main.c\0"
+	.uleb128	0
+	.uleb128	0
+	.uleb128	0
+
+	.ascii		"other.c\0"
+	.uleb128	0
+	.uleb128	0
+	.uleb128	0
+
+	.byte		0
+
+.Lline1_lines:
+	.byte		0	/* DW_LNE_set_address */
+	.uleb128	5
+	.byte		2
+	PTRBYTE		func_start
+	.byte		3	/* DW_LNS_advance_line */
+	.sleb128	4	/* ... to 5 */
+	.byte		1	/* DW_LNS_copy */
+
+	.byte		0	/* DW_LNE_set_address */
+	.uleb128	5
+	.byte		2
+	PTRBYTE		func0
+	.byte		4	/* DW_LNS_set_file */
+	.uleb128	2
+	.byte		3	/* DW_LNS_advance_line */
+	.sleb128	-4	/* ... to 1 */
+	.byte		1	/* DW_LNS_copy */
+
+	.byte		0	/* DW_LNE_set_address */
+	.uleb128	5
+	.byte		2
+	PTRBYTE		func1
+	.byte		4	/* DW_LNS_set_file */
+	.uleb128	1
+	.byte		3	/* DW_LNS_advance_line */
+	.sleb128	8	/* ... to 9 */
+	.byte		1	/* DW_LNS_copy */
+
+	.byte		0	/* DW_LNE_set_address */
+	.uleb128	5
+	.byte		2
+	PTRBYTE		func2
+	.byte		4	/* DW_LNS_set_file */
+	.uleb128	2
+	.byte		3	/* DW_LNS_advance_line */
+	.sleb128	-8	/* ... to 1 */
+	.byte		1	/* DW_LNS_copy */
+
+	.byte		0	/* DW_LNE_set_address */
+	.uleb128	5
+	.byte		2
+	PTRBYTE		func3
+	.byte		4	/* DW_LNS_set_file */
+	.uleb128	1
+	.byte		3	/* DW_LNS_advance_line */
+	.sleb128	8	/* ... to 9 */
+	.byte		1	/* DW_LNS_copy */
+
+	.byte		0	/* DW_LNE_set_address */
+	.uleb128	5
+	.byte		2
+	PTRBYTE		func_end
+
+/* Equivalent copy but renamed s/func/fund/.  */
+
+	.byte		0	/* DW_LNE_set_address */
+	.uleb128	5
+	.byte		2
+	PTRBYTE		fund_start
+	.byte		3	/* DW_LNS_advance_line */
+	.sleb128	-4	/* ... to 5 */
+	.byte		1	/* DW_LNS_copy */
+
+	.byte		0	/* DW_LNE_set_address */
+	.uleb128	5
+	.byte		2
+	PTRBYTE		fund0
+	.byte		4	/* DW_LNS_set_file */
+	.uleb128	2
+	.byte		3	/* DW_LNS_advance_line */
+	.sleb128	-4	/* ... to 1 */
+	.byte		1	/* DW_LNS_copy */
+
+	.byte		0	/* DW_LNE_set_address */
+	.uleb128	5
+	.byte		2
+	PTRBYTE		fund1
+	.byte		4	/* DW_LNS_set_file */
+	.uleb128	1
+	.byte		3	/* DW_LNS_advance_line */
+	.sleb128	8	/* ... to 9 */
+	.byte		1	/* DW_LNS_copy */
+
+	.byte		0	/* DW_LNE_set_address */
+	.uleb128	5
+	.byte		2
+	PTRBYTE		fund2
+	.byte		4	/* DW_LNS_set_file */
+	.uleb128	2
+	.byte		3	/* DW_LNS_advance_line */
+	.sleb128	-8	/* ... to 1 */
+	.byte		1	/* DW_LNS_copy */
+
+	.byte		0	/* DW_LNE_set_address */
+	.uleb128	5
+	.byte		2
+	PTRBYTE		fund3
+	.byte		4	/* DW_LNS_set_file */
+	.uleb128	1
+	.byte		3	/* DW_LNS_advance_line */
+	.sleb128	8	/* ... to 9 */
+	.byte		1	/* DW_LNS_copy */
+
+	.byte		0	/* DW_LNE_set_address */
+	.uleb128	5
+	.byte		2
+	PTRBYTE		fund_end
+
+/* Line numbering end.  */
+
+	.byte		0	/* DW_LNE_end_of_sequence */
+	.uleb128	1
+	.byte		1
+
+.Lline1_end:
diff --git a/testsuite/dwz.tests/dw2-skip-prologue.c b/testsuite/dwz.tests/dw2-skip-prologue.c
new file mode 100644
index 0000000..34b0a7c
--- /dev/null
+++ b/testsuite/dwz.tests/dw2-skip-prologue.c
@@ -0,0 +1,61 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2011-2019 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+   This was copied from the git://sourceware.org/git/binutils-gdb.git
+   repository, file gdb/testsuite/gdb.dwarf2/dw2-skip-prologue.c.  */
+
+static volatile int v;
+
+asm ("func_start: .globl func_start\n");
+static int
+func (void)
+{
+  v++;
+asm ("func0: .globl func0\n");
+  v++;
+asm ("func1: .globl func1\n");
+  v++;
+asm ("func2: .globl func2\n");
+  v++;
+asm ("func3: .globl func3\n");
+  return v;
+}
+asm ("func_end: .globl func_end\n");
+
+/* Equivalent copy but renamed s/func/fund/.  */
+
+asm ("fund_start: .globl fund_start\n");
+static int
+fund (void)
+{
+  v++;
+asm ("fund0: .globl fund0\n");
+  v++;
+asm ("fund1: .globl fund1\n");
+  v++;
+asm ("fund2: .globl fund2\n");
+  v++;
+asm ("fund3: .globl fund3\n");
+  return v;
+}
+asm ("fund_end: .globl fund_end\n");
+
+int
+main (void)
+{
+  return func () + fund ();
+}
diff --git a/testsuite/dwz.tests/pr24172.sh b/testsuite/dwz.tests/pr24172.sh
new file mode 100644
index 0000000..f455b27
--- /dev/null
+++ b/testsuite/dwz.tests/pr24172.sh
@@ -0,0 +1,14 @@
+cp $execs/dw2-skip-prologue 1
+
+if dwz 1 2>dwz.err; status=$?; then
+    true
+fi
+
+if ! grep -q "locexpr length .* exceeds .debug_loc section" dwz.err; then
+    cat dwz.err
+    exit 1
+fi
+
+[ $status -eq 1 ]
+
+rm -f 1 dwz.err
Require dw2-skip-prologue for pr24172.sh

Add missing require of dw2-skip-prologue for pr24172.sh in dwz-tests.exp.

This fixes buildbot failures on dwz-debian-armhf and dwz-debian-i386.

2019-04-24  Tom de Vries  <tdevries@suse.de>

	* testsuite/dwz.tests/dwz-tests.exp: Require dw2-skip-prologue for
	pr24172.sh.

---
 testsuite/dwz.tests/dwz-tests.exp | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/testsuite/dwz.tests/dwz-tests.exp b/testsuite/dwz.tests/dwz-tests.exp
index 04f00fc..fbc94ac 100644
--- a/testsuite/dwz.tests/dwz-tests.exp
+++ b/testsuite/dwz.tests/dwz-tests.exp
@@ -36,6 +36,9 @@ foreach test $tests {
 	    continue
 	}
     }
+    if { $basename == "pr24172.sh" } {
+	lappend required_execs "dw2-skip-prologue"
+    }
     if { ![istarget x86_64-*-*] } {
 	if { $basename == "pr24468.sh" } {
 	    unsupported "$test"