[ https://issues.apache.org/jira/browse/FELIX-1600?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12758816#action_12758816 ]
Henning Andersen commented on FELIX-1600: ----------------------------------------- Tried to fix this locally, allow=false is not the solution. It seems to me that case 2 is symmetrical to case 3 and implementing case using the below code fixed the problem for our application and did not at a first glance seem to have any negative sideeffects. // Case 2: Only include service reference if the service // object uses the same class as the requester. else if (requesterWire == null) { // If the provider has a wire to the requestor, we are OK. If not, // then try to use the service registration to see if the requester's // class is accessible. if (!((BundleImpl) providerWire.getExporter().getBundle()).hasModule(requesterModule)) { try { // Load the class from the requesting bundle. Class requestClass = requesterModule.getClassByDelegation(className); // Get the service registration and ask it to check // if the service object is assignable to the requesting // bundle's class. allow = getRegistration().isClassAccessible(requestClass); } catch (Exception ex) { // This should not happen, filter to be safe. allow = false; } } else { // O.k. the provider is wired to the requestor's package, now check // if the provider is wired to the latest version of the requestor, if so // then allow else don't (the requestor has been updated but not refreshed). allow = requesterModule == providerWire.getExporter(); } } > ServiceReference.isAssignableTo() always returns true if requesting bundle > has no wire > -------------------------------------------------------------------------------------- > > Key: FELIX-1600 > URL: https://issues.apache.org/jira/browse/FELIX-1600 > Project: Felix > Issue Type: Bug > Components: Framework > Affects Versions: felix-2.0.0 > Reporter: Stuart McCulloch > Fix For: felix-2.2.0 > > > [ from http://markmail.org/message/pu5usr5s7vsweyv3 ] > I think there's a bug in our ServiceReference.isAssignableTo implementation... > the javadoc for this method states: > "This method performs the following checks: > 1. Get the package name from the specified class name. > 2. For the bundle that registered the service referenced by this > ServiceReference (registrant bundle); > find the source for the package. If no source is found then return > true if the registrant bundle is > equal to the specified bundle; otherwise return false. > 3. If the package source of the registrant bundle is equal to the package > source of the specified > bundle then return true; otherwise return false." > whereas our implementation does: > // There are three situations that may occur here: > // 1. The requester does not have a wire for the package. > // 2. The provider does not have a wire for the package. > // 3. Both have a wire for the package. > // For case 1, we do not filter the service reference since we > // assume that the bundle is using reflection or that it won't > // use that class at all since it does not import it. For > // case 2, we have to try to load the class from the class > // loader of the service object and then compare the class > // loaders to determine if we should filter the service > // refernce. In case 3, we simply compare the exporting > // modules from the package wiring to determine if we need > // to filter the service reference. > assume both the provider and requester have no wire for the package > (as happens when a bundle uses it's own export, as in this situation) > the javadoc says isAssignableTo should return false, because the > provider has no wire and the provider != requester - but we'll return > true because the requester has no wire and we do that check first -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.