This is an automated email from the ASF dual-hosted git repository. markt pushed a commit to branch 8.5.x in repository https://gitbox.apache.org/repos/asf/tomcat.git
commit 665a6da487947b40e45c631191d8e831c54704e2 Author: Mark Thomas <ma...@apache.org> AuthorDate: Thu Nov 14 10:29:05 2019 +0000 Fix SpotBug failures in Jasper --- .../apache/jasper/compiler/JspRuntimeContext.java | 5 +-- .../apache/jasper/compiler/TagFileProcessor.java | 2 +- java/org/apache/jasper/el/JasperELResolver.java | 18 ++++++---- .../jasper/resources/LocalStrings.properties | 1 + .../jasper/resources/LocalStrings_fr.properties | 1 + .../jasper/resources/LocalStrings_ja.properties | 1 + .../jasper/resources/LocalStrings_ko.properties | 1 + .../apache/jasper/runtime/JspRuntimeLibrary.java | 2 +- .../apache/jasper/servlet/JspServletWrapper.java | 4 +-- res/findbugs/filter-false-positives.xml | 40 +++++++++++++++++----- 10 files changed, 54 insertions(+), 21 deletions(-) diff --git a/java/org/apache/jasper/compiler/JspRuntimeContext.java b/java/org/apache/jasper/compiler/JspRuntimeContext.java index 78f3f35..87157ff 100644 --- a/java/org/apache/jasper/compiler/JspRuntimeContext.java +++ b/java/org/apache/jasper/compiler/JspRuntimeContext.java @@ -19,6 +19,7 @@ package org.apache.jasper.compiler; import java.io.File; import java.io.FileNotFoundException; import java.io.FilePermission; +import java.io.IOException; import java.net.URISyntaxException; import java.net.URL; import java.net.URLClassLoader; @@ -543,8 +544,8 @@ public final class JspRuntimeContext { // Allow the JSP to access org.apache.jasper.runtime.HttpJspBase permissions.add( new RuntimePermission( "accessClassInPackage.org.apache.jasper.runtime") ); - } catch(Exception e) { - context.log("Security Init for context failed",e); + } catch (RuntimeException | IOException e) { + context.log(Localizer.getMessage("jsp.error.security"), e); } } return new SecurityHolder(source, permissions); diff --git a/java/org/apache/jasper/compiler/TagFileProcessor.java b/java/org/apache/jasper/compiler/TagFileProcessor.java index 910cb47..d26ba94 100644 --- a/java/org/apache/jasper/compiler/TagFileProcessor.java +++ b/java/org/apache/jasper/compiler/TagFileProcessor.java @@ -599,7 +599,7 @@ class TagFileProcessor { entry.getValue()); } } - } catch (Exception e) { + } catch (RuntimeException | ReflectiveOperationException e) { // ignore errors } diff --git a/java/org/apache/jasper/el/JasperELResolver.java b/java/org/apache/jasper/el/JasperELResolver.java index 3eaab88..07d07a2 100644 --- a/java/org/apache/jasper/el/JasperELResolver.java +++ b/java/org/apache/jasper/el/JasperELResolver.java @@ -18,6 +18,7 @@ package org.apache.jasper.el; import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; import javax.el.ArrayELResolver; import javax.el.BeanELResolver; @@ -41,15 +42,14 @@ public class JasperELResolver extends CompositeELResolver { private static final int STANDARD_RESOLVERS_COUNT = 9; - private int size; - private ELResolver[] resolvers; + private AtomicInteger resolversSize = new AtomicInteger(0); + private volatile ELResolver[] resolvers; private final int appResolversSize; public JasperELResolver(List<ELResolver> appResolvers, ELResolver streamResolver) { appResolversSize = appResolvers.size(); resolvers = new ELResolver[appResolversSize + STANDARD_RESOLVERS_COUNT]; - size = 0; add(new ImplicitObjectELResolver()); for (ELResolver appResolver : appResolvers) { @@ -69,6 +69,8 @@ public class JasperELResolver extends CompositeELResolver { public synchronized void add(ELResolver elResolver) { super.add(elResolver); + int size = resolversSize.get(); + if (resolvers.length > size) { resolvers[size] = elResolver; } else { @@ -78,7 +80,7 @@ public class JasperELResolver extends CompositeELResolver { resolvers = nr; } - size ++; + resolversSize.incrementAndGet(); } @Override @@ -106,6 +108,7 @@ public class JasperELResolver extends CompositeELResolver { start = 1; } + int size = resolversSize.get(); for (int i = start; i < size; i++) { result = resolvers[i].getValue(context, base, property); if (context.isPropertyResolved()) { @@ -143,6 +146,7 @@ public class JasperELResolver extends CompositeELResolver { // skip collection (map, resource, list, and array) resolvers index += 4; // call bean and the rest of resolvers + int size = resolversSize.get(); for (int i = index; i < size; i++) { result = resolvers[i].invoke( context, base, targetMethod, paramTypes, params); @@ -154,8 +158,8 @@ public class JasperELResolver extends CompositeELResolver { return null; } - /** - * Copied from {@link org.apache.el.lang.ELSupport#coerceToString(ELContext,Object)}. + /* + * Copied from org.apache.el.lang.ELSupport#coerceToString(ELContext,Object) */ private static final String coerceToString(final Object obj) { if (obj == null) { @@ -168,4 +172,4 @@ public class JasperELResolver extends CompositeELResolver { return obj.toString(); } } -} \ No newline at end of file +} diff --git a/java/org/apache/jasper/resources/LocalStrings.properties b/java/org/apache/jasper/resources/LocalStrings.properties index 20ad2c7..929bb6a 100644 --- a/java/org/apache/jasper/resources/LocalStrings.properties +++ b/java/org/apache/jasper/resources/LocalStrings.properties @@ -168,6 +168,7 @@ jsp.error.prolog_config_encoding_mismatch=Page-encoding specified in XML prolog jsp.error.prolog_pagedir_encoding_mismatch=Page-encoding specified in XML prolog [{0}] is different from that specified in page directive [{1}] jsp.error.quotes.unterminated=Unterminated quotes jsp.error.scripting.variable.missing_name=Unable to determine scripting variable name from attribute [{0}] +jsp.error.security=Security initialization failed for context jsp.error.servlet.destroy.failed=Exception during Servlet.destroy() for JSP page jsp.error.servlet.invalid.method=JSPs only permit GET POST or HEAD jsp.error.setLastModified=Unable to set last modified date for file [{0}] diff --git a/java/org/apache/jasper/resources/LocalStrings_fr.properties b/java/org/apache/jasper/resources/LocalStrings_fr.properties index 6e0d1e6..5010b4b 100644 --- a/java/org/apache/jasper/resources/LocalStrings_fr.properties +++ b/java/org/apache/jasper/resources/LocalStrings_fr.properties @@ -168,6 +168,7 @@ jsp.error.prolog_config_encoding_mismatch=Le page-encoding spécifié dans le pr jsp.error.prolog_pagedir_encoding_mismatch=L''encodage spécifié dans le prologue XML [{0}] est différent de celui spécifié dans la directive de page [{1}] jsp.error.quotes.unterminated=Guillemets non terminés jsp.error.scripting.variable.missing_name=Incapable de déterminer le nom de variable scripting d''après l''attribut [{0}] +jsp.error.security=L'initialisation de la sécurité a échouée pour le contexte jsp.error.servlet.destroy.failed=Erreur pendant le Servlet.destroy() de la page JSP jsp.error.setLastModified=Impossible de fixer la date de dernière modification pour le fichier [{0}] jsp.error.signature.classnotfound=La classe [{0}] spećifié dans la signature de la méthode dans la TLD pour la fonction [{1}] n''a pas pu être trouvée [{2}] diff --git a/java/org/apache/jasper/resources/LocalStrings_ja.properties b/java/org/apache/jasper/resources/LocalStrings_ja.properties index c936750..7a10510 100644 --- a/java/org/apache/jasper/resources/LocalStrings_ja.properties +++ b/java/org/apache/jasper/resources/LocalStrings_ja.properties @@ -168,6 +168,7 @@ jsp.error.prolog_config_encoding_mismatch=XML導入部で指定されたpage-enc jsp.error.prolog_pagedir_encoding_mismatch=XML導入部で指定されたpage-encoding [{0}] がpage指示子中の指定 [{1}] と違います jsp.error.quotes.unterminated=引用符が終了していません jsp.error.scripting.variable.missing_name=属性 [{0}] からスクリプト変数名を決定できません +jsp.error.security=コンテキストのセキュリティの初期化に失敗しました。 jsp.error.servlet.destroy.failed=JSPページのServlet.destroy()の例外 jsp.error.setLastModified=ファイル[{0}]の最終更新日を設定できません jsp.error.signature.classnotfound=TLDの中のメソッドシグネチャで関数 [{1}] に指定されているクラス [{0}] が見つかりません。 [{2}] diff --git a/java/org/apache/jasper/resources/LocalStrings_ko.properties b/java/org/apache/jasper/resources/LocalStrings_ko.properties index 1ef05d4..4361c42 100644 --- a/java/org/apache/jasper/resources/LocalStrings_ko.properties +++ b/java/org/apache/jasper/resources/LocalStrings_ko.properties @@ -167,6 +167,7 @@ jsp.error.prolog_config_encoding_mismatch=XML 프롤로그 [{0}]에 지정된 jsp.error.prolog_pagedir_encoding_mismatch=XML 프롤로그 [{0}]에 지정된 페이지 인코딩이, 페이지 지시어 [{1}]에 지정된 것과 다릅니다. jsp.error.quotes.unterminated=종료되지 않은 인용부들 jsp.error.scripting.variable.missing_name=속성 [{0}](으)로부터 스크립팅 변수 이름을 결정할 수 없습니다. +jsp.error.security=컨텍스트를 위한 보안 초기화 작업이 실패했습니다. jsp.error.servlet.destroy.failed=JSP 페이지를 위한 Servlet.destroy() 호출 중 예외 발생 jsp.error.setLastModified=파일 [{0}]의 최종 변경 시간을 설정할 수 없습니다. jsp.error.signature.classnotfound=TLD 내에 function [{1}]을 위해 지정된 메소드 signature에 포함된 클래스 [{0}]을(를) 찾을 수 없습니다. [{2}] diff --git a/java/org/apache/jasper/runtime/JspRuntimeLibrary.java b/java/org/apache/jasper/runtime/JspRuntimeLibrary.java index a7fde0a..e846229 100644 --- a/java/org/apache/jasper/runtime/JspRuntimeLibrary.java +++ b/java/org/apache/jasper/runtime/JspRuntimeLibrary.java @@ -487,7 +487,7 @@ public class JspRuntimeLibrary { } method.invoke (bean, new Object[] {tmpval}); } - } catch (Exception ex) { + } catch (RuntimeException | ReflectiveOperationException ex) { Throwable thr = ExceptionUtils.unwrapInvocationTargetException(ex); ExceptionUtils.handleThrowable(thr); throw new JasperException ("error in invoking method", ex); diff --git a/java/org/apache/jasper/servlet/JspServletWrapper.java b/java/org/apache/jasper/servlet/JspServletWrapper.java index d7f54de..7eca184 100644 --- a/java/org/apache/jasper/servlet/JspServletWrapper.java +++ b/java/org/apache/jasper/servlet/JspServletWrapper.java @@ -81,9 +81,9 @@ public class JspServletWrapper { // Logger private final Log log = LogFactory.getLog(JspServletWrapper.class); // must not be static - private Servlet theServlet; + private volatile Servlet theServlet; private final String jspUri; - private Class<?> tagHandlerClass; + private volatile Class<?> tagHandlerClass; private final JspCompilationContext ctxt; private long available = 0L; private final ServletConfig config; diff --git a/res/findbugs/filter-false-positives.xml b/res/findbugs/filter-false-positives.xml index eb037f8..b2ed8f1 100644 --- a/res/findbugs/filter-false-positives.xml +++ b/res/findbugs/filter-false-positives.xml @@ -869,18 +869,20 @@ <Bug code="Dm" /> </Match> <Match> - <!-- Yes this is a dead store. This is so the IDE warning can be suppressed. - The object creation has side-effects so the code is required. --> - <Class name="org.apache.jasper.compiler.JspDocumentParser" /> - <Method name="comment"/> - <Bug pattern="DLS_DEAD_LOCAL_STORE"/> - </Match> - <Match> <!-- Node constructors add node to parent. Local variable is used to silence an Eclipse warning --> <Class name="org.apache.jasper.compiler.ELFunctionMapper"/> <Method name="map"/> - <Bug code="DLS"/> + <Bug pattern="DLS_DEAD_LOCAL_STORE"/> + </Match> + <Match> + <!-- Sync is not protecting these fields --> + <Class name="org.apache.jasper.compiler.JspConfig"/> + <Or> + <Field name="defaultDeferedSyntaxAllowedAsLiteral" /> + <Field name="defaultIsELIgnored" /> + </Or> + <Bug pattern="IS2_INCONSISTENT_SYNC"/> </Match> <Match> <!-- NPE is not possible --> @@ -895,6 +897,16 @@ <Bug code="NP"/> </Match> <Match> + <!-- Yes this is a dead store. This is so the IDE warning can be suppressed. + The object creation has side-effects so the code is required. --> + <Class name="org.apache.jasper.compiler.JspDocumentParser" /> + <Or> + <Method name="comment"/> + <Method name="processChars"/> + </Or> + <Bug pattern="DLS_DEAD_LOCAL_STORE"/> + </Match> + <Match> <!-- Returning null is intentional --> <Class name="org.apache.jasper.compiler.JspReader"/> <Method name="indexOf"/> @@ -913,6 +925,12 @@ <Bug code="ES"/> </Match> <Match> + <!-- Sync is not protecting this field --> + <Class name="org.apache.jasper.compiler.SmapGenerator"/> + <Field name="doEmbedded" /> + <Bug pattern="IS2_INCONSISTENT_SYNC"/> + </Match> + <Match> <!-- Only base null is handled by this resolver --> <Class name="org.apache.jasper.el.ELResolverImpl"/> <Or> @@ -924,6 +942,12 @@ <Bug code="NP" /> </Match> <Match> + <!-- Array contents are not mutated --> + <Class name="org.apache.jasper.el.JasperELResolver"/> + <Field name="resolvers" /> + <Bug pattern="VO_VOLATILE_REFERENCE_TO_ARRAY" /> + </Match> + <Match> <!-- base null is handled by this resolver --> <Class name="org.apache.jasper.el.JasperELResolver"/> <Method name="getValue" /> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org