Skip to content

Commit fff0b48

Browse files
committed
Fixed filter's unique key for regex manager.
1 parent b66d65f commit fff0b48

File tree

1 file changed

+52
-26
lines changed

1 file changed

+52
-26
lines changed

src/filters/fb_network.rs

+52-26
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use std::collections::HashMap;
12
use std::vec;
23

34
use flatbuffers::WIPOffset;
@@ -189,9 +190,11 @@ impl<'a> FlatNetworkFilter<'a> {
189190
index: u32,
190191
owner: &'a FlatNetworkFilterList,
191192
) -> Self {
193+
let list_address: *const FlatNetworkFilterList = owner as *const FlatNetworkFilterList;
194+
192195
Self {
193196
fb_filter: filter,
194-
key: index as u64,
197+
key: index as u64 | (((list_address) as u64) << 32),
195198
mask: unsafe { NetworkFilterMask::from_bits_unchecked(filter.mask()) },
196199
owner: owner,
197200
}
@@ -206,6 +209,46 @@ impl<'a> FlatNetworkFilter<'a> {
206209
pub fn modifier_option(&self) -> Option<String> {
207210
self.fb_filter.modifier_option().map(|o| o.to_string())
208211
}
212+
213+
#[inline(always)]
214+
pub fn include_domains(&self) -> Option<&[u16]> {
215+
self.fb_filter.opt_domains().map(|data| {
216+
let bytes = data.bytes();
217+
unsafe {
218+
std::slice::from_raw_parts(
219+
bytes.as_ptr() as *const u16,
220+
bytes.len() / std::mem::size_of::<u16>(),
221+
)
222+
}
223+
})
224+
}
225+
226+
#[inline(always)]
227+
pub fn exclude_domains(&self) -> Option<&[u16]> {
228+
self.fb_filter.opt_not_domains().map(|data| {
229+
let bytes = data.bytes();
230+
unsafe {
231+
std::slice::from_raw_parts(
232+
bytes.as_ptr() as *const u16,
233+
bytes.len() / std::mem::size_of::<u16>(),
234+
)
235+
}
236+
})
237+
}
238+
239+
#[inline(always)]
240+
pub fn hostname(&self) -> Option<&'a str> {
241+
if self.mask.is_hostname_anchor() {
242+
self.fb_filter.hostname()
243+
} else {
244+
None
245+
}
246+
}
247+
248+
#[inline(always)]
249+
pub fn patterns(&self) -> FlatPatterns {
250+
FlatPatterns::new(self.fb_filter.patterns())
251+
}
209252
}
210253

211254
impl<'a> NetworkFilterMaskHelper for FlatNetworkFilter<'a> {
@@ -224,28 +267,24 @@ impl<'a> NetworkMatchable for FlatNetworkFilter<'a> {
224267
if !check_options(self.mask, request) {
225268
return false;
226269
}
227-
let opt_not_domains = get_u16_slice_from_flatvector(self.fb_filter.opt_domains());
228270
if !check_included_domains_mapped(
229-
opt_not_domains,
271+
self.include_domains(),
230272
request,
231273
&self.owner.domain_hashes_mapping,
232274
) {
233275
return false;
234276
}
235-
let opt_domains = get_u16_slice_from_flatvector(self.fb_filter.opt_not_domains());
236-
if !check_excluded_domains_mapped(opt_domains, request, &self.owner.domain_hashes_mapping) {
277+
if !check_excluded_domains_mapped(
278+
self.exclude_domains(),
279+
request,
280+
&self.owner.domain_hashes_mapping,
281+
) {
237282
return false;
238283
}
239-
let patterns = FlatPatterns::new(self.fb_filter.patterns());
240-
let hostname = if self.is_hostname_anchor() {
241-
self.fb_filter.hostname()
242-
} else {
243-
None
244-
};
245284
check_pattern(
246285
self.mask,
247-
patterns.iter(),
248-
hostname,
286+
self.patterns().iter(),
287+
self.hostname(),
249288
self.key,
250289
request,
251290
regex_manager,
@@ -257,16 +296,3 @@ impl<'a> NetworkMatchable for FlatNetworkFilter<'a> {
257296
self.matches(request, &mut RegexManager::default())
258297
}
259298
}
260-
261-
#[inline]
262-
fn get_u16_slice_from_flatvector<'a>(vec: Option<flatbuffers::Vector<'a, u16>>) -> Option<&[u16]> {
263-
vec.map(|data| {
264-
let bytes = data.bytes();
265-
unsafe {
266-
std::slice::from_raw_parts(
267-
bytes.as_ptr() as *const u16,
268-
bytes.len() / std::mem::size_of::<u16>(),
269-
)
270-
}
271-
})
272-
}

0 commit comments

Comments
 (0)