]> Cypherpunks repositories - gostls13.git/commitdiff
regexp: Regexp shouldn't keep references to inputs
authorOleg Bulatov <oleg@bulatov.me>
Fri, 23 Feb 2018 15:55:19 +0000 (16:55 +0100)
committerBrad Fitzpatrick <bradfitz@golang.org>
Fri, 23 Feb 2018 16:58:48 +0000 (16:58 +0000)
If you try to find something in a slice of bytes using a Regexp object,
the byte array will not be released by GC until you use the Regexp object
on another slice of bytes. It happens because the Regexp object keep
references to the input data in its cache.

Change-Id: I873107f15c1900aa53ccae5d29dbc885b9562808
Reviewed-on: https://go-review.googlesource.com/96715
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/regexp/regexp.go

index 2e4c6e8926f106ec63045a774ed781ea3ded4470..7d32d8d5a69589c349e625da3951b0a483947058 100644 (file)
@@ -226,6 +226,11 @@ func (re *Regexp) get() *machine {
 // grow to the maximum number of simultaneous matches
 // run using re.  (The cache empties when re gets garbage collected.)
 func (re *Regexp) put(z *machine) {
+       // Remove references to input data that we no longer need.
+       z.inputBytes.str = nil
+       z.inputString.str = ""
+       z.inputReader.r = nil
+
        re.mu.Lock()
        re.machine = append(re.machine, z)
        re.mu.Unlock()