diff options
Diffstat (limited to 'prog/rand.go')
| -rw-r--r-- | prog/rand.go | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/prog/rand.go b/prog/rand.go index 24662f6ff..1db5cd07a 100644 --- a/prog/rand.go +++ b/prog/rand.go @@ -278,6 +278,8 @@ func escapingFilename(file string) bool { var specialFiles = []string{"", "."} +const specialFileLenPad = "a" + func (r *randGen) filenameImpl(s *state) string { if r.oneOf(100) { return specialFiles[r.Intn(len(specialFiles))] @@ -296,6 +298,15 @@ func (r *randGen) filenameImpl(s *state) string { } for i := 0; ; i++ { f := fmt.Sprintf("%v/file%v", dir, i) + if r.oneOf(100) { + // Make file name very long using target.SpecialFileLenghts consts. + // Add/subtract some small const to account for our file name prefix + // and potential kernel off-by-one's. + fileLen := r.randFilenameLength() + if add := fileLen - len(f); add > 0 { + f += strings.Repeat(specialFileLenPad, add) + } + } if !s.files[f] { return f } @@ -304,6 +315,19 @@ func (r *randGen) filenameImpl(s *state) string { return r.randFromMap(s.files) } +func (r *randGen) randFilenameLength() int { + off := r.biasedRand(10, 5) + if r.bin() { + off = -off + } + lens := r.target.SpecialFileLenghts + res := lens[r.Intn(len(lens))] + off + if res < 0 { + res = 0 + } + return res +} + func (r *randGen) randFromMap(m map[string]bool) string { files := make([]string, 0, len(m)) for f := range m { @@ -721,10 +745,8 @@ func (a *BufferType) generate(r *randGen, s *state, dir Dir) (arg Arg, calls []* sz = a.Size() case r.nOutOf(1, 3): sz = r.rand(100) - case r.nOutOf(1, 2): - sz = 108 // UNIX_PATH_MAX default: - sz = 4096 // PATH_MAX + sz = uint64(r.randFilenameLength()) } return MakeOutDataArg(a, dir, sz), nil } |
