PERFORCE change 90069 for review

George V. Neville-Neil gnn at FreeBSD.org
Sat Jan 21 05:06:25 PST 2006


http://perforce.freebsd.org/chv.cgi?CH=90069

Change 90069 by gnn at gnn_tahi_fast_ipsec on 2006/01/21 13:06:06

	Fix pointer arithmetic so that we actually put the key in the database
	and not random garbage.  
	
	First working version with new structures.

Affected files ...

.. //depot/projects/gnn_fast_ipsec/src/sys/netipsec/key.c#3 edit

Differences ...

==== //depot/projects/gnn_fast_ipsec/src/sys/netipsec/key.c#3 (text+ko) ====

@@ -2799,10 +2799,14 @@
 			bzero(sav->key_enc->key_data, _KEYLEN(sav->key_enc));
 	}
 	if (sav->key_auth != NULL) {
+		if (sav->key_auth->key_data != NULL)
+			free(sav->key_auth->key_data, M_IPSEC_MISC);
 		free(sav->key_auth, M_IPSEC_MISC);
 		sav->key_auth = NULL;
 	}
 	if (sav->key_enc != NULL) {
+		if (sav->key_enc->key_data != NULL)
+			free(sav->key_enc->key_data, M_IPSEC_MISC);
 		free(sav->key_enc, M_IPSEC_MISC);
 		sav->key_enc = NULL;
 	}
@@ -3070,7 +3074,6 @@
 		}
 		switch (mhp->msg->sadb_msg_satype) {
 		case SADB_SATYPE_ESP:
-		  /* XXX FIX ME */
 			if (len == PFKEY_ALIGN8(sizeof(struct sadb_key)) &&
 			    sav->alg_enc != SADB_EALG_NULL) {
 				error = EINVAL;
@@ -3620,18 +3623,14 @@
 key_dup_keymsg(const struct sadb_key *src, u_int len,
 	       struct malloc_type *type)
 {
-	struct seckey *dst = NULL;
+	struct seckey *dst;
 	dst = (struct seckey *)malloc(sizeof(struct seckey), type, M_NOWAIT);
 	if (dst != NULL) {
 		dst->bits = src->sadb_key_bits;
 		dst->key_data = (char *)malloc(len, type, M_NOWAIT);
 		if (dst->key_data != NULL) {
-			bcopy(src + sizeof(struct sadb_key), 
+			bcopy((const char *)src + sizeof(struct sadb_key), 
 			      dst->key_data, len);
-			ipseclog((LOG_DEBUG, "%s: source bits %p\n", __func__,
-				  src + sizeof(struct sadb_key)));
-			ipseclog((LOG_DEBUG, "%s: dst bits %p\n", __func__,
-				  dst->key_data));
 		} else {
 			ipseclog((LOG_DEBUG, "%s: No more memory.\n", 
 				  __func__));
@@ -7265,12 +7264,25 @@
 	return m;
 }
 
+/*
+ * Take one of the kernel's security keys and convert it into a PF_KEY
+ * structure within an mbuf, suitable for sending up to a waiting
+ * application in user land.
+ * 
+ * IN: 
+ *    src: A pointer to a kernel security key.
+ *    exttype: Which type of key this is. Refer to the PF_KEY data structures.
+ * OUT:
+ *    a valid mbuf or NULL indicating an error
+ *
+ */
+
 static struct mbuf *
 key_setkey(struct seckey *src, u_int16_t exttype) 
 {
 	struct mbuf *m;
 	struct sadb_key *p;
-	int len = PFKEY_ALIGN8(sizeof(struct sadb_key));
+	int len = PFKEY_ALIGN8(sizeof(struct sadb_key) + _KEYLEN(src));
 
 	if (src == NULL)
 		return NULL;
@@ -7285,11 +7297,25 @@
 	p->sadb_key_bits = src->bits;
 	ipseclog((LOG_DEBUG, "%s: setting key data %s\n", 
 			   __func__, src->key_data));
-	bcopy(src->key_data, _KEYBUF(p), len);
+	bcopy(src->key_data, _KEYBUF(p), _KEYLEN(src));
 
 	return m;
 }
 
+/*
+ * Take one of the kernel's lifetime data structures and convert it
+ * into a PF_KEY structure within an mbuf, suitable for sending up to
+ * a waiting application in user land.
+ * 
+ * IN: 
+ *    src: A pointer to a kernel lifetime structure.
+ *    exttype: Which type of lifetime this is. Refer to the PF_KEY 
+ *             data structures for more information.
+ * OUT:
+ *    a valid mbuf or NULL indicating an error
+ *
+ */
+
 static struct mbuf *
 key_setlifetime(struct seclifetime *src, u_int16_t exttype)
 {


More information about the p4-projects mailing list