Skip to content

Commit 023e16c

Browse files
authored
Merge pull request #1471 from baranowb/UNDERTOW-2093_2
[UNDERTOW-2263] UNDERTOW-2093 detailed followup
2 parents 15e5454 + 3e2337d commit 023e16c

File tree

10 files changed

+715
-93
lines changed

10 files changed

+715
-93
lines changed

core/src/main/java/io/undertow/UndertowLogger.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -452,4 +452,16 @@ void nodeConfigCreated(URI connectionURI, String balancer, String domain, String
452452
@LogMessage(level = DEBUG)
453453
@Message(id = 5098, value = "GSSAPI negotiation failed for %s")
454454
void failedToNegotiateAtGSSAPI(final HttpServerExchange exchange, final @Cause Throwable e);
455+
456+
@LogMessage(level = WARN)
457+
@Message(id = 5099, value = "Failed to create SSO for session '%s'")
458+
void failedToCreateSSOForSession(final String sessionId);
459+
460+
@LogMessage(level = DEBUG)
461+
@Message(id = 5100, value = "Failed to list paths for '%s'")
462+
void failedToListPathsForFile(final Path f);
463+
464+
@LogMessage(level = DEBUG)
465+
@Message(id = 5101, value = "No source to list resources from")
466+
void noSourceToListResourcesFrom();
455467
}

core/src/main/java/io/undertow/UndertowMessages.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -647,4 +647,7 @@ public interface UndertowMessages {
647647
@Message(id = 207, value = "Invalid SNI hostname '%s'")
648648
IllegalArgumentException invalidSniHostname(String hostNameValue, @Cause Throwable t);
649649

650+
@Message(id = 208, value = "Failed to allocate resource")
651+
IOException failedToAllocateResource();
652+
650653
}

core/src/main/java/io/undertow/io/BlockingReceiverImpl.java

