[Bug gdb/34277] New: [gdb] gdb misses the width check required by DW_OP_deref_type/DW_OP_GNU_deref_type

wujielun402 at gmail dot com via Gdb-prs <[email protected]>
Newsgroups gmane.comp.gdb.bugs.discuss
Message-ID <[email protected]/bugzilla/>
https://sourceware.org/bugzilla/show_bug.cgi?id=34277

            Bug ID: 34277
           Summary: [gdb] gdb misses the width check required by
                    DW_OP_deref_type/DW_OP_GNU_deref_type
           Product: gdb
           Version: HEAD
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: gdb
          Assignee: unassigned at sourceware dot org
          Reporter: wujielun402 at gmail dot com
  Target Milestone: ---

`DW_OP_deref_type` / `DW_OP_GNU_deref_type` in DWARF v5 carries both:

- an explicit dereference size
- a referenced base type

and the standard requires these to agree.

[DWARF v5](https://dwarfstd.org/doc/DWARF5.pdf) Section 2.5.1.3 says that for
`DW_OP_deref_type`, the first operand is a 1-byte unsigned size, and that this
size is the same as the size of the base type referenced by the second
operand.

So an operation such as:

```text
DW_OP_deref_type 4, <long unsigned int>
```

is invalid if `long unsigned int` is an 8-byte base type.

That kind of mismatch should be rejected at the `DW_OP_deref_type` operation
itself.

While reviewing `gdb`'s evaluator in `gdb/dwarf2/expr.c`, I noticed that the
current implementation reads the explicit dereference size and the referenced
base type, but does not check that their widths match.

A minimal patch in this branch would be:

```diff
@@
     if (op == DW_OP_deref_type || op == DW_OP_GNU_deref_type)
       {
         op_ptr = safe_read_uleb128 (op_ptr, op_end, &uoffset);
         cu_offset type_die_cu_off = (cu_offset) uoffset;
         type = get_base_type (type_die_cu_off);
+        if (type->length () != addr_size)
+          error (_("DW_OP_deref_type has different sizes for type and data"));
       }
```

These two added lines are the missing width check.

They are also consistent with the nearby `DW_OP_const_type` branch, which
already does the analogous size-consistency validation:

```c
if (type->length () != n)
  error (_("DW_OP_const_type has different sizes for type and data"));
```

-- 
You are receiving this mail because:
You are on the CC list for the bug.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.