Skip to content

Commit 9b80017

Browse files
committed
Merge remote-tracking branch 'upstream/master' into index-lifecycle
2 parents 67bfdb1 + f55843c commit 9b80017

File tree

4 files changed

+93
-25
lines changed

4 files changed

+93
-25
lines changed

buildSrc/src/main/groovy/org/elasticsearch/gradle/doc/RestTestsFromSnippetsTask.groovy

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,11 @@ public class RestTestsFromSnippetsTask extends SnippetsTask {
197197
previousTest = snippet
198198
return
199199
}
200+
if (snippet.testTearDown) {
201+
testTearDown(snippet)
202+
previousTest = snippet
203+
return
204+
}
200205
if (snippet.testResponse) {
201206
response(snippet)
202207
return
@@ -223,6 +228,10 @@ public class RestTestsFromSnippetsTask extends SnippetsTask {
223228
throw new InvalidUserDataException("// TEST[continued] " +
224229
"cannot immediately follow // TESTSETUP: $test")
225230
}
231+
if (previousTest != null && previousTest.testTearDown) {
232+
throw new InvalidUserDataException("// TEST[continued] " +
233+
"cannot immediately follow // TEARDOWN: $test")
234+
}
226235
} else {
227236
current.println('---')
228237
current.println("\"line_$test.start\":")
@@ -355,6 +364,16 @@ public class RestTestsFromSnippetsTask extends SnippetsTask {
355364
body(snippet, true)
356365
}
357366

367+
private void testTearDown(Snippet snippet) {
368+
if (previousTest.testSetup == false && lastDocsPath == snippet.path) {
369+
throw new InvalidUserDataException("$snippet must follow test setup or be first")
370+
}
371+
setupCurrent(snippet)
372+
current.println('---')
373+
current.println('teardown:')
374+
body(snippet, true)
375+
}
376+
358377
private void body(Snippet snippet, boolean inSetup) {
359378
parse("$snippet", snippet.contents, SYNTAX) { matcher, last ->
360379
if (matcher.group("comment") != null) {

buildSrc/src/main/groovy/org/elasticsearch/gradle/doc/SnippetsTask.groovy

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,10 @@ public class SnippetsTask extends DefaultTask {
273273
snippet.testSetup = true
274274
return
275275
}
276+
if (line ==~ /\/\/\s*TEARDOWN\s*/) {
277+
snippet.testTearDown = true
278+
return
279+
}
276280
if (snippet == null) {
277281
// Outside
278282
return
@@ -317,6 +321,7 @@ public class SnippetsTask extends DefaultTask {
317321
boolean test = false
318322
boolean testResponse = false
319323
boolean testSetup = false
324+
boolean testTearDown = false
320325
String skip = null
321326
boolean continued = false
322327
String language = null

x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/transport/nio/SSLDriver.java

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,7 @@ private class HandshakeMode implements Mode {
327327
private void startHandshake() throws SSLException {
328328
handshakeStatus = engine.getHandshakeStatus();
329329
if (handshakeStatus != SSLEngineResult.HandshakeStatus.NEED_UNWRAP &&
330-
handshakeStatus != SSLEngineResult.HandshakeStatus.NEED_WRAP) {
330+
handshakeStatus != SSLEngineResult.HandshakeStatus.NEED_WRAP) {
331331
try {
332332
handshake();
333333
} catch (SSLException e) {
@@ -403,8 +403,8 @@ public int write(ByteBuffer[] buffers) throws SSLException {
403403
@Override
404404
public boolean needsNonApplicationWrite() {
405405
return handshakeStatus == SSLEngineResult.HandshakeStatus.NEED_WRAP
406-
|| handshakeStatus == SSLEngineResult.HandshakeStatus.NOT_HANDSHAKING
407-
|| handshakeStatus == SSLEngineResult.HandshakeStatus.FINISHED;
406+
|| handshakeStatus == SSLEngineResult.HandshakeStatus.NOT_HANDSHAKING
407+
|| handshakeStatus == SSLEngineResult.HandshakeStatus.FINISHED;
408408
}
409409

410410
@Override
@@ -465,7 +465,7 @@ public void read(InboundChannelBuffer buffer) throws SSLException {
465465
networkReadBuffer.flip();
466466
SSLEngineResult result = unwrap(buffer);
467467
boolean renegotiationRequested = result.getStatus() != SSLEngineResult.Status.CLOSED
468-
&& maybeRenegotiation(result.getHandshakeStatus());
468+
&& maybeRenegotiation(result.getHandshakeStatus());
469469
continueUnwrap = result.bytesProduced() > 0 && renegotiationRequested == false;
470470
}
471471
}
@@ -533,17 +533,24 @@ private CloseMode(boolean isHandshaking) {
533533
} else {
534534
engine.closeOutbound();
535535
}
536-
537536
}
538537

539538
@Override
540539
public void read(InboundChannelBuffer buffer) throws SSLException {
540+
if (needToReceiveClose == false) {
541+
// There is an issue where receiving handshake messages after initiating the close process
542+
// can place the SSLEngine back into handshaking mode. In order to handle this, if we
543+
// initiate close during a handshake we do not wait to receive close. As we do not need to
544+
// receive close, we will not handle reads.
545+
return;
546+
}
547+
541548
ensureApplicationBufferSize(buffer);
542549
boolean continueUnwrap = true;
543550
while (continueUnwrap && networkReadBuffer.position() > 0) {
544551
networkReadBuffer.flip();
545552
SSLEngineResult result = unwrap(buffer);
546-
continueUnwrap = result.bytesProduced() > 0;
553+
continueUnwrap = result.bytesProduced() > 0 || result.bytesConsumed() > 0;
547554
}
548555
if (engine.isInboundDone()) {
549556
needToReceiveClose = false;
@@ -598,7 +605,7 @@ private void closeInboundAndSwallowPeerDidNotCloseException() throws SSLExceptio
598605
try {
599606
engine.closeInbound();
600607
} catch (SSLException e) {
601-
if (e.getMessage().startsWith("Inbound closed before receiving peer's close_notify") == false) {
608+
if (e.getMessage().contains("before receiving peer's close_notify") == false) {
602609
throw e;
603610
}
604611
}

x-pack/plugin/security/src/test/java/org/elasticsearch/xpack/security/transport/nio/SSLDriverTests.java

Lines changed: 55 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import java.security.SecureRandom;
2424
import java.util.Arrays;
2525
import java.util.Collections;
26+
import java.util.List;
2627
import java.util.function.Supplier;
2728

2829
public class SSLDriverTests extends ESTestCase {
@@ -96,7 +97,7 @@ public void testRenegotiate() throws Exception {
9697
normalClose(clientDriver, serverDriver);
9798
}
9899

99-
public void testBigAppData() throws Exception {
100+
public void testBigApplicationData() throws Exception {
100101
SSLContext sslContext = getSSLContext();
101102

102103
SSLDriver clientDriver = getDriver(sslContext.createSSLEngine(), true);
@@ -124,8 +125,6 @@ public void testBigAppData() throws Exception {
124125
}
125126

126127
public void testHandshakeFailureBecauseProtocolMismatch() throws Exception {
127-
// See https://github.com/elastic/elasticsearch/issues/33751
128-
assumeTrue("test fails on JDK 11 >= ea28 currently", JavaVersion.current().compareTo(JavaVersion.parse("11")) < 0);
129128
SSLContext sslContext = getSSLContext();
130129
SSLEngine clientEngine = sslContext.createSSLEngine();
131130
SSLEngine serverEngine = sslContext.createSSLEngine();
@@ -138,7 +137,7 @@ public void testHandshakeFailureBecauseProtocolMismatch() throws Exception {
138137

139138
SSLException sslException = expectThrows(SSLException.class, () -> handshake(clientDriver, serverDriver));
140139
String oldExpected = "Client requested protocol TLSv1.1 not enabled or not supported";
141-
String jdk11Expected = "Received fatal alert: protocol_version";
140+
String jdk11Expected = "The client supported protocol versions [TLSv1.1] are not accepted by server preferences [TLS12]";
142141
boolean expectedMessage = oldExpected.equals(sslException.getMessage()) || jdk11Expected.equals(sslException.getMessage());
143142
assertTrue("Unexpected exception message: " + sslException.getMessage(), expectedMessage);
144143

@@ -148,7 +147,8 @@ public void testHandshakeFailureBecauseProtocolMismatch() throws Exception {
148147
}
149148
// Prior to JDK11 we still need to send a close alert
150149
if (serverDriver.isClosed() == false) {
151-
failedCloseAlert(serverDriver, clientDriver);
150+
failedCloseAlert(serverDriver, clientDriver, Arrays.asList("Received fatal alert: protocol_version",
151+
"Received fatal alert: handshake_failure"));
152152
}
153153
}
154154

@@ -172,12 +172,14 @@ public void testHandshakeFailureBecauseNoCiphers() throws Exception {
172172
}
173173
// Prior to JDK11 we still need to send a close alert
174174
if (serverDriver.isClosed() == false) {
175-
failedCloseAlert(serverDriver, clientDriver);
175+
List<String> messages = Arrays.asList("Received fatal alert: handshake_failure",
176+
"Received close_notify during handshake");
177+
failedCloseAlert(serverDriver, clientDriver, messages);
176178
}
177179
}
178180

179-
@AwaitsFix(bugUrl = "https://github.com/elastic/elasticsearch/issues/32144")
180-
public void testCloseDuringHandshake() throws Exception {
181+
public void testCloseDuringHandshakeJDK11() throws Exception {
182+
assumeTrue("this tests ssl engine for JDK11", JavaVersion.current().compareTo(JavaVersion.parse("11")) >= 0);
181183
SSLContext sslContext = getSSLContext();
182184
SSLDriver clientDriver = getDriver(sslContext.createSSLEngine(), true);
183185
SSLDriver serverDriver = getDriver(sslContext.createSSLEngine(), false);
@@ -199,30 +201,66 @@ public void testCloseDuringHandshake() throws Exception {
199201
serverDriver.initiateClose();
200202
assertTrue(serverDriver.needsNonApplicationWrite());
201203
assertFalse(serverDriver.isClosed());
202-
sendNeededWrites(serverDriver, clientDriver);
204+
sendNonApplicationWrites(serverDriver, clientDriver);
203205
// We are immediately fully closed due to SSLEngine inconsistency
204206
assertTrue(serverDriver.isClosed());
205207
// This should not throw exception yet as the SSLEngine will not UNWRAP data while attempting to WRAP
206208
clientDriver.read(clientBuffer);
207-
sendNeededWrites(clientDriver, serverDriver);
209+
sendNonApplicationWrites(clientDriver, serverDriver);
210+
clientDriver.read(clientBuffer);
211+
sendNonApplicationWrites(clientDriver, serverDriver);
212+
serverDriver.read(serverBuffer);
213+
assertTrue(clientDriver.isClosed());
214+
}
215+
216+
public void testCloseDuringHandshakePreJDK11() throws Exception {
217+
assumeTrue("this tests ssl engine for pre-JDK11", JavaVersion.current().compareTo(JavaVersion.parse("11")) < 0);
218+
SSLContext sslContext = getSSLContext();
219+
SSLDriver clientDriver = getDriver(sslContext.createSSLEngine(), true);
220+
SSLDriver serverDriver = getDriver(sslContext.createSSLEngine(), false);
221+
222+
clientDriver.init();
223+
serverDriver.init();
224+
225+
assertTrue(clientDriver.needsNonApplicationWrite());
226+
assertFalse(serverDriver.needsNonApplicationWrite());
227+
sendHandshakeMessages(clientDriver, serverDriver);
228+
sendHandshakeMessages(serverDriver, clientDriver);
229+
230+
sendData(clientDriver, serverDriver);
231+
232+
assertTrue(clientDriver.isHandshaking());
233+
assertTrue(serverDriver.isHandshaking());
234+
235+
assertFalse(serverDriver.needsNonApplicationWrite());
236+
serverDriver.initiateClose();
237+
assertTrue(serverDriver.needsNonApplicationWrite());
238+
assertFalse(serverDriver.isClosed());
239+
sendNonApplicationWrites(serverDriver, clientDriver);
240+
// We are immediately fully closed due to SSLEngine inconsistency
241+
assertTrue(serverDriver.isClosed());
242+
// This should not throw exception yet as the SSLEngine will not UNWRAP data while attempting to WRAP
243+
clientDriver.read(clientBuffer);
244+
sendNonApplicationWrites(clientDriver, serverDriver);
208245
SSLException sslException = expectThrows(SSLException.class, () -> clientDriver.read(clientBuffer));
209246
assertEquals("Received close_notify during handshake", sslException.getMessage());
210247
assertTrue(clientDriver.needsNonApplicationWrite());
211-
sendNeededWrites(clientDriver, serverDriver);
248+
sendNonApplicationWrites(clientDriver, serverDriver);
212249
serverDriver.read(serverBuffer);
213250
assertTrue(clientDriver.isClosed());
214251
}
215252

216-
private void failedCloseAlert(SSLDriver sendDriver, SSLDriver receiveDriver) throws SSLException {
253+
private void failedCloseAlert(SSLDriver sendDriver, SSLDriver receiveDriver, List<String> messages) throws SSLException {
217254
assertTrue(sendDriver.needsNonApplicationWrite());
218255
assertFalse(sendDriver.isClosed());
219256

220-
sendNeededWrites(sendDriver, receiveDriver);
257+
sendNonApplicationWrites(sendDriver, receiveDriver);
221258
assertTrue(sendDriver.isClosed());
222259
sendDriver.close();
223260

224261
SSLException sslException = expectThrows(SSLException.class, () -> receiveDriver.read(genericBuffer));
225-
assertEquals("Received fatal alert: handshake_failure", sslException.getMessage());
262+
assertTrue("Expected one of the following exception messages: " + messages + ". Found: " + sslException.getMessage(),
263+
messages.stream().anyMatch(m -> sslException.getMessage().equals(m)));
226264
if (receiveDriver.needsNonApplicationWrite() == false) {
227265
assertTrue(receiveDriver.isClosed());
228266
receiveDriver.close();
@@ -249,15 +287,15 @@ private void normalClose(SSLDriver sendDriver, SSLDriver receiveDriver) throws I
249287
sendDriver.initiateClose();
250288
assertFalse(sendDriver.readyForApplicationWrites());
251289
assertTrue(sendDriver.needsNonApplicationWrite());
252-
sendNeededWrites(sendDriver, receiveDriver);
290+
sendNonApplicationWrites(sendDriver, receiveDriver);
253291
assertFalse(sendDriver.isClosed());
254292

255293
receiveDriver.read(genericBuffer);
256294
assertFalse(receiveDriver.isClosed());
257295

258296
assertFalse(receiveDriver.readyForApplicationWrites());
259297
assertTrue(receiveDriver.needsNonApplicationWrite());
260-
sendNeededWrites(receiveDriver, sendDriver);
298+
sendNonApplicationWrites(receiveDriver, sendDriver);
261299
assertTrue(receiveDriver.isClosed());
262300

263301
sendDriver.read(genericBuffer);
@@ -267,7 +305,7 @@ private void normalClose(SSLDriver sendDriver, SSLDriver receiveDriver) throws I
267305
receiveDriver.close();
268306
}
269307

270-
private void sendNeededWrites(SSLDriver sendDriver, SSLDriver receiveDriver) throws SSLException {
308+
private void sendNonApplicationWrites(SSLDriver sendDriver, SSLDriver receiveDriver) throws SSLException {
271309
while (sendDriver.needsNonApplicationWrite() || sendDriver.hasFlushPending()) {
272310
if (sendDriver.hasFlushPending() == false) {
273311
sendDriver.nonApplicationWrite();
@@ -315,7 +353,6 @@ private void sendHandshakeMessages(SSLDriver sendDriver, SSLDriver receiveDriver
315353
assertTrue(sendDriver.needsNonApplicationWrite() || sendDriver.hasFlushPending());
316354

317355
while (sendDriver.needsNonApplicationWrite() || sendDriver.hasFlushPending()) {
318-
assertFalse(receiveDriver.needsNonApplicationWrite());
319356
if (sendDriver.hasFlushPending() == false) {
320357
sendDriver.nonApplicationWrite();
321358
}

0 commit comments

Comments
 (0)