X-Git-Url: https://www.tinc-vpn.org/git/browse?p=tinc;a=blobdiff_plain;f=src%2Fprotocol.c;h=5d84c5d7292d69a4688a48ed111cf8b015f11a34;hp=21dba5bb2c5374d2d17ae255c34283fb6ba56af2;hb=74b0cbecce5194dc5c594cc4e2aa3e97c14ea6c1;hpb=ca6abd41ea0cdf2ca6491c3945fb3c62fd40ab98 diff --git a/src/protocol.c b/src/protocol.c index 21dba5bb..5d84c5d7 100644 --- a/src/protocol.c +++ b/src/protocol.c @@ -19,6 +19,8 @@ #include "config.h" +#include + #include #include #include @@ -35,7 +37,7 @@ #include "netutl.h" #include "protocol.h" -char buffer[MAXBUFSIZE]; +char buffer[MAXBUFSIZE+1]; int buflen; int send_ack(conn_list_t *cl) @@ -44,7 +46,7 @@ cp if(debug_lvl > 2) syslog(LOG_DEBUG, "Send ACK to %s", cl->hostname); - buflen = sprintf(buffer, "%d\n", ACK); + buflen = snprintf(buffer, MAXBUFSIZE, "%d\n", ACK); if((write(cl->meta_socket, buffer, buflen)) < 0) { @@ -64,7 +66,7 @@ cp syslog(LOG_DEBUG, "Send TERMREQ to " IP_ADDR_S, IP_ADDR_V(cl->vpn_ip)); - buflen = sprintf(buffer, "%d %lx\n", TERMREQ, myself->vpn_ip); + buflen = snprintf(buffer, MAXBUFSIZE, "%d %lx\n", TERMREQ, myself->vpn_ip); if((write(cl->meta_socket, buffer, buflen)) < 0) { @@ -82,7 +84,7 @@ cp syslog(LOG_DEBUG, "Send TIMEOUT to " IP_ADDR_S, IP_ADDR_V(cl->vpn_ip)); - buflen = sprintf(buffer, "%d %lx\n", PINGTIMEOUT, myself->vpn_ip); + buflen = snprintf(buffer, MAXBUFSIZE, "%d %lx\n", PINGTIMEOUT, myself->vpn_ip); if((write(cl->meta_socket, buffer, buflen)) < 0) { @@ -100,7 +102,7 @@ cp syslog(LOG_DEBUG, "Sending delete host " IP_ADDR_S " to " IP_ADDR_S, IP_ADDR_V(new_host->vpn_ip), IP_ADDR_V(cl->vpn_ip)); - buflen = sprintf(buffer, "%d %lx\n", DEL_HOST, new_host->vpn_ip); + buflen = snprintf(buffer, MAXBUFSIZE, "%d %lx\n", DEL_HOST, new_host->vpn_ip); if((write(cl->meta_socket, buffer, buflen)) < 0) { @@ -117,7 +119,7 @@ cp if(debug_lvl > 3) syslog(LOG_DEBUG, "pinging " IP_ADDR_S, IP_ADDR_V(cl->vpn_ip)); - buflen = sprintf(buffer, "%d\n", PING); + buflen = snprintf(buffer, MAXBUFSIZE, "%d\n", PING); if((write(cl->meta_socket, buffer, buflen)) < 0) { @@ -131,7 +133,7 @@ cp int send_pong(conn_list_t *cl) { cp - buflen = sprintf(buffer, "%d\n", PONG); + buflen = snprintf(buffer, MAXBUFSIZE, "%d\n", PONG); if((write(cl->meta_socket, buffer, buflen)) < 0) { @@ -149,7 +151,7 @@ cp syslog(LOG_DEBUG, "Sending add host to " IP_ADDR_S, IP_ADDR_V(cl->vpn_ip)); - buflen = sprintf(buffer, "%d %lx %lx/%lx:%x\n", ADD_HOST, new_host->real_ip, new_host->vpn_ip, new_host->vpn_mask, new_host->port); + buflen = snprintf(buffer, MAXBUFSIZE, "%d %lx %lx/%lx:%x\n", ADD_HOST, new_host->real_ip, new_host->vpn_ip, new_host->vpn_mask, new_host->port); if((write(cl->meta_socket, buffer, buflen)) < 0) { @@ -167,7 +169,7 @@ cp syslog(LOG_DEBUG, "Sending KEY_CHANGED to " IP_ADDR_S, IP_ADDR_V(cl->vpn_ip)); - buflen = sprintf(buffer, "%d %lx\n", KEY_CHANGED, src->vpn_ip); + buflen = snprintf(buffer, MAXBUFSIZE, "%d %lx\n", KEY_CHANGED, src->vpn_ip); if((write(cl->meta_socket, buffer, buflen)) < 0) { @@ -195,7 +197,7 @@ cp syslog(LOG_DEBUG, "Send BASIC_INFO to " IP_ADDR_S, IP_ADDR_V(cl->real_ip)); - buflen = sprintf(buffer, "%d %d %lx/%lx:%x\n", BASIC_INFO, PROT_CURRENT, myself->vpn_ip, myself->vpn_mask, myself->port); + buflen = snprintf(buffer, MAXBUFSIZE, "%d %d %lx/%lx:%x\n", BASIC_INFO, PROT_CURRENT, myself->vpn_ip, myself->vpn_mask, myself->port); if((write(cl->meta_socket, buffer, buflen)) < 0) { @@ -213,10 +215,10 @@ cp encrypt_passphrase(&tmp); if(debug_lvl > 2) - syslog(LOG_DEBUG, "Send PASSPHRASE to " IP_ADDR_S, - IP_ADDR_V(cl->vpn_ip)); + syslog(LOG_DEBUG, "Send PASSPHRASE %s to " IP_ADDR_S, + tmp.phrase, IP_ADDR_V(cl->vpn_ip)); - buflen = sprintf(buffer, "%d %s\n", PASSPHRASE, tmp.phrase); + buflen = snprintf(buffer, MAXBUFSIZE, "%d %s\n", PASSPHRASE, tmp.phrase); if((write(cl->meta_socket, buffer, buflen)) < 0) { @@ -231,10 +233,10 @@ int send_public_key(conn_list_t *cl) { cp if(debug_lvl > 2) - syslog(LOG_DEBUG, "Send PUBLIC_KEY to " IP_ADDR_S, - IP_ADDR_V(cl->vpn_ip)); + syslog(LOG_DEBUG, "Send PUBLIC_KEY %s to " IP_ADDR_S, + my_public_key_base36, IP_ADDR_V(cl->vpn_ip)); - buflen = sprintf(buffer, "%d %s\n", PUBLIC_KEY, my_public_key_base36); + buflen = snprintf(buffer, MAXBUFSIZE, "%d %s\n", PUBLIC_KEY, my_public_key_base36); if((write(cl->meta_socket, buffer, buflen)) < 0) { @@ -248,7 +250,7 @@ cp int send_calculate(conn_list_t *cl, char *k) { cp - buflen = sprintf(buffer, "%d %s\n", CALCULATE, k); + buflen = snprintf(buffer, MAXBUFSIZE, "%d %s\n", CALCULATE, k); if((write(cl->meta_socket, buffer, buflen)) < 0) { @@ -275,7 +277,7 @@ cp syslog(LOG_DEBUG, "Sending out request for public key to " IP_ADDR_S, IP_ADDR_V(fw->nexthop->vpn_ip)); - buflen = sprintf(buffer, "%d %lx %lx\n", REQ_KEY, to, myself->vpn_ip); + buflen = snprintf(buffer, MAXBUFSIZE, "%d %lx %lx\n", REQ_KEY, to, myself->vpn_ip); if((write(fw->nexthop->meta_socket, buffer, buflen)) < 0) { @@ -305,7 +307,7 @@ cp syslog(LOG_DEBUG, "Sending public key to " IP_ADDR_S, IP_ADDR_V(fw->nexthop->vpn_ip)); - buflen = sprintf(buffer, "%d %lx %lx %d %s\n", ANS_KEY, to, myself->vpn_ip, my_key_expiry, my_public_key_base36); + buflen = snprintf(buffer, MAXBUFSIZE, "%d %lx %lx %d %s\n", ANS_KEY, to, myself->vpn_ip, my_key_expiry, my_public_key_base36); if((write(fw->nexthop->meta_socket, buffer, buflen)) < 0) { @@ -396,11 +398,13 @@ cp int passphrase_h(conn_list_t *cl) { cp - if(sscanf(cl->buffer, "%*d %s", cl->pp) != 1) + cl->pp=xmalloc(sizeof(*(cl->pp))); + if(sscanf(cl->buffer, "%*d %as", &(cl->pp->phrase)) != 1) { - syslog(LOG_ERR, "got bad PASSPHRASE request: %s", cl->buffer); - return -1; - } + syslog(LOG_ERR, "got bad PASSPHRASE request: %s", cl->buffer); + return -1; + } + cl->pp->len = strlen(cl->pp->phrase); if(debug_lvl > 2) syslog(LOG_DEBUG, "got PASSPHRASE"); @@ -424,7 +428,7 @@ cp } if(debug_lvl > 2) - syslog(LOG_DEBUG, "got PUBLIC_KEY"); + syslog(LOG_DEBUG, "got PUBLIC_KEY %s", g_n); if(verify_passphrase(cl, g_n)) { @@ -614,7 +618,9 @@ cp syslog(LOG_DEBUG, "Forwarding request for public key to " IP_ADDR_S, IP_ADDR_V(fw->nexthop->vpn_ip)); - if(write(fw->nexthop->meta_socket, cl->buffer, strlen(cl->buffer)) < 0) + cl->buffer[cl->reqlen-1] = '\n'; + + if(write(fw->nexthop->meta_socket, cl->buffer, cl->reqlen) < 0) { syslog(LOG_ERR, "send failed: %s:%d: %m", __FILE__, __LINE__); return -1; @@ -709,7 +715,9 @@ cp syslog(LOG_DEBUG, "Forwarding public key to " IP_ADDR_S, IP_ADDR_V(fw->nexthop->vpn_ip)); - if((write(fw->nexthop->meta_socket, cl->buffer, strlen(cl->buffer))) < 0) + cl->buffer[cl->reqlen-1] = '\n'; + + if((write(fw->nexthop->meta_socket, cl->buffer, cl->reqlen)) < 0) { syslog(LOG_ERR, "send failed: %s:%d: %m", __FILE__, __LINE__); return -1;