summaryrefslogtreecommitdiff
blob: 408456ecafecdb789216047db6a3daf238fa5b2c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
diff -Naur kismet-2011-03-R2-orig/packetsource_pcap.cc kismet-2011-03-R2/packetsource_pcap.cc
--- kismet-2011-03-R2-orig/packetsource_pcap.cc	2011-01-05 16:52:51.000000000 -0500
+++ kismet-2011-03-R2/packetsource_pcap.cc	2012-02-20 22:37:17.973526919 -0500
@@ -553,6 +553,9 @@
 }
 #endif
 
+#define ALIGN_OFFSET(offset, width) \
+	    ( (((offset) + ((width) - 1)) & (~((width) - 1))) - offset )
+
 /*
  * Useful combinations of channel characteristics.
  */
@@ -617,6 +620,8 @@
 	enum ieee80211_radiotap_type bit;
 	int bit0;
 	const u_char *iter;
+	const u_char *iter_start;
+	unsigned int iter_align;
 	int fcs_cut = 0; // Is the FCS bit set?
 	char errstr[STATUS_MAX];
 
@@ -658,7 +663,7 @@
 
 	eight11chunk->dlt = KDLT_IEEE802_11;
 	
-    iter = (u_char*)(last_presentp + 1);
+    iter_start = iter = (u_char*)(last_presentp + 1);
 
     for (bit0 = 0, presentp = &hdr->it_present; presentp <= last_presentp;
          presentp++, bit0 += 32) {
@@ -686,6 +691,9 @@
                     u.i8 = *iter++;
                     break;
                 case IEEE80211_RADIOTAP_CHANNEL:
+					iter_align = ALIGN_OFFSET((unsigned int) (iter - iter_start), 2);
+					iter += iter_align;
+
                     u.u16 = EXTRACT_LE_16BITS(iter);
                     iter += sizeof(u.u16);
                     u2.u16 = EXTRACT_LE_16BITS(iter);
@@ -695,10 +703,16 @@
                 case IEEE80211_RADIOTAP_LOCK_QUALITY:
                 case IEEE80211_RADIOTAP_TX_ATTENUATION:
                 case IEEE80211_RADIOTAP_DB_TX_ATTENUATION:
+					iter_align = ALIGN_OFFSET((unsigned int) (iter - iter_start), 2);
+					iter += iter_align;
+
                     u.u16 = EXTRACT_LE_16BITS(iter);
                     iter += sizeof(u.u16);
                     break;
                 case IEEE80211_RADIOTAP_TSFT:
+					iter_align = ALIGN_OFFSET((unsigned int) (iter - iter_start), 8);
+					iter += iter_align;
+
                     u.u64 = EXTRACT_LE_64BITS(iter);
                     iter += sizeof(u.u64);
                     break;