From 7ee722fd692a262b83ce32730b0fcbae27eaa210 Mon Sep 17 00:00:00 2001 From: Ann Priestman Date: Mon, 6 Jan 2020 10:14:47 -0500 Subject: [PATCH 1/2] Prevent infinite recursion in isChild() test --- .../EmailMessageThreader.java | 31 +++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/EmailMessageThreader.java b/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/EmailMessageThreader.java index 431c7cc74c..760f5ebe01 100755 --- a/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/EmailMessageThreader.java +++ b/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/EmailMessageThreader.java @@ -686,13 +686,40 @@ final class EmailMessageThreader { * @return True if the given container is in the child tree of this * container, false otherwise. */ - boolean isChild(EmailContainer container) { + boolean isChild(EmailContainer container) { + return isChild(container, new HashSet<>()); + } + + /** + * Search all of this containers children to make sure that the given + * container is not a related. + * + * @param container - the container object to search for + * @param seenContainers - every container seen while doing this isChild check (to prevent possible loop) + * + * @return True if the given container is in the child tree of this + * container, false otherwise. + */ + boolean isChild(EmailContainer container, Set seenContainers) { + seenContainers.add(this); if (children == null || children.isEmpty()) { return false; } else if (children.contains(container)) { return true; } else { - return children.stream().anyMatch((child) -> (child.isChild(container))); + //return children.stream().anyMatch((child) -> (child.isChild(container))); + for (EmailContainer child:children) { + if(seenContainers.contains(child)) { + System.out.println("Oh no! Recursion time!"); + } + + // Prevent an infinite recursion by making sure we haven't already + // run isChild() on this child + if ((!seenContainers.contains(child)) && child.isChild(container, seenContainers)) { + return true; + } + } + return false; } } } From 5c17cd66c304a958a7a407eec5b62c2b92cdd1b9 Mon Sep 17 00:00:00 2001 From: Ann Priestman Date: Mon, 6 Jan 2020 13:51:58 -0500 Subject: [PATCH 2/2] Clean up --- .../thunderbirdparser/EmailMessageThreader.java | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/EmailMessageThreader.java b/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/EmailMessageThreader.java index 760f5ebe01..14d7f3893f 100755 --- a/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/EmailMessageThreader.java +++ b/thunderbirdparser/src/org/sleuthkit/autopsy/thunderbirdparser/EmailMessageThreader.java @@ -695,27 +695,22 @@ final class EmailMessageThreader { * container is not a related. * * @param container - the container object to search for - * @param seenContainers - every container seen while doing this isChild check (to prevent possible loop) + * @param processedContainers - every container seen while doing this isChild check (to prevent possible loop) * * @return True if the given container is in the child tree of this * container, false otherwise. */ - boolean isChild(EmailContainer container, Set seenContainers) { - seenContainers.add(this); + private boolean isChild(EmailContainer container, Set processedContainers) { + processedContainers.add(this); if (children == null || children.isEmpty()) { return false; } else if (children.contains(container)) { return true; } else { - //return children.stream().anyMatch((child) -> (child.isChild(container))); - for (EmailContainer child:children) { - if(seenContainers.contains(child)) { - System.out.println("Oh no! Recursion time!"); - } - + for (EmailContainer child : children) { // Prevent an infinite recursion by making sure we haven't already // run isChild() on this child - if ((!seenContainers.contains(child)) && child.isChild(container, seenContainers)) { + if ((!processedContainers.contains(child)) && child.isChild(container, processedContainers)) { return true; } }