Resolve memleak in rlm_detail

Resolve OSCP certificate validation issue
Resolve crash triggered by event.c issue
Bump PORTREVISION
Pacify portlint(1)

Approved by:	wxs (mentor)
Obtained from:	freeradius github
This commit is contained in:
Ryan Steinmetz 2011-08-10 14:08:03 +00:00
parent ef3b9e5072
commit 9b219c3dcf
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=279413
4 changed files with 168 additions and 2 deletions

View file

@ -9,6 +9,7 @@
PORTNAME= freeradius
DISTVERSION= 2.1.11
PORTREVISION= 1
CATEGORIES= net
MASTER_SITES= ftp://ftp.freeradius.org/pub/freeradius/%SUBDIR%/ \
ftp://ftp.ntua.gr/pub/net/radius/freeradius/%SUBDIR%/ \
@ -21,6 +22,8 @@ DISTNAME= freeradius-server-${DISTVERSION}
MAINTAINER= zi@FreeBSD.org
COMMENT= A free RADIUS server implementation
LICENSE= GPLv2
LIB_DEPENDS= gdbm.3:${PORTSDIR}/databases/gdbm
USE_GMAKE= yes
@ -60,8 +63,6 @@ OPTIONS= USER "Run as user freeradius, group freeradius" on \
.include <bsd.port.options.mk>
LICENSE= GPLv2
# Default requirements for rc script
_REQUIRE= NETWORKING SERVERS

View file

