From 8a676ab2d88022aea68a2a31ac83dfe25d64e175 Mon Sep 17 00:00:00 2001 From: Linus Nordberg Date: Sun, 10 Oct 2010 15:53:37 +0200 Subject: Robustness fixes (and some callback invocation) by Luke Howard. * lib/packet.c (_packet_create): Set packet identity properly. (_do_send): Return an int. (_do_send): Don't ignore rad_encode() errors. (_do_send): Do invoke rad_sign(). (_event_cb): Invoke callbacks. (_event_cb): Honour _do_send() return code. (_read_cb): Check packet (by invoking rad_packet_ok()). (_read_cb): Don't ignore rad_decode() errors. (_read_cb): Invoke callbacks. --- lib/include/radsec/radsec-impl.h | 2 ++ lib/packet.c | 39 +++++++++++++++++++++++++++++++-------- 2 files changed, 33 insertions(+), 8 deletions(-) (limited to 'lib') diff --git a/lib/include/radsec/radsec-impl.h b/lib/include/radsec/radsec-impl.h index b46bc47..d2ea095 100644 --- a/lib/include/radsec/radsec-impl.h +++ b/lib/include/radsec/radsec-impl.h @@ -63,9 +63,11 @@ struct rs_connection { enum rs_conn_type type; struct rs_credentials transport_credentials; struct rs_conn_callbacks callbacks; + void *user_data; struct rs_peer *peers; struct rs_peer *active_peer; struct rs_error *err; + int nextid; }; struct rs_packet { diff --git a/lib/packet.c b/lib/packet.c index 54bfc01..6b95b73 100644 --- a/lib/packet.c +++ b/lib/packet.c @@ -24,7 +24,7 @@ _packet_create (struct rs_connection *conn, struct rs_packet **pkt_out) rpkt = rad_alloc (1); if (!rpkt) return rs_err_conn_push (conn, RSE_NOMEM, __func__); - rpkt->id = -1; + rpkt->id = conn->nextid++; p = (struct rs_packet *) malloc (sizeof (struct rs_packet)); if (!p) @@ -40,12 +40,17 @@ _packet_create (struct rs_connection *conn, struct rs_packet **pkt_out) return RSE_OK; } -static void +static int _do_send (struct rs_packet *pkt) { int err; - rad_encode (pkt->rpkt, NULL, pkt->conn->active_peer->secret); + if (rad_encode (pkt->rpkt, NULL, pkt->conn->active_peer->secret)) + return rs_err_conn_push_fl (pkg->conn, RSE_FR, __FILE__, __LINE__, + "rad_encode: %s", fr_strerror ()); + if (rad_sign (pkt->rpkt, NULL, pkt->conn->active_peer->secret)) + return rs_err_conn_push_fl (pkg->conn, RSE_FR, __FILE__, __LINE__, + "rad_sign: %s", fr_strerror ()); assert (pkt->rpkt); #if defined (DEBUG) { @@ -63,16 +68,19 @@ _do_send (struct rs_packet *pkt) err = bufferevent_write (pkt->conn->bev, pkt->rpkt->data, pkt->rpkt->data_len); if (err < 0) - rs_err_conn_push_fl (pkt->conn, RSE_EVENT, __FILE__, __LINE__, - "bufferevent_write: %s", evutil_gai_strerror(err)); + return rs_err_conn_push_fl (pkt->conn, RSE_EVENT, __FILE__, __LINE__, + "bufferevent_write: %s", + evutil_gai_strerror(err)); + return RSE_OK; } static void _event_cb (struct bufferevent *bev, short events, void *ctx) { - struct rs_packet *pkt = (struct rs_packet *) ctx; + struct rs_packet *pkt = (struct rs_packet *)ctx; struct rs_connection *conn; struct rs_peer *p; + int err; assert (pkt); assert (pkt->conn); @@ -84,10 +92,17 @@ _event_cb (struct bufferevent *bev, short events, void *ctx) if (events & BEV_EVENT_CONNECTED) { p->is_connected = 1; + if (conn->callbacks.connected_cb) + conn->callbacks.connected_cb (conn->user_data); + #if defined (DEBUG) fprintf (stderr, "%s: connected\n", __func__); #endif - _do_send (pkt); + err = _do_send (pkt); + if (err) + return err; + if (conn->callbacks.sent_cb) + conn->callbacks.sent_cb (conn->user_data); /* Packet will be freed in write callback. */ } else if (events & BEV_EVENT_ERROR) @@ -162,7 +177,14 @@ _read_cb (struct bufferevent *bev, void *ctx) #if defined (DEBUG) fprintf (stderr, "%s: complete packet read\n", __func__); #endif - rad_decode (pkt->rpkt, NULL, pkt->conn->active_peer->secret); + if (!rad_packet_ok (pkt->rpkt, 0) != 0) + return; + if (rad_decode (pkt->rpkt, NULL, pkt->conn->active_peer->secret) != 0) + return; + + if (pkt->conn->callbacks.received_cb) + pkt->conn->callbacks.received_cb(pkt, pkt->conn->user_data); + if (event_base_loopbreak (pkt->conn->evb) < 0) abort (); /* FIXME */ } @@ -335,6 +357,7 @@ int rs_packet_send (struct rs_packet *pkt, void *user_data) { struct rs_connection *conn; + assert (pkt); conn = pkt->conn; -- cgit v1.1