Source file src/debug/elf/fuzz_test.go

     1  // Copyright 2026 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package elf_test
     6  
     7  import (
     8  	"bytes"
     9  	"compress/gzip"
    10  	"debug/elf"
    11  	"io"
    12  	"os"
    13  	"path/filepath"
    14  	"testing"
    15  )
    16  
    17  func FuzzReader(f *testing.F) {
    18  	if testing.Short() {
    19  		f.Skip("Skipping in short mode")
    20  	}
    21  
    22  	testdata, err := os.ReadDir("testdata")
    23  	if err != nil {
    24  		f.Fatalf("failed to read testdata directory: %s", err)
    25  	}
    26  	for _, de := range testdata {
    27  		if de.IsDir() || filepath.Ext(de.Name()) == ".c" {
    28  			continue
    29  		}
    30  		b, err := os.ReadFile(filepath.Join("testdata", de.Name()))
    31  		if err != nil {
    32  			f.Fatalf("failed to read testdata: %s", err)
    33  		}
    34  		if filepath.Ext(de.Name()) == ".gz" {
    35  			gz, err := gzip.NewReader(bytes.NewBuffer(b))
    36  			if err != nil {
    37  				f.Fatalf("failed to read gzip testdata: %s", err)
    38  			}
    39  			b, err = io.ReadAll(gz)
    40  			if err != nil {
    41  				f.Fatalf("failed to read gzip testdata: %s", err)
    42  			}
    43  		}
    44  		f.Add(b)
    45  	}
    46  
    47  	f.Fuzz(func(t *testing.T, data []byte) {
    48  		f, err := elf.NewFile(bytes.NewReader(data))
    49  		if err != nil {
    50  			return
    51  		}
    52  		defer f.Close()
    53  		f.DynString(elf.DT_SONAME)
    54  		f.DynString(elf.DT_RPATH)
    55  		f.DynValue(elf.DT_FLAGS)
    56  		f.DynValue(elf.DT_VERNEEDNUM)
    57  		f.DynamicSymbols()
    58  		f.DynamicVersionNeeds()
    59  		f.DynamicVersions()
    60  		f.ImportedLibraries()
    61  		f.ImportedSymbols()
    62  		f.Section(".data")
    63  		f.Section(".text")
    64  		f.SectionByType(elf.SHT_GNU_VERSYM)
    65  		f.Symbols()
    66  		dw, err := f.DWARF()
    67  		if err != nil {
    68  			return
    69  		}
    70  		dr := dw.Reader()
    71  		for {
    72  			e, _ := dr.Next()
    73  			if e == nil {
    74  				break
    75  			}
    76  		}
    77  	})
    78  }
    79  

View as plain text