Fix scaling pcap-ng timestamps

(cherry picked from 6a9c2cb19cb7eebdab8d2fa7a592d39130f8bf61)

See: https://github.com/the-tcpdump-group/libpcap/issues/396

Resolves: #1169322
This commit is contained in:
Michal Sekletar 2015-02-23 08:52:27 +01:00
parent 386c946c90
commit c34a2d5a2c
2 changed files with 76 additions and 1 deletions

View File

@ -0,0 +1,71 @@
From 6a9c2cb19cb7eebdab8d2fa7a592d39130f8bf61 Mon Sep 17 00:00:00 2001
From: Guy Harris <guy@alum.mit.edu>
Date: Mon, 1 Dec 2014 13:53:01 -0800
Subject: [PATCH] Fix scaling of time stamps.
Addresses GitHub issue #396.
---
sf-pcap-ng.c | 29 +++++++++++++++++++++--------
1 file changed, 21 insertions(+), 8 deletions(-)
diff --git a/sf-pcap-ng.c b/sf-pcap-ng.c
index fae4086..ea62157 100644
--- a/sf-pcap-ng.c
+++ b/sf-pcap-ng.c
@@ -1210,10 +1210,16 @@ found:
}
/*
- * Convert the time stamp to a struct timeval.
+ * Convert the time stamp to seconds and fractions of a second,
+ * with the fractions being in units of the file-supplied resolution.
*/
sec = t / ps->ifaces[interface_id].tsresol + ps->ifaces[interface_id].tsoffset;
frac = t % ps->ifaces[interface_id].tsresol;
+
+ /*
+ * Convert the fractions from units of the file-supplied resolution
+ * to units of the user-requested resolution.
+ */
switch (ps->ifaces[interface_id].scale_type) {
case PASS_THROUGH:
@@ -1227,21 +1233,28 @@ found:
case SCALE_DOWN:
/*
* The interface resolution is different from what the
- * user wants; scale up or down to that resolution.
+ * user wants; convert the fractions to units of the
+ * resolution the user requested by multiplying by the
+ * quotient of the user-requested resolution and the
+ * file-supplied resolution. We do that by multiplying
+ * by the user-requested resolution and dividing by the
+ * file-supplied resolution, as the quotient might not
+ * fit in an integer.
*
* XXX - if ps->ifaces[interface_id].tsresol is a power
* of 10, we could just multiply by the quotient of
- * ps->ifaces[interface_id].tsresol and ps->user_tsresol
- * in the scale-up case, and divide by the quotient of
* ps->user_tsresol and ps->ifaces[interface_id].tsresol
- * in the scale-down case, as we know those are integers,
- * which would involve fewer arithmetic operations.
+ * in the scale-up case, and divide by the quotient of
+ * ps->ifaces[interface_id].tsresol and ps->user_tsresol
+ * in the scale-down case, as we know those will be integers.
+ * That would involve fewer arithmetic operations, and
+ * would run less risk of overflow.
*
* Is there something clever we could do if
* ps->ifaces[interface_id].tsresol is a power of 2?
*/
- frac *= ps->ifaces[interface_id].tsresol;
- frac /= ps->user_tsresol;
+ frac *= ps->user_tsresol;
+ frac /= ps->ifaces[interface_id].tsresol;
break;
}
hdr->ts.tv_sec = sec;
--
1.8.3.1

View File

@ -1,7 +1,7 @@
Name: libpcap
Epoch: 14
Version: 1.6.2
Release: 1%{?dist}
Release: 2%{?dist}
Summary: A system-independent interface for user-level packet capture
Group: Development/Libraries
License: BSD with advertising
@ -14,6 +14,7 @@ Patch0001: 0001-man-tcpdump-and-tcpslice-have-manpages-in-man8.patch
Patch0002: 0002-pcap-config-mitigate-multilib-conflict.patch
Patch0003: 0003-pcap-linux-apparently-ctc-interfaces-on-s390-has-eth.patch
Patch0004: 0004-pcap-linux-don-t-use-TPACKETV3-for-memory-mmapped-ca.patch
Patch0005: 0005-Fix-scaling-of-time-stamps.patch
%description
Libpcap provides a portable framework for low-level network
@ -83,6 +84,9 @@ rm -f $RPM_BUILD_ROOT%{_libdir}/libpcap.a
%{_mandir}/man5/pcap*.5*
%changelog
* Mon Feb 23 2015 Michal Sekletar <msekleta@redhat.com> - 14:1.6.2-2
- fix scaling of pcap-ng timestamps (#1169322)
* Mon Sep 29 2014 Michal Sekletar <msekleta@redhat.com> - 14:1.6.2-1
- update to 1.6.2 (#1124174)
- disable TPACKET_V3 support (#1131500)