diff options
| author | Linus Nordberg <linus@nordu.net> | 2010-10-10 15:53:37 +0200 | 
|---|---|---|
| committer | Linus Nordberg <linus@nordu.net> | 2010-10-10 15:53:37 +0200 | 
| commit | 8a676ab2d88022aea68a2a31ac83dfe25d64e175 (patch) | |
| tree | 5d644805b69e8dab4d44ed010706ccdb0e00a7d3 /lib | |
| parent | 5d1a02eb41025020b8c25ab927baca978fb733a9 (diff) | |
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.
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/include/radsec/radsec-impl.h | 2 | ||||
| -rw-r--r-- | lib/packet.c | 39 | 
2 files changed, 33 insertions, 8 deletions
| 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; | 
