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

1
util.h
View file

@ -40,6 +40,7 @@
#endif #endif
#define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) #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_DOWN(x, y) ((x) & ~((y) - 1))
#define ROUND_UP(x, y) (((x) + (y) - 1) & ~((y) - 1)) #define ROUND_UP(x, y) (((x) + (y) - 1) & ~((y) - 1))