Lines changed: 33 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -121,10 +121,14 @@ public void receiveFullString(final FullStringCallback callback, final ErrorCall
121121
}
122122
int s;
123123
try (PooledByteBuffer pooled = exchange.getConnection().getByteBufferPool().getArrayBackedPool().allocate()) {
124-
while ((s = inputStream.read(pooled.getBuffer().array(), pooled.getBuffer().arrayOffset(), pooled.getBuffer().remaining())) > 0) {
125-
sb.write(pooled.getBuffer().array(), pooled.getBuffer().arrayOffset(), s);
124+
if (pooled != null) {
125+
while ((s = inputStream.read(pooled.getBuffer().array(), pooled.getBuffer().arrayOffset(), pooled.getBuffer().remaining())) > 0) {
126+
sb.write(pooled.getBuffer().array(), pooled.getBuffer().arrayOffset(), s);
127+
}
128+
callback.handle(exchange, sb.toString(charset.name()));
129+
} else {
130+
throw UndertowMessages.MESSAGES.failedToAllocateResource();
126131
}
127-
callback.handle(exchange, sb.toString(charset.name()));
128132
} catch (IOException e) {
129133
error.error(exchange, e);
130134
}
@@ -169,13 +173,17 @@ public void receivePartialString(final PartialStringCallback callback, final Err
169173
CharsetDecoder decoder = charset.newDecoder();
170174
int s;
171175
try (PooledByteBuffer pooled = exchange.getConnection().getByteBufferPool().getArrayBackedPool().allocate()) {
172-
while ((s = inputStream.read(pooled.getBuffer().array(), pooled.getBuffer().arrayOffset(), pooled.getBuffer().remaining())) > 0) {
173-
pooled.getBuffer().limit(s);
174-
CharBuffer res = decoder.decode(pooled.getBuffer());
175-
callback.handle(exchange, res.toString(), false);
176-
pooled.getBuffer().clear();
176+
if (pooled != null) {
177+
while ((s = inputStream.read(pooled.getBuffer().array(), pooled.getBuffer().arrayOffset(), pooled.getBuffer().remaining())) > 0) {
178+
pooled.getBuffer().limit(s);
179+
CharBuffer res = decoder.decode(pooled.getBuffer());
180+
callback.handle(exchange, res.toString(), false);
181+
pooled.getBuffer().clear();
182+
}
183+
callback.handle(exchange, "", true);
184+
} else {
185+
throw UndertowMessages.MESSAGES.failedToAllocateResource();
177186
}
178-
callback.handle(exchange, "", true);
179187
} catch (IOException e) {
180188
error.error(exchange, e);
181189
}
@@ -222,10 +230,14 @@ public void receiveFullBytes(final FullBytesCallback callback, final ErrorCallba
222230
}
223231
int s;
224232
try (PooledByteBuffer pooled = exchange.getConnection().getByteBufferPool().getArrayBackedPool().allocate()) {
225-
while ((s = inputStream.read(pooled.getBuffer().array(), pooled.getBuffer().arrayOffset(), pooled.getBuffer().remaining())) > 0) {
226-
sb.write(pooled.getBuffer().array(), pooled.getBuffer().arrayOffset(), s);
233+
if (pooled != null) {
234+
while ((s = inputStream.read(pooled.getBuffer().array(), pooled.getBuffer().arrayOffset(), pooled.getBuffer().remaining())) > 0) {
235+
sb.write(pooled.getBuffer().array(), pooled.getBuffer().arrayOffset(), s);
236+
}
237+
callback.handle(exchange, sb.toByteArray());
238+
} else {
239+
throw UndertowMessages.MESSAGES.failedToAllocateResource();
227240
}
228-
callback.handle(exchange, sb.toByteArray());
229241
} catch (IOException e) {
230242
error.error(exchange, e);
231243
}
@@ -269,12 +281,16 @@ public void receivePartialBytes(final PartialBytesCallback callback, final Error
269281
}
270282
int s;
271283
try (PooledByteBuffer pooled = exchange.getConnection().getByteBufferPool().getArrayBackedPool().allocate()) {
272-
while ((s = inputStream.read(pooled.getBuffer().array(), pooled.getBuffer().arrayOffset(), pooled.getBuffer().remaining())) > 0) {
273-
byte[] newData = new byte[s];
274-
System.arraycopy(pooled.getBuffer().array(), pooled.getBuffer().arrayOffset(), newData, 0, s);
275-
callback.handle(exchange, newData, false);
284+
if (pooled != null) {
285+
while ((s = inputStream.read(pooled.getBuffer().array(), pooled.getBuffer().arrayOffset(), pooled.getBuffer().remaining())) > 0) {
286+
byte[] newData = new byte[s];
287+
System.arraycopy(pooled.getBuffer().array(), pooled.getBuffer().arrayOffset(), newData, 0, s);
288+
callback.handle(exchange, newData, false);
289+
}
290+
callback.handle(exchange, EMPTY_BYTE_ARRAY, true);
291+
} else {
292+
throw UndertowMessages.MESSAGES.failedToAllocateResource();
276293
}
277-
callback.handle(exchange, EMPTY_BYTE_ARRAY, true);
278294
} catch (IOException e) {
279295
error.error(exchange, e);
280296
}

core/src/main/java/io/undertow/io/BlockingSenderImpl.java

Lines changed: 32 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -196,23 +196,26 @@ private void performTransfer(FileChannel source, IoCallback callback) {
196196
}
197197
} else {
198198
try (PooledByteBuffer pooled = exchange.getConnection().getByteBufferPool().getArrayBackedPool().allocate()){
199-
ByteBuffer buffer = pooled.getBuffer();
200-
long pos = source.position();
201-
long size = source.size();
202-
while (size - pos > 0) {
203-
int ret = source.read(buffer);
204-
if (ret <= 0) {
205-
break;
199+
if(pooled != null) {
200+
ByteBuffer buffer = pooled.getBuffer();
201+
long pos = source.position();
202+
long size = source.size();
203+
while (size - pos > 0) {
204+
int ret = source.read(buffer);
205+
if (ret <= 0) {
206+
break;
207+
}
208+
pos += ret;
209+
outputStream.write(buffer.array(), buffer.arrayOffset(), ret);
210+
buffer.clear();
206211
}
207-
pos += ret;
208-
outputStream.write(buffer.array(), buffer.arrayOffset(), ret);
209-
buffer.clear();
210-
}
211212

212-
if (pos != size) {
213-
throw new EOFException("Unexpected EOF reading file");
213+
if (pos != size) {
214+
throw new EOFException("Unexpected EOF reading file");
215+
}
216+
} else {
217+
throw UndertowMessages.MESSAGES.failedToAllocateResource();
214218
}
215-
216219
} catch (IOException e) {
217220
callback.onException(exchange, this, e);
218221
}
@@ -259,16 +262,23 @@ private boolean writeBuffer(final ByteBuffer[] buffers, final IoCallback callbac
259262
}
260263
} else {
261264
try (PooledByteBuffer pooled = exchange.getConnection().getByteBufferPool().getArrayBackedPool().allocate()) {
262-
while (buffer.hasRemaining()) {
263-
int toRead = Math.min(buffer.remaining(), pooled.getBuffer().remaining());
264-
buffer.get(pooled.getBuffer().array(), pooled.getBuffer().arrayOffset(), toRead);
265-
try {
266-
outputStream.write(pooled.getBuffer().array(), pooled.getBuffer().arrayOffset(), toRead);
267-
} catch (IOException e) {
268-
callback.onException(exchange, this, e);
269-
return false;
265+
if(pooled != null) {
266+
while (buffer.hasRemaining()) {
267+
int toRead = Math.min(buffer.remaining(), pooled.getBuffer().remaining());
268+
buffer.get(pooled.getBuffer().array(), pooled.getBuffer().arrayOffset(), toRead);
269+
try {
270+
outputStream.write(pooled.getBuffer().array(), pooled.getBuffer().arrayOffset(), toRead);
271+
} catch (IOException e) {
272+
callback.onException(exchange, this, e);
273+
return false;
274+
}
270275
}
276+
} else {
277+
throw UndertowMessages.MESSAGES.failedToAllocateResource();
271278
}
279+
} catch (IOException e) {
280+
callback.onException(exchange, this, e);
281+
return false;
272282
}
273283
}
274284
}

core/src/main/java/io/undertow/security/impl/SingleSignOnAuthenticationMechanism.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
package io.undertow.security.impl;
2020

21+
import io.undertow.UndertowLogger;
2122
import io.undertow.security.api.AuthenticationMechanism;
2223
import io.undertow.security.api.NotificationReceiver;
2324
import io.undertow.security.api.SecurityContext;
@@ -120,6 +121,8 @@ public void handleNotification(SecurityNotification notification) {
120121
});
121122
log.tracef("Authenticated account %s using SSO", verified.getPrincipal().getName());
122123
return AuthenticationMechanismOutcome.AUTHENTICATED;
124+
} else {
125+
123126
}
124127
}
125128
clearSsoCookie(exchange);
@@ -168,9 +171,13 @@ public StreamSinkConduit wrap(ConduitFactory<StreamSinkConduit> factory, HttpSer
168171
Account account = sc.getAuthenticatedAccount();
169172
if (account != null) {
170173
try (SingleSignOn sso = singleSignOnManager.createSingleSignOn(account, sc.getMechanismName())) {
171-
Session session = getSession(exchange);
172-
registerSessionIfRequired(sso, session);
173-
exchange.setResponseCookie(new CookieImpl(cookieName, sso.getId()).setHttpOnly(httpOnly).setSecure(secure).setDomain(domain).setPath(path));
174+
final Session session = getSession(exchange);
175+
if(sso != null) {
176+
registerSessionIfRequired(sso, session);
177+
exchange.setResponseCookie(new CookieImpl(cookieName, sso.getId()).setHttpOnly(httpOnly).setSecure(secure).setDomain(domain).setPath(path));
178+
} else {
179+
UndertowLogger.SECURITY_LOGGER.failedToCreateSSOForSession(SSO_SESSION_ATTRIBUTE);
180+
}
174181
}
175182
}
176183
return factory.create();

core/src/main/java/io/undertow/server/handlers/form/MultiPartParserDefinition.java

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -220,22 +220,26 @@ public FormData parseBlocking() throws IOException {
220220
throw new IOException(UndertowMessages.MESSAGES.requestChannelAlreadyProvided());
221221
}
222222
try (PooledByteBuffer pooled = exchange.getConnection().getByteBufferPool().getArrayBackedPool().allocate()){
223-
ByteBuffer buf = pooled.getBuffer();
224-
while (true) {
225-
buf.clear();
226-
int c = inputStream.read(buf.array(), buf.arrayOffset(), buf.remaining());
227-
if (c == -1) {
228-
if (parser.isComplete()) {
229-
break;
230-
} else {
231-
throw UndertowMessages.MESSAGES.connectionTerminatedReadingMultiPartData();
223+
if(pooled != null) {
224+
ByteBuffer buf = pooled.getBuffer();
225+
while (true) {
226+
buf.clear();
227+
int c = inputStream.read(buf.array(), buf.arrayOffset(), buf.remaining());
228+
if (c == -1) {
229+
if (parser.isComplete()) {
230+
break;
231+
} else {
232+
throw UndertowMessages.MESSAGES.connectionTerminatedReadingMultiPartData();
233+
}
234+
} else if (c != 0) {
235+
buf.limit(c);
236+
parser.parse(buf);
232237
}
233-
} else if (c != 0) {
234-
buf.limit(c);
235-
parser.parse(buf);
236238
}
239+
exchange.putAttachment(FORM_DATA, data);
240+
} else {
241+
throw UndertowMessages.MESSAGES.failedToAllocateResource();
237242
}
238-
exchange.putAttachment(FORM_DATA, data);
239243
} catch (MalformedMessageException e) {
240244
throw new IOException(e);
241245
}

core/src/main/java/io/undertow/server/handlers/resource/PathResource.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,12 @@ public boolean isDirectory() {
9393
public List<Resource> list() {
9494
final List<Resource> resources = new ArrayList<>();
9595
try (DirectoryStream<Path> stream = Files.newDirectoryStream(file)) {
96-
for (Path child : stream) {
97-
resources.add(new PathResource(child, manager, path + file.getFileSystem().getSeparator() + child.getFileName().toString()));
96+
if(stream != null) {
97+
for (Path child : stream) {
98+
resources.add(new PathResource(child, manager, path + file.getFileSystem().getSeparator() + child.getFileName().toString()));
99+
}
100+
} else {
101+
UndertowLogger.ROOT_LOGGER.failedToListPathsForFile(file);
98102
}
99103
} catch (IOException e) {
100104
throw new RuntimeException(e);

core/src/main/java/io/undertow/server/handlers/resource/URLResource.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,10 +150,16 @@ public List<Resource> list() {
150150
try {
151151
if (file != null) {
152152
try (DirectoryStream<Path> stream = Files.newDirectoryStream(file)) {
153-
for (Path child : stream) {
154-
result.add(new URLResource(child.toUri().toURL(), child.toString()));
153+
if (stream != null) {
154+
for (Path child : stream) {
155+
result.add(new URLResource(child.toUri().toURL(), child.toString()));
156+
}
157+
} else {
158+
UndertowLogger.ROOT_LOGGER.failedToListPathsForFile(file);
155159
}
156160
}
161+
} else {
162+
UndertowLogger.ROOT_LOGGER.noSourceToListResourcesFrom();
157163
}
158164
} catch (IOException e) {
159165
throw new RuntimeException(e);

core/src/main/java/io/undertow/server/protocol/proxy/ProxyProtocolReadListener.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ public void handleEvent(StreamSourceChannel streamSourceChannel) {
103103
} catch (IOException e) {
104104
UndertowLogger.REQUEST_IO_LOGGER.ioException(e);
105105
IoUtils.safeClose(streamConnection);
106-
} catch (Exception e) {
106+
} catch (Throwable e) {
107107
UndertowLogger.REQUEST_IO_LOGGER.ioException(new IOException(e));
108108
IoUtils.safeClose(streamConnection);
109109
} finally {
@@ -115,7 +115,7 @@ public void handleEvent(StreamSourceChannel streamSourceChannel) {
115115

116116

117117

118-
private void parseProxyProtocolV2(PooledByteBuffer buffer, AtomicBoolean freeBuffer) throws Exception {
118+
private void parseProxyProtocolV2(PooledByteBuffer buffer, AtomicBoolean freeBuffer) throws IOException {
119119
while (byteCount < SIG.length) {
120120
byte c = buffer.getBuffer().get();
121121

@@ -222,7 +222,7 @@ private void parseProxyProtocolV2(PooledByteBuffer buffer, AtomicBoolean freeBuf
222222
return;
223223
}
224224

225-
private void parseProxyProtocolV1(PooledByteBuffer buffer, AtomicBoolean freeBuffer) throws Exception {
225+
private void parseProxyProtocolV1(PooledByteBuffer buffer, AtomicBoolean freeBuffer) throws IOException {
226226
while (buffer.getBuffer().hasRemaining()) {
227227
char c = (char) buffer.getBuffer().get();
228228
if (byteCount < NAME.length) {

0 commit comments

Comments
 (0)