Skip to content

Commit 95699f3

Browse files
authored
Merge pull request #15093 from jim-krueger/HttpServletRequestInjectionProxy_NPE
Insert null checks for context to avoid NPEs
2 parents c01f9a8 + faed3d0 commit 95699f3

File tree

4 files changed

+97
-68
lines changed

4 files changed

+97
-68
lines changed

dev/com.ibm.ws.jaxrs.2.0.common/src/com/ibm/ws/jaxrs20/injection/HttpServletRequestInjectionProxy.java

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*******************************************************************************
2-
* Copyright (c) 2018 IBM Corporation and others.
2+
* Copyright (c) 2018, 2020 IBM Corporation and others.
33
* All rights reserved. This program and the accompanying materials
44
* are made available under the terms of the Eclipse Public License v1.0
55
* which accompanies this distribution, and is available at
@@ -47,15 +47,18 @@ public Object invoke(Object proxy,
4747
if (tc.isEntryEnabled()) {
4848
Tr.entry(tc, "invoke");
4949
}
50-
Object result;
50+
Object result = null;
5151
if ("toString".equals(method.getName()) && (method.getParameterTypes().length == 0)) {
5252
result = "Injection Proxy for " + contextClass.getName();
5353
if (tc.isEntryEnabled()) {
5454
Tr.exit(tc, "invoke", result);
5555
}
5656
return result;
5757
}
58-
result = method.invoke(getHttpServletRequest(), args);
58+
Object context = getHttpServletRequest();
59+
if (context != null) {
60+
result = method.invoke(context, args);
61+
}
5962
if (tc.isEntryEnabled()) {
6063
Tr.exit(tc, "invoke", result);
6164
}
@@ -73,6 +76,9 @@ private static HttpServletRequest getHttpServletRequest() {
7376
InjectionRuntimeContext runtimeContext = InjectionRuntimeContextHelper.getRuntimeContext();
7477
// get the real context from the RuntimeContext
7578
Object context = runtimeContext.getRuntimeCtxObject(contextClass.getName());
79+
if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) {
80+
Tr.exit(tc, methodName, context);
81+
}
7682
return (HttpServletRequest) context;
7783
}
7884

@@ -110,16 +116,17 @@ public boolean isWrapperFor(@SuppressWarnings("rawtypes") Class wrappedType) {
110116
}
111117

112118
final ServletRequest request = getHttpServletRequest();
113-
@SuppressWarnings("unchecked")
114-
final Class<? extends ServletRequest> wrappedServletType = wrappedType;
119+
if (request != null) {
120+
@SuppressWarnings("unchecked")
121+
final Class<? extends ServletRequest> wrappedServletType = wrappedType;
115122

116-
if (wrappedServletType.isAssignableFrom(request.getClass())) {
117-
return true;
118-
} else if (request instanceof ServletRequestWrapper) {
119-
return ((ServletRequestWrapper) request).isWrapperFor(wrappedType);
120-
} else {
121-
return false;
123+
if (wrappedServletType.isAssignableFrom(request.getClass())) {
124+
return true;
125+
} else if (request instanceof ServletRequestWrapper) {
126+
return ((ServletRequestWrapper) request).isWrapperFor(wrappedType);
127+
}
122128
}
129+
return false;
123130
}
124131

