From mboxrd@z Thu Jan 1 00:00:00 1970 From: jeremie.galarneau@efficios.com (=?UTF-8?q?J=C3=A9r=C3=A9mie=20Galarneau?=) Date: Thu, 20 Feb 2014 11:22:33 -0500 Subject: [lttng-dev] [PATCH lttng-ust] Fix: Unsynchronized access in LTTngTCPSessiondClient Message-ID: <1392913353-13369-1-git-send-email-jeremie.galarneau@efficios.com> enabledEventList is shared between the LTTngThread and eventTimer threads but is not synchronized. This patch changes enabledEventList's type from an ArrayList to a synchronizedList which implements the same interface. Signed-off-by: J?r?mie Galarneau --- .../org/lttng/ust/jul/LTTngTCPSessiondClient.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/liblttng-ust-jul/org/lttng/ust/jul/LTTngTCPSessiondClient.java b/liblttng-ust-jul/org/lttng/ust/jul/LTTngTCPSessiondClient.java index 25d1cb2..0d9a485 100644 --- a/liblttng-ust-jul/org/lttng/ust/jul/LTTngTCPSessiondClient.java +++ b/liblttng-ust-jul/org/lttng/ust/jul/LTTngTCPSessiondClient.java @@ -34,6 +34,7 @@ import java.util.List; import java.util.Timer; import java.util.TimerTask; import java.util.logging.Logger; +import java.util.Collections; class USTRegisterMsg { public static int pid; @@ -57,7 +58,8 @@ public class LTTngTCPSessiondClient { private Semaphore registerSem; private Timer eventTimer; - private List enabledEventList = new ArrayList(); + private List enabledEventList = Collections.synchronizedList( + new ArrayList()); /* * Map of Logger objects that have been enabled. They are indexed by name. */ @@ -86,7 +88,10 @@ public class LTTngTCPSessiondClient { * We have to make a copy here since it is possible that the * enabled event list is changed during an iteration on it. */ - List tmpList = new ArrayList(enabledEventList); + List tmpList; + synchronized(enabledEventList) { + tmpList = new ArrayList(enabledEventList); + } LTTngSessiondCmd2_4.sessiond_enable_handler enableCmd = new LTTngSessiondCmd2_4.sessiond_enable_handler(); @@ -277,8 +282,10 @@ public class LTTngTCPSessiondClient { * Add the event to the list so it can be enabled if * the logger appears at some point in time. */ - if (enabledEventList.contains(event) == false) { - enabledEventList.add(event); + synchronized (enabledEventList) { + if (enabledEventList.contains(event) == false) { + enabledEventList.add(event); + } } } data = enableCmd.getBytes(); -- 1.9.0