|
|||||||||||
|
Re: IPV4_RANGE causes isakmpd crash
From: Hakan Olsson <ho(at)crt.se>
Date: Tue Jun 10 2003 - 08:26:10 EDT
> Isakmpd can crash during Phase 2 if a remote host uses ID like
Hi, thanks for pointing this out. I just committed a fix which is effectively the same as your suggested patch, although I took the opportunity to fix a few nits along the way. Here's the diff (or get it from CVS in a couple of hours): Index: ipsec.c RCS file: /cvs/src/sbin/isakmpd/ipsec.c,v retrieving revision 1.76 diff -u -u -r1.76 ipsec.c
--- ipsec.c 4 Jun 2003 07:31:16 -0000 1.76
+++ ipsec.c 10 Jun 2003 12:19:47 -0000
@@ -331,7 +331,7 @@
/* Initiator is source, responder is destination. */
if (ipsec_set_network (ie->id_ci, ie->id_cr, isa))
{
- log_error ("ipsec_finalize_exchange: "
+ log_print ("ipsec_finalize_exchange: "
"ipsec_set_network failed");
return;
}
@@ -341,7 +341,7 @@
/* Responder is source, initiator is destination. */
if (ipsec_set_network (ie->id_cr, ie->id_ci, isa))
{
- log_error ("ipsec_finalize_exchange: "
+ log_print ("ipsec_finalize_exchange: "
"ipsec_set_network failed");
return;
}
@@ -414,6 +414,7 @@ ipsec_set_network (u_int8_t *src_id, u_int8_t *dst_id, struct ipsec_sa *isa) { int id; + char *v;
/* Set source address/mask. */
isa->src_net =
(struct sockaddr *)calloc (1, sizeof (struct sockaddr_in));
if (!isa->src_net)
- return -1;
+ goto memfail;
isa->src_net->sa_family = AF_INET;
#ifndef USE_OLD_SOCKADDR
isa->src_net->sa_len = sizeof (struct sockaddr_in);
@@ -433,7 +434,7 @@
isa->src_mask =
(struct sockaddr *)calloc (1, sizeof (struct sockaddr_in));
if (!isa->src_mask)
- return -1;
+ goto memfail;
isa->src_mask->sa_family = AF_INET;
#ifndef USE_OLD_SOCKADDR
isa->src_mask->sa_len = sizeof (struct sockaddr_in);
@@ -445,7 +446,7 @@
isa->src_net =
(struct sockaddr *)calloc (1, sizeof (struct sockaddr_in6));
if (!isa->src_net)
- return -1;
+ goto memfail;
isa->src_net->sa_family = AF_INET6;
#ifndef USE_OLD_SOCKADDR
isa->src_net->sa_len = sizeof (struct sockaddr_in6);
@@ -454,12 +455,23 @@
isa->src_mask =
(struct sockaddr *)calloc (1, sizeof (struct sockaddr_in6));
if (!isa->src_mask)
- return -1;
+ goto memfail;
isa->src_mask->sa_family = AF_INET6;
#ifndef USE_OLD_SOCKADDR
isa->src_mask->sa_len = sizeof (struct sockaddr_in6);
#endif
break;
+
+ case IPSEC_ID_IPV4_RANGE:
+ case IPSEC_ID_IPV6_RANGE:
+ case IPSEC_ID_DER_ASN1_DN:
+ case IPSEC_ID_DER_ASN1_GN:
+ case IPSEC_ID_KEY_ID:
+ default:
+ v = constant_lookup (ipsec_id_cst, id);
+ log_print ("ipsec_set_network: ID type %d (%s) not supported",
+ id, v ? v : "
/* Net */
isa->dst_net =
(struct sockaddr *)calloc (1, sizeof (struct sockaddr_in));
if (!isa->dst_net)
- return -1;
+ goto memfail;
isa->dst_net->sa_family = AF_INET;
#ifndef USE_OLD_SOCKADDR
isa->dst_net->sa_len = sizeof (struct sockaddr_in);
@@ -503,7 +515,7 @@
isa->dst_mask =
(struct sockaddr *)calloc (1, sizeof (struct sockaddr_in));
if (!isa->dst_mask)
- return -1;
+ goto memfail;
isa->dst_mask->sa_family = AF_INET;
#ifndef USE_OLD_SOCKADDR
isa->dst_mask->sa_len = sizeof (struct sockaddr_in);
@@ -515,7 +527,7 @@
isa->dst_net =
(struct sockaddr *)calloc (1, sizeof (struct sockaddr_in6));
if (!isa->dst_net)
- return -1;
+ goto memfail;
isa->dst_net->sa_family = AF_INET6;
#ifndef USE_OLD_SOCKADDR
isa->dst_net->sa_len = sizeof (struct sockaddr_in6);
@@ -524,7 +536,7 @@
isa->dst_mask =
(struct sockaddr *)calloc (1, sizeof (struct sockaddr_in6));
if (!isa->dst_mask)
- return -1;
+ goto memfail;
isa->dst_mask->sa_family = AF_INET6;
#ifndef USE_OLD_SOCKADDR
isa->dst_mask->sa_len = sizeof (struct sockaddr_in6);
@@ -557,6 +569,10 @@
memcpy (&isa->dport, dst_id + ISAKMP_ID_DOI_DATA_OFF + IPSEC_ID_PORT_OFF, IPSEC_ID_PORT_LEN);
+
+ memfail:
+ log_error ("ipsec_set_network: calloc () failed");
+ return -1;
} /* Free the DOI-specific exchange data pointed to by VIE. */ //H -- Håkan OlssonReceived on Tue Jun 10 08:35:55 2003 This archive was generated by hypermail 2.1.8 : Wed Aug 23 2006 - 13:29:58 EDT |
||||||||||
|
|||||||||||