125132
/*
@@ -131,13 +138,14 @@ public boolean isWrapperFor(@SuppressWarnings("rawtypes") Class wrappedType) {
131138
public boolean isWrapperFor(ServletRequest wrapped) {
132139
final ServletRequest request = getHttpServletRequest();
133140

134-
if (request == wrapped) {
135-
return true;
136-
} else if (request instanceof ServletRequestWrapper) {
137-
return ((ServletRequestWrapper) request).isWrapperFor(wrapped);
138-
} else {
139-
return false;
141+
if (request != null) {
142+
if (request == wrapped) {
143+
return true;
144+
} else if (request instanceof ServletRequestWrapper) {
145+
return ((ServletRequestWrapper) request).isWrapperFor(wrapped);
146+
}
140147
}
148+
return false;
141149
}
142150

143151
/*

dev/com.ibm.ws.jaxrs.2.0.common/src/com/ibm/ws/jaxrs20/injection/HttpServletResponseInjectionProxy.java

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*******************************************************************************
2-
* Copyright (c) 2018 IBM Corporation and others.
2+
* Copyright (c) 2018, 2020 IBM Corporation and others.
33
* All rights reserved. This program and the accompanying materials
44
* are made available under the terms of the Eclipse Public License v1.0
55
* which accompanies this distribution, and is available at
@@ -47,15 +47,18 @@ public Object invoke(Object proxy,
4747
if (tc.isEntryEnabled()) {
4848
Tr.entry(tc, "invoke");
4949
}
50-
Object result;
50+
Object result = null;
5151
if ("toString".equals(method.getName()) && (method.getParameterTypes().length == 0)) {
5252
result = "Injection Proxy for " + contextClass.getName();
5353
if (tc.isEntryEnabled()) {
5454
Tr.exit(tc, "invoke", result);
5555
}
5656
return result;
5757
}
58-
result = method.invoke(getHttpServletResponse(), args);
58+
Object context = getHttpServletResponse();
59+
if (context != null) {
60+
result = method.invoke(context, args);
61+
}
5962
if (tc.isEntryEnabled()) {
6063
Tr.exit(tc, "invoke", result);
6164
}
@@ -73,6 +76,9 @@ private static HttpServletResponse getHttpServletResponse() {
7376
InjectionRuntimeContext runtimeContext = InjectionRuntimeContextHelper.getRuntimeContext();
7477
// get the real context from the RuntimeContext
7578
Object context = runtimeContext.getRuntimeCtxObject(contextClass.getName());
79+
if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) {
80+
Tr.exit(tc, methodName, context);
81+
}
7682
return (HttpServletResponse) context;
7783
}
7884

@@ -110,16 +116,17 @@ public boolean isWrapperFor(@SuppressWarnings("rawtypes") Class wrappedType) {
110116
}
111117

112118
final ServletResponse response = getHttpServletResponse();
113-
@SuppressWarnings("unchecked")
114-
final Class<? extends ServletResponse> wrappedServletType = wrappedType;
119+
if (response != null) {
120+
@SuppressWarnings("unchecked")
121+
final Class<? extends ServletResponse> wrappedServletType = wrappedType;
115122

116-
if (wrappedServletType.isAssignableFrom(response.getClass())) {
117-
return true;
118-
} else if (response instanceof ServletResponseWrapper) {
119-
return ((ServletResponseWrapper) response).isWrapperFor(wrappedType);
120-
} else {
121-
return false;
123+
if (wrappedServletType.isAssignableFrom(response.getClass())) {
124+
return true;
125+
} else if (response instanceof ServletResponseWrapper) {
126+
return ((ServletResponseWrapper) response).isWrapperFor(wrappedType);
127+
}
122128
}
129+
return false;
123130
}
124131

125132
/*
@@ -131,13 +138,14 @@ public boolean isWrapperFor(@SuppressWarnings("rawtypes") Class wrappedType) {
131138
public boolean isWrapperFor(ServletResponse wrapped) {
132139
final ServletResponse response = getHttpServletResponse();
133140

134-
if (response == wrapped) {
135-
return true;
136-
} else if (response instanceof ServletResponseWrapper) {
137-
return ((ServletResponseWrapper) response).isWrapperFor(wrapped);
138-
} else {
139-
return false;
141+
if (response != null) {
142+
if (response == wrapped) {
143+
return true;
144+
} else if (response instanceof ServletResponseWrapper) {
145+
return ((ServletResponseWrapper) response).isWrapperFor(wrapped);
146+
}
140147
}
148+
return false;
141149
}
142150

143151
/*

dev/com.ibm.ws.org.apache.cxf.cxf.rt.frontend.jaxrs.3.2/src/com/ibm/ws/jaxrs20/injection/HttpServletRequestInjectionProxy.java

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*******************************************************************************
2-
* Copyright (c) 2018 IBM Corporation and others.
2+
* Copyright (c) 2018, 2020 IBM Corporation and others.
33
* All rights reserved. This program and the accompanying materials
44
* are made available under the terms of the Eclipse Public License v1.0
55
* which accompanies this distribution, and is available at
@@ -44,7 +44,7 @@ public HttpServletRequestInjectionProxy() {
4444
public Object invoke(Object proxy,
4545
Method method,
4646
Object[] args) throws Throwable {
47-
Object result;
47+
Object result = null;
4848
if ("toString".equals(method.getName()) && (method.getParameterTypes().length == 0)) {
4949
result = "Injection Proxy for " + contextClass.getName();
5050
if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
@@ -55,7 +55,10 @@ public Object invoke(Object proxy,
5555
if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) {
5656
Tr.entry(tc, "invoke " + method + " ", args);
5757
}
58-
result = method.invoke(getHttpServletRequest(), args);
58+
Object context = getHttpServletRequest();
59+
if (context != null) {
60+
result = method.invoke(context, args);
61+
}
5962
if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) {
6063
Tr.exit(tc, "invoke " + result);
6164
}
@@ -113,16 +116,17 @@ public boolean isWrapperFor(@SuppressWarnings("rawtypes") Class wrappedType) {
113116
}
114117

115118
final ServletRequest request = getHttpServletRequest();
116-
@SuppressWarnings("unchecked")
117-
final Class<? extends ServletRequest> wrappedServletType = wrappedType;
119+
if (request != null) {
120+
@SuppressWarnings("unchecked")
121+
final Class<? extends ServletRequest> wrappedServletType = wrappedType;
118122

119-
if (wrappedServletType.isAssignableFrom(request.getClass())) {
120-
return true;
121-
} else if (request instanceof ServletRequestWrapper) {
122-
return ((ServletRequestWrapper) request).isWrapperFor(wrappedType);
123-
} else {
124-
return false;
123+
if (wrappedServletType.isAssignableFrom(request.getClass())) {
124+
return true;
125+
} else if (request instanceof ServletRequestWrapper) {
126+
return ((ServletRequestWrapper) request).isWrapperFor(wrappedType);
127+
}
125128
}
129+
return false;
126130
}
127131

128132
/*
@@ -134,13 +138,14 @@ public boolean isWrapperFor(@SuppressWarnings("rawtypes") Class wrappedType) {
134138
public boolean isWrapperFor(ServletRequest wrapped) {
135139
final ServletRequest request = getHttpServletRequest();
136140

137-
if (request == wrapped) {
138-
return true;
139-
} else if (request instanceof ServletRequestWrapper) {
140-
return ((ServletRequestWrapper) request).isWrapperFor(wrapped);
141-
} else {
142-
return false;
141+
if (request != null) {
142+
if (request == wrapped) {
143+
return true;
144+
} else if (request instanceof ServletRequestWrapper) {
145+
return ((ServletRequestWrapper) request).isWrapperFor(wrapped);
146+
}
143147
}
148+
return false;
144149
}
145150

146151
/*

dev/com.ibm.ws.org.apache.cxf.cxf.rt.frontend.jaxrs.3.2/src/com/ibm/ws/jaxrs20/injection/HttpServletResponseInjectionProxy.java

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*******************************************************************************
2-
* Copyright (c) 2018 IBM Corporation and others.
2+
* Copyright (c) 2018, 2020 IBM Corporation and others.
33
* All rights reserved. This program and the accompanying materials
44
* are made available under the terms of the Eclipse Public License v1.0
55
* which accompanies this distribution, and is available at
@@ -47,15 +47,18 @@ public Object invoke(Object proxy,
4747
if (tc.isEntryEnabled()) {
4848
Tr.entry(tc, "invoke");
4949
}
50-
Object result;
50+
Object result = null;
5151
if ("toString".equals(method.getName()) && (method.getParameterTypes().length == 0)) {
5252
result = "Injection Proxy for " + contextClass.getName();
5353
if (tc.isEntryEnabled()) {
5454
Tr.exit(tc, "invoke", result);
5555
}
5656
return result;
5757
}
58-
result = method.invoke(getHttpServletResponse(), args);
58+
Object context = getHttpServletResponse();
59+
if (context != null) {
60+
result = method.invoke(context, args);
61+
}
5962
if (tc.isEntryEnabled()) {
6063
Tr.exit(tc, "invoke", result);
6164
}
@@ -73,6 +76,9 @@ private static HttpServletResponse getHttpServletResponse() {
7376
InjectionRuntimeContext runtimeContext = InjectionRuntimeContextHelper.getRuntimeContext();
7477
// get the real context from the RuntimeContext
7578
Object context = runtimeContext.getRuntimeCtxObject(contextClass.getName());
79+
if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) {
80+
Tr.exit(tc, methodName, context);
81+
}
7682
return (HttpServletResponse) context;
7783
}
7884

@@ -110,16 +116,17 @@ public boolean isWrapperFor(@SuppressWarnings("rawtypes") Class wrappedType) {
110116
}
111117

112118
final ServletResponse response = getHttpServletResponse();
113-
@SuppressWarnings("unchecked")
114-
final Class<? extends ServletResponse> wrappedServletType = wrappedType;
119+
if (response != null) {
120+
@SuppressWarnings("unchecked")
121+
final Class<? extends ServletResponse> wrappedServletType = wrappedType;
115122

116-
if (wrappedServletType.isAssignableFrom(response.getClass())) {
117-
return true;
118-
} else if (response instanceof ServletResponseWrapper) {
119-
return ((ServletResponseWrapper) response).isWrapperFor(wrappedType);
120-
} else {
121-
return false;
123+
if (wrappedServletType.isAssignableFrom(response.getClass())) {
124+
return true;
125+
} else if (response instanceof ServletResponseWrapper) {
126+
return ((ServletResponseWrapper) response).isWrapperFor(wrappedType);
127+
}
122128
}
129+
return false;
123130
}
124131

125132
/*
@@ -131,13 +138,14 @@ public boolean isWrapperFor(@SuppressWarnings("rawtypes") Class wrappedType) {
131138
public boolean isWrapperFor(ServletResponse wrapped) {
132139
final ServletResponse response = getHttpServletResponse();
133140

134-
if (response == wrapped) {
135-
return true;
136-
} else if (response instanceof ServletResponseWrapper) {
137-
return ((ServletResponseWrapper) response).isWrapperFor(wrapped);
138-
} else {
139-
return false;
141+
if (response != null) {
142+
if (response == wrapped) {
143+
return true;
144+
} else if (response instanceof ServletResponseWrapper) {
145+
return ((ServletResponseWrapper) response).isWrapperFor(wrapped);
146+
}
140147
}
148+
return false;
141149
}
142150

143151
/*

0 commit comments

Comments
 (0)