Browse Source

segfault fix: ps->sfd can be null

fixes #48
pull/53/head
Richard Fuchs 11 years ago
parent
commit
a1786d67fc
1 changed files with 19 additions and 6 deletions
  1. +19
    -6
      daemon/dtls.c

+ 19
- 6
daemon/dtls.c View File

@ -423,11 +423,16 @@ static int try_connect(struct dtls_connection *d) {
}
int dtls_connection_init(struct packet_stream *ps, int active, struct dtls_cert *cert) {
struct dtls_connection *d = &ps->sfd->dtls;
struct dtls_connection *d;
unsigned long err;
if (!ps || !ps->sfd)
return 0;
__DBG("dtls_connection_init(%i)", active);
d = &ps->sfd->dtls;
if (d->init) {
if ((d->active && active) || (!d->active && !active))
goto connect;
@ -572,13 +577,18 @@ error:
}
int dtls(struct packet_stream *ps, const str *s, struct sockaddr_in6 *fsin) {
struct dtls_connection *d = &ps->sfd->dtls;
struct dtls_connection *d;
int ret;
unsigned char buf[0x10000], ctrl[256];
struct msghdr mh;
struct iovec iov;
struct sockaddr_in6 sin;
if (!ps || !ps->sfd)
return 0;
d = &ps->sfd->dtls;
if (s)
__DBG("dtls packet input: len %u %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
s->len,
@ -601,8 +611,7 @@ int dtls(struct packet_stream *ps, const str *s, struct sockaddr_in6 *fsin) {
ret = try_connect(d);
if (ret == -1) {
if (ps->sfd)
ilog(LOG_ERROR, "DTLS error on local port %hu", ps->sfd->fd.localport);
ilog(LOG_ERROR, "DTLS error on local port %hu", ps->sfd->fd.localport);
/* fatal error */
dtls_connection_cleanup(d);
return 0;
@ -669,9 +678,13 @@ int dtls(struct packet_stream *ps, const str *s, struct sockaddr_in6 *fsin) {
/* call must be locked */
void dtls_shutdown(struct packet_stream *ps) {
struct dtls_connection *d = &ps->sfd->dtls;
struct dtls_connection *d;
struct sockaddr_in6 sin;
if (!ps || !ps->sfd)
return;
d = &ps->sfd->dtls;
if (!d->init)
return;
@ -685,7 +698,7 @@ void dtls_shutdown(struct packet_stream *ps) {
dtls(ps, NULL, &sin);
}
dtls_connection_cleanup(&ps->sfd->dtls);
dtls_connection_cleanup(d);
if (ps->dtls_cert) {
X509_free(ps->dtls_cert);


Loading…
Cancel
Save