libgo: Update to Go 1.3.3 release.
authorIan Lance Taylor <ian@gcc.gnu.org>
Mon, 27 Oct 2014 16:57:33 +0000 (16:57 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Mon, 27 Oct 2014 16:57:33 +0000 (16:57 +0000)
From-SVN: r216746

19 files changed:
libgo/MERGE
libgo/go/compress/gzip/gzip.go
libgo/go/compress/zlib/writer.go
libgo/go/crypto/rsa/pkcs1v15.go
libgo/go/crypto/rsa/pkcs1v15_test.go
libgo/go/crypto/subtle/constant_time.go
libgo/go/crypto/tls/handshake_server.go
libgo/go/crypto/tls/handshake_server_test.go
libgo/go/crypto/tls/testdata/Server-TLSv12-IssueTicketPreDisable [new file with mode: 0644]
libgo/go/crypto/tls/testdata/Server-TLSv12-ResumeDisabled [new file with mode: 0644]
libgo/go/crypto/tls/ticket.go
libgo/go/net/dnsconfig_unix.go
libgo/go/net/fd_unix.go
libgo/go/net/fd_windows.go
libgo/go/net/http/httptest/server_test.go
libgo/go/net/sock_posix.go
libgo/go/net/testdata/resolv.conf
libgo/go/time/format_test.go
libgo/runtime/runtime.c

index b7e1968e24f6a6d2d0810ee8d17061ac8c51fc4f..99d33679a14754719ef37c97905eb2acab8ee26d 100644 (file)
@@ -1,4 +1,4 @@
-9895f9e36435
+f44017549ff9
 
 The first line of this file holds the Mercurial revision number of the
 last merge done from the master library sources.
index 3a0bf54e1b978bf789713536a032d2b76a65275d..5131d128e4e21e348e975d4180b0207878a164dc 100644 (file)
@@ -245,7 +245,8 @@ func (z *Writer) Flush() error {
        return z.err
 }
 
-// Close closes the Writer. It does not close the underlying io.Writer.
+// Close closes the Writer, flushing any unwritten data to the underlying
+// io.Writer, but does not close the underlying io.Writer.
 func (z *Writer) Close() error {
        if z.err != nil {
                return z.err
index fac7e15a7e3a04a3f8f33a0e6976a806fa31cd76..3b4313a8beaf56268629dc09664c4a3d3bcc3208 100644 (file)
@@ -174,7 +174,8 @@ func (z *Writer) Flush() error {
        return z.err
 }
 
-// Calling Close does not close the wrapped io.Writer originally passed to NewWriter.
+// Close closes the Writer, flushing any unwritten data to the underlying
+// io.Writer, but does not close the underlying io.Writer.
 func (z *Writer) Close() error {
        if !z.wroteHeader {
                z.err = z.writeHeader()
index d9957aec1d64f0f8b3ed72aeb1ae4f012124f325..59e8bb5b7ba1a6cb06d2e8c1367f0f3ca7811b51 100644 (file)
@@ -53,11 +53,14 @@ func DecryptPKCS1v15(rand io.Reader, priv *PrivateKey, ciphertext []byte) (out [
        if err := checkPub(&priv.PublicKey); err != nil {
                return nil, err
        }
-       valid, out, err := decryptPKCS1v15(rand, priv, ciphertext)
-       if err == nil && valid == 0 {
-               err = ErrDecryption
+       valid, out, index, err := decryptPKCS1v15(rand, priv, ciphertext)
+       if err != nil {
+               return
        }
-
+       if valid == 0 {
+               return nil, ErrDecryption
+       }
+       out = out[index:]
        return
 }
 
@@ -80,21 +83,32 @@ func DecryptPKCS1v15SessionKey(rand io.Reader, priv *PrivateKey, ciphertext []by
        }
        k := (priv.N.BitLen() + 7) / 8
        if k-(len(key)+3+8) < 0 {
-               err = ErrDecryption
-               return
+               return ErrDecryption
        }
 
-       valid, msg, err := decryptPKCS1v15(rand, priv, ciphertext)
+       valid, em, index, err := decryptPKCS1v15(rand, priv, ciphertext)
        if err != nil {
                return
        }
 
-       valid &= subtle.ConstantTimeEq(int32(len(msg)), int32(len(key)))
-       subtle.ConstantTimeCopy(valid, key, msg)
+       if len(em) != k {
+               // This should be impossible because decryptPKCS1v15 always
+               // returns the full slice.
+               return ErrDecryption
+       }
+
+       valid &= subtle.ConstantTimeEq(int32(len(em)-index), int32(len(key)))
+       subtle.ConstantTimeCopy(valid, key, em[len(em)-len(key):])
        return
 }
 
-func decryptPKCS1v15(rand io.Reader, priv *PrivateKey, ciphertext []byte) (valid int, msg []byte, err error) {
+// decryptPKCS1v15 decrypts ciphertext using priv and blinds the operation if
+// rand is not nil. It returns one or zero in valid that indicates whether the
+// plaintext was correctly structured. In either case, the plaintext is
+// returned in em so that it may be read independently of whether it was valid
+// in order to maintain constant memory access patterns. If the plaintext was
+// valid then index contains the index of the original message in em.
+func decryptPKCS1v15(rand io.Reader, priv *PrivateKey, ciphertext []byte) (valid int, em []byte, index int, err error) {
        k := (priv.N.BitLen() + 7) / 8
        if k < 11 {
                err = ErrDecryption
@@ -107,7 +121,7 @@ func decryptPKCS1v15(rand io.Reader, priv *PrivateKey, ciphertext []byte) (valid
                return
        }
 
-       em := leftPad(m.Bytes(), k)
+       em = leftPad(m.Bytes(), k)
        firstByteIsZero := subtle.ConstantTimeByteEq(em[0], 0)
        secondByteIsTwo := subtle.ConstantTimeByteEq(em[1], 2)
 
@@ -115,8 +129,7 @@ func decryptPKCS1v15(rand io.Reader, priv *PrivateKey, ciphertext []byte) (valid
        // octets, followed by a 0, followed by the message.
        //   lookingForIndex: 1 iff we are still looking for the zero.
        //   index: the offset of the first zero byte.
-       var lookingForIndex, index int
-       lookingForIndex = 1
+       lookingForIndex := 1
 
        for i := 2; i < len(em); i++ {
                equals0 := subtle.ConstantTimeByteEq(em[i], 0)
@@ -129,8 +142,8 @@ func decryptPKCS1v15(rand io.Reader, priv *PrivateKey, ciphertext []byte) (valid
        validPS := subtle.ConstantTimeLessOrEq(2+8, index)
 
        valid = firstByteIsZero & secondByteIsTwo & (^lookingForIndex & 1) & validPS
-       msg = em[index+1:]
-       return
+       index = subtle.ConstantTimeSelect(valid, index+1, 0)
+       return valid, em, index, nil
 }
 
 // nonZeroRandomBytes fills the given slice with non-zero random octets.
index 37c14d1d949b471e4a66cecfb65b2b38bbaa9c57..2dc5dbc2c85c5a97c5817f95b19e2157b9d1aa68 100644 (file)
@@ -227,6 +227,26 @@ func TestUnpaddedSignature(t *testing.T) {
        }
 }
 
+func TestShortSessionKey(t *testing.T) {
+       // This tests that attempting to decrypt a session key where the
+       // ciphertext is too small doesn't run outside the array bounds.
+       ciphertext, err := EncryptPKCS1v15(rand.Reader, &rsaPrivateKey.PublicKey, []byte{1})
+       if err != nil {
+               t.Fatalf("Failed to encrypt short message: %s", err)
+       }
+
+       var key [32]byte
+       if err := DecryptPKCS1v15SessionKey(nil, rsaPrivateKey, ciphertext, key[:]); err != nil {
+               t.Fatalf("Failed to decrypt short message: %s", err)
+       }
+
+       for _, v := range key {
+               if v != 0 {
+                       t.Fatal("key was modified when ciphertext was invalid")
+               }
+       }
+}
+
 // In order to generate new test vectors you'll need the PEM form of this key:
 // -----BEGIN RSA PRIVATE KEY-----
 // MIIBOgIBAAJBALKZD0nEffqM1ACuak0bijtqE2QrI/KLADv7l3kK3ppMyCuLKoF0
index de1a4e8c54da1a4c59d6f88b9b3e78a9fe68f44e..9c4b14a65f65424de72f7115e98f4835948d2bdb 100644 (file)
@@ -49,9 +49,14 @@ func ConstantTimeEq(x, y int32) int {
        return int(z & 1)
 }
 
-// ConstantTimeCopy copies the contents of y into x iff v == 1. If v == 0, x is left unchanged.
-// Its behavior is undefined if v takes any other value.
+// ConstantTimeCopy copies the contents of y into x (a slice of equal length)
+// if v == 1. If v == 0, x is left unchanged. Its behavior is undefined if v
+// takes any other value.
 func ConstantTimeCopy(v int, x, y []byte) {
+       if len(x) != len(y) {
+               panic("subtle: slices have different lengths")
+       }
+
        xmask := byte(v - 1)
        ymask := byte(^(v - 1))
        for i := 0; i < len(x); i++ {
index 75111eba0042f54c2cd42b59bd1f82161c957c84..dff6fd9adc4595e2ec67ad91acebb3592e714de6 100644 (file)
@@ -214,6 +214,10 @@ Curves:
 func (hs *serverHandshakeState) checkForResumption() bool {
        c := hs.c
 
+       if c.config.SessionTicketsDisabled {
+               return false
+       }
+
        var ok bool
        if hs.sessionState, ok = c.decryptTicket(hs.clientHello.sessionTicket); !ok {
                return false
index c3e36785b5d0fff4a0413d934b91372d12e73ab7..3444d5ca829e93ea75d79879666336de2816e471 100644 (file)
@@ -557,6 +557,32 @@ func TestResumption(t *testing.T) {
        runServerTestTLS12(t, test)
 }
 
+func TestResumptionDisabled(t *testing.T) {
+       sessionFilePath := tempFile("")
+       defer os.Remove(sessionFilePath)
+
+       config := *testConfig
+
+       test := &serverTest{
+               name:    "IssueTicketPreDisable",
+               command: []string{"openssl", "s_client", "-cipher", "RC4-SHA", "-sess_out", sessionFilePath},
+               config:  &config,
+       }
+       runServerTestTLS12(t, test)
+
+       config.SessionTicketsDisabled = true
+
+       test = &serverTest{
+               name:    "ResumeDisabled",
+               command: []string{"openssl", "s_client", "-cipher", "RC4-SHA", "-sess_in", sessionFilePath},
+               config:  &config,
+       }
+       runServerTestTLS12(t, test)
+
+       // One needs to manually confirm that the handshake in the golden data
+       // file for ResumeDisabled does not include a resumption handshake.
+}
+
 // cert.pem and key.pem were generated with generate_cert.go
 // Thus, they have no ExtKeyUsage fields and trigger an error
 // when verification is turned on.
diff --git a/libgo/go/crypto/tls/testdata/Server-TLSv12-IssueTicketPreDisable b/libgo/go/crypto/tls/testdata/Server-TLSv12-IssueTicketPreDisable
new file mode 100644 (file)
index 0000000..30f0026
--- /dev/null
@@ -0,0 +1,87 @@
+>>> Flow 1 (client to server)
+00000000  16 03 01 00 60 01 00 00  5c 03 03 54 23 54 02 17  |....`...\..T#T..|
+00000010  f3 53 13 3d 48 88 c3 19  b9 d1 3d 33 7f f5 99 56  |.S.=H.....=3...V|
+00000020  04 71 1b d9 d5 64 8a 0d  4a 54 00 00 00 04 00 05  |.q...d..JT......|
+00000030  00 ff 01 00 00 2f 00 23  00 00 00 0d 00 22 00 20  |...../.#.....". |
+00000040  06 01 06 02 06 03 05 01  05 02 05 03 04 01 04 02  |................|
+00000050  04 03 03 01 03 02 03 03  02 01 02 02 02 03 01 01  |................|
+00000060  00 0f 00 01 01                                    |.....|
+>>> Flow 2 (server to client)
+00000000  16 03 03 00 35 02 00 00  31 03 03 00 00 00 00 00  |....5...1.......|
+00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
+00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 05 00 00  |................|
+00000030  09 00 23 00 00 ff 01 00  01 00 16 03 03 02 be 0b  |..#.............|
+00000040  00 02 ba 00 02 b7 00 02  b4 30 82 02 b0 30 82 02  |.........0...0..|
+00000050  19 a0 03 02 01 02 02 09  00 85 b0 bb a4 8a 7f b8  |................|
+00000060  ca 30 0d 06 09 2a 86 48  86 f7 0d 01 01 05 05 00  |.0...*.H........|
+00000070  30 45 31 0b 30 09 06 03  55 04 06 13 02 41 55 31  |0E1.0...U....AU1|
+00000080  13 30 11 06 03 55 04 08  13 0a 53 6f 6d 65 2d 53  |.0...U....Some-S|
+00000090  74 61 74 65 31 21 30 1f  06 03 55 04 0a 13 18 49  |tate1!0...U....I|
+000000a0  6e 74 65 72 6e 65 74 20  57 69 64 67 69 74 73 20  |nternet Widgits |
+000000b0  50 74 79 20 4c 74 64 30  1e 17 0d 31 30 30 34 32  |Pty Ltd0...10042|
+000000c0  34 30 39 30 39 33 38 5a  17 0d 31 31 30 34 32 34  |4090938Z..110424|
+000000d0  30 39 30 39 33 38 5a 30  45 31 0b 30 09 06 03 55  |090938Z0E1.0...U|
+000000e0  04 06 13 02 41 55 31 13  30 11 06 03 55 04 08 13  |....AU1.0...U...|
+000000f0  0a 53 6f 6d 65 2d 53 74  61 74 65 31 21 30 1f 06  |.Some-State1!0..|
+00000100  03 55 04 0a 13 18 49 6e  74 65 72 6e 65 74 20 57  |.U....Internet W|
+00000110  69 64 67 69 74 73 20 50  74 79 20 4c 74 64 30 81  |idgits Pty Ltd0.|
+00000120  9f 30 0d 06 09 2a 86 48  86 f7 0d 01 01 01 05 00  |.0...*.H........|
+00000130  03 81 8d 00 30 81 89 02  81 81 00 bb 79 d6 f5 17  |....0.......y...|
+00000140  b5 e5 bf 46 10 d0 dc 69  be e6 2b 07 43 5a d0 03  |...F...i..+.CZ..|
+00000150  2d 8a 7a 43 85 b7 14 52  e7 a5 65 4c 2c 78 b8 23  |-.zC...R..eL,x.#|
+00000160  8c b5 b4 82 e5 de 1f 95  3b 7e 62 a5 2c a5 33 d6  |........;~b.,.3.|
+00000170  fe 12 5c 7a 56 fc f5 06  bf fa 58 7b 26 3f b5 cd  |..\zV.....X{&?..|
+00000180  04 d3 d0 c9 21 96 4a c7  f4 54 9f 5a bf ef 42 71  |....!.J..T.Z..Bq|
+00000190  00 fe 18 99 07 7f 7e 88  7d 7d f1 04 39 c4 a2 2e  |......~.}}..9...|
+000001a0  db 51 c9 7c e3 c0 4c 3b  32 66 01 cf af b1 1d b8  |.Q.|..L;2f......|
+000001b0  71 9a 1d db db 89 6b ae  da 2d 79 02 03 01 00 01  |q.....k..-y.....|
+000001c0  a3 81 a7 30 81 a4 30 1d  06 03 55 1d 0e 04 16 04  |...0..0...U.....|
+000001d0  14 b1 ad e2 85 5a cf cb  28 db 69 ce 23 69 de d3  |.....Z..(.i.#i..|
+000001e0  26 8e 18 88 39 30 75 06  03 55 1d 23 04 6e 30 6c  |&...90u..U.#.n0l|
+000001f0  80 14 b1 ad e2 85 5a cf  cb 28 db 69 ce 23 69 de  |......Z..(.i.#i.|
+00000200  d3 26 8e 18 88 39 a1 49  a4 47 30 45 31 0b 30 09  |.&...9.I.G0E1.0.|
+00000210  06 03 55 04 06 13 02 41  55 31 13 30 11 06 03 55  |..U....AU1.0...U|
+00000220  04 08 13 0a 53 6f 6d 65  2d 53 74 61 74 65 31 21  |....Some-State1!|
+00000230  30 1f 06 03 55 04 0a 13  18 49 6e 74 65 72 6e 65  |0...U....Interne|
+00000240  74 20 57 69 64 67 69 74  73 20 50 74 79 20 4c 74  |t Widgits Pty Lt|
+00000250  64 82 09 00 85 b0 bb a4  8a 7f b8 ca 30 0c 06 03  |d...........0...|
+00000260  55 1d 13 04 05 30 03 01  01 ff 30 0d 06 09 2a 86  |U....0....0...*.|
+00000270  48 86 f7 0d 01 01 05 05  00 03 81 81 00 08 6c 45  |H.............lE|
+00000280  24 c7 6b b1 59 ab 0c 52  cc f2 b0 14 d7 87 9d 7a  |$.k.Y..R.......z|
+00000290  64 75 b5 5a 95 66 e4 c5  2b 8e ae 12 66 1f eb 4f  |du.Z.f..+...f..O|
+000002a0  38 b3 6e 60 d3 92 fd f7  41 08 b5 25 13 b1 18 7a  |8.n`....A..%...z|
+000002b0  24 fb 30 1d ba ed 98 b9  17 ec e7 d7 31 59 db 95  |$.0.........1Y..|
+000002c0  d3 1d 78 ea 50 56 5c d5  82 5a 2d 5a 5f 33 c4 b6  |..x.PV\..Z-Z_3..|
+000002d0  d8 c9 75 90 96 8c 0f 52  98 b5 cd 98 1f 89 20 5f  |..u....R...... _|
+000002e0  f2 a0 1c a3 1b 96 94 dd  a9 fd 57 e9 70 e8 26 6d  |..........W.p.&m|
+000002f0  71 99 9b 26 6e 38 50 29  6c 90 a7 bd d9 16 03 03  |q..&n8P)l.......|
+00000300  00 04 0e 00 00 00                                 |......|
+>>> Flow 3 (client to server)
+00000000  16 03 03 00 86 10 00 00  82 00 80 27 e9 a4 f7 e7  |...........'....|
+00000010  df 25 de 84 8c 1f d6 e6  c3 11 28 55 9a c1 91 37  |.%........(U...7|
+00000020  84 f5 ba f8 80 0d ca 50  cb 1e 72 f7 97 6f c2 b2  |.......P..r..o..|
+00000030  04 4d 13 7c e0 6e a0 1f  91 e1 38 1b a2 c0 55 16  |.M.|.n....8...U.|
+00000040  7f 29 fc ed 1c 1a cf 72  14 c3 00 c1 dd 36 36 af  |.).....r.....66.|
+00000050  a6 e4 a8 be ba ec 13 d0  1e d0 1d fd e1 5b 27 fd  |.............['.|
+00000060  9a da 2e 12 c8 b0 b9 c2  b9 76 ec 7f 3c 98 b6 63  |.........v..<..c|
+00000070  bc da f0 07 7a 3d e7 61  f4 2f 12 80 3b f9 3b cc  |....z=.a./..;.;.|
+00000080  05 c8 2f 7e 28 b2 73 bf  97 61 29 14 03 03 00 01  |../~(.s..a).....|
+00000090  01 16 03 03 00 24 17 59  a9 45 53 46 33 96 50 dd  |.....$.Y.ESF3.P.|
+000000a0  3e 23 aa 91 38 f8 56 4a  2f 1a f2 b1 44 9b ce 17  |>#..8.VJ/...D...|
+000000b0  6b 8a 89 76 bc 67 b8 8b  ba 90                    |k..v.g....|
+>>> Flow 4 (server to client)
+00000000  16 03 03 00 72 04 00 00  6e 00 00 00 00 00 68 00  |....r...n.....h.|
+00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 65  |...............e|
+00000020  ea 4b d1 ef ba 2d db 0c  ba 9a d4 20 76 57 c8 ec  |.K...-..... vW..|
+00000030  dc 2d 77 fb fb 3b 93 5f  53 e0 14 4f 90 fb d6 55  |.-w..;._S..O...U|
+00000040  57 8c 8d 0d 25 ea 5d 0d  f2 91 e5 12 22 12 ec 7b  |W...%.]....."..{|
+00000050  5f b6 6e fd 07 59 23 24  fc b1 97 ca ea 56 a5 c2  |_.n..Y#$.....V..|
+00000060  a0 e4 9e 99 64 f2 64 d0  75 7a 46 63 e3 dc 21 ed  |....d.d.uzFc..!.|
+00000070  78 56 e9 e1 ab 66 80 14  03 03 00 01 01 16 03 03  |xV...f..........|
+00000080  00 24 fc 14 68 07 17 1f  df b7 84 cb fd c1 e0 e4  |.$..h...........|
+00000090  f2 1a ea 34 b5 00 7f 70  be c8 1c 0a d6 55 e3 57  |...4...p.....U.W|
+000000a0  50 4e 6d 7d 8a 5d 17 03  03 00 21 24 27 50 40 c1  |PNm}.]....!$'P@.|
+000000b0  c5 bd c7 9f 95 d9 ba 2e  7b 0e db ea a7 31 81 05  |........{....1..|
+000000c0  75 43 b1 63 cf b8 55 92  ef 76 98 a9 15 03 03 00  |uC.c..U..v......|
+000000d0  16 d7 ea 3c 79 e7 a6 2f  61 39 ec 4e 95 86 48 5e  |...<y../a9.N..H^|
+000000e0  75 a0 9e 41 42 89 67                              |u..AB.g|
diff --git a/libgo/go/crypto/tls/testdata/Server-TLSv12-ResumeDisabled b/libgo/go/crypto/tls/testdata/Server-TLSv12-ResumeDisabled
new file mode 100644 (file)
index 0000000..db833f6
--- /dev/null
@@ -0,0 +1,87 @@
+>>> Flow 1 (client to server)
+00000000  16 03 01 00 e8 01 00 00  e4 03 03 54 23 54 02 a5  |...........T#T..|
+00000010  10 11 0f 6d e5 2d 2f e8  bb 52 b1 38 3f 65 01 43  |...m.-/..R.8?e.C|
+00000020  36 cc 48 f6 09 22 a1 85  20 28 3c 20 35 8b fe 7a  |6.H..".. (< 5..z|
+00000030  41 3b 59 3a 5d b9 b3 21  f0 62 e9 0d 7b af f5 5d  |A;Y:]..!.b..{..]|
+00000040  fa 65 1a 40 c8 ca cd 74  8c ef d2 fb 00 04 00 05  |.e.@...t........|
+00000050  00 ff 01 00 00 97 00 23  00 68 00 00 00 00 00 00  |.......#.h......|
+00000060  00 00 00 00 00 00 00 00  00 00 65 ea 4b d1 ef ba  |..........e.K...|
+00000070  2d db 0c ba 9a d4 20 76  57 c8 ec dc 2d 77 fb fb  |-..... vW...-w..|
+00000080  3b 93 5f 53 e0 14 4f 90  fb d6 55 57 8c 8d 0d 25  |;._S..O...UW...%|
+00000090  ea 5d 0d f2 91 e5 12 22  12 ec 7b 5f b6 6e fd 07  |.]....."..{_.n..|
+000000a0  59 23 24 fc b1 97 ca ea  56 a5 c2 a0 e4 9e 99 64  |Y#$.....V......d|
+000000b0  f2 64 d0 75 7a 46 63 e3  dc 21 ed 78 56 e9 e1 ab  |.d.uzFc..!.xV...|
+000000c0  66 80 00 0d 00 22 00 20  06 01 06 02 06 03 05 01  |f....". ........|
+000000d0  05 02 05 03 04 01 04 02  04 03 03 01 03 02 03 03  |................|
+000000e0  02 01 02 02 02 03 01 01  00 0f 00 01 01           |.............|
+>>> Flow 2 (server to client)
+00000000  16 03 03 00 31 02 00 00  2d 03 03 00 00 00 00 00  |....1...-.......|
+00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
+00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 05 00 00  |................|
+00000030  05 ff 01 00 01 00 16 03  03 02 be 0b 00 02 ba 00  |................|
+00000040  02 b7 00 02 b4 30 82 02  b0 30 82 02 19 a0 03 02  |.....0...0......|
+00000050  01 02 02 09 00 85 b0 bb  a4 8a 7f b8 ca 30 0d 06  |.............0..|
+00000060  09 2a 86 48 86 f7 0d 01  01 05 05 00 30 45 31 0b  |.*.H........0E1.|
+00000070  30 09 06 03 55 04 06 13  02 41 55 31 13 30 11 06  |0...U....AU1.0..|
+00000080  03 55 04 08 13 0a 53 6f  6d 65 2d 53 74 61 74 65  |.U....Some-State|
+00000090  31 21 30 1f 06 03 55 04  0a 13 18 49 6e 74 65 72  |1!0...U....Inter|
+000000a0  6e 65 74 20 57 69 64 67  69 74 73 20 50 74 79 20  |net Widgits Pty |
+000000b0  4c 74 64 30 1e 17 0d 31  30 30 34 32 34 30 39 30  |Ltd0...100424090|
+000000c0  39 33 38 5a 17 0d 31 31  30 34 32 34 30 39 30 39  |938Z..1104240909|
+000000d0  33 38 5a 30 45 31 0b 30  09 06 03 55 04 06 13 02  |38Z0E1.0...U....|
+000000e0  41 55 31 13 30 11 06 03  55 04 08 13 0a 53 6f 6d  |AU1.0...U....Som|
+000000f0  65 2d 53 74 61 74 65 31  21 30 1f 06 03 55 04 0a  |e-State1!0...U..|
+00000100  13 18 49 6e 74 65 72 6e  65 74 20 57 69 64 67 69  |..Internet Widgi|
+00000110  74 73 20 50 74 79 20 4c  74 64 30 81 9f 30 0d 06  |ts Pty Ltd0..0..|
+00000120  09 2a 86 48 86 f7 0d 01  01 01 05 00 03 81 8d 00  |.*.H............|
+00000130  30 81 89 02 81 81 00 bb  79 d6 f5 17 b5 e5 bf 46  |0.......y......F|
+00000140  10 d0 dc 69 be e6 2b 07  43 5a d0 03 2d 8a 7a 43  |...i..+.CZ..-.zC|
+00000150  85 b7 14 52 e7 a5 65 4c  2c 78 b8 23 8c b5 b4 82  |...R..eL,x.#....|
+00000160  e5 de 1f 95 3b 7e 62 a5  2c a5 33 d6 fe 12 5c 7a  |....;~b.,.3...\z|
+00000170  56 fc f5 06 bf fa 58 7b  26 3f b5 cd 04 d3 d0 c9  |V.....X{&?......|
+00000180  21 96 4a c7 f4 54 9f 5a  bf ef 42 71 00 fe 18 99  |!.J..T.Z..Bq....|
+00000190  07 7f 7e 88 7d 7d f1 04  39 c4 a2 2e db 51 c9 7c  |..~.}}..9....Q.||
+000001a0  e3 c0 4c 3b 32 66 01 cf  af b1 1d b8 71 9a 1d db  |..L;2f......q...|
+000001b0  db 89 6b ae da 2d 79 02  03 01 00 01 a3 81 a7 30  |..k..-y........0|
+000001c0  81 a4 30 1d 06 03 55 1d  0e 04 16 04 14 b1 ad e2  |..0...U.........|
+000001d0  85 5a cf cb 28 db 69 ce  23 69 de d3 26 8e 18 88  |.Z..(.i.#i..&...|
+000001e0  39 30 75 06 03 55 1d 23  04 6e 30 6c 80 14 b1 ad  |90u..U.#.n0l....|
+000001f0  e2 85 5a cf cb 28 db 69  ce 23 69 de d3 26 8e 18  |..Z..(.i.#i..&..|
+00000200  88 39 a1 49 a4 47 30 45  31 0b 30 09 06 03 55 04  |.9.I.G0E1.0...U.|
+00000210  06 13 02 41 55 31 13 30  11 06 03 55 04 08 13 0a  |...AU1.0...U....|
+00000220  53 6f 6d 65 2d 53 74 61  74 65 31 21 30 1f 06 03  |Some-State1!0...|
+00000230  55 04 0a 13 18 49 6e 74  65 72 6e 65 74 20 57 69  |U....Internet Wi|
+00000240  64 67 69 74 73 20 50 74  79 20 4c 74 64 82 09 00  |dgits Pty Ltd...|
+00000250  85 b0 bb a4 8a 7f b8 ca  30 0c 06 03 55 1d 13 04  |........0...U...|
+00000260  05 30 03 01 01 ff 30 0d  06 09 2a 86 48 86 f7 0d  |.0....0...*.H...|
+00000270  01 01 05 05 00 03 81 81  00 08 6c 45 24 c7 6b b1  |..........lE$.k.|
+00000280  59 ab 0c 52 cc f2 b0 14  d7 87 9d 7a 64 75 b5 5a  |Y..R.......zdu.Z|
+00000290  95 66 e4 c5 2b 8e ae 12  66 1f eb 4f 38 b3 6e 60  |.f..+...f..O8.n`|
+000002a0  d3 92 fd f7 41 08 b5 25  13 b1 18 7a 24 fb 30 1d  |....A..%...z$.0.|
+000002b0  ba ed 98 b9 17 ec e7 d7  31 59 db 95 d3 1d 78 ea  |........1Y....x.|
+000002c0  50 56 5c d5 82 5a 2d 5a  5f 33 c4 b6 d8 c9 75 90  |PV\..Z-Z_3....u.|
+000002d0  96 8c 0f 52 98 b5 cd 98  1f 89 20 5f f2 a0 1c a3  |...R...... _....|
+000002e0  1b 96 94 dd a9 fd 57 e9  70 e8 26 6d 71 99 9b 26  |......W.p.&mq..&|
+000002f0  6e 38 50 29 6c 90 a7 bd  d9 16 03 03 00 04 0e 00  |n8P)l...........|
+00000300  00 00                                             |..|
+>>> Flow 3 (client to server)
+00000000  16 03 03 00 86 10 00 00  82 00 80 ae 02 dd 1f 1a  |................|
+00000010  86 83 f5 2f 82 46 4b 29  58 aa a1 b3 56 8b 4e 40  |.../.FK)X...V.N@|
+00000020  ef 23 65 67 ad 48 e5 e1  fd ae dd bf 68 fd bd a6  |.#eg.H......h...|
+00000030  13 a0 7e 05 ab f7 20 e1  6a 4e d1 37 93 08 1d c9  |..~... .jN.7....|
+00000040  37 e0 b5 34 28 bf 20 45  45 da 0f 7e 51 a7 c6 ae  |7..4(. EE..~Q...|
+00000050  61 6c 07 1b 73 ef da 6e  25 c4 ed be e3 3f da ae  |al..s..n%....?..|
+00000060  cd 3c 17 9c 2e ee fb 47  9d b3 a1 b2 c3 5d e0 83  |.<.....G.....]..|
+00000070  74 20 37 2d 72 d6 d0 4d  58 0e 26 1c 50 22 95 08  |t 7-r..MX.&.P"..|
+00000080  7d e0 5f 86 99 9e 2c 2e  a7 a0 7f 14 03 03 00 01  |}._...,.........|
+00000090  01 16 03 03 00 24 a2 ab  41 25 a5 cf 04 18 1d 98  |.....$..A%......|
+000000a0  88 6c 59 21 86 33 54 f4  35 b4 21 6e a5 29 d5 6e  |.lY!.3T.5.!n.).n|
+000000b0  3d 08 72 b0 af 46 b5 8f  6b 86                    |=.r..F..k.|
+>>> Flow 4 (server to client)
+00000000  14 03 03 00 01 01 16 03  03 00 24 59 20 4d c2 17  |..........$Y M..|
+00000010  8b 3c 9b 33 d9 f9 ef fb  80 18 1f 67 a7 58 12 89  |.<.3.......g.X..|
+00000020  4e 73 0f 2d 7b e6 c4 a6  79 73 01 da 22 e8 54 17  |Ns.-{...ys..".T.|
+00000030  03 03 00 21 36 ca 64 0f  4a 12 a5 50 3d 97 bb 39  |...!6.d.J..P=..9|
+00000040  02 fc ed d1 82 6a 9a 2e  21 79 f6 e1 b3 cc 32 db  |.....j..!y....2.|
+00000050  0f 5d b3 fb a5 15 03 03  00 16 51 f4 be 57 7a df  |.]........Q..Wz.|
+00000060  f1 f2 bd b5 51 5e 45 80  be 0b 9a 0c d1 19 3c 79  |....Q^E.......<y|
index 4cfc5a53ffeb1bff70cb3310ee0c5e6cd98221cb..0923027c701b162db37f236b6eaf5f77c0a7ef58 100644 (file)
@@ -153,7 +153,8 @@ func (c *Conn) encryptTicket(state *sessionState) ([]byte, error) {
 }
 
 func (c *Conn) decryptTicket(encrypted []byte) (*sessionState, bool) {
-       if len(encrypted) < aes.BlockSize+sha256.Size {
+       if c.config.SessionTicketsDisabled ||
+               len(encrypted) < aes.BlockSize+sha256.Size {
                return nil, false
        }
 
index af288253e09bacea861f751c779ae823c98035b2..db45716f124a155aa0519cd70ff6ad25c6e763f3 100644 (file)
@@ -75,19 +75,19 @@ func dnsReadConfig(filename string) (*dnsConfig, error) {
                        for i := 1; i < len(f); i++ {
                                s := f[i]
                                switch {
-                               case len(s) >= 6 && s[0:6] == "ndots:":
+                               case hasPrefix(s, "ndots:"):
                                        n, _, _ := dtoi(s, 6)
                                        if n < 1 {
                                                n = 1
                                        }
                                        conf.ndots = n
-                               case len(s) >= 8 && s[0:8] == "timeout:":
+                               case hasPrefix(s, "timeout:"):
                                        n, _, _ := dtoi(s, 8)
                                        if n < 1 {
                                                n = 1
                                        }
                                        conf.timeout = n
-                               case len(s) >= 8 && s[0:9] == "attempts:":
+                               case hasPrefix(s, "attempts:"):
                                        n, _, _ := dtoi(s, 9)
                                        if n < 1 {
                                                n = 1
@@ -103,3 +103,7 @@ func dnsReadConfig(filename string) (*dnsConfig, error) {
 
        return conf, nil
 }
+
+func hasPrefix(s, prefix string) bool {
+       return len(s) >= len(prefix) && s[:len(prefix)] == prefix
+}
index ca6aac3b42e3afafd72a3b01e8ec6ff06f49b5f3..7c73ddca7777670b6ae9619d4dcc41a2fdfc713d 100644 (file)
@@ -68,16 +68,19 @@ func (fd *netFD) name() string {
        return fd.net + ":" + ls + "->" + rs
 }
 
-func (fd *netFD) connect(la, ra syscall.Sockaddr) error {
+func (fd *netFD) connect(la, ra syscall.Sockaddr, deadline time.Time) error {
        // Do not need to call fd.writeLock here,
        // because fd is not yet accessible to user,
        // so no concurrent operations are possible.
-       if err := fd.pd.PrepareWrite(); err != nil {
-               return err
-       }
        switch err := syscall.Connect(fd.sysfd, ra); err {
        case syscall.EINPROGRESS, syscall.EALREADY, syscall.EINTR:
        case nil, syscall.EISCONN:
+               if !deadline.IsZero() && deadline.Before(time.Now()) {
+                       return errTimeout
+               }
+               if err := fd.init(); err != nil {
+                       return err
+               }
                return nil
        case syscall.EINVAL:
                // On Solaris we can see EINVAL if the socket has
@@ -92,6 +95,13 @@ func (fd *netFD) connect(la, ra syscall.Sockaddr) error {
        default:
                return err
        }
+       if err := fd.init(); err != nil {
+               return err
+       }
+       if !deadline.IsZero() {
+               fd.setWriteDeadline(deadline)
+               defer fd.setWriteDeadline(noDeadline)
+       }
        for {
                // Performing multiple connect system calls on a
                // non-blocking socket under Unix variants does not
index a1f6bc5f8148cb40fcbf45c7507da707dd5c89dd..d1129dccc47d8a857d038cf5758b794f5dacd80b 100644 (file)
@@ -313,10 +313,17 @@ func (fd *netFD) setAddr(laddr, raddr Addr) {
        runtime.SetFinalizer(fd, (*netFD).Close)
 }
 
-func (fd *netFD) connect(la, ra syscall.Sockaddr) error {
+func (fd *netFD) connect(la, ra syscall.Sockaddr, deadline time.Time) error {
        // Do not need to call fd.writeLock here,
        // because fd is not yet accessible to user,
        // so no concurrent operations are possible.
+       if err := fd.init(); err != nil {
+               return err
+       }
+       if !deadline.IsZero() {
+               fd.setWriteDeadline(deadline)
+               defer fd.setWriteDeadline(noDeadline)
+       }
        if !canUseConnectEx(fd.net) {
                return syscall.Connect(fd.sysfd, ra)
        }
index 501cc8a999562881be5fa81bd5e24857e418860f..4fc4c7020823f58b5ec4fbf3d2d8a663eeb599a4 100644 (file)
@@ -30,6 +30,7 @@ func TestServer(t *testing.T) {
 }
 
 func TestIssue7264(t *testing.T) {
+       t.Skip("broken test - removed at tip")
        for i := 0; i < 1000; i++ {
                func() {
                        inHandler := make(chan bool, 1)
index a6ef874c9fda0b3304dd503f2c1b836d2b5e200f..c80c7d6a2f1242f9a105d63b2cae59cad68adeec 100644 (file)
@@ -107,24 +107,18 @@ func (fd *netFD) dial(laddr, raddr sockaddr, deadline time.Time, toAddr func(sys
                        }
                }
        }
-       if err := fd.init(); err != nil {
-               return err
-       }
        var rsa syscall.Sockaddr
        if raddr != nil {
                if rsa, err = raddr.sockaddr(fd.family); err != nil {
                        return err
-               } else if rsa != nil {
-                       if !deadline.IsZero() {
-                               fd.setWriteDeadline(deadline)
-                       }
-                       if err := fd.connect(lsa, rsa); err != nil {
-                               return err
-                       }
-                       fd.isConnected = true
-                       if !deadline.IsZero() {
-                               fd.setWriteDeadline(noDeadline)
-                       }
+               }
+               if err := fd.connect(lsa, rsa, deadline); err != nil {
+                       return err
+               }
+               fd.isConnected = true
+       } else {
+               if err := fd.init(); err != nil {
+                       return err
                }
        }
        lsa, _ = syscall.Getsockname(fd.sysfd)
index b5972e09c98bc8dc87b74515aa28f02673a71316..3841bbf90446bd99d29526fa63ec60e46f61f198 100644 (file)
@@ -3,3 +3,4 @@
 domain Home
 nameserver 192.168.1.1
 options ndots:5 timeout:10 attempts:3 rotate
+options attempts 3
index 70e653e6706346d07e3262abe597f6bbc038a563..01717cad3e0f1c81cccca68ee844b7557e59cb25 100644 (file)
@@ -183,39 +183,45 @@ func TestParse(t *testing.T) {
        }
 }
 
-func TestParseInSydney(t *testing.T) {
-       loc, err := LoadLocation("Australia/Sydney")
+func TestParseInLocation(t *testing.T) {
+       // Check that Parse (and ParseInLocation) understand that
+       // Feb 01 AST (Arabia Standard Time) and Feb 01 AST (Atlantic Standard Time)
+       // are in different time zones even though both are called AST
+
+       baghdad, err := LoadLocation("Asia/Baghdad")
        if err != nil {
                t.Fatal(err)
        }
 
-       // Check that Parse (and ParseInLocation) understand
-       // that Feb EST and Aug EST are different time zones in Sydney
-       // even though both are called EST.
-       t1, err := ParseInLocation("Jan 02 2006 MST", "Feb 01 2013 EST", loc)
+       t1, err := ParseInLocation("Jan 02 2006 MST", "Feb 01 2013 AST", baghdad)
        if err != nil {
                t.Fatal(err)
        }
-       t2 := Date(2013, February, 1, 00, 00, 00, 0, loc)
+       t2 := Date(2013, February, 1, 00, 00, 00, 0, baghdad)
        if t1 != t2 {
-               t.Fatalf("ParseInLocation(Feb 01 2013 EST, Sydney) = %v, want %v", t1, t2)
+               t.Fatalf("ParseInLocation(Feb 01 2013 AST, Baghdad) = %v, want %v", t1, t2)
        }
        _, offset := t1.Zone()
-       if offset != 11*60*60 {
-               t.Fatalf("ParseInLocation(Feb 01 2013 EST, Sydney).Zone = _, %d, want _, %d", offset, 11*60*60)
+       if offset != 3*60*60 {
+               t.Fatalf("ParseInLocation(Feb 01 2013 AST, Baghdad).Zone = _, %d, want _, %d", offset, 3*60*60)
+       }
+
+       blancSablon, err := LoadLocation("America/Blanc-Sablon")
+       if err != nil {
+               t.Fatal(err)
        }
 
-       t1, err = ParseInLocation("Jan 02 2006 MST", "Aug 01 2013 EST", loc)
+       t1, err = ParseInLocation("Jan 02 2006 MST", "Feb 01 2013 AST", blancSablon)
        if err != nil {
                t.Fatal(err)
        }
-       t2 = Date(2013, August, 1, 00, 00, 00, 0, loc)
+       t2 = Date(2013, February, 1, 00, 00, 00, 0, blancSablon)
        if t1 != t2 {
-               t.Fatalf("ParseInLocation(Aug 01 2013 EST, Sydney) = %v, want %v", t1, t2)
+               t.Fatalf("ParseInLocation(Feb 01 2013 AST, Blanc-Sablon) = %v, want %v", t1, t2)
        }
        _, offset = t1.Zone()
-       if offset != 10*60*60 {
-               t.Fatalf("ParseInLocation(Aug 01 2013 EST, Sydney).Zone = _, %d, want _, %d", offset, 10*60*60)
+       if offset != -4*60*60 {
+               t.Fatalf("ParseInLocation(Feb 01 2013 AST, Blanc-Sablon).Zone = _, %d, want _, %d", offset, -4*60*60)
        }
 }
 
index 33fe1e7ee600046b47996d6148c6ab302363de69..bae462120923a085b023c2ac2f96ce8ddf410fdf 100644 (file)
@@ -112,8 +112,6 @@ runtime_goenvs_unix(void)
        syscall_Envs.__values = (void*)s;
        syscall_Envs.__count = n;
        syscall_Envs.__capacity = n;
-
-       traceback_cache = ~(uint32)0;
 }
 
 int32
@@ -309,6 +307,16 @@ runtime_parsedebugvars(void)
 {
        const byte *p;
        intgo i, n;
+       bool tmp;
+       
+       // gotraceback caches the GOTRACEBACK setting in traceback_cache.
+       // gotraceback can be called before the environment is available.
+       // traceback_cache must be reset after the environment is made
+       // available, in order for the environment variable to take effect.
+       // The code is fixed differently in Go 1.4.
+       // This is a limited fix for Go 1.3.3.
+       traceback_cache = ~(uint32)0;
+       runtime_gotraceback(&tmp);
 
        p = runtime_getenv("GODEBUG");
        if(p == nil)