diff options
46 files changed, 282 insertions, 149 deletions
diff --git a/lib/LICENSE b/lib/LICENSE index 43a0ec8..be32a9a 100644 --- a/lib/LICENSE +++ b/lib/LICENSE @@ -1,6 +1,6 @@ * Copyright (c) 2007-2010, UNINETT AS * Copyright (c) 2011, JANET(UK) -* Copyright (c) 2010-2011, NORDUnet A/S +* Copyright (c) 2010-2013, NORDUnet A/S * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/lib/Makefile.am b/lib/Makefile.am index ab1a47e..769e7ab 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -3,21 +3,22 @@ ACLOCAL_AMFLAGS = -I m4 # Shared library interface version, i.e. -version-info to Libtool, # expressed as three integers CURRENT:REVISION:AGE. - -# CURRENT is the version number of the current interface. Increment -# CURRENT when the library interface changes. - +# +# CURRENT is the version number of the current interface. Increment +# CURRENT when the library interface has changed or has been extended. +# # REVISION is the version number of the _implementation_ of the -# CURRENT interface. Set REVISION to 0 when CURRENT changes, -# else increment. - +# CURRENT interface. Set REVISION to 0 when CURRENT changes, else +# increment. +# # AGE is the number of interfaces this library implements, i.e. how -# many versions before CURRENT that are supported. Increment AGE -# when the library interface is _extended_. Set AGE to 0 when the -# library interface is _changed_. +# many versions before CURRENT that are supported. Increment AGE when +# the library interface is _extended_. Set AGE to 0 when the library +# interface is _changed_. SUBDIRS = radius radsecproxy include . examples +DIST_SUBDIRS = $(SUBDIRS) tests INCLUDES = -I$(srcdir)/include AM_CFLAGS = -Wall -Werror -g @@ -47,8 +48,24 @@ else libradsec_la_SOURCES += md5.c endif -EXTRA_DIST = HACKING LICENSE +libradsec_la_SOURCES += \ + compat.h \ + conn.h \ + debug.h \ + err.h \ + event.h \ + md5.h \ + packet.h \ + peer.h \ + radsec.h \ + tcp.h \ + tls.h \ + udp.h \ + util.h + +EXTRA_DIST = HACKING LICENSE libradsec.spec radsec.sym +AM_DISTCHECK_CONFIGURE_FLAGS = --enable-tls --enable-tls-psk libradsec_la_LIBADD = radsecproxy/libradsec-radsecproxy.la radius/libradsec-radius.la -libradsec_la_LDFLAGS = -version-info 1:0:1 -export-symbols radsec.sym +libradsec_la_LDFLAGS = -version-info 1:0:1 -export-symbols $(srcdir)/radsec.sym libradsec_la_CFLAGS = $(AM_CFLAGS) -DHAVE_CONFIG_H -Werror # -DDEBUG -DDEBUG_LEVENT @@ -1,16 +1,17 @@ -libradsec is a RADIUS library for clients doing RADIUS over UDP or -TLS. The goal is to add support for writing servers (and thus -proxies) and to add transports TCP and DTLS. +Libradsec is a RADIUS library for clients doing RADIUS over UDP or +TLS. The goal is to add support for writing servers (and thus proxies) +and to add transports TCP and DTLS. The canonical pickup point is http://git.nordu.net/?p=radsecproxy.git;a=shortlog;h=refs/heads/libradsec -The source code is licensed under a 3-clause BSD license. See LICENSE. +The source code is licensed under a 3-clause BSD license. See the +LICENSE file. -libradsec depends on +Libradsec depends on - libconfuse - libevent2 - openssl (if configured with --enable-tls) @@ -18,10 +19,24 @@ libradsec depends on To compile the library and the examples, do something like - sh autogen.sh && ./configure && make + sh autogen.sh && ./configure && make -If any of the libraries are not found, try setting environment -variable LDFLAGS at configure time like so: + +There are a couple of options that can be used when configuring. See + + ./configure --help + +for the full list. Worth mentioning here is --enable-tls and +--enable-tls-psk. + +If the preprocessor has a hard time finding some of the header files +are, try setting environment variable CPPFLAGS at configure +time. Example: + + CPPFLAGS="-I/usr/local/include" ./configure --enable-tls + +If the link editor has trouble finding any of the libraries needed, +try setting environment variable LDFLAGS at configure time. Example: LDFLAGS="-L/usr/local/lib" ./configure --enable-tls @@ -1,5 +1,5 @@ /* Copyright 2011 JANET(UK). All rights reserved. - See LICENSE for licensing information. */ + See LICENSE for licensing information. */ #if defined HAVE_CONFIG_H #include <config.h> diff --git a/lib/compat.c b/lib/compat.c index c09e795..7c4e346 100644 --- a/lib/compat.c +++ b/lib/compat.c @@ -1,5 +1,5 @@ /* Copyright 2011 NORDUnet A/S. All rights reserved. - See LICENSE for licensing information. */ + See LICENSE for licensing information. */ #if defined HAVE_CONFIG_H #include <config.h> diff --git a/lib/compat.h b/lib/compat.h index f132779..d3083e9 100644 --- a/lib/compat.h +++ b/lib/compat.h @@ -1,5 +1,5 @@ /* Copyright 2011 NORDUnet A/S. All rights reserved. - See LICENSE for licensing information. */ + See LICENSE for licensing information. */ ssize_t compat_send (int sockfd, const void *buf, size_t len, int flags); ssize_t compat_recv (int sockfd, void *buf, size_t len, int flags); @@ -1,5 +1,5 @@ -/* Copyright 2010, 2011 NORDUnet A/S. All rights reserved. - See LICENSE for licensing information. */ +/* Copyright 2010-2013 NORDUnet A/S. All rights reserved. + See LICENSE for licensing information. */ #if defined HAVE_CONFIG_H #include <config.h> diff --git a/lib/configure.ac b/lib/configure.ac index 4abd170..ab775e4 100644 --- a/lib/configure.ac +++ b/lib/configure.ac @@ -1,6 +1,6 @@ # -*- Autoconf -*- script for libradsec. -AC_PREREQ([2.65]) +AC_PREREQ([2.63]) AC_INIT([libradsec], [0.0.4.dev], [linus+libradsec@nordu.net]) AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_SRCDIR([radsec.c]) @@ -53,10 +53,10 @@ AC_TYPE_UINT8_T # Checks for library functions. AC_CHECK_FUNCS([memset socket strdup strerror strrchr]) -AC_CONFIG_FILES([Makefile +AC_CONFIG_FILES([Makefile libradsec.spec radsecproxy/Makefile - radius/Makefile - include/Makefile + radius/Makefile + include/Makefile examples/Makefile tests/Makefile]) AC_OUTPUT @@ -1,5 +1,5 @@ -/* Copyright 2010, 2011 NORDUnet A/S. All rights reserved. - See LICENSE for licensing information. */ +/* Copyright 2010-2013 NORDUnet A/S. All rights reserved. + See LICENSE for licensing information. */ #if defined HAVE_CONFIG_H #include <config.h> @@ -20,19 +20,6 @@ #include "tcp.h" int -conn_close (struct rs_connection **connp) -{ - int r = 0; - assert (connp); - assert (*connp); - if ((*connp)->is_connected) - r = rs_conn_disconnect (*connp); - if (r == RSE_OK) - *connp = NULL; - return r; -} - -int conn_user_dispatch_p (const struct rs_connection *conn) { assert (conn); @@ -145,6 +132,25 @@ rs_conn_disconnect (struct rs_connection *conn) assert (conn); + if (conn->is_connected) + event_on_disconnect (conn); + + if (conn->bev) + { + bufferevent_free (conn->bev); + conn->bev = NULL; + } + if (conn->rev) + { + event_free (conn->rev); + conn->rev = NULL; + } + if (conn->wev) + { + event_free (conn->wev); + conn->wev = NULL; + } + err = evutil_closesocket (conn->fd); conn->fd = -1; return err; @@ -1,7 +1,6 @@ -/* Copyright 2011 NORDUnet A/S. All rights reserved. - See LICENSE for licensing information. */ +/* Copyright 2011,2013 NORDUnet A/S. All rights reserved. + See LICENSE for licensing information. */ -int conn_close (struct rs_connection **connp); int conn_user_dispatch_p (const struct rs_connection *conn); int conn_activate_timeout (struct rs_connection *conn); int conn_type_tls (const struct rs_connection *conn); diff --git a/lib/debug.c b/lib/debug.c index 25c7fd6..903c793 100644 --- a/lib/debug.c +++ b/lib/debug.c @@ -1,5 +1,5 @@ /* Copyright 2011 NORDUnet A/S. All rights reserved. - See LICENSE for licensing information. */ + See LICENSE for licensing information. */ #if defined HAVE_CONFIG_H #include <config.h> diff --git a/lib/debug.h b/lib/debug.h index c319085..ed62da1 100644 --- a/lib/debug.h +++ b/lib/debug.h @@ -1,5 +1,5 @@ /* Copyright 2011 NORDUnet A/S. All rights reserved. - See LICENSE for licensing information. */ + See LICENSE for licensing information. */ #define hd(p, l) { int i; \ for (i = 1; i <= l; i++) { \ @@ -1,5 +1,5 @@ -/* Copyright 2010, 2011 NORDUnet A/S. All rights reserved. - See LICENSE for licensing information. */ +/* Copyright 2010-2013 NORDUnet A/S. All rights reserved. + See LICENSE for licensing information. */ #if defined HAVE_CONFIG_H #include <config.h> @@ -1,5 +1,5 @@ /* Copyright 2011 NORDUnet A/S. All rights reserved. - See LICENSE for licensing information. */ + See LICENSE for licensing information. */ struct rs_error *err_create (unsigned int code, const char *file, diff --git a/lib/event.c b/lib/event.c index e51616a..c625850 100644 --- a/lib/event.c +++ b/lib/event.c @@ -1,5 +1,5 @@ -/* Copyright 2011 NORDUnet A/S. All rights reserved. - See LICENSE for licensing information. */ +/* Copyright 2011-2013 NORDUnet A/S. All rights reserved. + See LICENSE for licensing information. */ #if defined HAVE_CONFIG_H #include <config.h> @@ -222,9 +222,7 @@ event_loopbreak (struct rs_connection *conn) { int err = event_base_loopbreak (conn->evb); if (err < 0) - rs_err_conn_push_fl (conn, RSE_EVENT, __FILE__, __LINE__, - "event_base_loopbreak: %s", - evutil_gai_strerror (err)); + rs_err_conn_push (conn, RSE_EVENT, "event_base_loopbreak"); return err; } diff --git a/lib/event.h b/lib/event.h index 9c239df..bd9ec77 100644 --- a/lib/event.h +++ b/lib/event.h @@ -1,5 +1,5 @@ -/* Copyright 2011 NORDUnet A/S. All rights reserved. - See LICENSE for licensing information. */ +/* Copyright 2011-2012 NORDUnet A/S. All rights reserved. + See LICENSE for licensing information. */ void event_on_disconnect (struct rs_connection *conn); int event_on_connect (struct rs_connection *conn, struct rs_packet *pkt); diff --git a/lib/examples/Makefile.am b/lib/examples/Makefile.am index bfd31e8..f300627 100644 --- a/lib/examples/Makefile.am +++ b/lib/examples/Makefile.am @@ -1,5 +1,5 @@ AUTOMAKE_OPTIONS = foreign -INCLUDES = -I$(top_srcdir)/include +INCLUDES = -I$(top_srcdir)/include -I$(top_srcdir) AM_CFLAGS = -Wall -Werror -g noinst_PROGRAMS = client diff --git a/lib/examples/client-psk.conf b/lib/examples/client-psk.conf new file mode 100644 index 0000000..7b35e23 --- /dev/null +++ b/lib/examples/client-psk.conf @@ -0,0 +1,18 @@ +# We keep PSK configurations in a separate config file until +# --enable-tls-psk is on by default. This configuration is not valid +# without PSK support. + +realm blocking-tls-psk { + type = "TLS" + timeout = 1 + retries = 3 + #pskstr = "sikrit psk" + pskhexstr = "deadbeef4711" + pskid = "Client_identity" + pskex = "PSK" + server { + hostname = "srv1" + service = "4433" + secret = "sikrit" + } +} diff --git a/lib/examples/client.conf b/lib/examples/client.conf index a19b699..b0b4536 100644 --- a/lib/examples/client.conf +++ b/lib/examples/client.conf @@ -22,18 +22,3 @@ realm blocking-tls { secret = "sikrit" } } - -realm blocking-tls-psk { - type = "TLS" - timeout = 1 - retries = 3 - #pskstr = "sikrit psk" - pskhexstr = "deadbeef4711" - pskid = "Client_identity" - pskex = "PSK" - server { - hostname = "srv1" - service = "4433" - secret = "sikrit" - } -} diff --git a/lib/include/radsec/radsec-impl.h b/lib/include/radsec/radsec-impl.h index 6c02dcf..e472703 100644 --- a/lib/include/radsec/radsec-impl.h +++ b/lib/include/radsec/radsec-impl.h @@ -1,7 +1,8 @@ /** @file libradsec-impl.h @brief Libraray internal header file for libradsec. */ -/* See LICENSE for licensing information. */ +/* Copyright 2010-2013 NORDUnet A/S. All rights reserved. + See LICENSE for licensing information. */ #ifndef _RADSEC_RADSEC_IMPL_H_ #define _RADSEC_RADSEC_IMPL_H_ 1 diff --git a/lib/include/radsec/radsec.h b/lib/include/radsec/radsec.h index fe6690a..bc061e0 100644 --- a/lib/include/radsec/radsec.h +++ b/lib/include/radsec/radsec.h @@ -1,7 +1,8 @@ /** \file radsec.h \brief Public interface for libradsec. */ -/* See LICENSE for licensing information. */ +/* Copyright 2010-2013 NORDUnet A/S. All rights reserved. + See LICENSE for licensing information. */ #ifndef _RADSEC_RADSEC_H_ #define _RADSEC_RADSEC_H_ 1 diff --git a/lib/include/radsec/request-impl.h b/lib/include/radsec/request-impl.h index bb61dd6..97335e5 100644 --- a/lib/include/radsec/request-impl.h +++ b/lib/include/radsec/request-impl.h @@ -1,4 +1,5 @@ -/* See LICENSE for licensing information. */ +/* Copyright 2010-2011 NORDUnet A/S. All rights reserved. + See LICENSE for licensing information. */ #ifndef _RADSEC_REQUEST_IMPL_H_ #define _RADSEC_REQUEST_IMPL_H_ 1 diff --git a/lib/include/radsec/request.h b/lib/include/radsec/request.h index 7e58008..d4c72b3 100644 --- a/lib/include/radsec/request.h +++ b/lib/include/radsec/request.h @@ -1,7 +1,8 @@ /** \file request.h \brief Public interface for libradsec request's. */ -/* See LICENSE for licensing information. */ +/* Copyright 2010-2013 NORDUnet A/S. All rights reserved. + See LICENSE for licensing information. */ #ifndef _RADSEC_REQUEST_H_ #define _RADSEC_REQUEST_H_ 1 diff --git a/lib/libradsec.spec.in b/lib/libradsec.spec.in new file mode 100644 index 0000000..97d6178 --- /dev/null +++ b/lib/libradsec.spec.in @@ -0,0 +1,77 @@ +Name: @PACKAGE@ +Version: @PACKAGE_VERSION@ +Release: 1%{?dist} +Summary: RADIUS over TLS library + +Group: System Environment/Libraries +License: BSD +URL: http://software.uninett.no/radsecproxy/?page=documentation +Source0: %{name}-%{version}.tar.gz +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root + + + +BuildRequires: openssl-devel +BuildRequires: libconfuse-devel +BuildRequires: autoconf +BuildRequires: automake +BuildRequires: libtool +BuildRequires: libevent-devel >= 2.0 + + + +%description + Libradsec is a RADIUS over TLS library. + + +%package devel +Summary: Development files for %{name} +Group: Development/Libraries +Requires: %{name} = %{version}-%{release} + +%description devel +The %{name}-devel package contains libraries and header files for +developing applications that use %{name}. + + +%prep +%setup -q + + +%build + export CPPFLAGS='-I%{_includedir}' + export LDFLAGS='-L%{_libdir}' +%configure --disable-static +make %{?_smp_mflags} + + +%install +rm -rf $RPM_BUILD_ROOT +make install DESTDIR=$RPM_BUILD_ROOT +find $RPM_BUILD_ROOT -name '*.la' -exec rm -f {} ';' + + +%clean +rm -rf $RPM_BUILD_ROOT + + +%post -p /sbin/ldconfig + +%postun -p /sbin/ldconfig + + +%files +%defattr(-,root,root,-) +%doc README +%{_libdir}/*.so.* + +%files devel +%defattr(-,root,root,-) +%{_includedir}/* +%{_libdir}/*.so + + +%changelog +* Tue Sep 27 2011 <hartmans@moonbuildcentos.dev.ja.net> - %{version}-1 +- initial version + @@ -89,9 +89,9 @@ * This processes one or more 64-byte data blocks, but does NOT update * the bit counters. There are no alignment requirements. */ -static void *body(MD5_CTX *ctx, void *data, unsigned long size) +static const void *body(MD5_CTX *ctx, const void *data, unsigned long size) { - unsigned char *ptr; + const unsigned char *ptr; MD5_u32plus a, b, c, d; MD5_u32plus saved_a, saved_b, saved_c, saved_d; @@ -207,7 +207,7 @@ void MD5_Init(MD5_CTX *ctx) ctx->hi = 0; } -void MD5_Update(MD5_CTX *ctx, void *data, unsigned long size) +void MD5_Update(MD5_CTX *ctx, const void *data, unsigned long size) { MD5_u32plus saved_lo; unsigned long used, free; @@ -39,7 +39,7 @@ typedef struct { } MD5_CTX; extern void MD5_Init(MD5_CTX *ctx); -extern void MD5_Update(MD5_CTX *ctx, void *data, unsigned long size); +extern void MD5_Update(MD5_CTX *ctx, const void *data, unsigned long size); extern void MD5_Final(unsigned char *result, MD5_CTX *ctx); #endif diff --git a/lib/packet.c b/lib/packet.c index 63bf370..5daad25 100644 --- a/lib/packet.c +++ b/lib/packet.c @@ -1,10 +1,11 @@ -/* Copyright 2010, 2011 NORDUnet A/S. All rights reserved. - See LICENSE for licensing information. */ +/* Copyright 2010-2013 NORDUnet A/S. All rights reserved. + See LICENSE for licensing information. */ #if defined HAVE_CONFIG_H #include <config.h> #endif +#include <stdlib.h> #include <assert.h> #include <radius/client.h> #include <event2/bufferevent.h> @@ -252,7 +253,7 @@ rs_packet_append_avp (struct rs_packet *pkt, da = nr_dict_attr_byvalue (attr, vendor); if (da == NULL) - return RSE_ATTR_TYPE_UNKNOWN; + return rs_err_conn_push (pkt->conn, RSE_ATTR_TYPE_UNKNOWN, __func__); err = nr_packet_attr_append (pkt->rpkt, NULL, da, data, data_len); if (err < 0) diff --git a/lib/packet.h b/lib/packet.h index c020d69..7cdbb35 100644 --- a/lib/packet.h +++ b/lib/packet.h @@ -1,5 +1,5 @@ /* Copyright 2010, 2011 NORDUnet A/S. All rights reserved. - See LICENSE for licensing information. */ + See LICENSE for licensing information. */ int packet_do_send (struct rs_packet *pkt); int packet_verify_response (struct rs_connection *conn, @@ -1,5 +1,5 @@ -/* Copyright 2010, 2011 NORDUnet A/S. All rights reserved. - See LICENSE for licensing information. */ +/* Copyright 2010-2012 NORDUnet A/S. All rights reserved. + See LICENSE for licensing information. */ #if defined HAVE_CONFIG_H #include <config.h> @@ -1,5 +1,5 @@ /* Copyright 2011 NORDUnet A/S. All rights reserved. - See LICENSE for licensing information. */ + See LICENSE for licensing information. */ struct rs_peer *peer_create (struct rs_context *ctx, struct rs_peer **rootp); struct rs_peer *peer_pick_peer (struct rs_connection *conn); diff --git a/lib/radius/Makefile.am b/lib/radius/Makefile.am index 96bafae..c827465 100644 --- a/lib/radius/Makefile.am +++ b/lib/radius/Makefile.am @@ -18,6 +18,8 @@ libradsec_radius_la_SOURCES = \ static.c \ valuepair.c +libradsec_radius_la_SOURCES += client.h + libradsec_radius_la_CFLAGS = $(AM_CFLAGS) -DHAVE_CONFIG_H DICTIONARIES = \ @@ -27,7 +29,7 @@ DICTIONARIES = \ share/dictionary.ukerna \ share/dictionary.abfab.ietf -EXTRA_DIST = $(DICTIONARIES) +EXTRA_DIST = dictionaries.c $(DICTIONARIES) common.pl convert.pl $(top_srcdir)/include/radsec/radius.h dictionaries.c: ${DICTIONARIES} convert.pl common.pl $(srcdir)/convert.pl ${DICTIONARIES} @@ -38,4 +40,3 @@ clean-local: rm -f dictionaries.c $(libradsec_radius_la_SOURCES): $(top_srcdir)/include/radsec/radius.h - diff --git a/lib/radsec.c b/lib/radsec.c index db406ae..efd2dc3 100644 --- a/lib/radsec.c +++ b/lib/radsec.c @@ -1,5 +1,5 @@ -/* Copyright 2010, 2011 NORDUnet A/S. All rights reserved. - See LICENSE for licensing information. */ +/* Copyright 2010-2013 NORDUnet A/S. All rights reserved. + See LICENSE for licensing information. */ #if defined HAVE_CONFIG_H #include <config.h> diff --git a/lib/radsec.h b/lib/radsec.h index c8fa2fb..703e44b 100644 --- a/lib/radsec.h +++ b/lib/radsec.h @@ -1,5 +1,5 @@ /* Copyright 2012 NORDUnet A/S. All rights reserved. - See LICENSE for licensing information. */ + See LICENSE for licensing information. */ struct rs_error *rs_resolve (struct evutil_addrinfo **addr, rs_conn_type_t type, diff --git a/lib/radsecproxy/Makefile.am b/lib/radsecproxy/Makefile.am index 0d4a882..962f367 100644 --- a/lib/radsecproxy/Makefile.am +++ b/lib/radsecproxy/Makefile.am @@ -7,12 +7,17 @@ AM_CFLAGS = -Wall -Werror -g noinst_LTLIBRARIES = libradsec-radsecproxy.la libradsec_radsecproxy_la_SOURCES = \ - debug.c \ - hash.c \ - list.c \ - util.c + debug.c debug.h \ + gconfig.h \ + hash.c hash.h \ + hostport_types.h \ + list.c list.h \ + radmsg.h \ + radsecproxy.h \ + tlv11.h \ + util.c util.h if RS_ENABLE_TLS libradsec_radsecproxy_la_SOURCES += \ - tlscommon.c + tlscommon.c tlscommon.h endif diff --git a/lib/request.c b/lib/request.c index 5649ee1..3a8b6dd 100644 --- a/lib/request.c +++ b/lib/request.c @@ -1,5 +1,5 @@ -/* Copyright 2010, 2011 NORDUnet A/S. All rights reserved. - See LICENSE for licensing information. */ +/* Copyright 2010-2011 NORDUnet A/S. All rights reserved. + See LICENSE for licensing information. */ #if defined HAVE_CONFIG_H #include <config.h> @@ -1,5 +1,5 @@ -/* Copyright 2011 NORDUnet A/S. All rights reserved. - See LICENSE for licensing information. */ +/* Copyright 2011,2013 NORDUnet A/S. All rights reserved. + See LICENSE for licensing information. */ #if defined HAVE_CONFIG_H #include <config.h> @@ -1,5 +1,5 @@ -/* Copyright 2011 NORDUnet A/S. All rights reserved. - See LICENSE for licensing information. */ +/* Copyright 2011-2013 NORDUnet A/S. All rights reserved. + See LICENSE for licensing information. */ #if defined HAVE_CONFIG_H #include <config.h> @@ -38,7 +38,9 @@ _read_header (struct rs_packet *pkt) pkt->rpkt->length = (pkt->hdr[2] << 8) + pkt->hdr[3]; if (pkt->rpkt->length < 20 || pkt->rpkt->length > RS_MAX_PACKET_LEN) { - conn_close (&pkt->conn); + rs_debug (("%s: invalid packet length: %d\n", + __func__, pkt->rpkt->length)); + rs_conn_disconnect (pkt->conn); return rs_err_conn_push (pkt->conn, RSE_INVALID_PKT, "invalid packet length: %d", pkt->rpkt->length); @@ -55,7 +57,8 @@ _read_header (struct rs_packet *pkt) } else /* Error: libevent gave us less than the low watermark. */ { - conn_close (&pkt->conn); + rs_debug (("%s: got: %d octets reading header\n", __func__, n)); + rs_conn_disconnect (pkt->conn); return rs_err_conn_push_fl (pkt->conn, RSE_INTERNAL, __FILE__, __LINE__, "got %d octets reading header", n); } @@ -100,8 +103,9 @@ _read_packet (struct rs_packet *pkt) err = nr_packet_ok (pkt->rpkt); if (err != RSE_OK) { - conn_close (&pkt->conn); - return rs_err_conn_push_fl (pkt->conn, err, __FILE__, __LINE__, + rs_debug (("%s: %d: invalid packet\n", __func__, -err)); + rs_conn_disconnect (pkt->conn); + return rs_err_conn_push_fl (pkt->conn, -err, __FILE__, __LINE__, "invalid packet"); } @@ -1,5 +1,5 @@ /* Copyright 2011 NORDUnet A/S. All rights reserved. - See LICENSE for licensing information. */ + See LICENSE for licensing information. */ void tcp_event_cb (struct bufferevent *bev, short events, void *user_data); void tcp_read_cb (struct bufferevent *bev, void *user_data); diff --git a/lib/tests/Makefile.am b/lib/tests/Makefile.am index 045991a..dc15264 100644 --- a/lib/tests/Makefile.am +++ b/lib/tests/Makefile.am @@ -1,12 +1,12 @@ AUTOMAKE_OPTIONS = foreign -INCLUDES = -I$(top_srcdir)/include +INCLUDES = -I$(top_srcdir)/include -I$(top_srcdir) AM_CFLAGS = -Wall -Werror -g TESTS = test-udp check_PROGRAMS = test-udp udp-server -test_udp_SOURCES = test-udp.c udp.c +test_udp_SOURCES = test-udp.c udp.c udp.h test_udp_LDADD = ../libradsec.la -lcunit -lm -udp_server_SOURCES = udp-server.c udp.c +udp_server_SOURCES = udp-server.c udp.c udp.h diff --git a/lib/tests/test-udp.c b/lib/tests/test-udp.c index 7ad340a..ed176c0 100644 --- a/lib/tests/test-udp.c +++ b/lib/tests/test-udp.c @@ -137,6 +137,7 @@ main (int argc, char *argv[]) { CU_pSuite s = NULL; CU_pTest t = NULL; + unsigned int nfail; assert (CU_initialize_registry () == CUE_SUCCESS); s = CU_add_suite ("auth", NULL, NULL); assert (s); @@ -144,8 +145,9 @@ main (int argc, char *argv[]) s = CU_add_suite ("buffering", NULL, NULL); assert (s); t = CU_ADD_TEST (s, test_buffering); assert (t); - return !(CU_basic_run_tests () == CUE_SUCCESS); + assert (CU_basic_run_tests () == CUE_SUCCESS); + nfail = CU_get_number_of_failures(); CU_cleanup_registry (); - return 0; + return nfail; } @@ -1,10 +1,11 @@ -/* Copyright 2010, 2011 NORDUnet A/S. All rights reserved. - See LICENSE for licensing information. */ +/* Copyright 2010-2013 NORDUnet A/S. All rights reserved. + See LICENSE for licensing information. */ #if defined HAVE_CONFIG_H #include <config.h> #endif +#include <stdlib.h> #include <assert.h> #include <openssl/ssl.h> #include <openssl/err.h> @@ -1,5 +1,5 @@ -/* Copyright 2010 NORDUnet A/S. All rights reserved. - See LICENSE for licensing information. */ +/* Copyright 2010-2012 NORDUnet A/S. All rights reserved. + See LICENSE for licensing information. */ #if defined (__cplusplus) extern "C" { @@ -1,5 +1,5 @@ /* Copyright 2011 NORDUnet A/S. All rights reserved. - See LICENSE for licensing information. */ + See LICENSE for licensing information. */ #if defined HAVE_CONFIG_H #include <config.h> @@ -65,22 +65,22 @@ static void _evcb (evutil_socket_t fd, short what, void *user_data) { int err; + struct rs_packet *pkt = (struct rs_packet *) user_data; rs_debug (("%s: fd=%d what =", __func__, fd)); - if (what & EV_TIMEOUT) rs_debug ((" TIMEOUT")); + if (what & EV_TIMEOUT) rs_debug ((" TIMEOUT -- shouldn't happen!")); if (what & EV_READ) rs_debug ((" READ")); if (what & EV_WRITE) rs_debug ((" WRITE")); rs_debug (("\n")); + assert (pkt); + assert (pkt->conn); if (what & EV_READ) { /* Read a single UDP packet and stick it in USER_DATA. */ /* TODO: Verify that unsolicited packets are dropped. */ - struct rs_packet *pkt = (struct rs_packet *) user_data; ssize_t r = 0; - assert (pkt); - assert (pkt->conn); assert (pkt->rpkt->data); r = compat_recv (fd, pkt->rpkt->data, RS_MAX_PACKET_LEN, MSG_TRUNC); @@ -92,7 +92,7 @@ _evcb (evutil_socket_t fd, short what, void *user_data) /* FIXME: Really shouldn't happen since we've been told that fd is readable! */ rs_debug (("%s: EAGAIN reading UDP packet -- wot?")); - return; + goto err_out; } /* Hard error. */ @@ -100,23 +100,22 @@ _evcb (evutil_socket_t fd, short what, void *user_data) "%d: recv: %d (%s)", fd, sockerr, evutil_socket_error_to_string (sockerr)); event_del (pkt->conn->tev); - return; + goto err_out; } event_del (pkt->conn->tev); if (r < 20 || r > RS_MAX_PACKET_LEN) /* Short or long packet. */ { rs_err_conn_push (pkt->conn, RSE_INVALID_PKT, - "invalid packet length: %d", - pkt->rpkt->length); - return; + "invalid packet length: %d", r); + goto err_out; } pkt->rpkt->length = (pkt->rpkt->data[2] << 8) + pkt->rpkt->data[3]; err = nr_packet_ok (pkt->rpkt); if (err) { - rs_err_conn_push_fl (pkt->conn, err, __FILE__, __LINE__, + rs_err_conn_push_fl (pkt->conn, -err, __FILE__, __LINE__, "invalid packet"); - return; + goto err_out; } /* Hand over message to user. This changes ownership of pkt. Don't touch it afterwards -- it might have been freed. */ @@ -125,10 +124,6 @@ _evcb (evutil_socket_t fd, short what, void *user_data) } else if (what & EV_WRITE) { - struct rs_packet *pkt = (struct rs_packet *) user_data; - assert (pkt); - assert (pkt->conn); - if (!pkt->conn->is_connected) event_on_connect (pkt->conn, pkt); @@ -137,11 +132,10 @@ _evcb (evutil_socket_t fd, short what, void *user_data) if (pkt->conn->callbacks.sent_cb) pkt->conn->callbacks.sent_cb (pkt->conn->user_data); } + return; -#if defined (DEBUG) - if (what & EV_TIMEOUT) - rs_debug (("%s: timeout on UDP event, shouldn't happen\n", __func__)); -#endif + err_out: + rs_conn_disconnect (pkt->conn); } int @@ -1,5 +1,5 @@ /* Copyright 2011 NORDUnet A/S. All rights reserved. - See LICENSE for licensing information. */ + See LICENSE for licensing information. */ int udp_init (struct rs_connection *conn, struct rs_packet *pkt); int udp_init_retransmit_timer (struct rs_connection *conn); @@ -1,6 +1,7 @@ -/* Copyright 2012 NORDUnet A/S. All rights reserved. - See LICENSE for licensing information. */ +/* Copyright 2012-2013 NORDUnet A/S. All rights reserved. + See LICENSE for licensing information. */ +#include <stdlib.h> #include <string.h> #include <radsec/radsec.h> #include <radsec/radsec-impl.h> @@ -9,11 +10,16 @@ char * rs_strdup (struct rs_context *ctx, const char *s) { - char *buf = rs_calloc (ctx, 1, strlen (s) + 1); + size_t len; + char *buf; + + len = strlen (s); + buf = rs_malloc (ctx, len + 1); if (buf != NULL) - return strcpy (buf, s); + memcpy (buf, s, len + 1); + else + rs_err_ctx_push (ctx, RSE_NOMEM, __func__); - rs_err_ctx_push (ctx, RSE_NOMEM, NULL); - return NULL; + return buf; } @@ -1,4 +1,4 @@ /* Copyright 2012 NORDUnet A/S. All rights reserved. - See LICENSE for licensing information. */ + See LICENSE for licensing information. */ char *rs_strdup (struct rs_context *ctx, const char *s); |