]> Cypherpunks repositories - gostls13.git/commitdiff
http: do not crash accessing r.Form if ParseForm fails
authorRuss Cox <rsc@golang.org>
Tue, 17 Nov 2009 22:45:10 +0000 (14:45 -0800)
committerRuss Cox <rsc@golang.org>
Tue, 17 Nov 2009 22:45:10 +0000 (14:45 -0800)
Fixes #233.

R=dsymonds1
https://golang.org/cl/154179

src/pkg/http/request.go
src/pkg/http/request_test.go

index 5c6ce9099bad4b984afede77d3165ef83da22d7d..ee8d9af0ee4726409e74c57d78f6287082f4fc71 100644 (file)
@@ -576,7 +576,7 @@ func ReadRequest(b *bufio.Reader) (req *Request, err os.Error) {
        return req, nil;
 }
 
-func parseForm(query string) (m map[string][]string, err os.Error) {
+func parseForm(m map[string][]string, query string) (err os.Error) {
        data := make(map[string]*vector.StringVector);
        for _, kv := range strings.Split(query, "&", 0) {
                kvPair := strings.Split(kv, "=", 2);
@@ -599,7 +599,6 @@ func parseForm(query string) (m map[string][]string, err os.Error) {
                vec.Push(value);
        }
 
-       m = make(map[string][]string);
        for k, vec := range data {
                m[k] = vec.Data()
        }
@@ -613,9 +612,9 @@ func (r *Request) ParseForm() (err os.Error) {
        if r.Form != nil {
                return
        }
+       r.Form = make(map[string][]string);
 
        var query string;
-
        switch r.Method {
        case "GET":
                query = r.URL.RawQuery
@@ -628,7 +627,7 @@ func (r *Request) ParseForm() (err os.Error) {
                case "text/plain", "application/x-www-form-urlencoded", "":
                        var b []byte;
                        if b, err = io.ReadAll(r.Body); err != nil {
-                               return
+                               return err
                        }
                        query = string(b);
                // TODO(dsymonds): Handle multipart/form-data
@@ -636,8 +635,7 @@ func (r *Request) ParseForm() (err os.Error) {
                        return &badStringError{"unknown Content-Type", ct}
                }
        }
-       r.Form, err = parseForm(query);
-       return;
+       return parseForm(r.Form, query);
 }
 
 // FormValue returns the first value for the named component of the query.
index 200aa14e9f343becef969236a68af046c985a180..f2ef041bb014d6925605a7ab822f3aae6577ff47 100644 (file)
@@ -33,7 +33,8 @@ var parseTests = []parseTest{
 
 func TestParseForm(t *testing.T) {
        for i, test := range parseTests {
-               form, err := parseForm(test.query);
+               form := make(map[string][]string);
+               err := parseForm(form, test.query);
                if err != nil {
                        t.Errorf("test %d: Unexpected error: %v", i, err);
                        continue;