[gPXE git] mainline: 2 commits to master (f73ffe8..e9d7419)

git at etherboot.org git at etherboot.org
Tue Jun 29 03:10:56 EDT 2010


In the Main gPXE repository, branch master has been updated.
      adds  e9d7419 [tls] Handle multiple handshake records
      adds  512bc1a [pcnet32] Fix uninitialised variable
      from  f73ffe8 [r8169] Remove r8169 driver cfg lookup, use pci_device_id->driver_data instead

Summary of changes:
 src/drivers/net/pcnet32.c |    2 +-
 src/net/tls.c             |   93 ++++++++++++++++++++++++++-------------------
 2 files changed, 55 insertions(+), 40 deletions(-)


- Log -----------------------------------------------------------------
------
commit e9d7419f1c4795e8c53630121cad86247ffa522f
Author: Michael Brown <mcb30 at ipxe.org>
Date: Wed Jun 23 01:01:32 2010 +0100
Committer: Stefan Hajnoczi <stefanha at gmail.com>

[tls] Handle multiple handshake records

The handshake record in TLS can contain multiple messages.

Originally-fixed-by: Timothy Stack <tstack at vmware.com>
Signed-off-by: Michael Brown <mcb30 at ipxe.org>
Signed-off-by: Stefan Hajnoczi <stefanha at gmail.com>
---
 src/net/tls.c |   93 +++++++++++++++++++++++++++++++++------------------------
 1 files changed, 54 insertions(+), 39 deletions(-)

diff --git a/src/net/tls.c b/src/net/tls.c
index a5b126e..89b5dee 100644
--- a/src/net/tls.c
+++ b/src/net/tls.c
@@ -964,50 +964,65 @@ static int tls_new_finished ( struct tls_session *tls,
  */
 static int tls_new_handshake ( struct tls_session *tls,
 			       void *data, size_t len ) {
-	struct {
-		uint8_t type;
-		uint8_t length[3];
-		uint8_t payload[0];
-	} __attribute__ (( packed )) *handshake = data;
-	void *payload = &handshake->payload;
-	size_t payload_len = tls_uint24 ( handshake->length );
-	void *end = ( payload + payload_len );
+	void *end = ( data + len );
 	int rc;
 
-	/* Sanity check */
-	if ( end != ( data + len ) ) {
-		DBGC ( tls, "TLS %p received overlength Handshake\n", tls );
-		DBGC_HD ( tls, data, len );
-		return -EINVAL;
-	}
+	while ( data != end ) {
+		struct {
+			uint8_t type;
+			uint8_t length[3];
+			uint8_t payload[0];
+		} __attribute__ (( packed )) *handshake = data;
+		void *payload = &handshake->payload;
+		size_t payload_len = tls_uint24 ( handshake->length );
+		void *next = ( payload + payload_len );
+
+		/* Sanity check */
+		if ( next > end ) {
+			DBGC ( tls, "TLS %p received overlength Handshake\n",
+			       tls );
+			DBGC_HD ( tls, data, len );
+			return -EINVAL;
+		}
 
-	switch ( handshake->type ) {
-	case TLS_SERVER_HELLO:
-		rc = tls_new_server_hello ( tls, payload, payload_len );
-		break;
-	case TLS_CERTIFICATE:
-		rc = tls_new_certificate ( tls, payload, payload_len );
-		break;
-	case TLS_SERVER_HELLO_DONE:
-		rc = tls_new_server_hello_done ( tls, payload, payload_len );
-		break;
-	case TLS_FINISHED:
-		rc = tls_new_finished ( tls, payload, payload_len );
-		break;
-	default:
-		DBGC ( tls, "TLS %p ignoring handshake type %d\n",
-		       tls, handshake->type );
-		rc = 0;
-		break;
-	}
+		switch ( handshake->type ) {
+		case TLS_SERVER_HELLO:
+			rc = tls_new_server_hello ( tls, payload, payload_len );
+			break;
+		case TLS_CERTIFICATE:
+			rc = tls_new_certificate ( tls, payload, payload_len );
+			break;
+		case TLS_SERVER_HELLO_DONE:
+			rc = tls_new_server_hello_done ( tls, payload,
+							 payload_len );
+			break;
+		case TLS_FINISHED:
+			rc = tls_new_finished ( tls, payload, payload_len );
+			break;
+		default:
+			DBGC ( tls, "TLS %p ignoring handshake type %d\n",
+			       tls, handshake->type );
+			rc = 0;
+			break;
+		}
 
-	/* Add to handshake digest (except for Hello Requests, which
-	 * are explicitly excluded).
-	 */
-	if ( handshake->type != TLS_HELLO_REQUEST )
-		tls_add_handshake ( tls, data, len );
+		/* Add to handshake digest (except for Hello Requests,
+		 * which are explicitly excluded).
+		 */
+		if ( handshake->type != TLS_HELLO_REQUEST )
+			tls_add_handshake ( tls, data,
+					    sizeof ( *handshake ) +
+					    payload_len );
 
-	return rc;
+		/* Abort on failure */
+		if ( rc != 0 )
+			return rc;
+
+		/* Move to next handshake record */
+		data = next;
+	}
+
+	return 0;
 }
 
 /**

------
commit 512bc1ae0687605e0b1a49f5cd91a7fea34e09f4
Author: Geoff Lywood <glywood at vmware.com>
Date: Tue Jun 29 07:51:51 2010 +0100
Committer: Stefan Hajnoczi <stefanha at gmail.com>

[pcnet32] Fix uninitialised variable

Using gcc 4.1.2, I get the following error when running 'make bin/pcnet32.rom':

  [BUILD] bin/pcnet32.o
cc1: warnings being treated as errors
drivers/net/pcnet32.c: In function 'pcnet32_probe':
drivers/net/pcnet32.c:516: warning: 'phycount' may be used uninitialized in this function
make: *** [bin/pcnet32.o] Error 1

This patch fixes the problem.

Signed-off-by: Geoff Lywood <glywood at vmware.com>
Signed-off-by: Stefan Hajnoczi <stefanha at gmail.com>
---
 src/drivers/net/pcnet32.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/src/drivers/net/pcnet32.c b/src/drivers/net/pcnet32.c
index 6bb2c1a..f845aa9 100644
--- a/src/drivers/net/pcnet32.c
+++ b/src/drivers/net/pcnet32.c
@@ -513,7 +513,7 @@ static void
 pcnet32_setup_probe_phy ( struct pcnet32_private *priv )
 {
 	unsigned long ioaddr = priv->pci_dev->ioaddr;
-	char phycount;
+	char phycount = 0;
 	int phy_id;
 	int i;
 
-----------------------------------------------------------------------


-- 
Main gPXE repository


More information about the gPXE-commits mailing list