X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=liblttng-ust-java-agent%2Fjava%2Flttng-ust-agent-common%2Forg%2Flttng%2Fust%2Fagent%2Fcontext%2FContextInfoManager.java;h=22efe022e794c3b1930570f560df5b408567ea2a;hb=c0c0989ab70574e09b2f7e8b48c2da6af664a849;hp=c3999b5d83883637be881352e9359a898b7fbcee;hpb=8ab5c06b92ac9a06ba2743470a38e4e1cfc6a3c9;p=lttng-ust.git diff --git a/liblttng-ust-java-agent/java/lttng-ust-agent-common/org/lttng/ust/agent/context/ContextInfoManager.java b/liblttng-ust-java-agent/java/lttng-ust-agent-common/org/lttng/ust/agent/context/ContextInfoManager.java index c3999b5d..22efe022 100644 --- a/liblttng-ust-java-agent/java/lttng-ust-agent-common/org/lttng/ust/agent/context/ContextInfoManager.java +++ b/liblttng-ust-java-agent/java/lttng-ust-agent-common/org/lttng/ust/agent/context/ContextInfoManager.java @@ -1,18 +1,8 @@ /* - * Copyright (C) 2015 - EfficiOS Inc., Alexandre Montplaisir + * SPDX-License-Identifier: LGPL-2.1-only * - * This library is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License, version 2.1 only, - * as published by the Free Software Foundation. - * - * This library is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License - * for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this library; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * Copyright (C) 2015 EfficiOS Inc. + * Copyright (C) 2015 Alexandre Montplaisir */ package org.lttng.ust.agent.context; @@ -21,6 +11,8 @@ import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** * The singleton manager of {@link IContextInfoRetriever} objects. @@ -31,11 +23,17 @@ public final class ContextInfoManager { private static final String SHARED_LIBRARY_NAME = "lttng-ust-context-jni"; + private static final Pattern VALID_CONTEXT_NAME_PATTERN = Pattern.compile("^[a-zA-Z0-9_\\.]+$"); + private static ContextInfoManager instance; private final Map contextInfoRetrievers = new ConcurrentHashMap(); private final Map contextInforRetrieverRefs = new HashMap(); + /** + * Lock used to keep the two maps above in sync when retrievers are + * registered or unregistered. + */ private final Object retrieverLock = new Object(); /** Singleton class, constructor should not be accessed directly */ @@ -95,6 +93,10 @@ public final class ContextInfoManager { */ public boolean registerContextInfoRetriever(String retrieverName, IContextInfoRetriever contextInfoRetriever) { synchronized (retrieverLock) { + if (!validateRetrieverName(retrieverName)) { + return false; + } + if (contextInfoRetrievers.containsKey(retrieverName)) { /* * There is already a retriever registered with that name, @@ -155,6 +157,33 @@ public final class ContextInfoManager { * was none */ public IContextInfoRetriever getContextInfoRetriever(String retrieverName) { + /* + * Note that this method does not take the retrieverLock, it lets + * concurrent threads access the ConcurrentHashMap directly. + * + * It's fine for a get() to happen during a registration or + * unregistration, it's first-come-first-serve. + */ return contextInfoRetrievers.get(retrieverName); } + + /** + * Validate that the given retriever name contains only the allowed + * characters, which are alphanumerical characters, period "." and + * underscore "_". The name must also not start with a number. + */ + private static boolean validateRetrieverName(String contextName) { + if (contextName.isEmpty()) { + return false; + } + + /* First character must not be a number */ + if (Character.isDigit(contextName.charAt(0))) { + return false; + } + + /* Validate the other characters of the string */ + Matcher matcher = VALID_CONTEXT_NAME_PATTERN.matcher(contextName); + return matcher.matches(); + } }