]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/internal/ld: fix package data parsing
authorMatthew Dempsky <mdempsky@google.com>
Fri, 6 Mar 2015 01:00:18 +0000 (17:00 -0800)
committerIan Lance Taylor <iant@golang.org>
Wed, 11 Mar 2015 21:28:51 +0000 (21:28 +0000)
The conversion of this logic from C introduced a few subtle behavior
changes.  E.g., assigning "name := data[p0:]" and then "name =
name[:p1-p0]" actually caused name to span the vast majority of the
package data, as at the time of the second statement p0 points just
after the package name and p1 points to the end of the package data.

Similarly, the logic for advancing past the newline at the end of the
package line changed slightly: for a "package foo safe" line, the new
code would only advance up to the newline, but not past.  (Albeit, in
practice this doesn't matter: newlines in package data are harmless.)

Lastly, "data[p0]" was incorrectly written as "data[0]" a few times.

Change-Id: I49017e16ba33a627f773532b418cbf85a84f2b4b
Reviewed-on: https://go-review.googlesource.com/7000
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/cmd/internal/ld/go.go

index dd2ba9ff6f1d1282c555d93b7868103d88efdf7a..7385ce034f7e0cc25a5ba2c279b7eb5224860039 100644 (file)
@@ -112,7 +112,7 @@ func ldpkg(f *Biobuf, pkg string, length int64, filename string, whence int) {
        }
 
        p0 += 3
-       for p0 < len(data) && data[0] != '\n' {
+       for p0 < len(data) && data[p0] != '\n' {
                p0++
        }
 
@@ -127,7 +127,7 @@ func ldpkg(f *Biobuf, pkg string, length int64, filename string, whence int) {
        }
        p1 += p0
 
-       for p0 < p1 && (data[p0] == ' ' || data[0] == '\t' || data[0] == '\n') {
+       for p0 < p1 && (data[p0] == ' ' || data[p0] == '\t' || data[p0] == '\n') {
                p0++
        }
        if p0 < p1 {
@@ -143,7 +143,7 @@ func ldpkg(f *Biobuf, pkg string, length int64, filename string, whence int) {
                for p0 < p1 && (data[p0] == ' ' || data[p0] == '\t' || data[p0] == '\n') {
                        p0++
                }
-               name := data[p0:]
+               pname := p0
                for p0 < p1 && data[p0] != ' ' && data[p0] != '\t' && data[p0] != '\n' {
                        p0++
                }
@@ -153,16 +153,12 @@ func ldpkg(f *Biobuf, pkg string, length int64, filename string, whence int) {
                        Errorexit()
                }
 
-               name = name[:p1-p0]
+               name := data[pname:p0]
+               for p0 < p1 && data[p0] != '\n' {
+                       p0++
+               }
                if p0 < p1 {
-                       if data[p0] == '\n' {
-                               p0++
-                       } else {
-                               p0++
-                               for p0 < p1 && data[p0] != '\n' {
-                                       p0++
-                               }
-                       }
+                       p0++
                }
 
                if pkg == "main" && name != "main" {