Skip to content

Commit 4da8081

Browse files
author
Tod Bookless
authored
Merge pull request apache#1 from exabrial/TRIBESTRM_3972_CVE_2016_8739
[Tribestrm-3972] cve-2016-8739
2 parents abcd8f6 + fdd6058 commit 4da8081

File tree

3 files changed

+187
-74
lines changed

3 files changed

+187
-74
lines changed

rt/rs/extensions/providers/src/main/java/org/apache/cxf/jaxrs/provider/atom/AbstractAtomProvider.java

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import javax.ws.rs.core.MultivaluedMap;
3232
import javax.ws.rs.ext.MessageBodyReader;
3333
import javax.ws.rs.ext.MessageBodyWriter;
34+
import javax.xml.stream.XMLStreamReader;
3435

3536
import org.apache.abdera.Abdera;
3637
import org.apache.abdera.model.Document;
@@ -39,28 +40,29 @@
3940
import org.apache.abdera.parser.ParserOptions;
4041
import org.apache.abdera.writer.Writer;
4142
import org.apache.cxf.common.logging.LogUtils;
43+
import org.apache.cxf.staxutils.StaxUtils;
4244

43-
public abstract class AbstractAtomProvider<T extends Element>
45+
public abstract class AbstractAtomProvider<T extends Element>
4446
implements MessageBodyWriter<T>, MessageBodyReader<T> {
4547

4648
private static final Logger LOG = LogUtils.getL7dLogger(AbstractAtomProvider.class);
4749
private static final Abdera ATOM_ENGINE = new Abdera();
4850
private boolean autodetectCharset;
4951
private boolean formattedOutput;
50-
52+
5153
public long getSize(T element, Class<?> type, Type genericType, Annotation[] annotations, MediaType mt) {
5254
return -1;
5355
}
5456

55-
public void writeTo(T element, Class<?> clazz, Type type, Annotation[] a,
56-
MediaType mt, MultivaluedMap<String, Object> headers, OutputStream os)
57+
public void writeTo(T element, Class<?> clazz, Type type, Annotation[] a,
58+
MediaType mt, MultivaluedMap<String, Object> headers, OutputStream os)
5759
throws IOException {
5860
if (MediaType.APPLICATION_JSON_TYPE.isCompatible(mt)) {
5961
Writer w = createWriter("json");
6062
if (w == null) {
6163
throw new WebApplicationException(415);
6264
}
63-
element.writeTo(w, os);
65+
element.writeTo(w, os);
6466
} else if (formattedOutput) {
6567
Writer w = createWriter("prettyxml");
6668
if (w != null) {
@@ -80,9 +82,9 @@ protected Writer createWriter(String writerName) {
8082
}
8183
return w;
8284
}
83-
84-
public T readFrom(Class<T> clazz, Type t, Annotation[] a, MediaType mt,
85-
MultivaluedMap<String, String> headers, InputStream is)
85+
86+
public T readFrom(Class<T> clazz, Type t, Annotation[] a, MediaType mt,
87+
MultivaluedMap<String, String> headers, InputStream is)
8688
throws IOException {
8789
Parser parser = ATOM_ENGINE.getParser();
8890
synchronized (parser) {
@@ -91,7 +93,8 @@ public T readFrom(Class<T> clazz, Type t, Annotation[] a, MediaType mt,
9193
options.setAutodetectCharset(autodetectCharset);
9294
}
9395
}
94-
Document<T> doc = parser.parse(is);
96+
XMLStreamReader reader = StaxUtils.createXMLStreamReader(is);
97+
Document<T> doc = parser.parse(reader);
9598
return doc.getRoot();
9699
}
97100

rt/rs/extensions/providers/src/main/java/org/apache/cxf/jaxrs/provider/atom/AtomPojoProvider.java

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -558,8 +558,8 @@ private void reportError(String message, Exception ex) {
558558
reportError(message, ex, 500);
559559
}
560560

561-
private boolean isFeedRequested(MediaType mt) {
562-
if ("entry".equals(mt.getParameters().get("type"))) {
561+
protected boolean isFeedRequested(MediaType mt) {
562+
if ("entry".equalsIgnoreCase(mt.getParameters().get("type"))) {
563563
return false;
564564
}
565565
return true;
@@ -600,25 +600,29 @@ public Object readFrom(Class<Object> cls, Type type, Annotation[] anns, MediaTyp
600600
boolean isFeed = isFeedRequested(mt);
601601

602602
if (isFeed) {
603-
return readFromFeed(cls, mt, headers, is);
603+
return readFromFeedOrEntry(cls, mt, headers, is);
604604
} else {
605605
AtomEntryProvider p = new AtomEntryProvider();
606606
p.setAutodetectCharset(autodetectCharset);
607607
Entry entry = p.readFrom(Entry.class, Entry.class,
608608
new Annotation[]{}, mt, headers, is);
609-
return readFromEntry(entry, cls, mt, headers, is);
609+
return readFromEntry(entry, cls);
610610
}
611611
}
612612

613613
@SuppressWarnings("unchecked")
614-
private Object readFromFeed(Class<Object> cls, MediaType mt,
614+
private Object readFromFeedOrEntry(Class<Object> cls, MediaType mt,
615615
MultivaluedMap<String, String> headers, InputStream is)
616616
throws IOException {
617617

618618
AtomFeedProvider p = new AtomFeedProvider();
619619
p.setAutodetectCharset(autodetectCharset);
620-
Feed feed = p.readFrom(Feed.class, Feed.class, new Annotation[]{}, mt, headers, is);
621-
620+
Object atomObject = p.readFrom(Feed.class, Feed.class, new Annotation[]{}, mt, headers, is);
621+
if (atomObject instanceof Entry) {
622+
return this.readFromEntry((Entry)atomObject, cls);
623+
}
624+
625+
Feed feed = (Feed)atomObject;
622626
AtomElementReader<?, ?> reader = getAtomReader(cls);
623627
if (reader != null) {
624628
return ((AtomElementReader<Feed, Object>)reader).readFrom(feed);
@@ -631,7 +635,7 @@ private Object readFromFeed(Class<Object> cls, MediaType mt,
631635
= (Class<Object>)InjectionUtils.getActualType(m.getGenericParameterTypes()[0]);
632636
List<Object> objects = new ArrayList<Object>();
633637
for (Entry e : feed.getEntries()) {
634-
objects.add(readFromEntry(e, realCls, mt, headers, is));
638+
objects.add(readFromEntry(e, realCls));
635639
}
636640
instance = cls.newInstance();
637641
m.invoke(instance, new Object[]{objects});
@@ -643,20 +647,22 @@ private Object readFromFeed(Class<Object> cls, MediaType mt,
643647
}
644648

645649
@SuppressWarnings("unchecked")
646-
private Object readFromEntry(Entry entry, Class<Object> cls, MediaType mt,
647-
MultivaluedMap<String, String> headers, InputStream is)
650+
private Object readFromEntry(Entry entry, Class<Object> cls)
648651
throws IOException {
649652

650653
AtomElementReader<?, ?> reader = getAtomReader(cls);
651654
if (reader != null) {
652655
return ((AtomElementReader<Entry, Object>)reader).readFrom(entry);
653656
}
654-
try {
655-
Unmarshaller um =
656-
jaxbProvider.getJAXBContext(cls, cls).createUnmarshaller();
657-
return cls.cast(um.unmarshal(new StringReader(entry.getContent())));
658-
} catch (Exception ex) {
659-
reportError("Object of type " + cls.getName() + " can not be deserialized from Entry", ex, 400);
657+
String entryContent = entry.getContent();
658+
if (entryContent != null) {
659+
try {
660+
Unmarshaller um =
661+
jaxbProvider.getJAXBContext(cls, cls).createUnmarshaller();
662+
return cls.cast(um.unmarshal(new StringReader(entryContent)));
663+
} catch (Exception ex) {
664+
reportError("Object of type " + cls.getName() + " can not be deserialized from Entry", ex, 400);
665+
}
660666
}
661667
return null;
662668
}

0 commit comments

Comments
 (0)