From mboxrd@z Thu Jan 1 00:00:00 1970 From: mathieu.desnoyers@efficios.com (Mathieu Desnoyers) Date: Sat, 22 Feb 2014 16:12:59 +0000 (UTC) Subject: [lttng-dev] [PATCH lttng-ust] Fix: Unsynchronized access in LTTngTCPSessiondClient In-Reply-To: <1392913353-13369-1-git-send-email-jeremie.galarneau@efficios.com> References: <1392913353-13369-1-git-send-email-jeremie.galarneau@efficios.com> Message-ID: <1530478584.28856.1393085579318.JavaMail.zimbra@efficios.com> ----- Original Message ----- > From: "J?r?mie Galarneau" > To: lttng-dev at lists.lttng.org > Sent: Thursday, February 20, 2014 11:22:33 AM > Subject: [lttng-dev] [PATCH lttng-ust] Fix: Unsynchronized access in LTTngTCPSessiondClient > > 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); > + } Further down in this function, we find: ret = enableCmd.enableLogger(handler, event, enabledLoggers); if (ret == 1) { /* Enabled so remove the event from the list. */ enabledEventList.remove(event); } should we encompass a larger part of this function with synchronize ? What happens if event is removed from enabledEventList while we iterate on the list copy ? Thanks, MAthieu > > 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 > > > _______________________________________________ > lttng-dev mailing list > lttng-dev at lists.lttng.org > http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev > -- Mathieu Desnoyers EfficiOS Inc. http://www.efficios.com