diff --git a/daemon/control_udp.c b/daemon/control_udp.c index fd6fd7d59..2ce6f62e4 100644 --- a/daemon/control_udp.c +++ b/daemon/control_udp.c @@ -27,7 +27,7 @@ static void control_udp_closed(int fd, void *p) { static void control_udp_incoming(int fd, void *p) { struct control_udp *u = p; - int ret; + int ret, len; char buf[8192]; struct sockaddr_in sin; socklen_t sin_len; @@ -38,17 +38,17 @@ static void control_udp_incoming(int fd, void *p) { struct iovec iov[10]; sin_len = sizeof(sin); - ret = recvfrom(fd, buf, sizeof(buf) - 1, 0, (struct sockaddr *) &sin, &sin_len); - if (ret <= 0) { + len = recvfrom(fd, buf, sizeof(buf) - 1, 0, (struct sockaddr *) &sin, &sin_len); + if (len <= 0) { mylog(LOG_WARNING, "Error reading from UDP socket"); return; } - buf[ret] = '\0'; + buf[len] = '\0'; - ret = pcre_exec(u->parse_re, u->parse_ree, buf, ret, 0, 0, ovec, G_N_ELEMENTS(ovec)); + ret = pcre_exec(u->parse_re, u->parse_ree, buf, len, 0, 0, ovec, G_N_ELEMENTS(ovec)); if (ret <= 0) { - ret = pcre_exec(u->fallback_re, NULL, buf, ret, 0, 0, ovec, G_N_ELEMENTS(ovec)); + ret = pcre_exec(u->fallback_re, NULL, buf, len, 0, 0, ovec, G_N_ELEMENTS(ovec)); if (ret <= 0) { mylog(LOG_WARNING, "Unable to parse command line from udp:" DF ": %s", DP(sin), buf); return; @@ -203,6 +203,9 @@ struct control_udp *control_udp_new(struct poller *p, u_int32_t ip, u_int16_t po /* cookie cmd flags callid addr port */ c->fallback_re = pcre_compile("^(\\S+)(?:\\s+(\\S)\\S*\\s+\\S+(\\s+\\S+)(\\s+\\S+))?", PCRE_DOLLAR_ENDONLY | PCRE_DOTALL | PCRE_CASELESS, &errptr, &erroff, NULL); + if (!c->parse_re || !c->fallback_re) + goto fail2; + ZERO(i); i.fd = fd; i.closed = control_udp_closed;