Skip to content

Commit

Permalink
cmd/asm: fix crash triggered by nested #define
Browse files Browse the repository at this point in the history
A panic was in place for an impossible condition that turned
out to be possible if one used a macro to define a macro.

Another go-fuzz "win".

Fixes #12654.

Change-Id: I0a7bb0f0eabb260c986bf7a2288860c78d8db1af
Reviewed-on: https://go-review.googlesource.com/14777
Reviewed-by: Andrew Gerrand <[email protected]>
  • Loading branch information
robpike committed Sep 21, 2015
1 parent bca70a6 commit 980cb0c
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 2 deletions.
29 changes: 29 additions & 0 deletions src/cmd/asm/internal/lex/lex_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,35 @@ var lexTests = []lexTest{
),
"C.\n",
},
{
"nested #define",
lines(
"#define A #define B THIS",
"A",
"B",
),
"THIS.\n",
},
{
"nested #define with args",
lines(
"#define A #define B(x) x",
"A",
"B(THIS)",
),
"THIS.\n",
},
/* This one fails. See comment in Slice.Col.
{
"nested #define with args",
lines(
"#define A #define B (x) x",
"A",
"B(THIS)",
),
"x.\n",
},
*/
}

func TestLex(t *testing.T) {
Expand Down
12 changes: 10 additions & 2 deletions src/cmd/asm/internal/lex/slice.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,16 @@ func (s *Slice) Line() int {
}

func (s *Slice) Col() int {
// Col is only called when defining a macro, which can't reach here.
panic("cannot happen: slice col")
// TODO: Col is only called when defining a macro and all it cares about is increasing
// position to discover whether there is a blank before the parenthesis.
// We only get here if defining a macro inside a macro.
// This imperfect implementation means we cannot tell the difference between
// #define A #define B(x) x
// and
// #define A #define B (x) x
// The first has definition of B has an argument, the second doesn't. Because we let
// text/scanner strip the blanks for us, this is extremely rare, hard to fix, and not worth it.
return s.pos
}

func (s *Slice) SetPos(line int, file string) {
Expand Down

0 comments on commit 980cb0c

Please sign in to comment.