@ -0,0 +1,24 @@
--- ./src/lib/event.c.orig 2011-06-20 10:57:14.000000000 -0400
+++ ./src/lib/event.c 2011-08-10 07:39:10.000000000 -0400
@@ -155,7 +155,7 @@
{
fr_event_t *ev;
- if (!el || !callback | !when || (when->tv_usec > USEC)) return 0;
+ if (!el || !callback | !when || (when->tv_usec >= USEC)) return 0;
if (ev_p && *ev_p) fr_event_delete(el, ev_p);
@@ -364,9 +364,11 @@
if (when.tv_sec > 0) {
when.tv_sec--;
when.tv_usec += USEC;
+ } else {
+ when.tv_sec = 0;
}
when.tv_usec -= el->now.tv_usec;
- if (when.tv_usec > USEC) {
+ if (when.tv_usec >= USEC) {
when.tv_usec -= USEC;
when.tv_sec++;
}

View file

@ -0,0 +1,16 @@
--- ./src/modules/rlm_detail/rlm_detail.c.orig 2011-08-09 23:23:35.000000000 -0400
+++ ./src/modules/rlm_detail/rlm_detail.c 2011-08-09 23:25:09.000000000 -0400
@@ -463,11 +463,11 @@
*/
if (fflush(fp) != 0) {
ftruncate(outfd, fsize); /* ignore errors! */
- close(outfd);
+ fclose(fp);
return RLM_MODULE_FAIL;
}
- close(outfd);
+ fclose(fp);
/*
* And everything is fine.

View file

@ -0,0 +1,125 @@
--- ./src/modules/rlm_eap/types/rlm_eap_tls/rlm_eap_tls.c.orig 2011-06-20 10:57:14.000000000 -0400
+++ ./src/modules/rlm_eap/types/rlm_eap_tls/rlm_eap_tls.c 2011-08-10 07:03:40.000000000 -0400
@@ -277,6 +277,10 @@
* This function sends a OCSP request to a defined OCSP responder
* and checks the OCSP response for correctness.
*/
+
+/* Maximum leeway in validity period: default 5 minutes */
+#define MAX_VALIDITY_PERIOD (5 * 60)
+
static int ocsp_check(X509_STORE *store, X509 *issuer_cert, X509 *client_cert,
EAP_TLS_CONF *conf)
{
@@ -288,9 +292,12 @@
char *port = NULL;
char *path = NULL;
int use_ssl = -1;
- BIO *cbio;
- int ocsp_ok;
- int status;
+ long nsec = MAX_VALIDITY_PERIOD, maxage = -1;
+ BIO *cbio, *bio_out;
+ int ocsp_ok = 0;
+ int status ;
+ ASN1_GENERALIZEDTIME *rev, *thisupd, *nextupd;
+ int reason;
/*
* Create OCSP Request
@@ -299,7 +306,7 @@
req = OCSP_REQUEST_new();
OCSP_request_add0_id(req, certid);
OCSP_request_add1_nonce(req, NULL, 8);
-
+
/*
* Send OCSP Request and get OCSP Response
*/
@@ -316,6 +323,9 @@
/* Setup BIO socket to OCSP responder */
cbio = BIO_new_connect(host);
+
+ bio_out = BIO_new_fp(stdout, BIO_NOCLOSE);
+
BIO_set_conn_port(cbio, port);
BIO_do_connect(cbio);
@@ -323,30 +333,60 @@
resp = OCSP_sendreq_bio(cbio, path, req);
if(resp==0) {
radlog(L_ERR, "Error: Couldn't get OCSP response");
- ocsp_ok = 0;
goto ocsp_end;
}
- /* Verify OCSP response */
+ /* Verify OCSP response status */
status = OCSP_response_status(resp);
+ DEBUG2("[ocsp] --> Response status: %s",OCSP_response_status_str(status));
if(status != OCSP_RESPONSE_STATUS_SUCCESSFUL) {
radlog(L_ERR, "Error: OCSP response status: %s", OCSP_response_status_str(status));
- ocsp_ok = 0;
goto ocsp_end;
}
bresp = OCSP_response_get1_basic(resp);
if(OCSP_check_nonce(req, bresp)!=1) {
radlog(L_ERR, "Error: OCSP response has wrong nonce value");
- ocsp_ok = 0;
goto ocsp_end;
}
if(OCSP_basic_verify(bresp, NULL, store, 0)!=1){
radlog(L_ERR, "Error: Couldn't verify OCSP basic response");
- ocsp_ok = 0;
goto ocsp_end;
}
-
- ocsp_ok = 1;
+ /* Verify OCSP cert status */
+ if(!OCSP_resp_find_status(bresp, certid, &status, &reason,
+ &rev, &thisupd, &nextupd)) {
+ radlog(L_ERR, "ERROR: No Status found.\n");
+ goto ocsp_end;
+ }
+
+ if (!OCSP_check_validity(thisupd, nextupd, nsec, maxage)) {
+ BIO_puts(bio_out, "WARNING: Status times invalid.\n");
+ ERR_print_errors(bio_out);
+ goto ocsp_end;
+ }
+ BIO_puts(bio_out, "\tThis Update: ");
+ ASN1_GENERALIZEDTIME_print(bio_out, thisupd);
+ BIO_puts(bio_out, "\n");
+ BIO_puts(bio_out, "\tNext Update: ");
+ ASN1_GENERALIZEDTIME_print(bio_out, nextupd);
+ BIO_puts(bio_out, "\n");
+
+ switch (status) {
+ case V_OCSP_CERTSTATUS_GOOD:
+ DEBUG2("[oscp] --> Cert status: good");
+ ocsp_ok = 1;
+ break;
+
+ default:
+ /* REVOKED / UNKNOWN */
+ DEBUG2("[ocsp] --> Cert status: %s",OCSP_cert_status_str(status));
+ if (reason != -1)
+ DEBUG2("[ocsp] --> Reason: %s", OCSP_crl_reason_str(reason));
+ BIO_puts(bio_out, "\tRevocation Time: ");
+ ASN1_GENERALIZEDTIME_print(bio_out, rev);
+ BIO_puts(bio_out, "\n");
+ break;
+ }
ocsp_end:
/* Free OCSP Stuff */
@@ -1170,7 +1210,7 @@
return -1;
}
}
-#endif HAVE_OPENSSL_OCSP_H
+#endif /*HAVE_OPENSSL_OCSP_H*/
if (load_dh_params(inst->ctx, conf->dh_file) < 0) {
eaptls_detach(inst);