pcap: Use clock_gettime() instead of gettimeofday()

POSIX.1-2008 declared gettimeofday() as obsolete, but I'm a dinosaur.

Usually, C libraries translate that to the clock_gettime() system
call anyway, but this doesn't happen in Jon's environment, and,
there, seccomp happily kills pasta(1) when started with --pcap,
because we didn't add gettimeofday() to our seccomp profiles.

Use clock_gettime() instead.

Reported-by: Jon Maloy <jmaloy@redhat.com>
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
Stefano Brivio 2024-03-12 19:45:07 +01:00
parent 0761f29a14
commit 3fe9878db7
2 changed files with 14 additions and 13 deletions

26
pcap.c
View file

@ -72,17 +72,17 @@ struct pcap_pkthdr {
* @iov: IO vector containing frame (with L2 headers and tap headers)
* @iovcnt: Number of buffers (@iov entries) in frame
* @offset: Byte offset of the L2 headers within @iov
* @tv: Timestamp
* @now: Timestamp
*
* Returns: 0 on success, -errno on error writing to the file
*/
static void pcap_frame(const struct iovec *iov, size_t iovcnt,
size_t offset, const struct timeval *tv)
size_t offset, const struct timespec *now)
{
size_t len = iov_size(iov, iovcnt) - offset;
struct pcap_pkthdr h = {
.tv_sec = tv->tv_sec,
.tv_usec = tv->tv_usec,
.tv_sec = now->tv_sec,
.tv_usec = DIV_ROUND_CLOSEST(now->tv_nsec, 1000),
.caplen = len,
.len = len
};
@ -103,13 +103,13 @@ static void pcap_frame(const struct iovec *iov, size_t iovcnt,
void pcap(const char *pkt, size_t len)
{
struct iovec iov = { (char *)pkt, len };
struct timeval tv;
struct timespec now;
if (pcap_fd == -1)
return;
gettimeofday(&tv, NULL);
pcap_frame(&iov, 1, 0, &tv);
clock_gettime(CLOCK_REALTIME, &now);
pcap_frame(&iov, 1, 0, &now);
}
/**
@ -122,16 +122,16 @@ void pcap(const char *pkt, size_t len)
void pcap_multiple(const struct iovec *iov, size_t frame_parts, unsigned int n,
size_t offset)
{
struct timeval tv;
struct timespec now;
unsigned int i;
if (pcap_fd == -1)
return;
gettimeofday(&tv, NULL);
clock_gettime(CLOCK_REALTIME, &now);
for (i = 0; i < n; i++)
pcap_frame(iov + i * frame_parts, frame_parts, offset, &tv);
pcap_frame(iov + i * frame_parts, frame_parts, offset, &now);
}
/*
@ -145,13 +145,13 @@ void pcap_multiple(const struct iovec *iov, size_t frame_parts, unsigned int n,
/* cppcheck-suppress unusedFunction */
void pcap_iov(const struct iovec *iov, size_t iovcnt)
{
struct timeval tv;
struct timespec now;
if (pcap_fd == -1)
return;
gettimeofday(&tv, NULL);
pcap_frame(iov, iovcnt, 0, &tv);
clock_gettime(CLOCK_REALTIME, &now);
pcap_frame(iov, iovcnt, 0, &now);
}
/**

1
util.h
View file

@ -40,6 +40,7 @@
#endif
#define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
#define DIV_ROUND_CLOSEST(n, d) (((n) + (d) / 2) / (d))
#define ROUND_DOWN(x, y) ((x) & ~((y) - 1))
#define ROUND_UP(x, y) (((x) + (y) - 1) & ~((y) - 1))