On 20/05/2010, Mark Thomas <[email protected]> wrote:
> On 20/05/2010 16:25, [email protected] wrote:
> > Author: jfclere
> > Date: Thu May 20 15:25:13 2010
> > New Revision: 946671
> >
> > URL: http://svn.apache.org/viewvc?rev=946671&view=rev
> > Log:
> > Prevent core due to wrong synchronisation.
> >
> > Modified:
> > tomcat/trunk/java/org/apache/catalina/core/AprLifecycleListener.java
> >
> > Modified:
> tomcat/trunk/java/org/apache/catalina/core/AprLifecycleListener.java
> > URL:
> http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/AprLifecycleListener.java?rev=946671&r1=946670&r2=946671&view=diff
> >
> ==============================================================================
> > --- tomcat/trunk/java/org/apache/catalina/core/AprLifecycleListener.java
> (original)
> > +++ tomcat/trunk/java/org/apache/catalina/core/AprLifecycleListener.java
> Thu May 20 15:25:13 2010
> > @@ -72,9 +72,15 @@ public class AprLifecycleListener
> > protected static boolean sslAvailable = false;
> > protected static boolean aprAvailable = false;
> >
> > + protected static String lock = "";
> > +
>
>
> Better as:
>
> protected static Object lock = new Object();
Even better:
protected static final Object lock = new Object();
otherwise the lock can be subverted.
>
> Mark
>
>
> > public static boolean isAprAvailable() {
> > //https://issues.apache.org/bugzilla/show_bug.cgi?id=48613
> > - if (instanceCreated) init();
> > + if (instanceCreated) {
> > + synchronized (lock) {
> > + init();
> > + }
> > + }
> > return aprAvailable;
> > }
> >
> > @@ -92,28 +98,32 @@ public class AprLifecycleListener
> > public void lifecycleEvent(LifecycleEvent event) {
> >
> > if (Lifecycle.INIT_EVENT.equals(event.getType())) {
> > - init();
> > - if (aprAvailable) {
> > - try {
> > - initializeSSL();
> > - } catch (Throwable t) {
> > - log.info(sm.getString("aprListener.sslInit"));
> > + synchronized (lock) {
> > + init();
> > + if (aprAvailable) {
> > + try {
> > + initializeSSL();
> > + } catch (Throwable t) {
> > + log.info(sm.getString("aprListener.sslInit"));
> > + }
> > }
> > }
> > } else if (Lifecycle.AFTER_STOP_EVENT.equals(event.getType())) {
> > - if (!aprAvailable) {
> > - return;
> > - }
> > - try {
> > - terminateAPR();
> > - } catch (Throwable t) {
> > - log.info(sm.getString("aprListener.aprDestroy"));
> > + synchronized (lock) {
> > + if (!aprAvailable) {
> > + return;
> > + }
> > + try {
> > + terminateAPR();
> > + } catch (Throwable t) {
> > + log.info(sm.getString("aprListener.aprDestroy"));
> > + }
> > }
> > }
> >
> > }
> >
> > - private static synchronized void terminateAPR()
> > + private static void terminateAPR()
> > throws ClassNotFoundException, NoSuchMethodException,
> > IllegalAccessException, InvocationTargetException
> > {
> > @@ -121,6 +131,8 @@ public class AprLifecycleListener
> > Method method = Class.forName("org.apache.tomcat.jni.Library")
> > .getMethod(methodName, (Class [])null);
> > method.invoke(null, (Object []) null);
> > + aprAvailable = false;
> > + aprInitialized = false;
> > }
> >
> > private static void init()
> > @@ -188,7 +200,7 @@ public class AprLifecycleListener
> > aprAvailable = true;
> > }
> >
> > - private static synchronized void initializeSSL()
> > + private static void initializeSSL()
> > throws ClassNotFoundException, NoSuchMethodException,
> > IllegalAccessException, InvocationTargetException
> > {
> >
> >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: [email protected]
> > For additional commands, e-mail: [email protected]
> >
>
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]