santuario-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Anli Shundi <>
Subject Re: [jira] [Commented] (SANTUARIO-337) ResourceResolver does thread-unsafe handling of the "secureValidation" flag
Date Thu, 02 Aug 2012 20:50:06 GMT

Performance is very important. Resolvers are typically used multiple times per signature.
XML processing currently dwarfs crypto operations by orders (!) of magnitude. 


On Aug 2, 2012, at 9:48 PM, "Eric Johnson" <> wrote:

> Hmmm.
> I need a little bit of direction.
> In the ResourceResolver class, the "getInstance" method is the one that takes the flag
for "secureValidation". Callers then take the returned "resolver" instance, and call "resolve",
which /doesn't/ take a "secureValidation" parameter.
> There are two ways to solve this, I think:
> a) always make new copies of the resolver & spi instances - this means that we can
safely set the "secureValidation" flag on the instance of the ResourceResolverSpi, and it
will just work. This moots the "engineIsThreadSafe" method, since every resolution will be
done in a thread safe manner (although the code still needs to be tweaked so that it only
creates a new resolver and spi instance once an Spi instance has been chosen).
> b) change the parameters to the "resolve" method, so that it takes the "secureValidation"
parameter. Note that this removes the need for the "secureValidation" field of "ResourceResolverSpi",
as it will now always be passed as state. Older Spi implementations might respect this flag.
However, since it was introduced in 1.5.0, this list of processors is likely to be short,
as it will have to be a processor written in the range of [1.5.0,1.5.3)
> Thoughts?
> -Eric.
> On 8/1/12 2:59 PM, Eric Johnson wrote:
>> Hi Colm,
>> I think I can come up with a patch. It will take me a few days.
>> I'm inclined to change the resolving code to pass around a "ResolveContext" instance
which will take all of the existing parameters. This way, additional parameters added in the
future will not re-break the API.
>> Do you think that can work? Or do I need to submit a patch before you understand
what I mean?
>> I admit, I have reason for such an approach - my port of Santuario to use GenXDM
has to change the resolver APIs to add a parameter. Combined with the "secureValidation" flag,
that's two additional pieces of metadata, and that suggests the possibility of yet more future
>> -Eric.
>> On 8/1/12 3:43 AM, Colm O hEigeartaigh (JIRA) wrote:
>>>     [
>>> Colm O hEigeartaigh commented on SANTUARIO-337:
>>> -----------------------------------------------
>>> Hi Eric,
>>> Could you submit a patch for this issue? One downside to adding the secureValidation
flag to the ResourceResolverSpi.engineResolve() method is that it breaks backwards compatibility
for any custom ResourceResolverSpi implementations. I don't see a way around this though unfortunately.
>>> Colm.
>>>> ResourceResolver does thread-unsafe handling of the "secureValidation" flag
>>>> ---------------------------------------------------------------------------

>>>>                 Key: SANTUARIO-337
>>>>                 URL:
>>>>             Project: Santuario
>>>>          Issue Type: Bug
>>>>          Components: Java
>>>>    Affects Versions: Java 1.5.2
>>>>            Reporter: Eric Johnson
>>>>            Assignee: Colm O hEigeartaigh
>>>>            Priority: Minor
>>>> From ResourceResolver.getInstance(), with parts elided for brevity &
>>>>             for (ResourceResolver resolver : resolverList) {
>>>>                 ResourceResolver resolverTmp = resolver;
>>>>                 if (!resolver.resolverSpi.engineIsThreadSafe()) {
>>>>                     // generate a new instances of resolverSpi ...
>>>>                 }
>>>>                 // ...
>>>>                 resolverTmp.resolverSpi.secureValidation = secureValidation;
>>>>                 if ((resolverTmp != null) && resolverTmp.canResolve(uri,
baseURI)) {
>>>>                     // Check to see whether the Resolver is allowed
>>>>                     // check for certain types ....
>>>>                     return resolverTmp;
>>>>                 }
>>>>             }
>>>> In case you didn't see it, the trouble is the juxtaposition of "resolverSpi.engineIsThreadSafe()"
followed by code that sets "secureValidation" on the very same instance of the spi, whether
or not it is thread safe.
>>>> Meaning, if two threads resolve at the same time, and one thread is attempting
secure resolution while the other is not, all the "thread safe" resolvers risk a race condition
where they will now be in an uncertain state. Of course, it turns out that all the included
resolvers declare themselves thread-safe, so this potentially magnifies the problem.
>>>> In practice, this is not likely ever to occur, because any given application
will likely share the same notion of "secureValidation".
>>>> Three observations
>>>> #1 - the secureValidation flag needs only be set for the resolver that is
actually chosen
>>>> #2 - the secureValidation flag should instead be passed as a parameter ResourceResolverSpi.engineResolve()
method, not stored as data in the SPI instance.
>>>> #3 - if there were ever a resolver to show up that isn't thread safe, and
it also has properties, the logic above which creates a new instance of the SPI would discard
the properties set on the registered spi. It turns out only the HTTP resolver uses these properties
for anything, so this may not be problematic in the real world.
>>>> Originally reported via email:
>>> -- 
>>> This message is automatically generated by JIRA.
>>> If you think it was sent incorrectly, please contact your JIRA administrators:!default.jspa
>>> For more information on JIRA, see:

View raw message