On Tue, Oct 20, 2020 at 01:11:09PM -0600, Theo de Raadt wrote:
> I believe most of the new local variables you added in main,
> can instead be added in the flush loop you wrote, even if you
> have to instantiate them. Or move it into a new function,
> then it is even easier. their scope is just too large...
Sure, I'd like to go with this for now and then refactor main later
and split it into functions. It's always a pain to find the spot where
it does anything...
diff --git ping.c ping.c
index d198d233921..7cca8c70342 100644
--- ping.c
+++ ping.c
@@ -786,6 +786,55 @@ main(int argc, char *argv[])
smsghdr.msg_iov = &smsgiov;
smsghdr.msg_iovlen = 1;
+ /* Drain our socket. */
+ (void)signal(SIGALRM, onsignal);
+ memset(&itimer, 0, sizeof(itimer));
+ itimer.it_value.tv_sec = 1; /* make sure we don't get stuck */
+ (void)setitimer(ITIMER_REAL, &itimer, NULL);
+ for (;;) {
+ struct msghdr m;
+ union {
+ struct cmsghdr hdr;
+ u_char buf[CMSG_SPACE(1024)];
+ } cmsgbuf;
+ struct iovec iov[1];
+ struct pollfd pfd;
+ struct sockaddr_in peer4;
+ struct sockaddr_in6 peer6;
+ ssize_t cc;
+
+ if (seenalrm)
+ break;
+
+ pfd.fd = s;
+ pfd.events = POLLIN;
+
+ if (poll(&pfd, 1, 0) <= 0)
+ break;
+
+ if (v6flag) {
+ m.msg_name = &peer6;
+ m.msg_namelen = sizeof(peer6);
+ } else {
+ m.msg_name = &peer4;
+ m.msg_namelen = sizeof(peer4);
+ }
+ memset(&iov, 0, sizeof(iov));
+ iov[0].iov_base = (caddr_t)packet;
+ iov[0].iov_len = packlen;
+
+ m.msg_iov = iov;
+ m.msg_iovlen = 1;
+ m.msg_control = (caddr_t)&cmsgbuf.buf;
+ m.msg_controllen = sizeof(cmsgbuf.buf);
+
+ cc = recvmsg(s, &m, 0);
+ if (cc == -1 && errno != EINTR)
+ break;
+ }
+ memset(&itimer, 0, sizeof(itimer));
+ (void)setitimer(ITIMER_REAL, &itimer, NULL);
+
while (preload--) /* Fire off them quickies. */
pinger(s);
--
I'm not entirely sure you are real.