From cd560ec416111b5e60a7a0beb6cc734d8f7fb5f2 Mon Sep 17 00:00:00 2001 From: "David M. Syzdek" Date: Thu, 21 Jul 2022 17:18:29 -0800 Subject: akcom-udpecho: refactoring buffer allocation --- src/akcom-udpecho.c | 55 ++++++++++++++++++++++++++--------------------------- 1 file changed, 27 insertions(+), 28 deletions(-) diff --git a/src/akcom-udpecho.c b/src/akcom-udpecho.c index d42c809..6e6cdaa 100644 --- a/src/akcom-udpecho.c +++ b/src/akcom-udpecho.c @@ -128,6 +128,7 @@ struct udp_echo_plus uint32_t reply_time; uint32_t failures; uint32_t iteration; + uint8_t bytes[]; }; @@ -345,37 +346,45 @@ main( return(1); }; - - // allocate buffer - if ((fd = open("/dev/urandom", O_RDONLY)) == -1) - { - fprintf(stderr, "%s: open(/dev/urandom): %s\n", prog_name, strerror(errno)); - return(1); - }; + // adjust defaults if (cnf_packetsize < sizeof(struct udp_echo_plus)) cnf_packetsize = sizeof(struct udp_echo_plus); - if ((sndbuff.data = malloc(cnf_packetsize)) == NULL) + + // allocate receive buffer + if ((rcvbuff.data = malloc(cnf_packetsize)) == NULL) { fprintf(stderr, "%s: out of virtual memory\n", prog_name); - close(fd); return(1); }; - if ((rcvbuff.data = malloc(cnf_packetsize)) == NULL) + + // allocate send buffer + if ((sndbuff.data = malloc(cnf_packetsize)) == NULL) { fprintf(stderr, "%s: out of virtual memory\n", prog_name); - close(fd); + free(rcvbuff.data); return(1); }; - if ((size = read(fd, sndbuff.data, cnf_packetsize)) == -1) + memset(sndbuff.data, 0, sizeof(struct udp_echo_plus)); + sndbuff.echoplus->iteration = htonl(1); + if (cnf_packetsize > sizeof(struct udp_echo_plus)) { - fprintf(stderr, "%s: read(): %s\n", prog_name, strerror(errno)); + if ((fd = open("/dev/urandom", O_RDONLY)) == -1) + { + fprintf(stderr, "%s: open(/dev/urandom): %s\n", prog_name, strerror(errno)); + free(rcvbuff.data); + free(sndbuff.data); + return(1); + }; + if (read(fd, sndbuff.echoplus->bytes, cnf_packetsize-sizeof(struct udp_echo_plus)) == -1) + { + fprintf(stderr, "%s: read(): %s\n", prog_name, strerror(errno)); + close(fd); + free(sndbuff.data); + free(rcvbuff.data); + return(1); + }; close(fd); - free(sndbuff.data); - free(rcvbuff.data); - return(1); }; - close(fd); - bzero(sndbuff.data, sizeof(struct udp_echo_plus)); // resolve host @@ -420,16 +429,6 @@ main( start.tv_sec -= cnf_interval; epoch = 0; - - // set packet information - sndbuff.echoplus->req_sn = 0; - sndbuff.echoplus->res_sn = 0; - sndbuff.echoplus->recv_time = 0; - sndbuff.echoplus->reply_time = 0; - sndbuff.echoplus->failures = 0; - sndbuff.echoplus->iteration = htonl(1); - - // master loop while (!(should_stop)) { -- cgit v1.2.3