From 8b7b0c8a2071d04c1ffdeecbc239278ce2506a3f Mon Sep 17 00:00:00 2001 From: Michal Sojka Date: Tue, 20 Jan 2009 14:12:12 +0100 Subject: [PATCH] Fixed handling of addresses in HELLO packets --- src/iop.c | 2 ++ src/peer.c | 3 +++ src/proto.h | 6 +++++- src/proto_inet.c | 10 ++++++++-- 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/iop.c b/src/iop.c index d7d3a53..b88fdd2 100644 --- a/src/iop.c +++ b/src/iop.c @@ -394,6 +394,8 @@ process_hello(forb_port_t *port, FORB_CDR_Codec *codec) peer = forb_peer_find(forb, &server_id); if (peer && peer->state == FORB_PEER_DISCOVERED) { /* TODO: Update last hello receive time */ + if (addr) + forb_free(addr); forb_peer_put(peer); } else { /* New peer discovered */ diff --git a/src/peer.c b/src/peer.c index 17fcb37..63c97f7 100644 --- a/src/peer.c +++ b/src/peer.c @@ -91,6 +91,9 @@ forb_peer_release(forb_ref_t *ref) peer->port->desc.proto->peer_destroy) { peer->port->desc.proto->peer_destroy(peer); } + if (peer->addr) + forb_free(peer->addr); + forb_free(peer); } diff --git a/src/proto.h b/src/proto.h index f26ec4a..58426b7 100644 --- a/src/proto.h +++ b/src/proto.h @@ -103,6 +103,9 @@ struct forb_proto { * peer. * * @param peer Peer to destroy + * + * @note The memory allocated by @a deserialize_addr (if any) + * is deallocated by FORB and should not be deallocated here. */ void (*peer_destroy)(forb_peer_t *peer); /** @@ -136,7 +139,8 @@ struct forb_proto { /** Serializes the protocol specific address */ CORBA_boolean (*serialize_addr)(FORB_CDR_Codec *codec, const void *addr); - /** Deserializes the protocol specific address */ + /** Deserializes the protocol specific address. The memory for + * storing the address should be allocated by forb_malloc(). */ CORBA_boolean (*deserialize_addr)(FORB_CDR_Codec *codec, void **addr); }; diff --git a/src/proto_inet.c b/src/proto_inet.c index fae7ec2..362e7d2 100644 --- a/src/proto_inet.c +++ b/src/proto_inet.c @@ -109,12 +109,16 @@ inet_serialize_addr(FORB_CDR_Codec *codec, const void *addr) static CORBA_boolean inet_deserialize_addr(FORB_CDR_Codec *codec, void **addr) { - struct inet_addr *a = *addr; + struct inet_addr *a; CORBA_long s_addr; CORBA_boolean ret; + a = forb_malloc(sizeof(*a)); + if (!a) + return CORBA_FALSE; ret = CORBA_long_deserialize(codec, &s_addr); a->addr.s_addr = s_addr; + *addr = a; return ret; } @@ -125,7 +129,9 @@ inet_connect(forb_peer_t *peer) struct sockaddr_in sa; struct inet_addr *addr = peer->addr; int ret; - + + if (!addr) + return NULL; ipeer = forb_malloc(sizeof(*ipeer)); if (!ipeer) goto err; -- 2.39.2