[ https://issues.apache.org/jira/browse/TUSCANY-3065?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Raymond Feng resolved TUSCANY-3065. ----------------------------------- Resolution: Fixed Fixed by Scott > Double use exposure in JAXBDataSource > ------------------------------------- > > Key: TUSCANY-3065 > URL: https://issues.apache.org/jira/browse/TUSCANY-3065 > Project: Tuscany > Issue Type: Bug > Components: Java SCA Data Binding Runtime > Reporter: Greg Dritschler > Assignee: Raymond Feng > > There is a potential double use of a Marshaller object in > org.apache.tuscany.sca.databinding.jaxb.axiom.JAXBDataSource. > The following code gets a marshaller from an underlying pool and then caches > it. > private Marshaller getMarshaller() throws JAXBException { > if (marshaller == null) { > // For thread safety, not sure we can cache the marshaller > marshaller = JAXBContextHelper.getMarshaller(context); > } > return marshaller; > } > The code which calls this method also releases the Marshaller back to the > pool. For example: > public void serialize(final OutputStream output, OMOutputFormat format) > throws XMLStreamException { > try { > // marshaller.setProperty(Marshaller.JAXB_ENCODING, > format.getCharSetEncoding()); > AccessController.doPrivileged(new > PrivilegedExceptionAction<Object>() { > public Object run() throws Exception { > try { > Marshaller marshaller = getMarshaller(); > marshaller.marshal(element, output); > } finally { > releaseMarshaller(marshaller); > } > return null; > } > }); > } catch (PrivilegedActionException e) { > throw new XMLStreamException(e.getException()); > } > } > So after this method runs, the member variable marshaller contains a > reference to an element in the free pool. If another thread obtains that > element, there is a potential of double use. > Proposed fix: > - Delete member variable marshaller. > - Change getMarshaller to just return the Marshaller obtained from > JAXBContextHelper without saving it. > - Change all callers of getMarshaller/releaseMarshaller to use local > variables. You'll note there's a local variable in the "try" paths, but then > the "finally" paths use the member variable. Both the try and finally should > use the same local variable. -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.