Unified · Split
| @@ -500,9 +500,7 @@ tlsClientExtensions(TLSconn *conn, int *plen) · 499 unmodified lines | |||
| 500 | p = b = nil; | 500 | p = b = nil; |
| 501 | 501 | ||
| 502 | // RFC6066 - Server Name Identification | 502 | // RFC6066 - Server Name Identification |
| 503 | if(conn->serverName != nil){ | 503 | if(conn->serverName != nil && (n = strlen(conn->serverName)) > 0){ |
| 504 | n = strlen(conn->serverName); | ||
| 505 | |||
| 506 | m = p - b; | 504 | m = p - b; |
| 507 | b = erealloc(b, m + 2+2+2+1+2+n); | 505 | b = erealloc(b, m + 2+2+2+1+2+n); |
| 508 | p = b + m; | 506 | p = b + m; |
| @@ -655,37 +653,26 @@ checkClientExtensions(TlsConnection *c, Bytes *ext) · 146 unmodified lines | |||
| 655 | uchar *p, *e; | 653 | uchar *p, *e; |
| 656 | int i, j, n; | 654 | int i, j, n; |
| 657 | 655 | ||
| 658 | p = ext->data; | 656 | if(ext == nil) |
| 659 | e = p+ext->len; | 657 | return 0; |
| 660 | while(p < e){ | 658 | |
| 661 | if(e-p < 2) | 659 | for(p = ext->data, e = p+ext->len; p < e; p += n){ |
| 660 | if(e-p < 4) | ||
| 662 | goto Short; | 661 | goto Short; |
| 663 | switch(get16(p)){ | 662 | p += 4; |
| 664 | case Extec: | 663 | if(e-p < (n = get16(p-2))) |
| 665 | p += 2; | 664 | goto Short; |
| 666 | n = get16(p); | 665 | switch(get16(p-4)){ |
| 667 | if(e-p < n || n < 2) | 666 | case Extec: |
| 667 | if(n < 4 || n % 2 || get16(p) != (n -= 2)) | ||
| 668 | goto Short; | 668 | goto Short; |
| 669 | p += 2; | 669 | p += 2; |
| 670 | n = get16(p); | ||
| 671 | p += 2; | ||
| 672 | if(e-p < n || n & 1 || n == 0) | ||
| 673 | goto Short; | ||
| 674 | for(i = 0; i < nelem(namedcurves) && c->sec->nc == nil; i++) | 670 | for(i = 0; i < nelem(namedcurves) && c->sec->nc == nil; i++) |
| 675 | for(j = 0; j < n; j += 2) | 671 | for(j = 0; j < n; j += 2) |
| 676 | if(namedcurves[i].tlsid == get16(p+j)){ | 672 | if(namedcurves[i].tlsid == get16(p+j)){ |
| 677 | c->sec->nc = &namedcurves[i]; | 673 | c->sec->nc = &namedcurves[i]; |
| 678 | break; | 674 | break; |
| 679 | } | 675 | } |
| 680 | p += n; | ||
| 681 | break; | ||
| 682 | default: | ||
| 683 | p += 2; | ||
| 684 | n = get16(p); | ||
| 685 | p += 2; | ||
| 686 | if(e-p < n) | ||
| 687 | goto Short; | ||
| 688 | p += n; | ||
| 689 | break; | 676 | break; |
| 690 | } | 677 | } |
| 691 | } | 678 | } |
| @@ -1591,7 +1578,7 @@ msgRecv(TlsConnection *c, Msg *m) · 899 unmodified lines | |||
| 1591 | nn = get16(p); | 1578 | nn = get16(p); |
| 1592 | p += 2, n -= 2; | 1579 | p += 2, n -= 2; |
| 1593 | 1580 | ||
| 1594 | if((nn & 1) || n < nn || nn < 2) | 1581 | if(nn % 2 || n < nn || nn < 2) |
| 1595 | goto Short; | 1582 | goto Short; |
| 1596 | m->u.clientHello.ciphers = newints(nn >> 1); | 1583 | m->u.clientHello.ciphers = newints(nn >> 1); |
| 1597 | for(i = 0; i < nn; i += 2) | 1584 | for(i = 0; i < nn; i += 2) |
| @@ -1680,7 +1667,7 @@ msgRecv(TlsConnection *c, Msg *m) · 82 unmodified lines | |||
| 1680 | goto Short; | 1667 | goto Short; |
| 1681 | nn = get16(p); | 1668 | nn = get16(p); |
| 1682 | p += 2, n -= 2; | 1669 | p += 2, n -= 2; |
| 1683 | if(nn & 1) | 1670 | if(nn % 2) |
| 1684 | goto Short; | 1671 | goto Short; |
| 1685 | m->u.certificateRequest.sigalgs = newints(nn>>1); | 1672 | m->u.certificateRequest.sigalgs = newints(nn>>1); |
| 1686 | for(i = 0; i < nn; i += 2) | 1673 | for(i = 0; i < nn; i += 2) |