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 */
peer->port->desc.proto->peer_destroy) {
peer->port->desc.proto->peer_destroy(peer);
}
+ if (peer->addr)
+ forb_free(peer->addr);
+
forb_free(peer);
}
* 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);
/**
/** 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);
};
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;
}
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;