Skip to content

Commit 4a8fde5

Browse files
Make sure the ByteBuf is released on Exception
1 parent a856917 commit 4a8fde5

File tree

1 file changed

+53
-24
lines changed

1 file changed

+53
-24
lines changed

vertx/src/main/java/io/undertow/vertx/VertxHttpExchange.java

Lines changed: 53 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -423,6 +423,7 @@ public void writeBlocking0(ByteBuf data, boolean last) throws IOException {
423423
if (last && data == null) {
424424
return;
425425
}
426+
data.release();
426427
throw new IOException("Response already complete");
427428
}
428429
if (last && data == null) {
@@ -438,15 +439,22 @@ public void writeBlocking0(ByteBuf data, boolean last) throws IOException {
438439
//do all this in the same lock
439440
synchronized (request.connection()) {
440441
awaitWriteable();
441-
if (last) {
442-
responseDone = true;
443-
if (upgradeHandler == null) {
444-
request.response().end(createBuffer(data));
442+
try {
443+
if (last) {
444+
responseDone = true;
445+
if (upgradeHandler == null) {
446+
request.response().end(createBuffer(data));
447+
} else {
448+
request.response().end(createBuffer(data), upgradeHandler);
449+
}
445450
} else {
446-
request.response().end(createBuffer(data), upgradeHandler);
451+
request.response().write(createBuffer(data));
447452
}
448-
} else {
449-
request.response().write(createBuffer(data));
453+
} catch (Exception e) {
454+
if (data != null) {
455+
data.release();
456+
}
457+
throw new IOException("Failed to write", e);
450458
}
451459
}
452460
} finally {
@@ -499,6 +507,9 @@ public <T> void writeAsync0(ByteBuf data, boolean last, IoCallback<T> callback,
499507
response.headers().add(HttpHeaderNames.CONNECTION, "close");
500508
}
501509
if (responseDone) {
510+
if (data != null) {
511+
data.release();
512+
}
502513
if (callback != null) {
503514
if (last && data == null) {
504515
callback.onComplete(this, context);
@@ -523,32 +534,50 @@ public <T> void writeAsync0(ByteBuf data, boolean last, IoCallback<T> callback,
523534
request.response().drainHandler(new Handler<Void>() {
524535
@Override
525536
public void handle(Void event) {
526-
if (last) {
527-
responseDone = true;
528-
if (upgradeHandler == null) {
529-
request.response().end(createBuffer(data));
537+
try {
538+
if (last) {
539+
responseDone = true;
540+
if (upgradeHandler == null) {
541+
request.response().end(createBuffer(data));
542+
} else {
543+
request.response().end(createBuffer(data), upgradeHandler);
544+
}
530545
} else {
531-
request.response().end(createBuffer(data), upgradeHandler);
546+
request.response().write(createBuffer(data));
547+
}
548+
queueWriteListener(callback, context, last);
549+
request.response().drainHandler(null);
550+
} catch (Exception e) {
551+
if (data != null) {
552+
data.release();
553+
}
554+
if (callback != null) {
555+
callback.onException(VertxHttpExchange.this, context, new IOException("Write failed", e));
532556
}
533-
} else {
534-
request.response().write(createBuffer(data));
535557
}
536-
queueWriteListener(callback, context, last);
537-
request.response().drainHandler(null);
538558
}
539559
});
540560
} else {
541-
if (last) {
542-
responseDone = true;
543-
if (upgradeHandler == null) {
544-
request.response().end(createBuffer(data));
561+
try {
562+
if (last) {
563+
responseDone = true;
564+
if (upgradeHandler == null) {
565+
request.response().end(createBuffer(data));
566+
} else {
567+
request.response().end(createBuffer(data), upgradeHandler);
568+
}
545569
} else {
546-
request.response().end(createBuffer(data), upgradeHandler);
570+
request.response().write(createBuffer(data));
571+
}
572+
queueWriteListener(callback, context, last);
573+
} catch (Exception e) {
574+
if (data != null) {
575+
data.release();
576+
}
577+
if (callback != null) {
578+
callback.onException(VertxHttpExchange.this, context, new IOException("Write failed", e));
547579
}
548-
} else {
549-
request.response().write(createBuffer(data));
550580
}
551-
queueWriteListener(callback, context, last);
552581
}
553582
}
554583

0 commit comments

Comments
 (0)