From f7ef52616aa29255561c0640bdc0d1d4b62e0a1f Mon Sep 17 00:00:00 2001 From: asiva Date: Wed, 6 Sep 2023 18:39:14 +0000 Subject: [PATCH] [IO] - Use try/catch in lookupAddresses instead of Future error. Applying patch from @aam for using try/catch in lookupAddresses instead of Future error. This will be cherry picked into the stable branch to ensure we address the expedient issue in https://github.com/dart-lang/sdk/issues/53334 TEST=new test added. Change-Id: Ia5375cbd118d8d6437cf6869383f173cab48aa3f Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/323684 Commit-Queue: Siva Annamalai Reviewed-by: Alexander Aprelev --- .../break_on_unhandled_exception_test.dart | 68 +++++++++++++++++++ sdk/lib/_internal/vm/bin/socket_patch.dart | 10 +-- 2 files changed, 74 insertions(+), 4 deletions(-) create mode 100644 pkg/vm_service/test/break_on_unhandled_exception_test.dart diff --git a/pkg/vm_service/test/break_on_unhandled_exception_test.dart b/pkg/vm_service/test/break_on_unhandled_exception_test.dart new file mode 100644 index 00000000000..23663d3c5a5 --- /dev/null +++ b/pkg/vm_service/test/break_on_unhandled_exception_test.dart @@ -0,0 +1,68 @@ +// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. +// VMOptions=--verbose_debug + +// Test checks to make sure we don't encounter any unhandled exceptions +// in the URL lookup code. +// (please see https://github.com/dart-lang/sdk/issues/53334 for more details). + +import 'dart:developer'; +import 'dart:io'; + +import 'package:expect/expect.dart'; + +import 'common/service_test_common.dart'; +import 'common/test_helper.dart'; + +// AUTOGENERATED START +// +// Update these constants by running: +// +// dart runtime/observatory/tests/service/update_line_numbers.dart +// +const int LINE_0 = 46; +// AUTOGENERATED END +const String file = "break_on_unhandled_exception_test.dart"; + +Future testFunction() async { + try { + var client = new HttpClient(); + final urlstr = 'https://www.bbc.co.uk/'; + final uri = Uri.parse(urlstr); + var response = await client.getUrl(uri); + Expect.equals(urlstr, response.uri.toString()); + return 0; + } catch (e) { + print(e.toString()); + return 1; + } +} + +void testMain() async { + debugger(); + final ret = await testFunction(); + Expect.equals(ret, 0); + print("Done"); // LINE_0 +} + +final tests = [ + hasStoppedAtBreakpoint, + + // Add breakpoint + setBreakpointAtUriAndLine(file, LINE_0), + + resumeIsolate, + + hasStoppedAtBreakpoint, + stoppedAtLine(LINE_0), + resumeIsolate, +]; + +void main(args) => runIsolateTests( + args, + tests, + 'break_on_unhandled_exception_test.dart', + pause_on_unhandled_exceptions: true, + testeeConcurrent: testMain, + ); diff --git a/sdk/lib/_internal/vm/bin/socket_patch.dart b/sdk/lib/_internal/vm/bin/socket_patch.dart index 84901439f65..2b98e7631f0 100644 --- a/sdk/lib/_internal/vm/bin/socket_patch.dart +++ b/sdk/lib/_internal/vm/bin/socket_patch.dart @@ -627,8 +627,10 @@ base class _NativeSocket extends _NativeSocketNativeWrapper // Only report an error if no address lookups were sucessful. var anySuccess = false; - void lookupAddresses(InternetAddressType type, Completer done) { - lookup(host, type: type).then((addresses) { + void lookupAddresses( + InternetAddressType type, Completer done) async { + try { + final addresses = await lookup(host, type: type); anySuccess = true; if (done.isCompleted) { // By the time lookup is done, [connectNext] might have @@ -637,14 +639,14 @@ base class _NativeSocket extends _NativeSocketNativeWrapper } controller.add(addresses); done.complete(); - }, onError: (e, st) { + } catch (e, st) { if (done.isCompleted) { // By the time lookup is done, [connectNext] might have // been able to connect to one of the resolved addresses. return; } done.completeError(e, st); - }); + } } const concurrentLookupDelay = Duration(milliseconds: 10);