Version in base suite: 91.13.0esr-1~deb11u1 Version in overlay suite: 102.6.0esr-1~deb11u1 Base version: firefox-esr_102.6.0esr-1~deb11u1 Target version: firefox-esr_102.7.0esr-1~deb11u1 Base file: /srv/ftp-master.debian.org/ftp/pool/main/f/firefox-esr/firefox-esr_102.6.0esr-1~deb11u1.dsc Target file: /srv/ftp-master.debian.org/policy/pool/main/f/firefox-esr/firefox-esr_102.7.0esr-1~deb11u1.dsc .taskcluster.yml | 2 CLOBBER | 2 browser/actors/DOMFullscreenParent.jsm | 6 browser/components/enterprisepolicies/Policies.jsm | 21 browser/components/enterprisepolicies/schemas/policies-schema.json | 3 browser/components/enterprisepolicies/tests/browser/browser_policy_display_bookmarks.js | 68 browser/components/preferences/privacy.js | 14 browser/components/search/test/unit/test_urlTelemetry.js | 12 browser/config/version.txt | 2 browser/config/version_display.txt | 2 config/milestone.txt | 2 debian/browser.mozconfig.in | 2 debian/changelog | 25 debian/control.in | 5 debian/patches/fixes/Bug-1747145-Add-more-configure-checks-for-the-wasm-t.patch | 127 debian/patches/fixes/Bug-1769631-Remove-U-from-mode-parameters-for-variou.patch | 129 debian/patches/fixes/Bug-1799982-Remove-uses-of-inline-flags-from-XPIDL-r.patch | 51 debian/patches/fixes/Bug-1810627-Allow-to-build-without-a-wasi-sysroot.-r.patch | 53 debian/patches/series | 4 devtools/client/netmonitor/test/browser_net_curl-utils.js | 19 devtools/client/shared/components/reps/reps/rep-utils.js | 30 devtools/client/shared/curl.js | 75 devtools/client/webconsole/test/browser/browser_webconsole_stubs_console_api.js | 2 devtools/client/webconsole/test/node/fixtures/stubs/consoleApi.js | 54 dom/base/ContentAreaDropListener.jsm | 25 dom/base/Document.cpp | 12 dom/base/Navigator.cpp | 14 dom/base/Navigator.h | 4 dom/base/nsGlobalWindowInner.cpp | 2 dom/base/test/chrome.ini | 2 dom/base/test/file_serializer_noscript.html | 1 dom/base/test/test_serializer_noscript.html | 38 dom/events/DataTransfer.cpp | 12 dom/events/DataTransfer.h | 3 dom/l10n/DocumentL10n.cpp | 14 dom/locks/LockManager.h | 2 dom/locks/LockManagerChild.cpp | 7 dom/locks/LockManagerChild.h | 23 dom/locks/LockRequestChild.h | 8 dom/media/webrtc/libwebrtcglue/VideoConduit.cpp | 9 dom/media/webrtc/tests/mochitests/sdpUtils.js | 10 dom/media/webrtc/tests/mochitests/test_peerConnection_basicScreenshare.html | 40 dom/performance/Performance.cpp | 223 dom/performance/Performance.h | 35 dom/performance/PerformanceMark.cpp | 7 dom/performance/PerformanceMeasure.cpp | 37 dom/performance/PerformanceMeasure.h | 12 dom/performance/tests/test_performance_user_timing_dying_global.html | 10 dom/security/test/general/test_meta_referrer.html | 4 dom/serializers/nsHTMLContentSerializer.cpp | 8 dom/tests/mochitest/chrome/MozDomFullscreen_chrome.xhtml | 28 dom/webidl/DataTransfer.webidl | 7 dom/webidl/Navigator.webidl | 4 dom/webidl/Performance.webidl | 10 dom/webidl/PerformanceMeasure.webidl | 1 dom/websocket/WebSocket.cpp | 38 gfx/layers/PersistentBufferProvider.cpp | 2 js/src/devtools/automation/autospider.py | 4 layout/style/Loader.cpp | 12 layout/style/SharedStyleSheetCache.cpp | 4 layout/style/SheetLoadData.h | 2 mozglue/build/TsanOptions.cpp | 11 netwerk/dns/effective_tld_names.dat | 5 netwerk/protocol/http/Http2Session.cpp | 9 netwerk/protocol/http/Http2Session.h | 3 netwerk/protocol/http/nsHttpChannel.cpp | 14 netwerk/sctp/datachannel/DataChannel.cpp | 52 netwerk/sctp/sctp_update.log | 1 netwerk/sctp/src/netinet/sctp.h | 10 netwerk/sctp/src/netinet/sctp_asconf.c | 225 netwerk/sctp/src/netinet/sctp_asconf.h | 4 netwerk/sctp/src/netinet/sctp_auth.c | 16 netwerk/sctp/src/netinet/sctp_auth.h | 5 netwerk/sctp/src/netinet/sctp_bsd_addr.c | 35 netwerk/sctp/src/netinet/sctp_bsd_addr.h | 3 netwerk/sctp/src/netinet/sctp_callout.c | 2 netwerk/sctp/src/netinet/sctp_callout.h | 5 netwerk/sctp/src/netinet/sctp_cc_functions.c | 95 netwerk/sctp/src/netinet/sctp_constants.h | 41 netwerk/sctp/src/netinet/sctp_crc32.c | 74 netwerk/sctp/src/netinet/sctp_crc32.h | 6 netwerk/sctp/src/netinet/sctp_header.h | 64 netwerk/sctp/src/netinet/sctp_indata.c | 291 netwerk/sctp/src/netinet/sctp_indata.h | 25 netwerk/sctp/src/netinet/sctp_input.c | 1097 - netwerk/sctp/src/netinet/sctp_input.h | 8 netwerk/sctp/src/netinet/sctp_lock_userspace.h | 10 netwerk/sctp/src/netinet/sctp_os.h | 5 netwerk/sctp/src/netinet/sctp_os_userspace.h | 27 netwerk/sctp/src/netinet/sctp_output.c | 1815 +- netwerk/sctp/src/netinet/sctp_output.h | 62 netwerk/sctp/src/netinet/sctp_pcb.c | 1051 - netwerk/sctp/src/netinet/sctp_pcb.h | 91 netwerk/sctp/src/netinet/sctp_peeloff.c | 3 netwerk/sctp/src/netinet/sctp_peeloff.h | 2 netwerk/sctp/src/netinet/sctp_process_lock.h | 212 netwerk/sctp/src/netinet/sctp_sha1.c | 18 netwerk/sctp/src/netinet/sctp_sha1.h | 4 netwerk/sctp/src/netinet/sctp_ss_functions.c | 538 netwerk/sctp/src/netinet/sctp_structs.h | 112 netwerk/sctp/src/netinet/sctp_sysctl.c | 86 netwerk/sctp/src/netinet/sctp_sysctl.h | 21 netwerk/sctp/src/netinet/sctp_timer.c | 182 netwerk/sctp/src/netinet/sctp_timer.h | 3 netwerk/sctp/src/netinet/sctp_uio.h | 13 netwerk/sctp/src/netinet/sctp_userspace.c | 63 netwerk/sctp/src/netinet/sctp_usrreq.c | 697 netwerk/sctp/src/netinet/sctp_var.h | 17 netwerk/sctp/src/netinet/sctputil.c | 658 netwerk/sctp/src/netinet/sctputil.h | 52 netwerk/sctp/src/netinet6/sctp6_usrreq.c | 104 netwerk/sctp/src/netinet6/sctp6_var.h | 4 netwerk/sctp/src/user_environment.c | 326 netwerk/sctp/src/user_environment.h | 9 netwerk/sctp/src/user_inpcb.h | 2 netwerk/sctp/src/user_ip6_var.h | 6 netwerk/sctp/src/user_ip_icmp.h | 2 netwerk/sctp/src/user_malloc.h | 2 netwerk/sctp/src/user_mbuf.c | 43 netwerk/sctp/src/user_mbuf.h | 11 netwerk/sctp/src/user_queue.h | 2 netwerk/sctp/src/user_recv_thread.c | 87 netwerk/sctp/src/user_route.h | 2 netwerk/sctp/src/user_socket.c | 76 netwerk/sctp/src/user_socketvar.h | 2 netwerk/sctp/src/usrsctp.h | 18 security/manager/ssl/StaticHPKPins.h | 10 security/manager/ssl/nsSTSPreloadList.inc | 6991 +++++++--- security/manager/tools/PreloadedHPKPins.json | 2 services/settings/dumps/blocklists/addons-bloomfilters.json | 110 services/settings/dumps/main/devtools-compatibility-browsers.json | 325 services/settings/dumps/main/search-config.json | 312 services/settings/dumps/main/search-telemetry-v2.json | 166 services/settings/dumps/security-state/intermediates.json | 794 - sourcestamp.txt | 4 taskcluster/ci/config.yml | 27 taskcluster/ci/release-flatpak-repackage/kind.yml | 2 taskcluster/ci/valgrind/kind.yml | 2 testing/web-platform/meta/resource-timing/nested-context-navigations-embed.html.ini | 2 testing/web-platform/meta/url/failure.html.ini | 1 testing/web-platform/meta/user-timing/idlharness.any.js.ini | 31 testing/web-platform/meta/user-timing/mark-measure-return-objects.any.js.ini | 20 testing/web-platform/meta/user-timing/measure-l3.any.js.ini | 21 testing/web-platform/meta/user-timing/measure-with-dict.any.js.ini | 15 testing/web-platform/meta/user-timing/measure_exception.html.ini | 7 testing/web-platform/meta/user-timing/structured-serialize-detail.any.js.ini | 26 testing/web-platform/tests/web-locks/crashtests/worker-termination.https.html | 16 toolkit/components/pdfjs/content/build/pdf.worker.js | 4 toolkit/components/printing/content/print.js | 40 toolkit/components/printing/content/printUtils.js | 65 toolkit/components/printing/tests/browser_system_dialog_subdialog_hidden.js | 2 toolkit/components/printing/tests/head.js | 15 toolkit/components/search/tests/xpcshell/searchconfigs/test_distributions.js | 40 widget/cocoa/nsPrintDialogX.mm | 9 widget/gtk/nsDragService.cpp | 13 widget/nsIPrintSettings.idl | 10 156 files changed, 11508 insertions(+), 7497 deletions(-) diff -Nru firefox-esr-102.6.0esr/.taskcluster.yml firefox-esr-102.7.0esr/.taskcluster.yml --- firefox-esr-102.6.0esr/.taskcluster.yml 2022-12-05 23:00:09.000000000 +0000 +++ firefox-esr-102.7.0esr/.taskcluster.yml 2023-01-09 17:27:35.000000000 +0000 @@ -101,7 +101,7 @@ description: 'Created by a [cron task](https://firefox-ci-tc.services.mozilla.com/tasks/${cron.task_id}) (${treeherder_link})' provisionerId: "${trustDomain}-${repository.level}" - workerType: "decision" + workerType: "decision-gcp" tags: $if: 'tasks_for == "hg-push"' diff -Nru firefox-esr-102.6.0esr/CLOBBER firefox-esr-102.7.0esr/CLOBBER --- firefox-esr-102.6.0esr/CLOBBER 2022-12-05 23:00:09.000000000 +0000 +++ firefox-esr-102.7.0esr/CLOBBER 2023-01-09 17:27:35.000000000 +0000 @@ -22,4 +22,4 @@ # changes to stick? As of bug 928195, this shouldn't be necessary! Please # don't change CLOBBER for WebIDL changes any more. -Merge day clobber 2022-11-14 \ No newline at end of file +Merge day clobber 2022-12-12 \ No newline at end of file diff -Nru firefox-esr-102.6.0esr/browser/actors/DOMFullscreenParent.jsm firefox-esr-102.7.0esr/browser/actors/DOMFullscreenParent.jsm --- firefox-esr-102.6.0esr/browser/actors/DOMFullscreenParent.jsm 2022-12-05 23:00:09.000000000 +0000 +++ firefox-esr-102.7.0esr/browser/actors/DOMFullscreenParent.jsm 2023-01-09 17:27:35.000000000 +0000 @@ -202,6 +202,12 @@ TelemetryStopwatch.start("FULLSCREEN_CHANGE_MS"); window.FullScreen.enterDomFullscreen(browser, this); this.updateFullscreenWindowReference(window); + + if (!this.hasBeenDestroyed() && this.requestOrigin) { + window.PointerlockFsWarning.showFullScreen( + this.requestOrigin.manager.documentPrincipal.originNoSuffix + ); + } break; } case "MozDOMFullscreen:Exited": { diff -Nru firefox-esr-102.6.0esr/browser/components/enterprisepolicies/Policies.jsm firefox-esr-102.7.0esr/browser/components/enterprisepolicies/Policies.jsm --- firefox-esr-102.6.0esr/browser/components/enterprisepolicies/Policies.jsm 2022-12-05 23:00:09.000000000 +0000 +++ firefox-esr-102.7.0esr/browser/components/enterprisepolicies/Policies.jsm 2023-01-09 17:27:35.000000000 +0000 @@ -853,23 +853,18 @@ DisplayBookmarksToolbar: { onBeforeUIStartup(manager, param) { - let value = (!param).toString(); + let visibility; + if (typeof param === "boolean") { + visibility = param ? "always" : "newtab"; + } else { + visibility = param; + } // This policy is meant to change the default behavior, not to force it. - // If this policy was alreay applied and the user chose to re-hide the + // If this policy was already applied and the user chose to re-hide the // bookmarks toolbar, do not show it again. - runOncePerModification("displayBookmarksToolbar", value, () => { - // Set the preference to keep the bookmarks bar open and also - // declaratively open the bookmarks toolbar. Otherwise, default - // to showing it on the New Tab Page. + runOncePerModification("displayBookmarksToolbar", visibility, () => { let visibilityPref = "browser.toolbars.bookmarks.visibility"; - let visibility = param ? "always" : "newtab"; Services.prefs.setCharPref(visibilityPref, visibility); - gXulStore.setValue( - BROWSER_DOCUMENT_URL, - "PersonalToolbar", - "collapsed", - value - ); }); }, }, diff -Nru firefox-esr-102.6.0esr/browser/components/enterprisepolicies/schemas/policies-schema.json firefox-esr-102.7.0esr/browser/components/enterprisepolicies/schemas/policies-schema.json --- firefox-esr-102.6.0esr/browser/components/enterprisepolicies/schemas/policies-schema.json 2022-12-05 23:00:14.000000000 +0000 +++ firefox-esr-102.7.0esr/browser/components/enterprisepolicies/schemas/policies-schema.json 2023-01-09 17:27:36.000000000 +0000 @@ -391,7 +391,8 @@ }, "DisplayBookmarksToolbar": { - "type": "boolean" + "type": ["boolean", "string"], + "enum": ["always", "never", "newtab"] }, "DisplayMenuBar": { diff -Nru firefox-esr-102.6.0esr/browser/components/enterprisepolicies/tests/browser/browser_policy_display_bookmarks.js firefox-esr-102.7.0esr/browser/components/enterprisepolicies/tests/browser/browser_policy_display_bookmarks.js --- firefox-esr-102.6.0esr/browser/components/enterprisepolicies/tests/browser/browser_policy_display_bookmarks.js 2022-12-05 23:00:09.000000000 +0000 +++ firefox-esr-102.7.0esr/browser/components/enterprisepolicies/tests/browser/browser_policy_display_bookmarks.js 2023-01-09 15:01:01.000000000 +0000 @@ -3,21 +3,81 @@ "use strict"; -add_setup(async function() { +// Since testing will apply the policy after the browser has already started, +// we will need to open a new window to actually see the toolbar + +add_task(async function test_personaltoolbar_shown_old() { await setupPolicyEngineWithJson({ policies: { DisplayBookmarksToolbar: true, }, }); + let newWin = await BrowserTestUtils.openNewBrowserWindow(); + let menuBar = newWin.document.getElementById("PersonalToolbar"); + is( + menuBar.getAttribute("collapsed"), + "false", + "The bookmarks toolbar should not be hidden" + ); + + await BrowserTestUtils.closeWindow(newWin); +}); + +add_task(async function test_personaltoolbar_shown() { + await setupPolicyEngineWithJson({ + policies: { + DisplayBookmarksToolbar: "always", + }, + }); + + let newWin = await BrowserTestUtils.openNewBrowserWindow(); + let menuBar = newWin.document.getElementById("PersonalToolbar"); + is( + menuBar.getAttribute("collapsed"), + "false", + "The bookmarks toolbar should not be hidden" + ); + + await BrowserTestUtils.closeWindow(newWin); +}); + +add_task(async function test_personaltoolbar_hidden() { + await setupPolicyEngineWithJson({ + policies: { + DisplayBookmarksToolbar: "never", + }, + }); + + let newWin = await BrowserTestUtils.openNewBrowserWindow(); + let menuBar = newWin.document.getElementById("PersonalToolbar"); + is( + menuBar.getAttribute("collapsed"), + "true", + "The bookmarks toolbar should be hidden" + ); + + await BrowserTestUtils.closeWindow(newWin); }); -add_task(async function test_menu_shown() { - // Since testing will apply the policy after the browser has already started, - // we will need to open a new window to actually see the toolbar +add_task(async function test_personaltoolbar_newtabonly() { + await setupPolicyEngineWithJson({ + policies: { + DisplayBookmarksToolbar: "newtab", + }, + }); + let newWin = await BrowserTestUtils.openNewBrowserWindow(); let menuBar = newWin.document.getElementById("PersonalToolbar"); is( menuBar.getAttribute("collapsed"), + "true", + "The bookmarks toolbar should be hidden" + ); + + await BrowserTestUtils.openNewForegroundTab(newWin.gBrowser, "about:newtab"); + menuBar = newWin.document.getElementById("PersonalToolbar"); + is( + menuBar.getAttribute("collapsed"), "false", "The bookmarks toolbar should not be hidden" ); diff -Nru firefox-esr-102.6.0esr/browser/components/preferences/privacy.js firefox-esr-102.7.0esr/browser/components/preferences/privacy.js --- firefox-esr-102.6.0esr/browser/components/preferences/privacy.js 2022-12-05 23:00:14.000000000 +0000 +++ firefox-esr-102.7.0esr/browser/components/preferences/privacy.js 2023-01-09 17:27:35.000000000 +0000 @@ -448,6 +448,20 @@ httpsOnlyRadioGroup.value = "disabled"; httpsOnlyExceptionButton.disabled = true; } + + if ( + Services.prefs.prefIsLocked("dom.security.https_only_mode") || + Services.prefs.prefIsLocked("dom.security.https_only_mode_pbm") + ) { + httpsOnlyRadioGroup.disabled = true; + } + + if ( + Services.prefs.prefIsLocked("dom.security.https_only_mode") || + Services.prefs.prefIsLocked("dom.security.https_only_mode_pbm") + ) { + httpsOnlyRadioGroup.disabled = true; + } }, syncToHttpsOnlyPref() { diff -Nru firefox-esr-102.6.0esr/browser/components/search/test/unit/test_urlTelemetry.js firefox-esr-102.7.0esr/browser/components/search/test/unit/test_urlTelemetry.js --- firefox-esr-102.6.0esr/browser/components/search/test/unit/test_urlTelemetry.js 2022-12-05 23:00:15.000000000 +0000 +++ firefox-esr-102.7.0esr/browser/components/search/test/unit/test_urlTelemetry.js 2023-01-09 17:27:35.000000000 +0000 @@ -65,18 +65,6 @@ expectedSearchCountEntry: "google.in-content:organic:none", }, { - title: "Yahoo organic", - trackingUrl: - "https://search.yahoo.com/search?p=test&fr=yfp-t&fp=1&toggle=1&cop=mss&ei=UTF-8", - expectedSearchCountEntry: "yahoo.in-content:organic:none", - }, - { - title: "Yahoo organic UK", - trackingUrl: - "https://uk.search.yahoo.com/search?p=test&fr=yfp-t&fp=1&toggle=1&cop=mss&ei=UTF-8", - expectedSearchCountEntry: "yahoo.in-content:organic:none", - }, - { title: "Bing search access point", trackingUrl: "https://www.bing.com/search?q=test&pc=MOZI&form=MOZLBR", expectedSearchCountEntry: "bing.in-content:sap:MOZI", diff -Nru firefox-esr-102.6.0esr/browser/config/version.txt firefox-esr-102.7.0esr/browser/config/version.txt --- firefox-esr-102.6.0esr/browser/config/version.txt 2022-12-05 23:00:15.000000000 +0000 +++ firefox-esr-102.7.0esr/browser/config/version.txt 2023-01-09 17:27:36.000000000 +0000 @@ -1 +1 @@ -102.6.0 +102.7.0 diff -Nru firefox-esr-102.6.0esr/browser/config/version_display.txt firefox-esr-102.7.0esr/browser/config/version_display.txt --- firefox-esr-102.6.0esr/browser/config/version_display.txt 2022-12-05 23:00:15.000000000 +0000 +++ firefox-esr-102.7.0esr/browser/config/version_display.txt 2023-01-09 17:27:36.000000000 +0000 @@ -1 +1 @@ -102.6.0esr +102.7.0esr diff -Nru firefox-esr-102.6.0esr/config/milestone.txt firefox-esr-102.7.0esr/config/milestone.txt --- firefox-esr-102.6.0esr/config/milestone.txt 2022-12-05 23:00:15.000000000 +0000 +++ firefox-esr-102.7.0esr/config/milestone.txt 2023-01-09 17:27:35.000000000 +0000 @@ -10,4 +10,4 @@ # hardcoded milestones in the tree from these two files. #-------------------------------------------------------- -102.6.0 +102.7.0 diff -Nru firefox-esr-102.6.0esr/debian/browser.mozconfig.in firefox-esr-102.7.0esr/debian/browser.mozconfig.in --- firefox-esr-102.6.0esr/debian/browser.mozconfig.in 2022-12-13 22:48:39.000000000 +0000 +++ firefox-esr-102.7.0esr/debian/browser.mozconfig.in 2023-01-17 20:33:36.000000000 +0000 @@ -30,4 +30,6 @@ ac_add_options --with-unsigned-addon-scopes=app,system ac_add_options --allow-addon-sideload ac_add_options --enable-alsa +%if DIST == bullseye || DIST == buster || DIST == stretch ac_add_options --without-wasm-sandboxed-libraries +%endif diff -Nru firefox-esr-102.6.0esr/debian/changelog firefox-esr-102.7.0esr/debian/changelog --- firefox-esr-102.6.0esr/debian/changelog 2022-12-13 22:48:39.000000000 +0000 +++ firefox-esr-102.7.0esr/debian/changelog 2023-01-17 20:33:36.000000000 +0000 @@ -1,3 +1,28 @@ +firefox-esr (102.7.0esr-1~deb11u1) bullseye-security; urgency=medium + + * New upstream release. + * Fixes for mfsa2023-02, also known as: + CVE-2022-46871, CVE-2023-23598, CVE-2023-23601, CVE-2023-23602, + CVE-2022-46877, CVE-2023-23603, CVE-2023-23605. + + * debian/browser.mozconfig.in, debian/control*: Enable wasm sandboxing + on bookworm. + + * dom/base/usecounters.py, + python/mozbuild/mozbuild/action/process_define_files.py, + python/mozbuild/mozbuild/backend/base.py, + python/mozbuild/mozbuild/preprocessor.py, + python/mozbuild/mozbuild/util.py, + python/mozbuild/mozpack/files.py, + xpcom/idl-parser/xpidl/xpidl.py: Fix FTBFS with python 3.11. + bz#1769631, bz#1799982, Closes: #1028809. + * build/moz.configure/compilers-util.configure, + toolkit/moz.configure: Add more configure checks for the wasm toolchain + setup. bz#1747145. + toolkit/moz.configure: Allow to build without a wasi sysroot. bz#1810627 + + -- Mike Hommey Wed, 18 Jan 2023 05:33:36 +0900 + firefox-esr (102.6.0esr-1~deb11u1) bullseye-security; urgency=medium * New upstream release. diff -Nru firefox-esr-102.6.0esr/debian/control.in firefox-esr-102.7.0esr/debian/control.in --- firefox-esr-102.6.0esr/debian/control.in 2022-12-13 22:48:39.000000000 +0000 +++ firefox-esr-102.7.0esr/debian/control.in 2023-01-17 20:33:36.000000000 +0000 @@ -64,6 +64,11 @@ llvm-dev, libclang-dev, clang, +%if DIST != bullseye && DIST != buster && DIST != stretch + libc++-dev-wasm32, + libclang-rt-dev-wasm32, + lld, +%endif %endif cbindgen (>= 0.23.0), %if DIST == stretch diff -Nru firefox-esr-102.6.0esr/debian/patches/fixes/Bug-1747145-Add-more-configure-checks-for-the-wasm-t.patch firefox-esr-102.7.0esr/debian/patches/fixes/Bug-1747145-Add-more-configure-checks-for-the-wasm-t.patch --- firefox-esr-102.6.0esr/debian/patches/fixes/Bug-1747145-Add-more-configure-checks-for-the-wasm-t.patch 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-102.7.0esr/debian/patches/fixes/Bug-1747145-Add-more-configure-checks-for-the-wasm-t.patch 2023-01-17 20:33:36.000000000 +0000 @@ -0,0 +1,127 @@ +From: Mike Hommey +Date: Tue, 17 Jan 2023 10:41:35 +0900 +Subject: Bug 1747145 - Add more configure checks for the wasm toolchain setup. + r?build + +Differential Revision: https://phabricator.services.mozilla.com/D166977 +--- + build/moz.configure/compilers-util.configure | 8 ++- + toolkit/moz.configure | 62 +++++++++++++++----- + 2 files changed, 55 insertions(+), 15 deletions(-) + +diff --git a/build/moz.configure/compilers-util.configure b/build/moz.configure/compilers-util.configure +index 1d89303..2c9fe02 100644 +--- a/build/moz.configure/compilers-util.configure ++++ b/build/moz.configure/compilers-util.configure +@@ -96,16 +96,22 @@ def compiler_class(compiler, host_or_target): + def checking_fn(fn): + return fn + ++ # We accept onerror being a @depends function that returns a callable. ++ # So, create a similar @depends function when it's not already one. ++ if not isinstance(onerror, SandboxDependsFunction): ++ onerror = dependable(lambda: onerror) ++ + @depends( + self, + dependable(flags), + extra_toolchain_flags, + stlport_cppflags, + dependable(header), ++ onerror, + when=when, + ) + @checking_fn +- def func(compiler, flags, extra_flags, stlport_flags, header): ++ def func(compiler, flags, extra_flags, stlport_flags, header, onerror): + flags = list(flags or []) + if is_target: + flags += extra_flags or [] +diff --git a/toolkit/moz.configure b/toolkit/moz.configure +index 0dd52bd..4c356e6 100644 +--- a/toolkit/moz.configure ++++ b/toolkit/moz.configure +@@ -2437,24 +2437,57 @@ with only_when(requires_wasm_sandboxing & compile_environment): + + return wasi_sysroot + ++ @depends(wasi_sysroot) ++ def wasi_sysroot_flags(wasi_sysroot): ++ log.info("Using wasi sysroot in %s", wasi_sysroot) ++ return ["--sysroot=%s" % wasi_sysroot] ++ + set_config("WASI_SYSROOT", wasi_sysroot) + +- def wasm_compiler_with_flags(compiler, sysroot): +- if not sysroot: +- return +- elif compiler: ++ def wasm_compiler_with_flags(compiler, sysroot_flags): ++ if compiler: + return ( +- compiler.wrapper +- + [compiler.compiler] +- + compiler.flags +- + ["--sysroot=%s" % sysroot] ++ compiler.wrapper + [compiler.compiler] + compiler.flags + sysroot_flags + ) + ++ @template ++ def wasm_compiler_error(msg): ++ @depends("--with-wasm-sandboxed-libraries") ++ def wasm_compiler_error(sandboxed_libs): ++ suggest_disable = "" ++ if sandboxed_libs.origin == "default": ++ suggest_disable = " Or build with --without-wasm-sandboxed-libraries." ++ return lambda: die(msg + suggest_disable) ++ ++ return wasm_compiler_error ++ ++ @template ++ def check_wasm_compiler(compiler, language): ++ compiler.try_compile( ++ includes=["cstring" if language == "C++" else "string.h"], ++ flags=wasi_sysroot_flags, ++ check_msg="the wasm %s compiler can find wasi headers" % language, ++ onerror=wasm_compiler_error( ++ "Cannot find wasi headers or problem with the wasm compiler. " ++ "Please fix the problem." ++ ), ++ ) ++ ++ compiler.try_run( ++ flags=wasi_sysroot_flags, ++ check_msg="the wasm %s linker can find wasi libraries" % language, ++ onerror=wasm_compiler_error( ++ "Cannot find wasi libraries or problem with the wasm linker. " ++ "Please fix the problem." ++ ), ++ ) ++ + wasm_cc = compiler("C", wasm, other_compiler=c_compiler) ++ check_wasm_compiler(wasm_cc, "C") + +- @depends(wasm_cc, wasi_sysroot) +- def wasm_cc_with_flags(wasm_cc, wasi_sysroot): +- return wasm_compiler_with_flags(wasm_cc, wasi_sysroot) ++ @depends(wasm_cc, wasi_sysroot_flags) ++ def wasm_cc_with_flags(wasm_cc, wasi_sysroot_flags): ++ return wasm_compiler_with_flags(wasm_cc, wasi_sysroot_flags) + + set_config("WASM_CC", wasm_cc_with_flags) + +@@ -2465,10 +2498,11 @@ with only_when(requires_wasm_sandboxing & compile_environment): + other_compiler=cxx_compiler, + other_c_compiler=c_compiler, + ) ++ check_wasm_compiler(wasm_cxx, "C++") + +- @depends(wasm_cxx, wasi_sysroot) +- def wasm_cxx_with_flags(wasm_cxx, wasi_sysroot): +- return wasm_compiler_with_flags(wasm_cxx, wasi_sysroot) ++ @depends(wasm_cxx, wasi_sysroot_flags) ++ def wasm_cxx_with_flags(wasm_cxx, wasi_sysroot_flags): ++ return wasm_compiler_with_flags(wasm_cxx, wasi_sysroot_flags) + + set_config("WASM_CXX", wasm_cxx_with_flags) + diff -Nru firefox-esr-102.6.0esr/debian/patches/fixes/Bug-1769631-Remove-U-from-mode-parameters-for-variou.patch firefox-esr-102.7.0esr/debian/patches/fixes/Bug-1769631-Remove-U-from-mode-parameters-for-variou.patch --- firefox-esr-102.6.0esr/debian/patches/fixes/Bug-1769631-Remove-U-from-mode-parameters-for-variou.patch 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-102.7.0esr/debian/patches/fixes/Bug-1769631-Remove-U-from-mode-parameters-for-variou.patch 2023-01-17 20:33:36.000000000 +0000 @@ -0,0 +1,129 @@ +From: ahochheiden +Date: Thu, 2 Jun 2022 06:27:44 +0000 +Subject: Bug 1769631 - Remove 'U' from 'mode' parameters for various 'open' + calls to ensure Python3.11 compatibility + r=firefox-build-system-reviewers,glandium + +The 'U' flag represents "universal newline". It has been deprecated +since Python3.3. Since then "universal newline" is the default when a +file is opened in text mode (not bytes). In Python3.11 using the 'U' +flag throws errors. There should be no harm in removing 'U' from 'open' +everywhere it is used, and doing allows the use of Python3.11. + +For more reading see: https://docs.python.org/3.11/whatsnew/3.11.html#changes-in-the-python-api + +Differential Revision: https://phabricator.services.mozilla.com/D147721 +--- + dom/base/usecounters.py | 2 +- + python/mozbuild/mozbuild/action/process_define_files.py | 2 +- + python/mozbuild/mozbuild/backend/base.py | 2 +- + python/mozbuild/mozbuild/preprocessor.py | 6 +++--- + python/mozbuild/mozbuild/util.py | 2 +- + python/mozbuild/mozpack/files.py | 4 ++-- + 6 files changed, 9 insertions(+), 9 deletions(-) + +diff --git a/dom/base/usecounters.py b/dom/base/usecounters.py +index 780e3b3..7e2c714 100644 +--- a/dom/base/usecounters.py ++++ b/dom/base/usecounters.py +@@ -8,7 +8,7 @@ import re + + def read_conf(conf_filename): + # Can't read/write from a single StringIO, so make a new one for reading. +- stream = open(conf_filename, "rU") ++ stream = open(conf_filename, "r") + + def parse_counters(stream): + for line_num, line in enumerate(stream): +diff --git a/python/mozbuild/mozbuild/action/process_define_files.py b/python/mozbuild/mozbuild/action/process_define_files.py +index f1d401ac..aca59d0 100644 +--- a/python/mozbuild/mozbuild/action/process_define_files.py ++++ b/python/mozbuild/mozbuild/action/process_define_files.py +@@ -36,7 +36,7 @@ def process_define_file(output, input): + ) and not config.substs.get("JS_STANDALONE"): + config = PartialConfigEnvironment(mozpath.join(topobjdir, "js", "src")) + +- with open(path, "rU") as input: ++ with open(path, "r") as input: + r = re.compile( + "^\s*#\s*(?P[a-z]+)(?:\s+(?P\S+)(?:\s+(?P\S+))?)?", re.U + ) +diff --git a/python/mozbuild/mozbuild/backend/base.py b/python/mozbuild/mozbuild/backend/base.py +index 7bc1986..b64a709 100644 +--- a/python/mozbuild/mozbuild/backend/base.py ++++ b/python/mozbuild/mozbuild/backend/base.py +@@ -272,7 +272,7 @@ class BuildBackend(LoggingMixin): + return status + + @contextmanager +- def _write_file(self, path=None, fh=None, readmode="rU"): ++ def _write_file(self, path=None, fh=None, readmode="r"): + """Context manager to write a file. + + This is a glorified wrapper around FileAvoidWrite with integration to +diff --git a/python/mozbuild/mozbuild/preprocessor.py b/python/mozbuild/mozbuild/preprocessor.py +index f7820b9..857f1a6 100644 +--- a/python/mozbuild/mozbuild/preprocessor.py ++++ b/python/mozbuild/mozbuild/preprocessor.py +@@ -531,7 +531,7 @@ class Preprocessor: + + if args: + for f in args: +- with io.open(f, "rU", encoding="utf-8") as input: ++ with io.open(f, "r", encoding="utf-8") as input: + self.processFile(input=input, output=out) + if depfile: + mk = Makefile() +@@ -860,7 +860,7 @@ class Preprocessor: + args = self.applyFilters(args) + if not os.path.isabs(args): + args = os.path.join(self.curdir, args) +- args = io.open(args, "rU", encoding="utf-8") ++ args = io.open(args, "r", encoding="utf-8") + except Preprocessor.Error: + raise + except Exception: +@@ -914,7 +914,7 @@ class Preprocessor: + def preprocess(includes=[sys.stdin], defines={}, output=sys.stdout, marker="#"): + pp = Preprocessor(defines=defines, marker=marker) + for f in includes: +- with io.open(f, "rU", encoding="utf-8") as input: ++ with io.open(f, "r", encoding="utf-8") as input: + pp.processFile(input=input, output=output) + return pp.includes + +diff --git a/python/mozbuild/mozbuild/util.py b/python/mozbuild/mozbuild/util.py +index b09f164..4f1e0cd 100644 +--- a/python/mozbuild/mozbuild/util.py ++++ b/python/mozbuild/mozbuild/util.py +@@ -236,7 +236,7 @@ class FileAvoidWrite(BytesIO): + still occur, as well as diff capture if requested. + """ + +- def __init__(self, filename, capture_diff=False, dry_run=False, readmode="rU"): ++ def __init__(self, filename, capture_diff=False, dry_run=False, readmode="r"): + BytesIO.__init__(self) + self.name = filename + assert type(capture_diff) == bool +diff --git a/python/mozbuild/mozpack/files.py b/python/mozbuild/mozpack/files.py +index 1d8a1ed..a295a67 100644 +--- a/python/mozbuild/mozpack/files.py ++++ b/python/mozbuild/mozpack/files.py +@@ -554,7 +554,7 @@ class PreprocessedFile(BaseFile): + pp = Preprocessor(defines=self.defines, marker=self.marker) + pp.setSilenceDirectiveWarnings(self.silence_missing_directive_warnings) + +- with _open(self.path, "rU") as input: ++ with _open(self.path, "r") as input: + with _open(os.devnull, "w") as output: + pp.processFile(input=input, output=output) + +@@ -611,7 +611,7 @@ class PreprocessedFile(BaseFile): + pp = Preprocessor(defines=self.defines, marker=self.marker) + pp.setSilenceDirectiveWarnings(self.silence_missing_directive_warnings) + +- with _open(self.path, "rU") as input: ++ with _open(self.path, "r") as input: + pp.processFile(input=input, output=dest, depfile=deps_out) + + dest.close() diff -Nru firefox-esr-102.6.0esr/debian/patches/fixes/Bug-1799982-Remove-uses-of-inline-flags-from-XPIDL-r.patch firefox-esr-102.7.0esr/debian/patches/fixes/Bug-1799982-Remove-uses-of-inline-flags-from-XPIDL-r.patch --- firefox-esr-102.6.0esr/debian/patches/fixes/Bug-1799982-Remove-uses-of-inline-flags-from-XPIDL-r.patch 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-102.7.0esr/debian/patches/fixes/Bug-1799982-Remove-uses-of-inline-flags-from-XPIDL-r.patch 2023-01-17 20:33:36.000000000 +0000 @@ -0,0 +1,51 @@ +From: Andrew McCreight +Date: Thu, 10 Nov 2022 20:16:52 +0000 +Subject: Bug 1799982 - Remove uses of inline flags from XPIDL regexps. + r=xpcom-reviewers,kmag + +Apparently the use of these is being turned into an error in Python 3.11. +Fortunately, our uses appears to be rather trivial. + +For t_multilinecomment and t_LCDATA, I dropped the (?s) flag and just +replaced the one use of . with (\n|.). (?s) means DOTALL, which means +that dot includes any character, including a newline. Otherwise it means +dot includes any character except a newline. + +I took the new t_singlelinecomment from IPDL's parser.py, so I assume +it is reasonable enough. t_multilinecomment is also now the same as +in IPDL. + +Differential Revision: https://phabricator.services.mozilla.com/D161738 +--- + xpcom/idl-parser/xpidl/xpidl.py | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/xpcom/idl-parser/xpidl/xpidl.py b/xpcom/idl-parser/xpidl/xpidl.py +index 758a44c..6f514f9 100755 +--- a/xpcom/idl-parser/xpidl/xpidl.py ++++ b/xpcom/idl-parser/xpidl/xpidl.py +@@ -1572,13 +1572,13 @@ class IDLParser(object): + t_ignore = " \t" + + def t_multilinecomment(self, t): +- r"/\*(?s).*?\*/" ++ r"/\*(\n|.)*?\*/" + t.lexer.lineno += t.value.count("\n") + if t.value.startswith("/**"): + self._doccomments.append(t.value) + + def t_singlelinecomment(self, t): +- r"(?m)//.*?$" ++ r"//[^\n]*" + + def t_IID(self, t): + return t +@@ -1591,7 +1591,7 @@ class IDLParser(object): + return t + + def t_LCDATA(self, t): +- r"(?s)%\{[ ]*C\+\+[ ]*\n(?P.*?\n?)%\}[ ]*(C\+\+)?" ++ r"%\{[ ]*C\+\+[ ]*\n(?P(\n|.)*?\n?)%\}[ ]*(C\+\+)?" + t.type = "CDATA" + t.value = t.lexer.lexmatch.group("cdata") + t.lexer.lineno += t.value.count("\n") diff -Nru firefox-esr-102.6.0esr/debian/patches/fixes/Bug-1810627-Allow-to-build-without-a-wasi-sysroot.-r.patch firefox-esr-102.7.0esr/debian/patches/fixes/Bug-1810627-Allow-to-build-without-a-wasi-sysroot.-r.patch --- firefox-esr-102.6.0esr/debian/patches/fixes/Bug-1810627-Allow-to-build-without-a-wasi-sysroot.-r.patch 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-102.7.0esr/debian/patches/fixes/Bug-1810627-Allow-to-build-without-a-wasi-sysroot.-r.patch 2023-01-17 20:33:36.000000000 +0000 @@ -0,0 +1,53 @@ +From: Mike Hommey +Date: Sun, 15 Jan 2023 07:08:44 +0900 +Subject: Bug 1810627 - Allow to build without a wasi sysroot. r?build + +On e.g. Debian unstable, the wasi SDK is available via packages in a +multiarch fashion, which doesn't require the --sysroot flag being passed +to the compiler. + +Differential Revision: https://phabricator.services.mozilla.com/D166978 +--- + toolkit/moz.configure | 19 +++++-------------- + 1 file changed, 5 insertions(+), 14 deletions(-) + +diff --git a/toolkit/moz.configure b/toolkit/moz.configure +index 4c356e6..3304806 100644 +--- a/toolkit/moz.configure ++++ b/toolkit/moz.configure +@@ -2412,21 +2412,10 @@ with only_when(requires_wasm_sandboxing & compile_environment): + @depends( + "--with-wasi-sysroot", + bootstrap_path("sysroot-wasm32-wasi", when=bootstrap_wasi_sysroot), +- "--with-wasm-sandboxed-libraries", + ) + @imports("os") +- def wasi_sysroot(wasi_sysroot, bootstrapped_sysroot, sandboxed_libs): ++ def wasi_sysroot(wasi_sysroot, bootstrapped_sysroot): + if not wasi_sysroot: +- if not bootstrapped_sysroot: +- suggest_disable = "" +- if sandboxed_libs.origin == "default": +- suggest_disable = ( +- " Or build with --without-wasm-sandboxed-libraries." +- ) +- die( +- "Cannot find a wasi sysroot. Please give its location with " +- "--with-wasi-sysroot." + suggest_disable +- ) + return bootstrapped_sysroot + + wasi_sysroot = wasi_sysroot[0] +@@ -2439,8 +2428,10 @@ with only_when(requires_wasm_sandboxing & compile_environment): + + @depends(wasi_sysroot) + def wasi_sysroot_flags(wasi_sysroot): +- log.info("Using wasi sysroot in %s", wasi_sysroot) +- return ["--sysroot=%s" % wasi_sysroot] ++ if wasi_sysroot: ++ log.info("Using wasi sysroot in %s", wasi_sysroot) ++ return ["--sysroot=%s" % wasi_sysroot] ++ return [] + + set_config("WASI_SYSROOT", wasi_sysroot) + diff -Nru firefox-esr-102.6.0esr/debian/patches/series firefox-esr-102.7.0esr/debian/patches/series --- firefox-esr-102.6.0esr/debian/patches/series 2022-12-13 22:48:39.000000000 +0000 +++ firefox-esr-102.7.0esr/debian/patches/series 2023-01-17 20:33:36.000000000 +0000 @@ -1,4 +1,8 @@ fixes/Allow-.js-preference-files-to-set-locked-prefs-with-.patch +fixes/Bug-1769631-Remove-U-from-mode-parameters-for-variou.patch +fixes/Bug-1799982-Remove-uses-of-inline-flags-from-XPIDL-r.patch +fixes/Bug-1747145-Add-more-configure-checks-for-the-wasm-t.patch +fixes/Bug-1810627-Allow-to-build-without-a-wasi-sysroot.-r.patch porting/Add-xptcall-support-for-SH4-processors.patch porting/NSS-Fix-FTBFS-on-Hurd-because-of-MAXPATHLEN.patch porting/Use-NEON_FLAGS-instead-of-VPX_ASFLAGS-for-libaom-neo.patch diff -Nru firefox-esr-102.6.0esr/devtools/client/netmonitor/test/browser_net_curl-utils.js firefox-esr-102.7.0esr/devtools/client/netmonitor/test/browser_net_curl-utils.js --- firefox-esr-102.6.0esr/devtools/client/netmonitor/test/browser_net_curl-utils.js 2022-12-05 23:00:15.000000000 +0000 +++ firefox-esr-102.7.0esr/devtools/client/netmonitor/test/browser_net_curl-utils.js 2023-01-09 17:27:36.000000000 +0000 @@ -309,10 +309,10 @@ "Double quotes should be escaped." ); - const percentSigns = "%AppData%"; + const percentSigns = "%TEMP% %@foo% %2XX% %_XX% %?XX%"; is( CurlUtils.escapeStringWin(percentSigns), - '""%"AppData"%""', + '"^%^TEMP^% ^%^@foo^% ^%^2XX^% ^%^_XX^% ^%?XX^%"', "Percent signs should be escaped." ); @@ -323,26 +323,33 @@ "Backslashes should be escaped." ); - const newLines = "line1\r\nline2\r\nline3"; + const newLines = "line1\r\nline2\r\rline3\n\nline4"; is( CurlUtils.escapeStringWin(newLines), - '"line1"^\u000d\u000A\u000d\u000A"line2"^\u000d\u000A\u000d\u000A"line3"', + '"line1"^\r\n\r\n"line2"^\r\n\r\n""^\r\n\r\n"line3"^\r\n\r\n""^\r\n\r\n"line4"', "Newlines should be escaped." ); const dollarSignCommand = "$(calc.exe)"; is( CurlUtils.escapeStringWin(dollarSignCommand), - '"`$(calc.exe)"', + '"\\$(calc.exe)"', "Dollar sign should be escaped." ); const tickSignCommand = "`$(calc.exe)"; is( CurlUtils.escapeStringWin(tickSignCommand), - '"```$(calc.exe)"', + '"\\`\\$(calc.exe)"', "Both the tick and dollar signs should be escaped." ); + + const evilCommand = `query=evil\r\rcmd" /c timeout /t 3 & calc.exe\r\r`; + is( + CurlUtils.escapeStringWin(evilCommand), + '"query=evil"^\r\n\r\n""^\r\n\r\n"cmd"" /c timeout /t 3 & calc.exe"^\r\n\r\n""^\r\n\r\n""', + "The evil command is escaped properly" + ); } async function createCurlData(selected, getLongString, requestData) { diff -Nru firefox-esr-102.6.0esr/devtools/client/shared/components/reps/reps/rep-utils.js firefox-esr-102.7.0esr/devtools/client/shared/components/reps/reps/rep-utils.js --- firefox-esr-102.6.0esr/devtools/client/shared/components/reps/reps/rep-utils.js 2022-12-05 23:00:15.000000000 +0000 +++ firefox-esr-102.7.0esr/devtools/client/shared/components/reps/reps/rep-utils.js 2023-01-09 17:27:36.000000000 +0000 @@ -484,14 +484,10 @@ "(?:min-|max-)?width|(?:min-|max-)?height)" ); - // Regular expression that matches the forbidden CSS property values. - const forbiddenValuesRegexs = [ - // -moz-element() - /\b((?:-moz-)?element)[\s('"]+/gi, - - // various URL protocols - /['"(]*(?:chrome|resource|about|app|https?|ftp|file):+\/*/gi, - ]; + const mozElementRegex = /\b((?:-moz-)?element)[\s('"]+/gi; + + // Regex to retrieve usages of `url(*)` in property value + const cssUrlRegex = /url\([\'\"]?([^\)]*)/g; // Use a dummy element to parse the style string. const dummy = createElement("div"); @@ -502,10 +498,20 @@ // without forbidden properties and values. return Array.from(dummy.style) .filter(name => { - return ( - allowedStylesRegex.test(name) && - !forbiddenValuesRegexs.some(regex => regex.test(dummy.style[name])) - ); + if (!allowedStylesRegex.test(name)) { + return false; + } + + if (mozElementRegex.test(name)) { + return false; + } + + // There can be multiple call to `url()` (e.g.` background: url("path/to/image"), url("data:image/png,…");`); + // filter out the property if the url function is called with anything that is not + // a data URL. + return Array.from(dummy.style[name].matchAll(cssUrlRegex)) + .map(match => match[1]) + .every(potentialUrl => potentialUrl.startsWith("data:")); }) .reduce((object, name) => { // React requires CSS properties to be provided in JavaScript form, i.e. camelCased. diff -Nru firefox-esr-102.6.0esr/devtools/client/shared/curl.js firefox-esr-102.7.0esr/devtools/client/shared/curl.js --- firefox-esr-102.6.0esr/devtools/client/shared/curl.js 2022-12-05 23:00:15.000000000 +0000 +++ firefox-esr-102.7.0esr/devtools/client/shared/curl.js 2023-01-09 17:27:36.000000000 +0000 @@ -424,46 +424,49 @@ */ escapeStringWin: function(str) { /* - Replace the backtick character ` with `` in order to escape it. - The backtick character is an escape character in PowerShell and - can, among other things, be used to disable the effect of some - of the other escapes created below. - Also see http://www.rlmueller.net/PowerShellEscape.htm for - useful details. - - Replace dollar sign because of commands in powershell when using - double quotes. e.g $(calc.exe) Also see - http://www.rlmueller.net/PowerShellEscape.htm for details. - - Replace quote by double quote (but not by \") because it is - recognized by both cmd.exe and MS Crt arguments parser. - - Replace % by "%" because it could be expanded to an environment - variable value. So %% becomes "%""%". Even if an env variable "" - (2 doublequotes) is declared, the cmd.exe will not - substitute it with its value. - - Replace each backslash with double backslash to make sure - MS Crt arguments parser won't collapse them. - - Replace new line outside of quotes since cmd.exe doesn't let - to do it inside. At the same time it gets duplicated, - because first newline is consumed by ^. - So for quote: `"Text-start\r\ntext-continue"`, - we get: `"Text-start"^\r\n\r\n"text-continue"`, - where `^\r\n` is just breaking the command, the `\r\n` right - after is actual escaped newline. + Because cmd.exe parser and MS Crt arguments parsers use some of the + same escape characters, they can interact with each other in + horrible ways, the order of operations is critical. */ + const encapsChars = '"'; return ( - '"' + + encapsChars + str - .replaceAll("`", "``") - .replaceAll("$", "`$") - .replaceAll('"', '""') - .replaceAll("%", '"%"') + + // Replace \ with \\ first because it is an escape character for certain + // conditions in both parsers. .replace(/\\/g, "\\\\") - .replace(/[\r\n]{1,2}/g, '"^$&$&"') + - '"' + + // Replace double quote chars with two double quotes (not by escaping with \") because it is + // recognized by both cmd.exe and MS Crt arguments parser. + .replace(/"/g, '""') + + // Escape ` and $ so commands do not get executed e.g $(calc.exe) or `\$(calc.exe) + .replace(/[`$]/g, "\\$&") + + // Then escape all characters we are not sure about with ^ to ensure it + // gets to MS Crt parser safely. + .replace(/[^a-zA-Z0-9\s_\-:=+~\/.',?;()*\$&\\{}\"`]/g, "^$&") + + // The % character is special because MS Crt parser will try and look for + // ENV variables and fill them in its place. We cannot escape them with % + // and cannot escape them with ^ (because it's cmd.exe's escape not MS Crt + // parser); So we can get cmd.exe parser to escape the character after it, + // if it is followed by a valid beginning character of an ENV variable. + // This ensures we do not try and double escape another ^ if it was placed + // by the previous replace. + .replace(/%(?=[a-zA-Z0-9_])/g, "%^") + + // We replace \r and \r\n with \n, this allows to consistently escape all new + // lines in the next replace + .replace(/\r\n?/g, "\n") + + // Lastly we replace new lines with ^ and TWO new lines because the first + // new line is there to enact the escape command the second is the character + // to escape (in this case new line). + // The extra " enables escaping new lines with ^ within quotes in cmd.exe. + .replace(/\n/g, '"^\r\n\r\n"') + + encapsChars ); }, }; diff -Nru firefox-esr-102.6.0esr/devtools/client/webconsole/test/browser/browser_webconsole_stubs_console_api.js firefox-esr-102.7.0esr/devtools/client/webconsole/test/browser/browser_webconsole_stubs_console_api.js --- firefox-esr-102.6.0esr/devtools/client/webconsole/test/browser/browser_webconsole_stubs_console_api.js 2022-12-05 23:00:15.000000000 +0000 +++ firefox-esr-102.7.0esr/devtools/client/webconsole/test/browser/browser_webconsole_stubs_console_api.js 2023-01-09 17:27:36.000000000 +0000 @@ -261,7 +261,7 @@ code: ` console.log( "%cfoo%cbar", - "color:blue; font-size:1.3em; background:url('https://example.com/test'); position:absolute; top:10px; ", + "color:blue; font-size:1.3em; background:url('data:image/png,base64,iVBORw0KGgoAAAAN'), url('https://example.com/test'); position:absolute; top:10px; ", "color:red; line-height: 1.5; background:\\165rl('https://example.com/test')" ); `, diff -Nru firefox-esr-102.6.0esr/devtools/client/webconsole/test/node/fixtures/stubs/consoleApi.js firefox-esr-102.7.0esr/devtools/client/webconsole/test/node/fixtures/stubs/consoleApi.js --- firefox-esr-102.6.0esr/devtools/client/webconsole/test/node/fixtures/stubs/consoleApi.js 2022-12-05 23:00:15.000000000 +0000 +++ firefox-esr-102.7.0esr/devtools/client/webconsole/test/node/fixtures/stubs/consoleApi.js 2023-01-09 17:27:36.000000000 +0000 @@ -170,7 +170,7 @@ { "_grip": { "type": "object", - "actor": "server0.conn0.windowGlobal15032385537/obj32", + "actor": "server0.conn0.windowGlobal15032385537/obj30", "class": "Object", "ownPropertyLength": 1, "extensible": true, @@ -190,7 +190,7 @@ "ownPropertiesLength": 1 } }, - "actorID": "server0.conn0.windowGlobal15032385537/obj32" + "actorID": "server0.conn0.windowGlobal15032385537/obj30" } ], "columnNumber": 35, @@ -237,7 +237,7 @@ { "_grip": { "type": "object", - "actor": "server0.conn0.windowGlobal15032385537/obj35", + "actor": "server0.conn0.windowGlobal15032385537/obj33", "class": "Window", "ownPropertyLength": 818, "extensible": true, @@ -249,7 +249,7 @@ "url": "https://example.com/browser/devtools/client/webconsole/test/browser/test-console-api.html" } }, - "actorID": "server0.conn0.windowGlobal15032385537/obj35" + "actorID": "server0.conn0.windowGlobal15032385537/obj33" } ], "columnNumber": 35, @@ -271,7 +271,7 @@ { "_grip": { "type": "object", - "actor": "server0.conn0.windowGlobal15032385537/obj37", + "actor": "server0.conn0.windowGlobal15032385537/obj35", "class": "Array", "ownPropertyLength": 4, "extensible": true, @@ -288,7 +288,7 @@ ] } }, - "actorID": "server0.conn0.windowGlobal15032385537/obj37" + "actorID": "server0.conn0.windowGlobal15032385537/obj35" } ], "columnNumber": 35, @@ -310,7 +310,7 @@ { "_grip": { "type": "object", - "actor": "server0.conn0.windowGlobal15032385537/obj39", + "actor": "server0.conn0.windowGlobal15032385537/obj37", "class": "RegExp", "ownPropertyLength": 1, "extensible": true, @@ -319,7 +319,7 @@ "isError": false, "displayString": "/a.b.c/" }, - "actorID": "server0.conn0.windowGlobal15032385537/obj39" + "actorID": "server0.conn0.windowGlobal15032385537/obj37" } ], "columnNumber": 35, @@ -340,7 +340,7 @@ { "_grip": { "type": "object", - "actor": "server0.conn0.windowGlobal15032385537/obj41", + "actor": "server0.conn0.windowGlobal15032385537/obj39", "class": "Array", "ownPropertyLength": 4, "extensible": true, @@ -369,7 +369,7 @@ } } }, - "actorID": "server0.conn0.windowGlobal15032385537/obj41" + "actorID": "server0.conn0.windowGlobal15032385537/obj39" } ], "columnNumber": 35, @@ -391,7 +391,7 @@ { "_grip": { "type": "object", - "actor": "server0.conn0.windowGlobal15032385537/obj43", + "actor": "server0.conn0.windowGlobal15032385537/obj41", "class": "Object", "ownPropertyLength": 3, "extensible": true, @@ -423,7 +423,7 @@ "ownPropertiesLength": 3 } }, - "actorID": "server0.conn0.windowGlobal15032385537/obj43" + "actorID": "server0.conn0.windowGlobal15032385537/obj41" } ], "columnNumber": 35, @@ -505,7 +505,7 @@ { "_grip": { "type": "object", - "actor": "server0.conn0.windowGlobal15032385537/obj48", + "actor": "server0.conn0.windowGlobal15032385537/obj46", "class": "Map", "ownPropertyLength": 0, "extensible": true, @@ -527,7 +527,7 @@ ] } }, - "actorID": "server0.conn0.windowGlobal15032385537/obj48" + "actorID": "server0.conn0.windowGlobal15032385537/obj46" } ], "columnNumber": 11, @@ -549,7 +549,7 @@ { "_grip": { "type": "object", - "actor": "server0.conn0.windowGlobal15032385537/obj50", + "actor": "server0.conn0.windowGlobal15032385537/obj48", "class": "Set", "ownPropertyLength": 0, "extensible": true, @@ -565,7 +565,7 @@ ] } }, - "actorID": "server0.conn0.windowGlobal15032385537/obj50" + "actorID": "server0.conn0.windowGlobal15032385537/obj48" } ], "columnNumber": 11, @@ -625,7 +625,7 @@ { "_grip": { "type": "object", - "actor": "server0.conn0.windowGlobal15032385537/obj53", + "actor": "server0.conn0.windowGlobal15032385537/obj51", "class": "Object", "ownPropertyLength": 1, "extensible": true, @@ -645,12 +645,12 @@ "ownPropertiesLength": 1 } }, - "actorID": "server0.conn0.windowGlobal15032385537/obj53" + "actorID": "server0.conn0.windowGlobal15032385537/obj51" }, { "_grip": { "type": "object", - "actor": "server0.conn0.windowGlobal15032385537/obj54", + "actor": "server0.conn0.windowGlobal15032385537/obj52", "class": "Array", "ownPropertyLength": 4, "extensible": true, @@ -667,7 +667,7 @@ ] } }, - "actorID": "server0.conn0.windowGlobal15032385537/obj54" + "actorID": "server0.conn0.windowGlobal15032385537/obj52" } ], "columnNumber": 13, @@ -808,7 +808,7 @@ { "_grip": { "type": "object", - "actor": "server0.conn0.windowGlobal15032385537/obj57", + "actor": "server0.conn0.windowGlobal15032385537/obj55", "class": "Object", "ownPropertyLength": 1, "extensible": true, @@ -828,7 +828,7 @@ "ownPropertiesLength": 1 } }, - "actorID": "server0.conn0.windowGlobal15032385537/obj57" + "actorID": "server0.conn0.windowGlobal15032385537/obj55" } ], "columnNumber": 11, @@ -933,7 +933,7 @@ { "_grip": { "type": "object", - "actor": "server0.conn0.windowGlobal15032385537/obj60", + "actor": "server0.conn0.windowGlobal15032385537/obj58", "class": "Array", "ownPropertyLength": 4, "extensible": true, @@ -962,7 +962,7 @@ } } }, - "actorID": "server0.conn0.windowGlobal15032385537/obj60" + "actorID": "server0.conn0.windowGlobal15032385537/obj58" } ], "columnNumber": 11, @@ -1085,7 +1085,7 @@ "sourceId": "server0.conn0.child1/source48", "innerWindowID": 8589934593, "styles": [ - "color:blue; font-size:1.3em; background:url('https://example.com/test'); position:absolute; top:10px; ", + "color:blue; font-size:1.3em; background:url('data:image/png,base64,iVBORw0KGgoAAAAN'), url('https://example.com/test'); position:absolute; top:10px; ", "color:red; line-height: 1.5; background:url('https://example.com/test')" ] }, @@ -1197,7 +1197,7 @@ { "_grip": { "type": "object", - "actor": "server0.conn0.windowGlobal15032385537/obj69", + "actor": "server0.conn0.windowGlobal15032385537/obj67", "class": "Object", "ownPropertyLength": 4, "extensible": true, @@ -1235,7 +1235,7 @@ "ownPropertiesLength": 4 } }, - "actorID": "server0.conn0.windowGlobal15032385537/obj69" + "actorID": "server0.conn0.windowGlobal15032385537/obj67" } ], "columnNumber": 35, diff -Nru firefox-esr-102.6.0esr/dom/base/ContentAreaDropListener.jsm firefox-esr-102.7.0esr/dom/base/ContentAreaDropListener.jsm --- firefox-esr-102.6.0esr/dom/base/ContentAreaDropListener.jsm 2022-12-05 23:00:15.000000000 +0000 +++ firefox-esr-102.7.0esr/dom/base/ContentAreaDropListener.jsm 2023-01-09 17:27:36.000000000 +0000 @@ -261,30 +261,19 @@ return true; } - let sourceNode = dataTransfer.mozSourceNode; - if (!sourceNode) { + // If this is an external drag, allow drop. + let sourceWC = dataTransfer.sourceWindowContext; + if (!sourceWC) { return true; } - // don't allow a drop of a node from the same document onto this one - let sourceDocument = sourceNode.ownerDocument; - let eventDocument = aEvent.originalTarget.ownerDocument; - if (sourceDocument == eventDocument) { + // If drag source and drop target are in the same top window, don't allow. + let eventWC = + aEvent.originalTarget.ownerGlobal.browsingContext.currentWindowContext; + if (eventWC && sourceWC.topWindowContext == eventWC.topWindowContext) { return false; } - // also check for nodes in other child or sibling frames by checking - // if both have the same top window. - if (sourceDocument && eventDocument) { - if (sourceDocument.defaultView == null) { - return true; - } - let sourceRoot = sourceDocument.defaultView.top; - if (sourceRoot && sourceRoot == eventDocument.defaultView.top) { - return false; - } - } - return true; }, diff -Nru firefox-esr-102.6.0esr/dom/base/Document.cpp firefox-esr-102.7.0esr/dom/base/Document.cpp --- firefox-esr-102.6.0esr/dom/base/Document.cpp 2022-12-05 23:00:15.000000000 +0000 +++ firefox-esr-102.7.0esr/dom/base/Document.cpp 2023-01-09 17:27:36.000000000 +0000 @@ -15271,12 +15271,12 @@ // The origin which is fullscreen gets changed. Trigger an event so // that the chrome knows to pop up a warning UI. Note that - // previousFullscreenDoc == nullptr upon first entry, so we always - // take this path on the first entry. Also note that, in a multi- - // process browser, the code in content process is responsible for - // sending message with the origin to its parent, and the parent - // shouldn't rely on this event itself. - if (aRequest->mShouldNotifyNewOrigin && + // previousFullscreenDoc == nullptr upon first entry, we show the warning UI + // directly as soon as chrome document goes into fullscreen state. Also note + // that, in a multi-process browser, the code in content process is + // responsible for sending message with the origin to its parent, and the + // parent shouldn't rely on this event itself. + if (aRequest->mShouldNotifyNewOrigin && previousFullscreenDoc && !nsContentUtils::HaveEqualPrincipals(previousFullscreenDoc, this)) { DispatchFullscreenNewOriginEvent(this); } diff -Nru firefox-esr-102.6.0esr/dom/base/Navigator.cpp firefox-esr-102.7.0esr/dom/base/Navigator.cpp --- firefox-esr-102.6.0esr/dom/base/Navigator.cpp 2022-12-05 23:00:15.000000000 +0000 +++ firefox-esr-102.7.0esr/dom/base/Navigator.cpp 2023-01-09 17:27:36.000000000 +0000 @@ -1587,7 +1587,12 @@ win->GetGamepads(aGamepads); } -GamepadServiceTest* Navigator::RequestGamepadServiceTest() { +GamepadServiceTest* Navigator::RequestGamepadServiceTest(ErrorResult& aRv) { + if (!xpc::IsInAutomation()) { + aRv.Throw(NS_ERROR_UNEXPECTED); + return nullptr; + } + if (!mGamepadServiceTest) { mGamepadServiceTest = GamepadServiceTest::CreateTestService(mWindow); } @@ -1752,7 +1757,12 @@ Navigator_Binding::ClearCachedActiveVRDisplaysValue(this); } -VRServiceTest* Navigator::RequestVRServiceTest() { +VRServiceTest* Navigator::RequestVRServiceTest(ErrorResult& aRv) { + if (!xpc::IsInAutomation()) { + aRv.Throw(NS_ERROR_UNEXPECTED); + return nullptr; + } + // Ensure that the Mock VR devices are not released prematurely nsGlobalWindowInner* win = nsGlobalWindowInner::Cast(mWindow); win->NotifyHasXRSession(); diff -Nru firefox-esr-102.6.0esr/dom/base/Navigator.h firefox-esr-102.7.0esr/dom/base/Navigator.h --- firefox-esr-102.6.0esr/dom/base/Navigator.h 2022-12-05 23:00:15.000000000 +0000 +++ firefox-esr-102.7.0esr/dom/base/Navigator.h 2023-01-09 17:27:36.000000000 +0000 @@ -181,13 +181,13 @@ MediaDevices* GetExtantMediaDevices() const { return mMediaDevices; }; void GetGamepads(nsTArray>& aGamepads, ErrorResult& aRv); - GamepadServiceTest* RequestGamepadServiceTest(); + GamepadServiceTest* RequestGamepadServiceTest(ErrorResult& aRv); already_AddRefed GetVRDisplays(ErrorResult& aRv); void FinishGetVRDisplays(bool isWebVRSupportedInwindow, Promise* p); void GetActiveVRDisplays(nsTArray>& aDisplays) const; void OnXRPermissionRequestAllow(); void OnXRPermissionRequestCancel(); - VRServiceTest* RequestVRServiceTest(); + VRServiceTest* RequestVRServiceTest(ErrorResult& aRv); bool IsWebVRContentDetected() const; bool IsWebVRContentPresenting() const; void RequestVRPresentation(VRDisplay& aDisplay); diff -Nru firefox-esr-102.6.0esr/dom/base/nsGlobalWindowInner.cpp firefox-esr-102.7.0esr/dom/base/nsGlobalWindowInner.cpp --- firefox-esr-102.6.0esr/dom/base/nsGlobalWindowInner.cpp 2022-12-05 23:00:15.000000000 +0000 +++ firefox-esr-102.7.0esr/dom/base/nsGlobalWindowInner.cpp 2023-01-09 17:27:36.000000000 +0000 @@ -1453,6 +1453,7 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mExternal) NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mInstallTrigger) NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mIntlUtils) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mVisualViewport) tmp->TraverseObjectsInGlobal(cb); @@ -1568,6 +1569,7 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK(mExternal) NS_IMPL_CYCLE_COLLECTION_UNLINK(mInstallTrigger) NS_IMPL_CYCLE_COLLECTION_UNLINK(mIntlUtils) + NS_IMPL_CYCLE_COLLECTION_UNLINK(mVisualViewport) tmp->UnlinkObjectsInGlobal(); diff -Nru firefox-esr-102.6.0esr/dom/base/test/chrome.ini firefox-esr-102.7.0esr/dom/base/test/chrome.ini --- firefox-esr-102.6.0esr/dom/base/test/chrome.ini 2022-12-05 23:00:15.000000000 +0000 +++ firefox-esr-102.7.0esr/dom/base/test/chrome.ini 2023-01-09 17:27:36.000000000 +0000 @@ -11,6 +11,7 @@ file_external_script.html file_external_script.xhtml file_script.js + file_serializer_noscript.html referrer_helper.js referrer_testserver.sjs !/image/test/mochitest/shaver.png @@ -34,3 +35,4 @@ [test_urgent_start.html] skip-if = (os == "win" && debug) || (os == "mac" && debug) #leaks Bug 1571583 [test_sanitize_xhr.html] +[test_serializer_noscript.html] diff -Nru firefox-esr-102.6.0esr/dom/base/test/file_serializer_noscript.html firefox-esr-102.7.0esr/dom/base/test/file_serializer_noscript.html --- firefox-esr-102.6.0esr/dom/base/test/file_serializer_noscript.html 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-102.7.0esr/dom/base/test/file_serializer_noscript.html 2023-01-09 15:01:03.000000000 +0000 @@ -0,0 +1 @@ + diff -Nru firefox-esr-102.6.0esr/dom/base/test/test_serializer_noscript.html firefox-esr-102.7.0esr/dom/base/test/test_serializer_noscript.html --- firefox-esr-102.6.0esr/dom/base/test/test_serializer_noscript.html 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-102.7.0esr/dom/base/test/test_serializer_noscript.html 2023-01-09 15:01:02.000000000 +0000 @@ -0,0 +1,38 @@ + + + + Test for document.blockParsing + + + + + + + + diff -Nru firefox-esr-102.6.0esr/dom/events/DataTransfer.cpp firefox-esr-102.7.0esr/dom/events/DataTransfer.cpp --- firefox-esr-102.6.0esr/dom/events/DataTransfer.cpp 2022-12-05 23:00:16.000000000 +0000 +++ firefox-esr-102.7.0esr/dom/events/DataTransfer.cpp 2023-01-09 17:27:36.000000000 +0000 @@ -42,6 +42,7 @@ #include "mozilla/dom/BindingUtils.h" #include "mozilla/dom/OSFileSystem.h" #include "mozilla/dom/Promise.h" +#include "mozilla/dom/WindowContext.h" #include "mozilla/Unused.h" #include "nsComponentManagerUtils.h" #include "nsNetUtil.h" @@ -437,6 +438,17 @@ return sourceNode.forget(); } +already_AddRefed DataTransfer::GetSourceWindowContext() { + nsCOMPtr dragSession = nsContentUtils::GetDragSession(); + if (!dragSession) { + return nullptr; + } + + RefPtr sourceWindowContext; + dragSession->GetSourceWindowContext(getter_AddRefs(sourceWindowContext)); + return sourceWindowContext.forget(); +} + already_AddRefed DataTransfer::MozTypesAt( uint32_t aIndex, ErrorResult& aRv) const { // Only the first item is valid for clipboard events diff -Nru firefox-esr-102.6.0esr/dom/events/DataTransfer.h firefox-esr-102.7.0esr/dom/events/DataTransfer.h --- firefox-esr-102.6.0esr/dom/events/DataTransfer.h 2022-12-05 23:00:16.000000000 +0000 +++ firefox-esr-102.7.0esr/dom/events/DataTransfer.h 2023-01-09 17:27:36.000000000 +0000 @@ -42,6 +42,7 @@ class Promise; template class Optional; +class WindowContext; #define NS_DATATRANSFER_IID \ { \ @@ -253,6 +254,8 @@ already_AddRefed GetMozSourceNode(); + already_AddRefed GetSourceWindowContext(); + /* * Integer version of dropEffect, set to one of the constants in * nsIDragService. diff -Nru firefox-esr-102.6.0esr/dom/l10n/DocumentL10n.cpp firefox-esr-102.7.0esr/dom/l10n/DocumentL10n.cpp --- firefox-esr-102.6.0esr/dom/l10n/DocumentL10n.cpp 2022-12-05 23:00:21.000000000 +0000 +++ firefox-esr-102.7.0esr/dom/l10n/DocumentL10n.cpp 2023-01-09 17:27:36.000000000 +0000 @@ -177,6 +177,9 @@ MOZ_ASSERT(mState == DocumentL10nState::Constructed, "This method should be called only from Constructed state."); RefPtr promise = Promise::Create(mGlobal, aRv); + if (NS_WARN_IF(aRv.Failed())) { + return nullptr; + } Element* elem = mDocument->GetDocumentElement(); if (!elem) { @@ -253,17 +256,18 @@ // 2.1.4. Collect promises with Promise::All (maybe empty). AutoEntryScript aes(mGlobal, "DocumentL10n InitialTranslationCompleted"); promise = Promise::All(aes.cx(), promises, aRv); + if (NS_WARN_IF(aRv.Failed())) { + return nullptr; + } } else { // 2.2. Handle the case when we don't have proto. // 2.2.1. Otherwise, translate all available elements, // without attempting to cache them. promise = TranslateElements(elements, nullptr, aRv); - } - - if (NS_WARN_IF(!promise || aRv.Failed())) { - promise->MaybeRejectWithUndefined(); - return promise.forget(); + if (NS_WARN_IF(aRv.Failed())) { + return nullptr; + } } return promise.forget(); diff -Nru firefox-esr-102.6.0esr/dom/locks/LockManager.h firefox-esr-102.7.0esr/dom/locks/LockManager.h --- firefox-esr-102.6.0esr/dom/locks/LockManager.h 2022-12-05 23:00:21.000000000 +0000 +++ firefox-esr-102.7.0esr/dom/locks/LockManager.h 2023-01-09 15:01:03.000000000 +0000 @@ -61,6 +61,8 @@ nsCOMPtr mOwner; RefPtr mActor; + // Revokes itself and triggers LockManagerChild deletion on worker shutdown + // callback. RefPtr mWorkerRef; }; diff -Nru firefox-esr-102.6.0esr/dom/locks/LockManagerChild.cpp firefox-esr-102.7.0esr/dom/locks/LockManagerChild.cpp --- firefox-esr-102.6.0esr/dom/locks/LockManagerChild.cpp 2022-12-05 23:00:21.000000000 +0000 +++ firefox-esr-102.7.0esr/dom/locks/LockManagerChild.cpp 2023-01-09 17:27:36.000000000 +0000 @@ -16,6 +16,13 @@ namespace mozilla::dom::locks { +LockManagerChild::LockManagerChild(nsIGlobalObject* aOwner) : mOwner(aOwner) { + if (!NS_IsMainThread()) { + mWorkerRef = IPCWorkerRef::Create(GetCurrentThreadWorkerPrivate(), + "LockManagerChild"); + } +} + void LockManagerChild::NotifyBFCacheOnMainThread(nsPIDOMWindowInner* aInner, bool aCreated) { AssertIsOnMainThread(); diff -Nru firefox-esr-102.6.0esr/dom/locks/LockManagerChild.h firefox-esr-102.7.0esr/dom/locks/LockManagerChild.h --- firefox-esr-102.6.0esr/dom/locks/LockManagerChild.h 2022-12-05 23:00:15.000000000 +0000 +++ firefox-esr-102.7.0esr/dom/locks/LockManagerChild.h 2023-01-09 15:01:03.000000000 +0000 @@ -9,6 +9,7 @@ #include "mozilla/dom/locks/PLockManagerChild.h" #include "mozilla/dom/Promise.h" +#include "mozilla/dom/WorkerRef.h" #include "nsIUUIDGenerator.h" namespace mozilla::dom::locks { @@ -23,7 +24,7 @@ static void NotifyBFCacheOnMainThread(nsPIDOMWindowInner* aInner, bool aCreated); - explicit LockManagerChild(nsIGlobalObject* aOwner) : mOwner(aOwner){}; + explicit LockManagerChild(nsIGlobalObject* aOwner); nsIGlobalObject* GetParentObject() const { return mOwner; }; @@ -37,6 +38,26 @@ ~LockManagerChild() = default; nsCOMPtr mOwner; + + // This WorkerRef is deleted by destructor. + // + // Here we want to make sure the IPC layer deletes the actor before allowing + // WorkerPrivate deletion, since managed LockRequestChild holds a reference to + // global object (currently via mRequest member variable) and thus deleting + // the worker first causes an assertion failure. Having this ensures that all + // LockRequestChild instances must first have been deleted. + // + // (Because each LockRequestChild's ActorLifecycleProxy will hold + // a strong reference to its manager LockManagerChild's ActorLifecycleProxy, + // which means that the LockManagerChild will only be destroyed once all + // LockRequestChild instances have been destroyed. At that point, all + // references to the global should have been dropped, and then the + // LockManagerChild IPCWorkerRef will be dropped and the worker will be able + // to transition to the Killing state.) + // + // ActorDestroy can't release this since it does not guarantee to destruct and + // GC the managees (LockRequestChild) immediately. + RefPtr mWorkerRef; }; } // namespace mozilla::dom::locks diff -Nru firefox-esr-102.6.0esr/dom/locks/LockRequestChild.h firefox-esr-102.7.0esr/dom/locks/LockRequestChild.h --- firefox-esr-102.6.0esr/dom/locks/LockRequestChild.h 2022-12-05 23:00:21.000000000 +0000 +++ firefox-esr-102.7.0esr/dom/locks/LockRequestChild.h 2023-01-09 15:01:03.000000000 +0000 @@ -50,6 +50,14 @@ LockManagerChild* CastedManager() const; const LockRequest mRequest; + + // This prevents the worker from being GC'ed when the caller is waiting to + // acquire the lock and when the lock is held. + // + // The StrongWorkerRef is dropped immediately in the shutdown notification + // callback, and thus does not ensure any cleanup before the worker advances + // to the Killing state. That is ensured instead by + // LockManagerChild::mWorkerRef, see also the details there. RefPtr mWorkerRef; }; diff -Nru firefox-esr-102.6.0esr/dom/media/webrtc/libwebrtcglue/VideoConduit.cpp firefox-esr-102.7.0esr/dom/media/webrtc/libwebrtcglue/VideoConduit.cpp --- firefox-esr-102.6.0esr/dom/media/webrtc/libwebrtcglue/VideoConduit.cpp 2022-12-05 23:00:21.000000000 +0000 +++ firefox-esr-102.7.0esr/dom/media/webrtc/libwebrtcglue/VideoConduit.cpp 2023-01-09 17:27:36.000000000 +0000 @@ -210,11 +210,10 @@ if (aConfig.mName == kVp9CodecName) { webrtc::VideoCodecVP9 vp9_settings = webrtc::VideoEncoder::GetDefaultVp9Settings(); - if (is_screencast) { - // TODO(asapersson): Set to 2 for now since there is a DCHECK in - // VideoSendStream::ReconfigureVideoEncoder. - vp9_settings.numberOfSpatialLayers = 2; - } else { + if (!is_screencast) { + // Always configure only 1 spatial layer for screencapture as libwebrtc + // has some special requirements when SVC is active. For non-screencapture + // the spatial layers are experimentally configurable via a pref. vp9_settings.numberOfSpatialLayers = aConduit->SpatialLayers(); } // VP9 denoising is disabled by default. diff -Nru firefox-esr-102.6.0esr/dom/media/webrtc/tests/mochitests/sdpUtils.js firefox-esr-102.7.0esr/dom/media/webrtc/tests/mochitests/sdpUtils.js --- firefox-esr-102.6.0esr/dom/media/webrtc/tests/mochitests/sdpUtils.js 2022-12-05 23:00:21.000000000 +0000 +++ firefox-esr-102.7.0esr/dom/media/webrtc/tests/mochitests/sdpUtils.js 2023-01-09 17:27:36.000000000 +0000 @@ -29,6 +29,16 @@ return match[1]; }, + // Returns a list of all payload types, excluding rtx, in an sdp. + getPayloadTypes(sdp) { + const regex = /^a=rtpmap:([0-9]+) (?:(?!rtx).)*$/gim; + const pts = []; + for (const [line, pt] of sdp.matchAll(regex)) { + pts.push(pt); + } + return pts; + }, + // Finds all the extmap ids in the given sdp. Note that this does NOT // consider m-sections, so a more generic version would need to // look at each m-section separately. diff -Nru firefox-esr-102.6.0esr/dom/media/webrtc/tests/mochitests/test_peerConnection_basicScreenshare.html firefox-esr-102.7.0esr/dom/media/webrtc/tests/mochitests/test_peerConnection_basicScreenshare.html --- firefox-esr-102.6.0esr/dom/media/webrtc/tests/mochitests/test_peerConnection_basicScreenshare.html 2022-12-05 23:00:22.000000000 +0000 +++ firefox-esr-102.7.0esr/dom/media/webrtc/tests/mochitests/test_peerConnection_basicScreenshare.html 2023-01-09 15:01:04.000000000 +0000 @@ -11,14 +11,44 @@ title: "Basic screenshare-only peer connection" }); - var test; - runNetworkTest(function (options) { - test = new PeerConnectionTest(options); - var constraints = { + async function supportedVideoPayloadTypes() { + const pc = new RTCPeerConnection(); + const offer = await pc.createOffer({offerToReceiveVideo: true}); + return sdputils.getPayloadTypes(offer.sdp); + } + + async function testScreenshare(payloadType) { + const options = {}; + options.h264 = payloadType == 97 || payloadType == 126; + const test = new PeerConnectionTest(options); + const constraints = { video: { mediaSource: "screen" }, }; test.setMediaConstraints([constraints], []); - return test.run(); + test.chain.insertAfterEach("PC_LOCAL_CREATE_OFFER", [ + function PC_LOCAL_ISOLATE_CODEC() { + info(`Forcing payload type ${payloadType}. Note that other associated ` + + `payload types, like RTX, are removed too.`); + test.originalOffer.sdp = + sdputils.removeAllButPayloadType(test.originalOffer.sdp, payloadType); + }, + ]); + await test.run(); + } + + runNetworkTest(async () => { + await matchPlatformH264CodecPrefs(); + const pts = await supportedVideoPayloadTypes(); + ok(pts.includes("120"), "VP8 is supported"); + ok(pts.includes("121"), "VP9 is supported"); + if (pts.length > 2) { + is(pts.length, 4, "Expected VP8, VP9 and two variants of H264"); + ok(pts.includes("97"), "H264 with no packetization-mode is supported"); + ok(pts.includes("126"), "H264 with packetization-mode=1 is supported"); + } + for (const pt of pts) { + await testScreenshare(pt); + } }); diff -Nru firefox-esr-102.6.0esr/dom/performance/Performance.cpp firefox-esr-102.7.0esr/dom/performance/Performance.cpp --- firefox-esr-102.6.0esr/dom/performance/Performance.cpp 2022-12-05 23:00:22.000000000 +0000 +++ firefox-esr-102.7.0esr/dom/performance/Performance.cpp 2023-01-09 17:27:36.000000000 +0000 @@ -18,6 +18,7 @@ #include "PerformanceWorker.h" #include "mozilla/BasePrincipal.h" #include "mozilla/ErrorResult.h" +#include "mozilla/dom/MessagePortBinding.h" #include "mozilla/dom/PerformanceBinding.h" #include "mozilla/dom/PerformanceEntryEvent.h" #include "mozilla/dom/PerformanceNavigationBinding.h" @@ -33,6 +34,12 @@ namespace mozilla::dom { +enum class Performance::ResolveTimestampAttribute { + Start, + End, + Duration, +}; + NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(Performance) NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper) @@ -387,7 +394,7 @@ ClearUserEntries(aName, u"mark"_ns); } -DOMHighResTimeStamp Performance::ResolveTimestampFromName( +DOMHighResTimeStamp Performance::ConvertMarkToTimestampWithString( const nsAString& aName, ErrorResult& aRv) { AutoTArray, 1> arr; Optional typeParam; @@ -400,7 +407,9 @@ } if (!IsPerformanceTimingAttribute(aName)) { - aRv.Throw(NS_ERROR_DOM_SYNTAX_ERR); + nsPrintfCString errorMsg("Given mark name, %s, is unknown", + NS_ConvertUTF16toUTF8(aName).get()); + aRv.ThrowSyntaxError(errorMsg); return 0; } @@ -413,41 +422,195 @@ return ts - CreationTime(); } -void Performance::Measure(const nsAString& aName, - const Optional& aStartMark, - const Optional& aEndMark, - ErrorResult& aRv) { - // We add nothing when 'privacy.resistFingerprinting' is on. - if (nsContentUtils::ShouldResistFingerprinting()) { - return; +DOMHighResTimeStamp Performance::ConvertMarkToTimestampWithDOMHighResTimeStamp( + const ResolveTimestampAttribute aAttribute, + const DOMHighResTimeStamp aTimestamp, ErrorResult& aRv) { + if (aTimestamp < 0) { + nsAutoCString attributeName; + switch (aAttribute) { + case ResolveTimestampAttribute::Start: + attributeName = "start"; + break; + case ResolveTimestampAttribute::End: + attributeName = "end"; + break; + case ResolveTimestampAttribute::Duration: + attributeName = "duration"; + break; + } + + nsPrintfCString errorMsg("Given attribute %s cannot be negative", + attributeName.get()); + aRv.ThrowTypeError(errorMsg); + } + return aTimestamp; +} + +DOMHighResTimeStamp Performance::ConvertMarkToTimestamp( + const ResolveTimestampAttribute aAttribute, + const OwningStringOrDouble& aMarkNameOrTimestamp, ErrorResult& aRv) { + if (aMarkNameOrTimestamp.IsString()) { + return ConvertMarkToTimestampWithString(aMarkNameOrTimestamp.GetAsString(), + aRv); + } + + return ConvertMarkToTimestampWithDOMHighResTimeStamp( + aAttribute, aMarkNameOrTimestamp.GetAsDouble(), aRv); +} + +DOMHighResTimeStamp Performance::ResolveEndTimeForMeasure( + const Optional& aEndMark, + const Maybe& aOptions, ErrorResult& aRv) { + DOMHighResTimeStamp endTime; + if (aEndMark.WasPassed()) { + endTime = ConvertMarkToTimestampWithString(aEndMark.Value(), aRv); + } else if (aOptions && aOptions->mEnd.WasPassed()) { + endTime = ConvertMarkToTimestamp(ResolveTimestampAttribute::End, + aOptions->mEnd.Value(), aRv); + } else if (aOptions && aOptions->mStart.WasPassed() && + aOptions->mDuration.WasPassed()) { + const DOMHighResTimeStamp start = ConvertMarkToTimestamp( + ResolveTimestampAttribute::Start, aOptions->mStart.Value(), aRv); + if (aRv.Failed()) { + return 0; + } + + const DOMHighResTimeStamp duration = + ConvertMarkToTimestampWithDOMHighResTimeStamp( + ResolveTimestampAttribute::Duration, aOptions->mDuration.Value(), + aRv); + if (aRv.Failed()) { + return 0; + } + + endTime = start + duration; + } else { + endTime = Now(); } - DOMHighResTimeStamp startTime; - DOMHighResTimeStamp endTime; + return endTime; +} - if (aStartMark.WasPassed()) { - startTime = ResolveTimestampFromName(aStartMark.Value(), aRv); - if (NS_WARN_IF(aRv.Failed())) { - return; - } +DOMHighResTimeStamp Performance::ResolveStartTimeForMeasure( + const Maybe& aStartMark, + const Maybe& aOptions, ErrorResult& aRv) { + DOMHighResTimeStamp startTime; + if (aOptions && aOptions->mStart.WasPassed()) { + startTime = ConvertMarkToTimestamp(ResolveTimestampAttribute::Start, + aOptions->mStart.Value(), aRv); + } else if (aOptions && aOptions->mDuration.WasPassed() && + aOptions->mEnd.WasPassed()) { + const DOMHighResTimeStamp duration = + ConvertMarkToTimestampWithDOMHighResTimeStamp( + ResolveTimestampAttribute::Duration, aOptions->mDuration.Value(), + aRv); + if (aRv.Failed()) { + return 0; + } + + const DOMHighResTimeStamp end = ConvertMarkToTimestamp( + ResolveTimestampAttribute::End, aOptions->mEnd.Value(), aRv); + if (aRv.Failed()) { + return 0; + } + + startTime = end - duration; + } else if (aStartMark) { + startTime = ConvertMarkToTimestampWithString(*aStartMark, aRv); } else { - // Navigation start is used in this case, but since DOMHighResTimeStamp is - // in relation to navigation start, this will be zero if a name is not - // passed. startTime = 0; } - if (aEndMark.WasPassed()) { - endTime = ResolveTimestampFromName(aEndMark.Value(), aRv); - if (NS_WARN_IF(aRv.Failed())) { - return; + return startTime; +} + +already_AddRefed Performance::Measure( + JSContext* aCx, const nsAString& aName, + const StringOrPerformanceMeasureOptions& aStartOrMeasureOptions, + const Optional& aEndMark, ErrorResult& aRv) { + if (!GetParentObject()) { + aRv.ThrowInvalidStateError("Global object is unavailable"); + return nullptr; + } + + // When resisting fingerprinting, we don't add marks to the buffer. Since + // measure relies on relationships between marks in the buffer, this method + // will throw if we look for user-entered marks so we return a dummy measure + // instead of continuing. We could instead return real values for performance + // timing attributes and dummy values for user-entered marks but this adds + // complexity that doesn't seem worth the effort because these fingerprinting + // protections may not longer be necessary (since performance.now() already + // has reduced precision). + if (nsContentUtils::ShouldResistFingerprinting()) { + return do_AddRef(new PerformanceMeasure(GetParentObject(), aName, 0, 0, + JS::NullHandleValue)); + } + + // Maybe is more readable than using the union type directly. + Maybe options; + if (aStartOrMeasureOptions.IsPerformanceMeasureOptions()) { + options.emplace(aStartOrMeasureOptions.GetAsPerformanceMeasureOptions()); + } + + const bool isOptionsNotEmpty = + options.isSome() && + (!options->mDetail.isUndefined() || options->mStart.WasPassed() || + options->mEnd.WasPassed() || options->mDuration.WasPassed()); + if (isOptionsNotEmpty) { + if (aEndMark.WasPassed()) { + aRv.ThrowTypeError( + "Cannot provide separate endMark argument if " + "PerformanceMeasureOptions argument is given"); + return nullptr; + } + + if (!options->mStart.WasPassed() && !options->mEnd.WasPassed()) { + aRv.ThrowTypeError( + "PerformanceMeasureOptions must have start and/or end member"); + return nullptr; + } + + if (options->mStart.WasPassed() && options->mDuration.WasPassed() && + options->mEnd.WasPassed()) { + aRv.ThrowTypeError( + "PerformanceMeasureOptions cannot have all of the following members: " + "start, duration, and end"); + return nullptr; + } + } + + const DOMHighResTimeStamp endTime = + ResolveEndTimeForMeasure(aEndMark, options, aRv); + if (NS_WARN_IF(aRv.Failed())) { + return nullptr; + } + + // Convert to Maybe for consistency with options. + Maybe startMark; + if (aStartOrMeasureOptions.IsString()) { + startMark.emplace(aStartOrMeasureOptions.GetAsString()); + } + const DOMHighResTimeStamp startTime = + ResolveStartTimeForMeasure(startMark, options, aRv); + if (NS_WARN_IF(aRv.Failed())) { + return nullptr; + } + + JS::Rooted detail(aCx); + if (options && !options->mDetail.isNullOrUndefined()) { + StructuredSerializeOptions serializeOptions; + JS::Rooted valueToClone(aCx, options->mDetail); + nsContentUtils::StructuredClone(aCx, GetParentObject(), valueToClone, + serializeOptions, &detail, aRv); + if (aRv.Failed()) { + return nullptr; } } else { - endTime = Now(); + detail.setNull(); } - RefPtr performanceMeasure = - new PerformanceMeasure(GetParentObject(), aName, startTime, endTime); + RefPtr performanceMeasure = new PerformanceMeasure( + GetParentObject(), aName, startTime, endTime, detail); InsertUserEntry(performanceMeasure); if (profiler_thread_is_being_profiled_for_markers()) { @@ -456,12 +619,6 @@ TimeStamp endTimeStamp = CreationTimeStamp() + TimeDuration::FromMilliseconds(endTime); - // Convert to Maybe values so that Optional types do not need to be used in - // the profiler. - Maybe startMark; - if (aStartMark.WasPassed()) { - startMark.emplace(aStartMark.Value()); - } Maybe endMark; if (aEndMark.WasPassed()) { endMark.emplace(aEndMark.Value()); @@ -477,6 +634,8 @@ UserTimingMarker{}, aName, /* aIsMeasure */ true, startMark, endMark); } + + return performanceMeasure.forget(); } void Performance::ClearMeasures(const Optional& aName) { diff -Nru firefox-esr-102.6.0esr/dom/performance/Performance.h firefox-esr-102.7.0esr/dom/performance/Performance.h --- firefox-esr-102.6.0esr/dom/performance/Performance.h 2022-12-05 23:00:22.000000000 +0000 +++ firefox-esr-102.7.0esr/dom/performance/Performance.h 2023-01-09 17:27:36.000000000 +0000 @@ -21,9 +21,13 @@ namespace dom { +class OwningStringOrDouble; +class StringOrPerformanceMeasureOptions; class PerformanceEntry; class PerformanceMark; struct PerformanceMarkOptions; +struct PerformanceMeasureOptions; +class PerformanceMeasure; class PerformanceNavigation; class PerformancePaintTiming; class PerformanceObserver; @@ -84,8 +88,10 @@ void ClearMarks(const Optional& aName); - void Measure(const nsAString& aName, const Optional& aStartMark, - const Optional& aEndMark, ErrorResult& aRv); + already_AddRefed Measure( + JSContext* aCx, const nsAString& aName, + const StringOrPerformanceMeasureOptions& aStartOrMeasureOptions, + const Optional& aEndMark, ErrorResult& aRv); void ClearMeasures(const Optional& aName); @@ -161,9 +167,6 @@ void ClearUserEntries(const Optional& aEntryName, const nsAString& aEntryType); - DOMHighResTimeStamp ResolveTimestampFromName(const nsAString& aName, - ErrorResult& aRv); - virtual void DispatchBufferFullEvent() = 0; virtual DOMHighResTimeStamp CreationTime() const = 0; @@ -206,6 +209,28 @@ private: MOZ_ALWAYS_INLINE bool CanAddResourceTimingEntry(); void BufferEvent(); + + // The attributes of a PerformanceMeasureOptions that we call + // ResolveTimestamp* on. + enum class ResolveTimestampAttribute; + + DOMHighResTimeStamp ConvertMarkToTimestampWithString(const nsAString& aName, + ErrorResult& aRv); + DOMHighResTimeStamp ConvertMarkToTimestampWithDOMHighResTimeStamp( + const ResolveTimestampAttribute aAttribute, const double aTimestamp, + ErrorResult& aRv); + DOMHighResTimeStamp ConvertMarkToTimestamp( + const ResolveTimestampAttribute aAttribute, + const OwningStringOrDouble& aMarkNameOrTimestamp, ErrorResult& aRv); + + DOMHighResTimeStamp ResolveEndTimeForMeasure( + const Optional& aEndMark, + const Maybe& aOptions, + ErrorResult& aRv); + DOMHighResTimeStamp ResolveStartTimeForMeasure( + const Maybe& aStartMark, + const Maybe& aOptions, + ErrorResult& aRv); }; } // namespace dom diff -Nru firefox-esr-102.6.0esr/dom/performance/PerformanceMark.cpp firefox-esr-102.7.0esr/dom/performance/PerformanceMark.cpp --- firefox-esr-102.6.0esr/dom/performance/PerformanceMark.cpp 2022-12-05 23:00:22.000000000 +0000 +++ firefox-esr-102.7.0esr/dom/performance/PerformanceMark.cpp 2023-01-09 17:27:36.000000000 +0000 @@ -100,9 +100,10 @@ void PerformanceMark::GetDetail(JSContext* aCx, JS::MutableHandle aRetval) { - // Return a copy so that the PerformanceMark.detail reference always returns - // the same value. However, the contents of detail can be mutated. The spec - // isn't clear if this is okay but it matches Chrome's behavior. + // Return a copy so that this method always returns the value it is set to + // (i.e. it'll return the same value even if the caller assigns to it). Note + // that if detail is an object, its contents can be mutated and this is + // expected. aRetval.set(mDetail); } diff -Nru firefox-esr-102.6.0esr/dom/performance/PerformanceMeasure.cpp firefox-esr-102.7.0esr/dom/performance/PerformanceMeasure.cpp --- firefox-esr-102.6.0esr/dom/performance/PerformanceMeasure.cpp 2022-12-05 23:00:16.000000000 +0000 +++ firefox-esr-102.7.0esr/dom/performance/PerformanceMeasure.cpp 2023-01-09 15:01:04.000000000 +0000 @@ -13,18 +13,49 @@ PerformanceMeasure::PerformanceMeasure(nsISupports* aParent, const nsAString& aName, DOMHighResTimeStamp aStartTime, - DOMHighResTimeStamp aEndTime) + DOMHighResTimeStamp aEndTime, + const JS::Handle& aDetail) : PerformanceEntry(aParent, aName, u"measure"_ns), mStartTime(aStartTime), - mDuration(aEndTime - aStartTime) {} + mDuration(aEndTime - aStartTime), + mDetail(aDetail) { + mozilla::HoldJSObjects(this); +} + +PerformanceMeasure::~PerformanceMeasure() { mozilla::DropJSObjects(this); } + +NS_IMPL_CYCLE_COLLECTION_CLASS(PerformanceMeasure) +NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(PerformanceMeasure, + PerformanceEntry) + tmp->mDetail.setUndefined(); + mozilla::DropJSObjects(tmp); +NS_IMPL_CYCLE_COLLECTION_UNLINK_END +NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(PerformanceMeasure, + PerformanceEntry) +NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END -PerformanceMeasure::~PerformanceMeasure() = default; +NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN_INHERITED(PerformanceMeasure, + PerformanceEntry) + NS_IMPL_CYCLE_COLLECTION_TRACE_JS_MEMBER_CALLBACK(mDetail) +NS_IMPL_CYCLE_COLLECTION_TRACE_END + +NS_IMPL_ISUPPORTS_CYCLE_COLLECTION_INHERITED_0(PerformanceMeasure, + PerformanceEntry) JSObject* PerformanceMeasure::WrapObject(JSContext* aCx, JS::Handle aGivenProto) { return PerformanceMeasure_Binding::Wrap(aCx, this, aGivenProto); } +void PerformanceMeasure::GetDetail(JSContext* aCx, + JS::MutableHandle aRetval) { + // Return a copy so that this method always returns the value it is set to + // (i.e. it'll return the same value even if the caller assigns to it). Note + // that if detail is an object, its contents can be mutated and this is + // expected. + aRetval.set(mDetail); +} + size_t PerformanceMeasure::SizeOfIncludingThis( mozilla::MallocSizeOf aMallocSizeOf) const { return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf); diff -Nru firefox-esr-102.6.0esr/dom/performance/PerformanceMeasure.h firefox-esr-102.7.0esr/dom/performance/PerformanceMeasure.h --- firefox-esr-102.6.0esr/dom/performance/PerformanceMeasure.h 2022-12-05 23:00:21.000000000 +0000 +++ firefox-esr-102.7.0esr/dom/performance/PerformanceMeasure.h 2023-01-09 15:01:04.000000000 +0000 @@ -14,9 +14,14 @@ // http://www.w3.org/TR/user-timing/#performancemeasure class PerformanceMeasure final : public PerformanceEntry { public: + NS_DECL_ISUPPORTS_INHERITED + NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(PerformanceMeasure, + PerformanceEntry); + PerformanceMeasure(nsISupports* aParent, const nsAString& aName, DOMHighResTimeStamp aStartTime, - DOMHighResTimeStamp aEndTime); + DOMHighResTimeStamp aEndTime, + const JS::Handle& aDetail); virtual JSObject* WrapObject(JSContext* aCx, JS::Handle aGivenProto) override; @@ -25,6 +30,8 @@ virtual DOMHighResTimeStamp Duration() const override { return mDuration; } + void GetDetail(JSContext* aCx, JS::MutableHandle aRetval); + size_t SizeOfIncludingThis( mozilla::MallocSizeOf aMallocSizeOf) const override; @@ -32,6 +39,9 @@ virtual ~PerformanceMeasure(); DOMHighResTimeStamp mStartTime; DOMHighResTimeStamp mDuration; + + private: + JS::Heap mDetail; }; } // namespace mozilla::dom diff -Nru firefox-esr-102.6.0esr/dom/performance/tests/test_performance_user_timing_dying_global.html firefox-esr-102.7.0esr/dom/performance/tests/test_performance_user_timing_dying_global.html --- firefox-esr-102.6.0esr/dom/performance/tests/test_performance_user_timing_dying_global.html 2022-12-05 23:00:22.000000000 +0000 +++ firefox-esr-102.7.0esr/dom/performance/tests/test_performance_user_timing_dying_global.html 2023-01-09 15:01:04.000000000 +0000 @@ -40,13 +40,17 @@ ok(true, 'new PerformanceMark() on dying global did not crash'); try { - dyingWindow.performance.mark('markMethod', {detail: 'markMethodDetail'}); + dyingWindow.performance.mark('markMethod', {detail: 'markMethodDetail'}); } catch (e) { - is(e.code, e.INVALID_STATE_ERR, 'performance.mark on dying global threw expected exception'); + is(e.code, e.INVALID_STATE_ERR, 'performance.mark on dying global threw expected exception'); } ok(true, 'performance.mark on dying global did not crash'); - dyingWindow.performance.measure('measureMethod'); + try { + dyingWindow.performance.measure('measureMethod'); + } catch (e) { + is(e.code, e.INVALID_STATE_ERR, 'performance.measure on dying global threw expected exception'); + } ok(true, 'performance.measure on dying global did not crash'); } diff -Nru firefox-esr-102.6.0esr/dom/security/test/general/test_meta_referrer.html firefox-esr-102.7.0esr/dom/security/test/general/test_meta_referrer.html --- firefox-esr-102.6.0esr/dom/security/test/general/test_meta_referrer.html 2022-12-05 23:00:22.000000000 +0000 +++ firefox-esr-102.7.0esr/dom/security/test/general/test_meta_referrer.html 2023-01-09 17:27:36.000000000 +0000 @@ -25,9 +25,10 @@ var script = SpecialPowers.loadChromeScript(() => { const {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm"); + let counter = 0; Services.obs.addObserver(function onExamResp(subject, topic, data) { let channel = subject.QueryInterface(Ci.nsIHttpChannel); - if (!channel.URI.spec.startsWith("https://example.com")) { + if (!channel.URI.spec.startsWith("https://example.com") || counter >= 2) { return; } @@ -39,6 +40,7 @@ refererHeaderSet = false; } ok(!refererHeaderSet, "the referer header should not be set"); + counter++; sendAsyncMessage("checked-referer-header"); }, "http-on-stop-request"); }); diff -Nru firefox-esr-102.6.0esr/dom/serializers/nsHTMLContentSerializer.cpp firefox-esr-102.7.0esr/dom/serializers/nsHTMLContentSerializer.cpp --- firefox-esr-102.6.0esr/dom/serializers/nsHTMLContentSerializer.cpp 2022-12-05 23:00:21.000000000 +0000 +++ firefox-esr-102.7.0esr/dom/serializers/nsHTMLContentSerializer.cpp 2023-01-09 15:01:03.000000000 +0000 @@ -237,7 +237,9 @@ if (ns == kNameSpaceID_XHTML && (name == nsGkAtoms::script || name == nsGkAtoms::style || - name == nsGkAtoms::noscript || name == nsGkAtoms::noframes)) { + (name == nsGkAtoms::noscript && + aElement->OwnerDoc()->IsScriptEnabled()) || + name == nsGkAtoms::noframes)) { ++mDisableEntityEncoding; } @@ -263,7 +265,9 @@ if (ns == kNameSpaceID_XHTML && (name == nsGkAtoms::script || name == nsGkAtoms::style || - name == nsGkAtoms::noscript || name == nsGkAtoms::noframes)) { + (name == nsGkAtoms::noscript && + aElement->OwnerDoc()->IsScriptEnabled()) || + name == nsGkAtoms::noframes)) { --mDisableEntityEncoding; } diff -Nru firefox-esr-102.6.0esr/dom/tests/mochitest/chrome/MozDomFullscreen_chrome.xhtml firefox-esr-102.7.0esr/dom/tests/mochitest/chrome/MozDomFullscreen_chrome.xhtml --- firefox-esr-102.6.0esr/dom/tests/mochitest/chrome/MozDomFullscreen_chrome.xhtml 2022-12-05 23:00:22.000000000 +0000 +++ firefox-esr-102.7.0esr/dom/tests/mochitest/chrome/MozDomFullscreen_chrome.xhtml 2023-01-09 17:27:36.000000000 +0000 @@ -38,28 +38,26 @@ var gInnerDoc = null; var gReceivedFullscreenEnteredEvent = false; -var gReceivedNewOriginEvent = false; function firstEntry(event) { - if (event.type == "MozDOMFullscreen:Entered") { - window.removeEventListener("MozDOMFullscreen:Entered", firstEntry, false); - ok(!gReceivedFullscreenEnteredEvent, "MozDOMFullscreen:Entered shouldn't have been triggered twice"); - is(event.target, gOuterDoc.body, "First MozDOMFullscreen:Entered should be targeted at outer body"); - gReceivedFullscreenEnteredEvent = true; - } else if (event.type == "MozDOMFullscreen:NewOrigin") { - window.removeEventListener("MozDOMFullscreen:NewOrigin", firstEntry, false); - ok(!gReceivedNewOriginEvent, "MozDOMFullscreen:NewOrigin shouldn't have been triggered twice"); - is(event.target, gOuterDoc, "First MozDOMFullscreen:NewOrigin should be targeted at outer doc"); - gReceivedNewOriginEvent = true; - } else { - ok(false, "Unknown event received"); + if (event.type == "MozDOMFullscreen:NewOrigin") { + ok(false, "MozDOMFullscreen:NewOrigin shouldn't be triggered at first entry"); + return; } - if (!gReceivedFullscreenEnteredEvent || !gReceivedNewOriginEvent) { + + if (event.type != "MozDOMFullscreen:Entered") { + ok(false, "Unknown event received"); return; } ok(gOuterDoc.fullscreenElement != null, "Outer doc should be in fullscreen"); + is(event.target, gOuterDoc.body, "First MozDOMFullscreen:Entered should be targeted at outer body"); + ok(!gReceivedFullscreenEnteredEvent, "MozDOMFullscreen:Entered shouldn't have been triggered twice"); + gReceivedFullscreenEnteredEvent = true; + window.removeEventListener("MozDOMFullscreen:Entered", firstEntry); + window.removeEventListener("MozDOMFullscreen:NewOrigin", firstEntry); + + window.addEventListener("MozDOMFullscreen:NewOrigin", secondEntry); gInnerDoc = gOuterDoc.getElementById("innerFrame").contentDocument; - window.addEventListener("MozDOMFullscreen:NewOrigin", secondEntry, false); gInnerDoc.defaultView.focus(); gInnerDoc.body.requestFullscreen(); } diff -Nru firefox-esr-102.6.0esr/dom/webidl/DataTransfer.webidl firefox-esr-102.7.0esr/dom/webidl/DataTransfer.webidl --- firefox-esr-102.6.0esr/dom/webidl/DataTransfer.webidl 2022-12-05 23:00:22.000000000 +0000 +++ firefox-esr-102.7.0esr/dom/webidl/DataTransfer.webidl 2023-01-09 17:27:36.000000000 +0000 @@ -152,6 +152,13 @@ readonly attribute Node? mozSourceNode; /** + * The window context that mouse was pressed over to begin the drag. For + * external drags, this will be null. + */ + [ChromeOnly] + readonly attribute WindowContext? sourceWindowContext; + + /** * The URI spec of the triggering principal. This may be different than * sourceNode's principal when sourceNode is xul:browser and the drag is * triggered in a browsing context inside it. diff -Nru firefox-esr-102.6.0esr/dom/webidl/Navigator.webidl firefox-esr-102.7.0esr/dom/webidl/Navigator.webidl --- firefox-esr-102.6.0esr/dom/webidl/Navigator.webidl 2022-12-05 23:00:22.000000000 +0000 +++ firefox-esr-102.7.0esr/dom/webidl/Navigator.webidl 2023-01-09 17:27:36.000000000 +0000 @@ -209,7 +209,7 @@ sequence getGamepads(); }; partial interface Navigator { - [Pref="dom.gamepad.test.enabled"] + [Throws, Pref="dom.gamepad.test.enabled"] GamepadServiceTest requestGamepadServiceTest(); }; @@ -228,7 +228,7 @@ void requestVRPresentation(VRDisplay display); }; partial interface Navigator { - [Pref="dom.vr.puppet.enabled"] + [Throws, Pref="dom.vr.puppet.enabled"] VRServiceTest requestVRServiceTest(); }; diff -Nru firefox-esr-102.6.0esr/dom/webidl/Performance.webidl firefox-esr-102.7.0esr/dom/webidl/Performance.webidl --- firefox-esr-102.6.0esr/dom/webidl/Performance.webidl 2022-12-05 23:00:22.000000000 +0000 +++ firefox-esr-102.7.0esr/dom/webidl/Performance.webidl 2023-01-09 17:27:36.000000000 +0000 @@ -72,13 +72,21 @@ }; // https://w3c.github.io/user-timing/#extensions-performance-interface +dictionary PerformanceMeasureOptions { + any detail; + (DOMString or DOMHighResTimeStamp) start; + DOMHighResTimeStamp duration; + (DOMString or DOMHighResTimeStamp) end; +}; + +// https://w3c.github.io/user-timing/#extensions-performance-interface [Exposed=(Window,Worker)] partial interface Performance { [Throws] PerformanceMark mark(DOMString markName, optional PerformanceMarkOptions markOptions = {}); void clearMarks(optional DOMString markName); [Throws] - void measure(DOMString measureName, optional DOMString startMark, optional DOMString endMark); + PerformanceMeasure measure(DOMString measureName, optional (DOMString or PerformanceMeasureOptions) startOrMeasureOptions = {}, optional DOMString endMark); void clearMeasures(optional DOMString measureName); }; diff -Nru firefox-esr-102.6.0esr/dom/webidl/PerformanceMeasure.webidl firefox-esr-102.7.0esr/dom/webidl/PerformanceMeasure.webidl --- firefox-esr-102.6.0esr/dom/webidl/PerformanceMeasure.webidl 2022-12-05 23:00:22.000000000 +0000 +++ firefox-esr-102.7.0esr/dom/webidl/PerformanceMeasure.webidl 2023-01-09 15:01:03.000000000 +0000 @@ -10,4 +10,5 @@ [Exposed=(Window,Worker)] interface PerformanceMeasure : PerformanceEntry { + readonly attribute any detail; }; diff -Nru firefox-esr-102.6.0esr/dom/websocket/WebSocket.cpp firefox-esr-102.7.0esr/dom/websocket/WebSocket.cpp --- firefox-esr-102.6.0esr/dom/websocket/WebSocket.cpp 2022-12-05 23:00:22.000000000 +0000 +++ firefox-esr-102.7.0esr/dom/websocket/WebSocket.cpp 2023-01-09 17:27:36.000000000 +0000 @@ -150,7 +150,8 @@ bool IsTargetThread() const; nsresult Init(JSContext* aCx, nsIPrincipal* aLoadingPrincipal, - nsIPrincipal* aPrincipal, bool aIsServerSide, + nsIPrincipal* aPrincipal, const Maybe& aClientInfo, + nsICSPEventListener* aCSPEventListener, bool aIsServerSide, const nsAString& aURL, nsTArray& aProtocolArray, const nsACString& aScriptFile, uint32_t aScriptLine, uint32_t aScriptColumn); @@ -1080,12 +1081,14 @@ class InitRunnable final : public WebSocketMainThreadRunnable { public: InitRunnable(WorkerPrivate* aWorkerPrivate, WebSocketImpl* aImpl, + const Maybe& aClientInfo, bool aIsServerSide, const nsAString& aURL, nsTArray& aProtocolArray, const nsACString& aScriptFile, uint32_t aScriptLine, uint32_t aScriptColumn) : WebSocketMainThreadRunnable(aWorkerPrivate, "WebSocket :: init"_ns), mImpl(aImpl), + mClientInfo(aClientInfo), mIsServerSide(aIsServerSide), mURL(aURL), mProtocolArray(aProtocolArray), @@ -1115,10 +1118,10 @@ return true; } - mErrorCode = - mImpl->Init(jsapi.cx(), mWorkerPrivate->GetPrincipal(), - doc->NodePrincipal(), mIsServerSide, mURL, mProtocolArray, - mScriptFile, mScriptLine, mScriptColumn); + mErrorCode = mImpl->Init( + jsapi.cx(), mWorkerPrivate->GetPrincipal(), doc->NodePrincipal(), + mClientInfo, mWorkerPrivate->CSPEventListener(), mIsServerSide, mURL, + mProtocolArray, mScriptFile, mScriptLine, mScriptColumn); return true; } @@ -1128,7 +1131,8 @@ mErrorCode = mImpl->Init(nullptr, mWorkerPrivate->GetPrincipal(), - aTopLevelWorkerPrivate->GetPrincipal(), mIsServerSide, mURL, + aTopLevelWorkerPrivate->GetPrincipal(), mClientInfo, + mWorkerPrivate->CSPEventListener(), mIsServerSide, mURL, mProtocolArray, mScriptFile, mScriptLine, mScriptColumn); return true; } @@ -1136,6 +1140,7 @@ // Raw pointer. This worker runnable runs synchronously. WebSocketImpl* mImpl; + Maybe mClientInfo; bool mIsServerSide; const nsAString& mURL; nsTArray& mProtocolArray; @@ -1319,8 +1324,8 @@ } aRv = webSocketImpl->Init(aGlobal.Context(), loadingPrincipal, principal, - !!aTransportProvider, aUrl, protocolArray, ""_ns, - 0, 0); + Nothing(), nullptr, !!aTransportProvider, aUrl, + protocolArray, ""_ns, 0, 0); if (NS_WARN_IF(aRv.Failed())) { return nullptr; @@ -1345,8 +1350,9 @@ } RefPtr runnable = new InitRunnable( - workerPrivate, webSocketImpl, !!aTransportProvider, aUrl, protocolArray, - nsDependentCString(file.get()), lineno, column); + workerPrivate, webSocketImpl, + workerPrivate->GlobalScope()->GetClientInfo(), !!aTransportProvider, + aUrl, protocolArray, nsDependentCString(file.get()), lineno, column); runnable->Dispatch(Canceling, aRv); if (NS_WARN_IF(aRv.Failed())) { return nullptr; @@ -1529,8 +1535,10 @@ //----------------------------------------------------------------------------- nsresult WebSocketImpl::Init(JSContext* aCx, nsIPrincipal* aLoadingPrincipal, - nsIPrincipal* aPrincipal, bool aIsServerSide, - const nsAString& aURL, + nsIPrincipal* aPrincipal, + const Maybe& aClientInfo, + nsICSPEventListener* aCSPEventListener, + bool aIsServerSide, const nsAString& aURL, nsTArray& aProtocolArray, const nsACString& aScriptFile, uint32_t aScriptLine, uint32_t aScriptColumn) { @@ -1627,7 +1635,11 @@ aPrincipal, // loading principal aPrincipal, // triggering principal originDoc, nsILoadInfo::SEC_ONLY_FOR_EXPLICIT_CONTENTSEC_CHECK, - nsIContentPolicy::TYPE_WEBSOCKET); + nsIContentPolicy::TYPE_WEBSOCKET, aClientInfo); + + if (aCSPEventListener) { + secCheckLoadInfo->SetCspEventListener(aCSPEventListener); + } int16_t shouldLoad = nsIContentPolicy::ACCEPT; rv = NS_CheckContentLoadPolicy(uri, secCheckLoadInfo, ""_ns, &shouldLoad, diff -Nru firefox-esr-102.6.0esr/gfx/layers/PersistentBufferProvider.cpp firefox-esr-102.7.0esr/gfx/layers/PersistentBufferProvider.cpp --- firefox-esr-102.6.0esr/gfx/layers/PersistentBufferProvider.cpp 2022-12-05 23:00:27.000000000 +0000 +++ firefox-esr-102.7.0esr/gfx/layers/PersistentBufferProvider.cpp 2023-01-09 17:27:36.000000000 +0000 @@ -250,7 +250,7 @@ // Get rid of everything else Destroy(); - if (prevTexture) { + if (prevTexture && prevTexture->IsValid()) { RefPtr newTexture = CreateTexture(aKnowsCompositor, mFormat, mSize); diff -Nru firefox-esr-102.6.0esr/js/src/devtools/automation/autospider.py firefox-esr-102.7.0esr/js/src/devtools/automation/autospider.py --- firefox-esr-102.6.0esr/js/src/devtools/automation/autospider.py 2022-12-05 23:00:22.000000000 +0000 +++ firefox-esr-102.7.0esr/js/src/devtools/automation/autospider.py 2023-01-09 17:27:37.000000000 +0000 @@ -492,7 +492,9 @@ COMMAND_PREFIX = [] # On Linux, disable ASLR to make shell builds a bit more reproducible. -if subprocess.call("type setarch >/dev/null 2>&1", shell=True) == 0: +# Bug 1795718 - Disable in automation for now as call to setarch requires extra +# docker privileges. +if not AUTOMATION and subprocess.call("type setarch >/dev/null 2>&1", shell=True) == 0: COMMAND_PREFIX.extend(["setarch", platform.machine(), "-R"]) diff -Nru firefox-esr-102.6.0esr/layout/style/Loader.cpp firefox-esr-102.7.0esr/layout/style/Loader.cpp --- firefox-esr-102.6.0esr/layout/style/Loader.cpp 2022-12-05 23:01:06.000000000 +0000 +++ firefox-esr-102.7.0esr/layout/style/Loader.cpp 2023-01-09 17:27:36.000000000 +0000 @@ -383,9 +383,9 @@ } SheetLoadData::~SheetLoadData() { - MOZ_DIAGNOSTIC_ASSERT(mSheetCompleteCalled || mIntentionallyDropped, - "Should always call SheetComplete, except when " - "dropping the load"); + MOZ_RELEASE_ASSERT(mSheetCompleteCalled || mIntentionallyDropped, + "Should always call SheetComplete, except when " + "dropping the load"); } NS_IMETHODIMP @@ -1882,11 +1882,9 @@ return Err(rv); } } else { -#ifdef MOZ_DIAGNOSTIC_ASSERT_ENABLED // We don't have to notify anyone of this load, as it was complete, so // drop it intentionally. data->mIntentionallyDropped = true; -#endif } // The load hasn't been completed yet, will be done in PostLoadEvent. @@ -2026,9 +2024,7 @@ // We're completely done. No need to notify, even, since the // @import rule addition/modification will trigger the right style // changes automatically. -#ifdef MOZ_DIAGNOSTIC_ASSERT_ENABLED data->mIntentionallyDropped = true; -#endif return NS_OK; } @@ -2121,9 +2117,7 @@ } else { // We don't have to notify anyone of this load, as it was complete, so // drop it intentionally. -#ifdef MOZ_DIAGNOSTIC_ASSERT_ENABLED data->mIntentionallyDropped = true; -#endif } return sheet; } diff -Nru firefox-esr-102.6.0esr/layout/style/SharedStyleSheetCache.cpp firefox-esr-102.7.0esr/layout/style/SharedStyleSheetCache.cpp --- firefox-esr-102.6.0esr/layout/style/SharedStyleSheetCache.cpp 2022-12-05 23:01:07.000000000 +0000 +++ firefox-esr-102.7.0esr/layout/style/SharedStyleSheetCache.cpp 2023-01-09 17:27:37.000000000 +0000 @@ -110,10 +110,8 @@ // Go through and deal with the whole linked list. auto* data = &aData; do { - MOZ_DIAGNOSTIC_ASSERT(!data->mSheetCompleteCalled); -#ifdef MOZ_DIAGNOSTIC_ASSERT_ENABLED + MOZ_RELEASE_ASSERT(!data->mSheetCompleteCalled); data->mSheetCompleteCalled = true; -#endif if (!data->mSheetAlreadyComplete) { // If mSheetAlreadyComplete, then the sheet could well be modified between diff -Nru firefox-esr-102.6.0esr/layout/style/SheetLoadData.h firefox-esr-102.7.0esr/layout/style/SheetLoadData.h --- firefox-esr-102.6.0esr/layout/style/SheetLoadData.h 2022-12-05 23:00:38.000000000 +0000 +++ firefox-esr-102.7.0esr/layout/style/SheetLoadData.h 2023-01-09 17:27:37.000000000 +0000 @@ -226,13 +226,11 @@ // The quirks mode of the loader at the time the load was triggered. const nsCompatibility mCompatMode; -#ifdef MOZ_DIAGNOSTIC_ASSERT_ENABLED // Whether SheetComplete was called. bool mSheetCompleteCalled = false; // Whether we intentionally are not calling SheetComplete because nobody is // listening for the load. bool mIntentionallyDropped = false; -#endif bool ShouldDefer() const { return mWasAlternate || !mMediaMatched; } diff -Nru firefox-esr-102.6.0esr/mozglue/build/TsanOptions.cpp firefox-esr-102.7.0esr/mozglue/build/TsanOptions.cpp --- firefox-esr-102.6.0esr/mozglue/build/TsanOptions.cpp 2022-12-05 23:00:55.000000000 +0000 +++ firefox-esr-102.7.0esr/mozglue/build/TsanOptions.cpp 2023-01-09 17:27:37.000000000 +0000 @@ -151,12 +151,7 @@ // Likely benign write-write race in libevent to set a sticky boolean // flag to true. "race:event_debug_mode_too_late\n" - // Bug 1648606 - permanent - // No Upstream Bug Filed! - // - // Race on some flag being checking in libusrsctp. - "race:sctp_close\n" - "race:sctp_iterator_work\n" + // Bug 1653618 - permanent // Upstream Bug: https://github.com/sctplab/usrsctp/issues/507 // @@ -168,6 +163,10 @@ // // Likely benign race in libusrsctp allocator during a free. "race:system_base_info\n" + // Benign lock-order-inversion in libusrsctp + // No upstream bug filed! + "deadlock:sctp_add_to_readq\n" + // Bug 1153409 - permanent // No Upstream Bug Filed! // diff -Nru firefox-esr-102.6.0esr/netwerk/dns/effective_tld_names.dat firefox-esr-102.7.0esr/netwerk/dns/effective_tld_names.dat --- firefox-esr-102.6.0esr/netwerk/dns/effective_tld_names.dat 2022-12-05 23:00:50.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/dns/effective_tld_names.dat 2023-01-09 17:27:37.000000000 +0000 @@ -7171,7 +7171,7 @@ // newGTLDs -// List of new gTLDs imported from https://www.icann.org/resources/registries/gtlds/v2/gtlds.json on 2022-11-29T15:14:18Z +// List of new gTLDs imported from https://www.icann.org/resources/registries/gtlds/v2/gtlds.json on 2022-12-07T15:13:11Z // This list is auto-generated, don't edit it manually. // aaa : 2015-02-26 American Automobile Association, Inc. aaa @@ -10461,9 +10461,6 @@ // xn--jlq480n2rg : 2019-12-19 Amazon Registry Services, Inc. 亚马逊 -// xn--jlq61u9w7b : 2015-01-08 Nokia Corporation -诺基亚 - // xn--jvr189m : 2015-02-26 Amazon Registry Services, Inc. 食品 diff -Nru firefox-esr-102.6.0esr/netwerk/protocol/http/Http2Session.cpp firefox-esr-102.7.0esr/netwerk/protocol/http/Http2Session.cpp --- firefox-esr-102.6.0esr/netwerk/protocol/http/Http2Session.cpp 2022-12-05 23:01:06.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/protocol/http/Http2Session.cpp 2023-01-09 17:27:37.000000000 +0000 @@ -1297,7 +1297,8 @@ RemoveStreamFromQueue(aStream, mSlowConsumersReadyForRead); } -void Http2Session::CloseStream(Http2Stream* aStream, nsresult aResult) { +void Http2Session::CloseStream(Http2Stream* aStream, nsresult aResult, + bool aRemoveFromQueue) { MOZ_ASSERT(OnSocketThread(), "not on socket thread"); LOG3(("Http2Session::CloseStream %p %p 0x%x %" PRIX32 "\n", this, aStream, aStream->StreamID(), static_cast(aResult))); @@ -1311,7 +1312,9 @@ mInputFrameDataStream = nullptr; } - RemoveStreamFromQueues(aStream); + if (aRemoveFromQueue) { + RemoveStreamFromQueues(aStream); + } if (aStream->IsTunnel()) { UnRegisterTunnel(aStream); @@ -2200,7 +2203,7 @@ if (self->mPeerGoAwayReason == HTTP_1_1_REQUIRED) { stream->Transaction()->DisableSpdy(); } - self->CloseStream(stream, NS_ERROR_NET_RESET); + self->CloseStream(stream, NS_ERROR_NET_RESET, false); self->mStreamTransactionHash.Remove(stream->Transaction()); } self->mQueuedStreams.Clear(); diff -Nru firefox-esr-102.6.0esr/netwerk/protocol/http/Http2Session.h firefox-esr-102.7.0esr/netwerk/protocol/http/Http2Session.h --- firefox-esr-102.6.0esr/netwerk/protocol/http/Http2Session.h 2022-12-05 23:01:12.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/protocol/http/Http2Session.h 2023-01-09 17:27:37.000000000 +0000 @@ -322,7 +322,8 @@ void GenerateGoAway(uint32_t); void CleanupStream(Http2Stream*, nsresult, errorType); void CleanupStream(uint32_t, nsresult, errorType); - void CloseStream(Http2Stream*, nsresult); + void CloseStream(Http2Stream* aStream, nsresult aResult, + bool aRemoveFromQueue = true); void SendHello(); void RemoveStreamFromQueues(Http2Stream*); [[nodiscard]] nsresult ParsePadding(uint8_t&, uint16_t&); diff -Nru firefox-esr-102.6.0esr/netwerk/protocol/http/nsHttpChannel.cpp firefox-esr-102.7.0esr/netwerk/protocol/http/nsHttpChannel.cpp --- firefox-esr-102.6.0esr/netwerk/protocol/http/nsHttpChannel.cpp 2022-12-05 23:01:11.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/protocol/http/nsHttpChannel.cpp 2023-01-09 17:27:37.000000000 +0000 @@ -5565,6 +5565,10 @@ &mTransactionTimings, std::move(mSource)); } + // If we don't have mTransactionPump and mCachePump, we need to call + // AsyncAbort to make sure this channel's listener got notified. + bool needAsyncAbort = !mTransactionPump && !mCachePump; + if (mProxyRequest) mProxyRequest->Cancel(status); CancelNetworkRequest(status); mCacheInputStream.CloseAndRelease(); @@ -5575,10 +5579,20 @@ mOnTailUnblock = nullptr; mRequestContext->CancelTailedRequest(this); CloseCacheEntry(false); + needAsyncAbort = false; Unused << AsyncAbort(status); } else if (channelClassifierCancellationPending) { // If we're coming from an asynchronous path when canceling a channel due // to safe-browsing protection, we need to AsyncAbort the channel now. + needAsyncAbort = false; + Unused << AsyncAbort(status); + } + + // If we already have mCallOnResume, AsyncAbort will be called in + // ResumeInternal. + if (needAsyncAbort && !mCallOnResume && !mSuspendCount) { + LOG(("nsHttpChannel::CancelInternal do AsyncAbort [this=%p]\n", this)); + CloseCacheEntry(false); Unused << AsyncAbort(status); } return NS_OK; diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/datachannel/DataChannel.cpp firefox-esr-102.7.0esr/netwerk/sctp/datachannel/DataChannel.cpp --- firefox-esr-102.6.0esr/netwerk/sctp/datachannel/DataChannel.cpp 2022-12-05 23:00:39.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/datachannel/DataChannel.cpp 2023-01-09 17:27:37.000000000 +0000 @@ -319,7 +319,8 @@ // Called when the buffer empties to the threshold value. This is called // from SctpDtlsInput() through the sctp stack. SctpDtlsInput() calls // usrsctp_conninput() under lock -static int threshold_event(struct socket* sock, uint32_t sb_free) { +static int threshold_event(struct socket* sock, uint32_t sb_free, + void* ulp_info) { RefPtr connection = GetConnectionFromSocket(sock); connection->mLock.AssertCurrentThreadOwns(); if (connection) { @@ -2380,30 +2381,31 @@ ASSERT_WEBRTC(!NS_IsMainThread()); DC_DEBUG(("In ReceiveCallback")); - if (!data) { - DC_DEBUG(("ReceiveCallback: SCTP has finished shutting down")); - } else { - bool locked = false; - if (!IsSTSThread()) { - mLock.Lock(); - locked = true; - } else { - mLock.AssertCurrentThreadOwns(); - } - if (flags & MSG_NOTIFICATION) { - HandleNotification(static_cast(data), datalen); - } else { - HandleMessage(data, datalen, ntohl(rcv.rcv_ppid), rcv.rcv_sid, flags); - } - if (locked) { - mLock.Unlock(); - } - // sctp allocates 'data' with malloc(), and expects the receiver to free - // it (presumably with free). - // XXX future optimization: try to deliver messages without an internal - // alloc/copy, and if so delay the free until later. - free(data); - } + // libusrsctp just went reentrant on us. Put a stop to this. + mSTS->Dispatch(NS_NewRunnableFunction( + "DataChannelConnection::ReceiveCallback", + [data, datalen, rcv, flags, this, + self = RefPtr(this)]() mutable { + if (!data) { + DC_DEBUG(("ReceiveCallback: SCTP has finished shutting down")); + } else { + mLock.Lock(); + if (flags & MSG_NOTIFICATION) { + HandleNotification(static_cast(data), + datalen); + } else { + HandleMessage(data, datalen, ntohl(rcv.rcv_ppid), rcv.rcv_sid, + flags); + } + mLock.Unlock(); + // sctp allocates 'data' with malloc(), and expects the receiver to + // free it (presumably with free). + // XXX future optimization: try to deliver messages without an + // internal alloc/copy, and if so delay the free until later. + free(data); + } + })); + // usrsctp defines the callback as returning an int, but doesn't use it return 1; } diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/sctp_update.log firefox-esr-102.7.0esr/netwerk/sctp/sctp_update.log --- firefox-esr-102.6.0esr/netwerk/sctp/sctp_update.log 2022-12-05 23:01:12.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/sctp_update.log 2023-01-09 15:01:10.000000000 +0000 @@ -18,3 +18,4 @@ sctp updated to version 9209 from SVN on Tue Mar 24 18:11:59 EDT 2015 sctp updated to version 0e076261b832121cf120ddc04aaff87ac3a34d30 from git on Tue Nov 28 15:20:51 EST 2017 sctp updated to version ea345b6d0c8a0f8701cf49445dba5ec8d34e2305 from git on Tue 30 Jun 14:01:18 CEST 2020 +sctp updated to version 8e12cd9e01fc94d2e84ea1afa351c845966e116e from git on Mon Oct 17 10:23:01 CDT 2022 diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp.h firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp.h --- firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp.h 2022-12-05 23:01:11.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp.h 2023-01-09 15:01:10.000000000 +0000 @@ -34,7 +34,7 @@ #if defined(__FreeBSD__) && !defined(__Userspace__) #include -__FBSDID("$FreeBSD: head/sys/netinet/sctp.h 356357 2020-01-04 20:33:12Z tuexen $"); +__FBSDID("$FreeBSD$"); #endif #ifndef _NETINET_SCTP_H_ @@ -43,10 +43,8 @@ #if defined(__APPLE__) || defined(__linux__) #include #endif - #include - #if !defined(_WIN32) #define SCTP_PACKED __attribute__((packed)) #else @@ -191,7 +189,6 @@ #define SCTP_STREAM_RESET_INCOMING 0x00000001 #define SCTP_STREAM_RESET_OUTGOING 0x00000002 - /* here on down are more implementation specific */ #define SCTP_SET_DEBUG_LEVEL 0x00001005 #define SCTP_CLR_STAT_LOG 0x00001007 @@ -213,7 +210,6 @@ #define SCTP_PCB_STATUS 0x00001104 #define SCTP_GET_NONCE_VALUES 0x00001105 - /* Special hook for dynamically setting primary for all assoc's, * this is a write only option that requires root privilege. */ @@ -336,7 +332,6 @@ /* First-come, first-serve */ #define SCTP_SS_FIRST_COME 0x00000005 - /* fragment interleave constants * setting must be one of these or * EINVAL returned. @@ -607,7 +602,6 @@ #define SCTP_MOBILITY_FASTHANDOFF 0x00000002 #define SCTP_MOBILITY_PRIM_DELETED 0x00000004 - /* Smallest PMTU allowed when disabling PMTU discovery */ #define SCTP_SMALLEST_PMTU 512 /* Largest PMTU allowed when disabling PMTU discovery */ @@ -632,9 +626,9 @@ */ #define SCTP_MAX_SACK_DELAY 500 /* per RFC4960 */ #define SCTP_MAX_HB_INTERVAL 14400000 /* 4 hours in ms */ +#define SCTP_MIN_COOKIE_LIFE 1000 /* 1 second in ms */ #define SCTP_MAX_COOKIE_LIFE 3600000 /* 1 hour in ms */ - /* Types of logging/KTR tracing that can be enabled via the * sysctl net.inet.sctp.sctp_logging. You must also enable * SUBSYS tracing. diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_asconf.c firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_asconf.c --- firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_asconf.c 2022-12-05 23:00:38.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_asconf.c 2023-01-09 15:01:10.000000000 +0000 @@ -34,7 +34,7 @@ #if defined(__FreeBSD__) && !defined(__Userspace__) #include -__FBSDID("$FreeBSD: head/sys/netinet/sctp_asconf.c 362377 2020-06-19 12:35:29Z tuexen $"); +__FBSDID("$FreeBSD$"); #endif #include @@ -555,8 +555,8 @@ /* notify upper layer */ sctp_ulp_notify(SCTP_NOTIFY_ASCONF_SET_PRIMARY, stcb, 0, sa, SCTP_SO_NOT_LOCKED); if ((stcb->asoc.primary_destination->dest_state & SCTP_ADDR_REACHABLE) && - (!(stcb->asoc.primary_destination->dest_state & SCTP_ADDR_PF)) && - (stcb->asoc.alternate)) { + ((stcb->asoc.primary_destination->dest_state & SCTP_ADDR_PF) == 0) && + (stcb->asoc.alternate != NULL)) { sctp_free_remote_addr(stcb->asoc.alternate); stcb->asoc.alternate = NULL; } @@ -584,7 +584,6 @@ SCTP_MOBILITY_PRIM_DELETED) && (stcb->asoc.primary_destination->dest_state & SCTP_ADDR_UNCONFIRMED) == 0) { - sctp_timer_stop(SCTP_TIMER_TYPE_PRIM_DELETED, stcb->sctp_ep, stcb, NULL, SCTP_FROM_SCTP_ASCONF + SCTP_LOC_1); @@ -738,7 +737,7 @@ sctp_m_freem(m_ack); return; } - if (param_length <= sizeof(struct sctp_paramhdr)) { + if (param_length < sizeof(struct sctp_asconf_paramhdr)) { SCTPDBG(SCTP_DEBUG_ASCONF1, "handle_asconf: param length (%u) too short\n", param_length); sctp_m_freem(m_ack); return; @@ -1008,7 +1007,6 @@ } } - void sctp_assoc_immediate_retrans(struct sctp_tcb *stcb, struct sctp_nets *dstnet) { @@ -1134,7 +1132,7 @@ return; } - /* Multiple local addresses exsist in the association. */ + /* Multiple local addresses exist in the association. */ TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) { /* clear any cached route and source address */ #if defined(__FreeBSD__) && !defined(__Userspace__) @@ -1369,7 +1367,6 @@ return (0); } - /* * add an asconf operation for the given ifa and type. * type = SCTP_ADD_IP_ADDRESS, SCTP_DEL_IP_ADDRESS, SCTP_SET_PRIM_ADDR. @@ -1741,7 +1738,7 @@ SCTPDBG(SCTP_DEBUG_ASCONF1, "handle_asconf_ack: got unexpected next serial number! Aborting asoc!\n"); SCTP_SNPRINTF(msg, sizeof(msg), "Never sent serial number %8.8x", serial_num); op_err = sctp_generate_cause(SCTP_CAUSE_PROTOCOL_VIOLATION, msg); - sctp_abort_an_association(stcb->sctp_ep, stcb, op_err, SCTP_SO_NOT_LOCKED); + sctp_abort_an_association(stcb->sctp_ep, stcb, op_err, false, SCTP_SO_NOT_LOCKED); *abort_no_unlock = 1; return; } @@ -1780,7 +1777,7 @@ sctp_asconf_ack_clear(stcb); return; } - if (param_length < sizeof(struct sctp_paramhdr)) { + if (param_length < sizeof(struct sctp_asconf_paramhdr)) { sctp_asconf_ack_clear(stcb); return; } @@ -1989,7 +1986,7 @@ sin6 = &ifa->address.sin6; if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) { - /* we skip unspecifed addresses */ + /* we skip unspecified addresses */ return; } if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr)) { @@ -2020,7 +2017,7 @@ sin = &ifa->address.sin; if (sin->sin_addr.s_addr == 0) { - /* we skip unspecifed addresses */ + /* we skip unspecified addresses */ return; } if (stcb->asoc.scope.ipv4_local_scope == 0 && @@ -2061,7 +2058,6 @@ } } - int sctp_asconf_iterator_ep(struct sctp_inpcb *inp, void *ptr, uint32_t val SCTP_UNUSED) { @@ -2125,7 +2121,6 @@ laddr->action = 0; break; } - } } else if (l->action == SCTP_DEL_IP_ADDRESS) { LIST_FOREACH_SAFE(laddr, &inp->sctp_addr_list, sctp_nxt_addr, nladdr) { @@ -2177,7 +2172,7 @@ } sin6 = &ifa->address.sin6; if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) { - /* we skip unspecifed addresses */ + /* we skip unspecified addresses */ continue; } #if defined(__FreeBSD__) && !defined(__Userspace__) @@ -2211,7 +2206,7 @@ sin = &ifa->address.sin; if (sin->sin_addr.s_addr == 0) { - /* we skip unspecifed addresses */ + /* we skip unspecified addresses */ continue; } #if defined(__FreeBSD__) && !defined(__Userspace__) @@ -2242,7 +2237,6 @@ return; else continue; - break; } if (type == SCTP_ADD_IP_ADDRESS) { @@ -2272,7 +2266,6 @@ */ stcb->asoc.cc_functions.sctp_set_initial_cc_param(stcb, net); net->RTO = 0; - } } } else if (type == SCTP_SET_PRIM_ADDR) { @@ -2501,7 +2494,7 @@ sin = &sctp_ifa->address.sin; if (sin->sin_addr.s_addr == 0) { - /* skip unspecifed addresses */ + /* skip unspecified addresses */ continue; } #if defined(__FreeBSD__) && !defined(__Userspace__) @@ -2535,7 +2528,7 @@ sin6 = &sctp_ifa->address.sin6; if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) { - /* we skip unspecifed addresses */ + /* we skip unspecified addresses */ continue; } #if defined(__FreeBSD__) && !defined(__Userspace__) @@ -2605,7 +2598,7 @@ struct sctp_asconf_chunk *acp; struct sctp_asconf_paramhdr *aph; struct sctp_asconf_addr_param *aap; - uint32_t p_length; + uint32_t p_length, overhead; uint32_t correlation_id = 1; /* 0 is reserved... */ caddr_t ptr, lookup_ptr; uint8_t lookup_used = 0; @@ -2618,6 +2611,20 @@ if (aa == NULL) return (NULL); + /* Consider IP header and SCTP common header. */ + if (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) { + overhead = SCTP_MIN_OVERHEAD; + } else { + overhead = SCTP_MIN_V4_OVERHEAD; + } + /* Consider ASONF chunk. */ + overhead += sizeof(struct sctp_asconf_chunk); + /* Consider AUTH chunk. */ + overhead += sctp_get_auth_chunk_len(stcb->asoc.peer_hmac_id); + if (stcb->asoc.smallest_mtu <= overhead) { + /* MTU too small. */ + return (NULL); + } /* * get a chunk header mbuf and a cluster for the asconf params since * it's simpler to fill in the asconf chunk header lookup address on @@ -2627,14 +2634,14 @@ if (m_asconf_chk == NULL) { /* no mbuf's */ SCTPDBG(SCTP_DEBUG_ASCONF1, - "compose_asconf: couldn't get chunk mbuf!\n"); + "sctp_compose_asconf: couldn't get chunk mbuf!\n"); return (NULL); } m_asconf = sctp_get_mbuf_for_msg(MCLBYTES, 0, M_NOWAIT, 1, MT_DATA); if (m_asconf == NULL) { /* no mbuf's */ SCTPDBG(SCTP_DEBUG_ASCONF1, - "compose_asconf: couldn't get mbuf!\n"); + "sctp_compose_asconf: couldn't get mbuf!\n"); sctp_m_freem(m_asconf_chk); return (NULL); } @@ -2659,7 +2666,7 @@ /* get the parameter length */ p_length = SCTP_SIZE32(aa->ap.aph.ph.param_length); /* will it fit in current chunk? */ - if ((SCTP_BUF_LEN(m_asconf) + p_length > stcb->asoc.smallest_mtu) || + if ((SCTP_BUF_LEN(m_asconf) + p_length > stcb->asoc.smallest_mtu - overhead) || (SCTP_BUF_LEN(m_asconf) + p_length > MCLBYTES)) { /* won't fit, so we're done with this chunk */ break; @@ -2759,10 +2766,12 @@ break; #endif default: - p_size = 0; - addr_size = 0; - addr_ptr = NULL; - break; + SCTPDBG(SCTP_DEBUG_ASCONF1, + "sctp_compose_asconf: no usable lookup addr (family = %d)!\n", + found_addr->sa_family); + sctp_m_freem(m_asconf_chk); + sctp_m_freem(m_asconf); + return (NULL); } lookup->ph.param_length = htons(SCTP_SIZE32(p_size)); memcpy(lookup->addr, addr_ptr, addr_size); @@ -2770,12 +2779,10 @@ } else { /* uh oh... don't have any address?? */ SCTPDBG(SCTP_DEBUG_ASCONF1, - "compose_asconf: no lookup addr!\n"); - /* XXX for now, we send a IPv4 address of 0.0.0.0 */ - lookup->ph.param_type = htons(SCTP_IPV4_ADDRESS); - lookup->ph.param_length = htons(SCTP_SIZE32(sizeof(struct sctp_ipv4addr_param))); - memset(lookup->addr, 0, sizeof(struct in_addr)); - SCTP_BUF_LEN(m_asconf_chk) += SCTP_SIZE32(sizeof(struct sctp_ipv4addr_param)); + "sctp_compose_asconf: no lookup addr!\n"); + sctp_m_freem(m_asconf_chk); + sctp_m_freem(m_asconf); + return (NULL); } } /* chain it all together */ @@ -3315,10 +3322,9 @@ } void -sctp_asconf_send_nat_state_update(struct sctp_tcb *stcb, - struct sctp_nets *net) +sctp_asconf_send_nat_state_update(struct sctp_tcb *stcb, struct sctp_nets *net) { - struct sctp_asconf_addr *aa; + struct sctp_asconf_addr *aa_vtag, *aa_add, *aa_del; struct sctp_ifa *sctp_ifap; struct sctp_asconf_tag_param *vtag; #ifdef INET @@ -3327,6 +3333,7 @@ #ifdef INET6 struct sockaddr_in6 *to6; #endif + if (net == NULL) { SCTPDBG(SCTP_DEBUG_ASCONF1, "sctp_asconf_send_nat_state_update: Missing net\n"); return; @@ -3335,108 +3342,84 @@ SCTPDBG(SCTP_DEBUG_ASCONF1, "sctp_asconf_send_nat_state_update: Missing stcb\n"); return; } - /* Need to have in the asconf: - * - vtagparam(my_vtag/peer_vtag) - * - add(0.0.0.0) - * - del(0.0.0.0) - * - Any global addresses add(addr) - */ - SCTP_MALLOC(aa, struct sctp_asconf_addr *, sizeof(*aa), - SCTP_M_ASC_ADDR); - if (aa == NULL) { - /* didn't get memory */ - SCTPDBG(SCTP_DEBUG_ASCONF1, - "sctp_asconf_send_nat_state_update: failed to get memory!\n"); + /* Need to have in the ASCONF: + * - VTAG(my_vtag/peer_vtag) + * - ADD(wildcard) + * - DEL(wildcard) + * - ADD(Any global addresses) + */ + SCTP_MALLOC(aa_vtag, struct sctp_asconf_addr *, sizeof(struct sctp_asconf_addr), SCTP_M_ASC_ADDR); + SCTP_MALLOC(aa_add, struct sctp_asconf_addr *, sizeof(struct sctp_asconf_addr), SCTP_M_ASC_ADDR); + SCTP_MALLOC(aa_del, struct sctp_asconf_addr *, sizeof(struct sctp_asconf_addr), SCTP_M_ASC_ADDR); + + if ((aa_vtag == NULL) || (aa_add == NULL) || (aa_del == NULL)) { + /* Didn't get memory */ + SCTPDBG(SCTP_DEBUG_ASCONF1, "sctp_asconf_send_nat_state_update: failed to get memory!\n"); +out: + if (aa_vtag != NULL) { + SCTP_FREE(aa_vtag, SCTP_M_ASC_ADDR); + } + if (aa_add != NULL) { + SCTP_FREE(aa_add, SCTP_M_ASC_ADDR); + } + if (aa_del != NULL) { + SCTP_FREE(aa_del, SCTP_M_ASC_ADDR); + } return; } - aa->special_del = 0; - /* fill in asconf address parameter fields */ - /* top level elements are "networked" during send */ - aa->ifa = NULL; - aa->sent = 0; /* clear sent flag */ - vtag = (struct sctp_asconf_tag_param *)&aa->ap.aph; + memset(aa_vtag, 0, sizeof(struct sctp_asconf_addr)); + aa_vtag->special_del = 0; + /* Fill in ASCONF address parameter fields. */ + /* Top level elements are "networked" during send. */ + aa_vtag->ifa = NULL; + aa_vtag->sent = 0; /* clear sent flag */ + vtag = (struct sctp_asconf_tag_param *)&aa_vtag->ap.aph; vtag->aph.ph.param_type = SCTP_NAT_VTAGS; vtag->aph.ph.param_length = sizeof(struct sctp_asconf_tag_param); vtag->local_vtag = htonl(stcb->asoc.my_vtag); vtag->remote_vtag = htonl(stcb->asoc.peer_vtag); - TAILQ_INSERT_TAIL(&stcb->asoc.asconf_queue, aa, next); - SCTP_MALLOC(aa, struct sctp_asconf_addr *, sizeof(*aa), - SCTP_M_ASC_ADDR); - if (aa == NULL) { - /* didn't get memory */ - SCTPDBG(SCTP_DEBUG_ASCONF1, - "sctp_asconf_send_nat_state_update: failed to get memory!\n"); - return; - } - memset(aa, 0, sizeof(struct sctp_asconf_addr)); - /* fill in asconf address parameter fields */ - /* ADD(0.0.0.0) */ + memset(aa_add, 0, sizeof(struct sctp_asconf_addr)); + memset(aa_del, 0, sizeof(struct sctp_asconf_addr)); switch (net->ro._l_addr.sa.sa_family) { #ifdef INET case AF_INET: - aa->ap.aph.ph.param_type = SCTP_ADD_IP_ADDRESS; - aa->ap.aph.ph.param_length = sizeof(struct sctp_asconf_addrv4_param); - aa->ap.addrp.ph.param_type = SCTP_IPV4_ADDRESS; - aa->ap.addrp.ph.param_length = sizeof (struct sctp_ipv4addr_param); - /* No need to add an address, we are using 0.0.0.0 */ - TAILQ_INSERT_TAIL(&stcb->asoc.asconf_queue, aa, next); + aa_add->ap.aph.ph.param_type = SCTP_ADD_IP_ADDRESS; + aa_add->ap.aph.ph.param_length = sizeof(struct sctp_asconf_addrv4_param); + aa_add->ap.addrp.ph.param_type = SCTP_IPV4_ADDRESS; + aa_add->ap.addrp.ph.param_length = sizeof (struct sctp_ipv4addr_param); + /* No need to fill the address, we are using 0.0.0.0 */ + aa_del->ap.aph.ph.param_type = SCTP_DEL_IP_ADDRESS; + aa_del->ap.aph.ph.param_length = sizeof(struct sctp_asconf_addrv4_param); + aa_del->ap.addrp.ph.param_type = SCTP_IPV4_ADDRESS; + aa_del->ap.addrp.ph.param_length = sizeof (struct sctp_ipv4addr_param); + /* No need to fill the address, we are using 0.0.0.0 */ break; #endif #ifdef INET6 case AF_INET6: - aa->ap.aph.ph.param_type = SCTP_ADD_IP_ADDRESS; - aa->ap.aph.ph.param_length = sizeof(struct sctp_asconf_addr_param); - aa->ap.addrp.ph.param_type = SCTP_IPV6_ADDRESS; - aa->ap.addrp.ph.param_length = sizeof (struct sctp_ipv6addr_param); - /* No need to add an address, we are using 0.0.0.0 */ - TAILQ_INSERT_TAIL(&stcb->asoc.asconf_queue, aa, next); + aa_add->ap.aph.ph.param_type = SCTP_ADD_IP_ADDRESS; + aa_add->ap.aph.ph.param_length = sizeof(struct sctp_asconf_addr_param); + aa_add->ap.addrp.ph.param_type = SCTP_IPV6_ADDRESS; + aa_add->ap.addrp.ph.param_length = sizeof (struct sctp_ipv6addr_param); + /* No need to fill the address, we are using ::0 */ + aa_del->ap.aph.ph.param_type = SCTP_DEL_IP_ADDRESS; + aa_del->ap.aph.ph.param_length = sizeof(struct sctp_asconf_addr_param); + aa_del->ap.addrp.ph.param_type = SCTP_IPV6_ADDRESS; + aa_del->ap.addrp.ph.param_length = sizeof (struct sctp_ipv6addr_param); + /* No need to fill the address, we are using ::0 */ break; #endif default: SCTPDBG(SCTP_DEBUG_ASCONF1, - "sctp_asconf_send_nat_state_update: unknown address family\n"); - SCTP_FREE(aa, SCTP_M_ASC_ADDR); - return; - } - SCTP_MALLOC(aa, struct sctp_asconf_addr *, sizeof(*aa), - SCTP_M_ASC_ADDR); - if (aa == NULL) { - /* didn't get memory */ - SCTPDBG(SCTP_DEBUG_ASCONF1, - "sctp_asconf_send_nat_state_update: failed to get memory!\n"); - return; - } - memset(aa, 0, sizeof(struct sctp_asconf_addr)); - /* fill in asconf address parameter fields */ - /* ADD(0.0.0.0) */ - switch (net->ro._l_addr.sa.sa_family) { -#ifdef INET - case AF_INET: - aa->ap.aph.ph.param_type = SCTP_ADD_IP_ADDRESS; - aa->ap.aph.ph.param_length = sizeof(struct sctp_asconf_addrv4_param); - aa->ap.addrp.ph.param_type = SCTP_IPV4_ADDRESS; - aa->ap.addrp.ph.param_length = sizeof (struct sctp_ipv4addr_param); - /* No need to add an address, we are using 0.0.0.0 */ - TAILQ_INSERT_TAIL(&stcb->asoc.asconf_queue, aa, next); - break; -#endif -#ifdef INET6 - case AF_INET6: - aa->ap.aph.ph.param_type = SCTP_DEL_IP_ADDRESS; - aa->ap.aph.ph.param_length = sizeof(struct sctp_asconf_addr_param); - aa->ap.addrp.ph.param_type = SCTP_IPV6_ADDRESS; - aa->ap.addrp.ph.param_length = sizeof (struct sctp_ipv6addr_param); - /* No need to add an address, we are using 0.0.0.0 */ - TAILQ_INSERT_TAIL(&stcb->asoc.asconf_queue, aa, next); - break; -#endif - default: - SCTPDBG(SCTP_DEBUG_ASCONF1, - "sctp_asconf_send_nat_state_update: unknown address family\n"); - SCTP_FREE(aa, SCTP_M_ASC_ADDR); - return; - } + "sctp_asconf_send_nat_state_update: unknown address family %d\n", + net->ro._l_addr.sa.sa_family); + goto out; + } + TAILQ_INSERT_TAIL(&stcb->asoc.asconf_queue, aa_vtag, next); + TAILQ_INSERT_TAIL(&stcb->asoc.asconf_queue, aa_add, next); + TAILQ_INSERT_TAIL(&stcb->asoc.asconf_queue, aa_del, next); + /* Now we must hunt the addresses and add all global addresses */ if (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_BOUNDALL) { struct sctp_vrf *vrf = NULL; diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_asconf.h firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_asconf.h --- firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_asconf.h 2022-12-05 23:00:38.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_asconf.h 2023-01-09 15:01:10.000000000 +0000 @@ -34,7 +34,7 @@ #if defined(__FreeBSD__) && !defined(__Userspace__) #include -__FBSDID("$FreeBSD: head/sys/netinet/sctp_asconf.h 362377 2020-06-19 12:35:29Z tuexen $"); +__FBSDID("$FreeBSD$"); #endif #ifndef _NETINET_SCTP_ASCONF_H_ @@ -61,7 +61,6 @@ sctp_addr_mgmt_ep_sa(struct sctp_inpcb *, struct sockaddr *, uint32_t, uint32_t); - extern int sctp_asconf_iterator_ep(struct sctp_inpcb *inp, void *ptr, uint32_t val); extern void sctp_asconf_iterator_stcb(struct sctp_inpcb *inp, @@ -69,7 +68,6 @@ void *ptr, uint32_t type); extern void sctp_asconf_iterator_end(void *ptr, uint32_t val); - extern int32_t sctp_set_primary_ip_address_sa(struct sctp_tcb *, struct sockaddr *); diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_auth.c firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_auth.c --- firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_auth.c 2022-12-05 23:00:39.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_auth.c 2023-01-09 15:01:10.000000000 +0000 @@ -34,7 +34,7 @@ #if defined(__FreeBSD__) && !defined(__Userspace__) #include -__FBSDID("$FreeBSD: head/sys/netinet/sctp_auth.c 362054 2020-06-11 13:34:09Z tuexen $"); +__FBSDID("$FreeBSD$"); #endif #include @@ -53,7 +53,6 @@ #define SCTP_AUTH_DEBUG2 (SCTP_BASE_SYSCTL(sctp_debug_on) & SCTP_DEBUG_AUTH2) #endif /* SCTP_DEBUG */ - void sctp_clear_chunklist(sctp_auth_chklist_t *chklist) { @@ -101,7 +100,6 @@ return (new_list); } - /* * add a chunk to the required chunks list */ @@ -241,7 +239,6 @@ return (size); } - /* * allocate structure space for a key of length keylen */ @@ -458,7 +455,6 @@ return (new_key); } - sctp_sharedkey_t * sctp_alloc_sharedkey(void) { @@ -632,7 +628,6 @@ return (count); } - sctp_hmaclist_t * sctp_alloc_hmaclist(uint16_t num_hmacs) { @@ -826,7 +821,6 @@ /* SCTP_FREE(authinfo, SCTP_M_AUTH_??); */ } - uint32_t sctp_get_auth_chunk_len(uint16_t hmac_algo) { @@ -1166,7 +1160,6 @@ return (0); } - /*- * clear any cached key(s) if they match the given key id on an association. * the cached key(s) will be recomputed and re-cached at next use. @@ -1579,7 +1572,6 @@ m, auth_offset, auth->hmac); } - static void sctp_zero_m(struct mbuf *m, uint32_t m_offset, uint32_t size) { @@ -1645,11 +1637,9 @@ "SCTP AUTH Chunk: shared key %u, HMAC id %u\n", shared_key_id, hmac_id); -#if defined(__Userspace__) -#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION +#if defined(__Userspace__) && defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) return (0); #endif -#endif /* is the indicated HMAC supported? */ if (!sctp_auth_is_supported_hmac(stcb->asoc.local_hmacs, hmac_id)) { struct mbuf *op_err; @@ -1800,7 +1790,6 @@ &stcb->sctp_socket->so_rcv, 1, SCTP_READ_LOCK_NOT_HELD, so_locked); } - /*- * validates the AUTHentication related parameters in an INIT/INIT-ACK * Note: currently only used for INIT as INIT-ACK is handled inline @@ -1915,7 +1904,6 @@ saw_asconf = 1; if (chunks->chunk_types[i] == SCTP_ASCONF_ACK) saw_asconf_ack = 1; - } if (num_chunks) got_chklist = 1; diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_auth.h firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_auth.h --- firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_auth.h 2022-12-05 23:00:50.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_auth.h 2023-01-09 15:01:10.000000000 +0000 @@ -34,7 +34,7 @@ #if defined(__FreeBSD__) && !defined(__Userspace__) #include -__FBSDID("$FreeBSD: head/sys/netinet/sctp_auth.h 338749 2018-09-18 10:53:07Z tuexen $"); +__FBSDID("$FreeBSD$"); #endif #ifndef _NETINET_SCTP_AUTH_H_ @@ -99,8 +99,6 @@ uint16_t recv_keyid; /* last recv keyid (cached) */ } sctp_authinfo_t; - - /* * Macros */ @@ -149,7 +147,6 @@ extern void sctp_auth_key_release(struct sctp_tcb *stcb, uint16_t keyid, int so_locked); - /* hmac list handling */ extern sctp_hmaclist_t *sctp_alloc_hmaclist(uint16_t num_hmacs); extern void sctp_free_hmaclist(sctp_hmaclist_t *list); diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_bsd_addr.c firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_bsd_addr.c --- firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_bsd_addr.c 2022-12-05 23:01:06.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_bsd_addr.c 2023-01-09 15:01:10.000000000 +0000 @@ -34,7 +34,7 @@ #if defined(__FreeBSD__) && !defined(__Userspace__) #include -__FBSDID("$FreeBSD: head/sys/netinet/sctp_bsd_addr.c 358080 2020-02-18 19:41:55Z tuexen $"); +__FBSDID("$FreeBSD$"); #endif #include @@ -78,8 +78,8 @@ /* Global NON-VNET structure that controls the iterator */ struct iterator_control sctp_it_ctl; - #if !(defined(__FreeBSD__) && !defined(__Userspace__)) + static void sctp_cleanup_itqueue(void) { @@ -195,7 +195,7 @@ kproc_create(sctp_iterator_thread, (void *)NULL, &sctp_it_ctl.thread_proc, - RFPROC, + 0, SCTP_KTHREAD_PAGES, SCTP_KTRHEAD_NAME); #elif defined(__APPLE__) @@ -244,7 +244,6 @@ #endif /* __Userspace__ */ #endif /* INET6 */ - #if !defined(__Userspace__) static uint32_t sctp_is_desired_interface_type(struct ifnet *ifn) @@ -294,13 +293,14 @@ return (result); } #endif - #if defined(__APPLE__) && !defined(__Userspace__) + int sctp_is_vmware_interface(struct ifnet *ifn) { return (strncmp(ifnet_name(ifn), "vmnet", 5) == 0); } + #endif #if defined(_WIN32) && defined(__Userspace__) @@ -448,7 +448,7 @@ #if defined(INET6) if ((ifa->ifa_addr->sa_family == AF_INET6) && IN6_IS_ADDR_UNSPECIFIED(&((struct sockaddr_in6 *)ifa->ifa_addr)->sin6_addr)) { - /* skip unspecifed addresses */ + /* skip unspecified addresses */ continue; } #endif @@ -476,7 +476,6 @@ #endif } #endif - #if defined(__APPLE__) && !defined(__Userspace__) static void sctp_init_ifns_for_vrf(int vrfid) @@ -522,7 +521,7 @@ } if (ifa->ifa_addr->sa_family == AF_INET6) { if (IN6_IS_ADDR_UNSPECIFIED(&((struct sockaddr_in6 *)ifa->ifa_addr)->sin6_addr)) { - /* skip unspecifed addresses */ + /* skip unspecified addresses */ continue; } } else { @@ -555,7 +554,6 @@ ifnet_list_free(ifnetlist); } #endif - #if defined(__FreeBSD__) && !defined(__Userspace__) static void sctp_init_ifns_for_vrf(int vrfid) @@ -596,7 +594,7 @@ #ifdef INET6 case AF_INET6: if (IN6_IS_ADDR_UNSPECIFIED(&((struct sockaddr_in6 *)ifa->ifa_addr)->sin6_addr)) { - /* skip unspecifed addresses */ + /* skip unspecified addresses */ continue; } break; @@ -701,7 +699,7 @@ case AF_INET6: ifa_flags = ((struct in6_ifaddr *)ifa)->ia6_flags; if (IN6_IS_ADDR_UNSPECIFIED(&((struct sockaddr_in6 *)ifa->ifa_addr)->sin6_addr)) { - /* skip unspecifed addresses */ + /* skip unspecified addresses */ return; } break; @@ -719,7 +717,6 @@ #endif (void *)ifa, ifa->ifa_addr, ifa_flags, 1); } else { - sctp_del_addr_from_vrf(SCTP_DEFAULT_VRFID, ifa->ifa_addr, #if defined(__APPLE__) && !defined(__Userspace__) ifnet_index(ifa->ifa_ifp), @@ -777,9 +774,9 @@ struct mbuf *m = NULL; #if defined(__FreeBSD__) || defined(__Userspace__) #if defined(__Userspace__) - m = m_getm2(NULL, space_needed, how, type, want_header ? M_PKTHDR : 0, allonebuf); + m = m_getm2(NULL, space_needed, how, type, want_header ? M_PKTHDR : 0, allonebuf); #else - m = m_getm2(NULL, space_needed, how, type, want_header ? M_PKTHDR : 0); + m = m_getm2(NULL, space_needed, how, type, want_header ? M_PKTHDR : 0); #endif if (m == NULL) { /* bad, no memory */ @@ -791,7 +788,7 @@ m_freem(m); return (NULL); } - KASSERT(SCTP_BUF_NEXT(m) == NULL, ("%s: no chain allowed", __FUNCTION__)); + KASSERT(SCTP_BUF_NEXT(m) == NULL, ("%s: no chain allowed", __func__)); } #endif #ifdef SCTP_MBUF_LOGGING @@ -845,7 +842,6 @@ return (m); } - #ifdef SCTP_PACKET_LOGGING void sctp_packet_log(struct mbuf *m) @@ -921,7 +917,6 @@ SCTP_BASE_VAR(packet_log_end)); SCTP_BASE_VAR(packet_log_end) = 0; goto no_log; - } lenat = (int *)&SCTP_BASE_VAR(packet_log_buffer)[thisbegin]; *lenat = total_len; @@ -947,7 +942,6 @@ atomic_subtract_int(&SCTP_BASE_VAR(packet_log_writers), 1); } - int sctp_copy_out_packet_log(uint8_t *target, int length) { @@ -955,11 +949,10 @@ * start copying up to length bytes out. * We return the number of bytes copied. */ - int tocopy, this_copy; + int this_copy; int *lenat; int did_delay = 0; - tocopy = length; if (length < (int)(2 * sizeof(int))) { /* not enough room */ return (0); @@ -987,7 +980,7 @@ memcpy((void *)lenat, (void *)SCTP_BASE_VAR(packet_log_buffer), this_copy); if (SCTP_PKTLOG_WRITERS_NEED_LOCK) { atomic_subtract_int(&SCTP_BASE_VAR(packet_log_writers), - SCTP_PKTLOG_WRITERS_NEED_LOCK); + SCTP_PKTLOG_WRITERS_NEED_LOCK); } SCTP_IP_PKTLOG_UNLOCK(); return (this_copy + sizeof(int)); diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_bsd_addr.h firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_bsd_addr.h --- firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_bsd_addr.h 2022-12-05 23:01:12.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_bsd_addr.h 2023-01-09 15:01:10.000000000 +0000 @@ -34,7 +34,7 @@ #if defined(__FreeBSD__) && !defined(__Userspace__) #include -__FBSDID("$FreeBSD: head/sys/netinet/sctp_bsd_addr.h 353480 2019-10-13 18:17:08Z tuexen $"); +__FBSDID("$FreeBSD$"); #endif #ifndef _NETINET_SCTP_BSD_ADDR_H_ @@ -49,7 +49,6 @@ void sctp_startup_iterator(void); - #ifdef INET6 void sctp_gather_internal_ifa_flags(struct sctp_ifa *ifa); #endif diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_callout.c firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_callout.c --- firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_callout.c 2022-12-05 23:01:11.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_callout.c 2023-01-09 15:01:10.000000000 +0000 @@ -136,7 +136,7 @@ /* * Don't attempt to delete a callout that's not on the queue. */ - if (!(c->c_flags & SCTP_CALLOUT_PENDING)) { + if ((c->c_flags & SCTP_CALLOUT_PENDING) == 0) { c->c_flags &= ~SCTP_CALLOUT_ACTIVE; SCTP_TIMERQ_UNLOCK(); return (0); diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_callout.h firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_callout.h --- firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_callout.h 2022-12-05 23:00:55.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_callout.h 2023-01-09 15:01:10.000000000 +0000 @@ -95,6 +95,11 @@ void sctp_handle_tick(uint32_t); #define SCTP_OS_TIMER_INIT sctp_os_timer_init +/* + * NOTE: The next two shouldn't be called directly outside of sctp_timer_start() + * and sctp_timer_stop(), since they don't handle incrementing/decrementing + * relevant reference counts. + */ #define SCTP_OS_TIMER_START sctp_os_timer_start #define SCTP_OS_TIMER_STOP sctp_os_timer_stop /* MT FIXME: Is the following correct? */ diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_cc_functions.c firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_cc_functions.c --- firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_cc_functions.c 2022-12-05 23:01:12.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_cc_functions.c 2023-01-09 15:01:10.000000000 +0000 @@ -34,7 +34,7 @@ #if defined(__FreeBSD__) && !defined(__Userspace__) #include -__FBSDID("$FreeBSD: head/sys/netinet/sctp_cc_functions.c 359405 2020-03-28 20:25:45Z tuexen $"); +__FBSDID("$FreeBSD$"); #endif #include @@ -64,7 +64,7 @@ if ((assoc->max_cwnd > 0) && (net->cwnd > assoc->max_cwnd) && (net->cwnd > (net->mtu - sizeof(struct sctphdr)))) { - net->cwnd = assoc->max_cwnd ; + net->cwnd = assoc->max_cwnd; if (net->cwnd < (net->mtu - sizeof(struct sctphdr))) { net->cwnd = net->mtu - sizeof(struct sctphdr); } @@ -163,7 +163,6 @@ (uint64_t)net->mtu * (uint64_t)net->ssthresh) / (uint64_t)t_ssthresh); - } if (asoc->sctp_cmt_on_off == SCTP_CMT_RPV2) { uint32_t srtt; @@ -251,15 +250,14 @@ #define SCTP_INST_NEUTRAL 2 /* Neutral, no indication */ #define SCTP_INST_GAINING 3 /* Gaining, step down possible */ - #if defined(__FreeBSD__) && !defined(__Userspace__) static int cc_bw_same(struct sctp_tcb *stcb, struct sctp_nets *net, uint64_t nbw, - uint64_t rtt_offset, uint64_t vtag, uint8_t inst_ind) + uint64_t rtt_offset, uint64_t vtag, uint8_t inst_ind) #else static int cc_bw_same(struct sctp_tcb *stcb SCTP_UNUSED, struct sctp_nets *net, uint64_t nbw, - uint64_t rtt_offset, uint8_t inst_ind) + uint64_t rtt_offset, uint8_t inst_ind) #endif { #if defined(__FreeBSD__) && !defined(__Userspace__) @@ -410,11 +408,11 @@ #if defined(__FreeBSD__) && !defined(__Userspace__) static int cc_bw_decrease(struct sctp_tcb *stcb, struct sctp_nets *net, uint64_t nbw, uint64_t rtt_offset, - uint64_t vtag, uint8_t inst_ind) + uint64_t vtag, uint8_t inst_ind) #else static int cc_bw_decrease(struct sctp_tcb *stcb SCTP_UNUSED, struct sctp_nets *net, uint64_t nbw, uint64_t rtt_offset, - uint8_t inst_ind) + uint8_t inst_ind) #endif { #if defined(__FreeBSD__) && !defined(__Userspace__) @@ -766,7 +764,7 @@ #if defined(__FreeBSD__) && !defined(__Userspace__) int old_cwnd; #endif - uint32_t t_ssthresh, t_cwnd, incr; + uint32_t t_ssthresh, incr; uint64_t t_ucwnd_sbw; uint64_t t_path_mptcp; uint64_t mptcp_like_alpha; @@ -775,7 +773,6 @@ /* MT FIXME: Don't compute this over and over again */ t_ssthresh = 0; - t_cwnd = 0; t_ucwnd_sbw = 0; t_path_mptcp = 0; mptcp_like_alpha = 1; @@ -785,7 +782,6 @@ max_path = 0; TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) { t_ssthresh += net->ssthresh; - t_cwnd += net->cwnd; /* lastsa>>3; we don't need to devide ...*/ srtt = net->lastsa; if (srtt > 0) { @@ -817,7 +813,6 @@ /* update cwnd and Early FR */ /******************************/ TAILQ_FOREACH(net, &asoc->nets, sctp_next) { - #ifdef JANA_CMT_FAST_RECOVERY /* * CMT fast recovery code. Need to debug. @@ -837,7 +832,7 @@ continue; } #ifdef JANA_CMT_FAST_RECOVERY - /* CMT fast recovery code + /* CMT fast recovery code */ /* if (sctp_cmt_on_off > 0 && net->fast_retran_loss_recovery && net->will_exit_fast_recovery == 0) { @@ -1008,7 +1003,7 @@ net->partial_bytes_acked += net->net_ack; if ((net->flight_size + net->net_ack >= net->cwnd) && - (net->partial_bytes_acked >= net->cwnd)) { + (net->partial_bytes_acked >= net->cwnd)) { net->partial_bytes_acked -= net->cwnd; #if defined(__FreeBSD__) && !defined(__Userspace__) old_cwnd = net->cwnd; @@ -1101,7 +1096,6 @@ (void *)net, net->cwnd); } - static void sctp_cwnd_update_after_timeout(struct sctp_tcb *stcb, struct sctp_nets *net) { @@ -1179,7 +1173,7 @@ static void sctp_cwnd_update_after_ecn_echo_common(struct sctp_tcb *stcb, struct sctp_nets *net, - int in_window, int num_pkt_lost, int use_rtcc) + int in_window, int num_pkt_lost, int use_rtcc) { int old_cwnd = net->cwnd; if ((use_rtcc) && (net->lan_type == SCTP_LAN_LOCAL) && (net->cc_mod.rtcc.use_dccc_ecn)) { @@ -1207,10 +1201,9 @@ if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_CWND_MONITOR_ENABLE) { sctp_log_cwnd(stcb, net, (net->cwnd - old_cwnd), SCTP_CWND_LOG_FROM_SAT); } - } SCTP_STAT_INCR(sctps_ecnereducedcwnd); - } else { + } else { if (in_window == 0) { SCTP_STAT_INCR(sctps_ecnereducedcwnd); net->ssthresh = net->cwnd / 2; @@ -1357,7 +1350,7 @@ static void sctp_cwnd_update_after_output(struct sctp_tcb *stcb, - struct sctp_nets *net, int burst_limit) + struct sctp_nets *net, int burst_limit) { int old_cwnd = net->cwnd; @@ -1381,8 +1374,8 @@ static void sctp_cwnd_update_after_sack(struct sctp_tcb *stcb, - struct sctp_association *asoc, - int accum_moved, int reneged_all, int will_exit) + struct sctp_association *asoc, + int accum_moved, int reneged_all, int will_exit) { /* Passing a zero argument in last disables the rtcc algorithm */ sctp_cwnd_update_after_sack_common(stcb, asoc, accum_moved, reneged_all, will_exit, 0); @@ -1390,7 +1383,7 @@ static void sctp_cwnd_update_after_ecn_echo(struct sctp_tcb *stcb, struct sctp_nets *net, - int in_window, int num_pkt_lost) + int in_window, int num_pkt_lost) { /* Passing a zero argument in last disables the rtcc algorithm */ sctp_cwnd_update_after_ecn_echo_common(stcb, net, in_window, num_pkt_lost, 0); @@ -1403,25 +1396,23 @@ */ static void sctp_cwnd_update_rtcc_after_ecn_echo(struct sctp_tcb *stcb, struct sctp_nets *net, - int in_window, int num_pkt_lost) + int in_window, int num_pkt_lost) { sctp_cwnd_update_after_ecn_echo_common(stcb, net, in_window, num_pkt_lost, 1); } - -static -void sctp_cwnd_update_rtcc_tsn_acknowledged(struct sctp_nets *net, - struct sctp_tmit_chunk *tp1) +static void sctp_cwnd_update_rtcc_tsn_acknowledged(struct sctp_nets *net, + struct sctp_tmit_chunk *tp1) { net->cc_mod.rtcc.bw_bytes += tp1->send_size; } static void sctp_cwnd_prepare_rtcc_net_for_sack(struct sctp_tcb *stcb SCTP_UNUSED, - struct sctp_nets *net) + struct sctp_nets *net) { if (net->cc_mod.rtcc.tls_needs_set > 0) { - /* We had a bw measurment going on */ + /* We had a bw measurement going on */ struct timeval ltls; SCTP_GETPTIME_TIMEVAL(<ls); timevalsub(<ls, &net->cc_mod.rtcc.tls); @@ -1431,7 +1422,7 @@ static void sctp_cwnd_new_rtcc_transmission_begins(struct sctp_tcb *stcb, - struct sctp_nets *net) + struct sctp_nets *net) { #if defined(__FreeBSD__) && !defined(__Userspace__) uint64_t vtag, probepoint; @@ -1492,7 +1483,7 @@ static void sctp_set_rtcc_initial_cc_param(struct sctp_tcb *stcb, - struct sctp_nets *net) + struct sctp_nets *net) { #if defined(__FreeBSD__) && !defined(__Userspace__) uint64_t vtag, probepoint; @@ -1527,15 +1518,14 @@ net->cc_mod.rtcc.use_dccc_ecn = SCTP_BASE_SYSCTL(sctp_use_dccc_ecn); net->cc_mod.rtcc.step_cnt = 0; net->cc_mod.rtcc.last_step_state = 0; - - } static int sctp_cwnd_rtcc_socket_option(struct sctp_tcb *stcb, int setorget, - struct sctp_cc_option *cc_opt) + struct sctp_cc_option *cc_opt) { struct sctp_nets *net; + if (setorget == 1) { /* a set */ if (cc_opt->option == SCTP_CC_OPT_RTCC_SETMODE) { @@ -1600,8 +1590,8 @@ static void sctp_cwnd_update_rtcc_after_sack(struct sctp_tcb *stcb, - struct sctp_association *asoc, - int accum_moved, int reneged_all, int will_exit) + struct sctp_association *asoc, + int accum_moved, int reneged_all, int will_exit) { /* Passing a one argument at the last enables the rtcc algorithm */ sctp_cwnd_update_after_sack_common(stcb, asoc, accum_moved, reneged_all, will_exit, 1); @@ -1842,15 +1832,14 @@ static void sctp_hs_cwnd_update_after_sack(struct sctp_tcb *stcb, - struct sctp_association *asoc, - int accum_moved, int reneged_all SCTP_UNUSED, int will_exit) + struct sctp_association *asoc, + int accum_moved, int reneged_all SCTP_UNUSED, int will_exit) { struct sctp_nets *net; /******************************/ /* update cwnd and Early FR */ /******************************/ TAILQ_FOREACH(net, &asoc->nets, sctp_next) { - #ifdef JANA_CMT_FAST_RECOVERY /* * CMT fast recovery code. Need to debug. @@ -1870,7 +1859,7 @@ continue; } #ifdef JANA_CMT_FAST_RECOVERY - /* CMT fast recovery code + /* CMT fast recovery code */ /* if (sctp_cmt_on_off > 0 && net->fast_retran_loss_recovery && net->will_exit_fast_recovery == 0) { @@ -1934,7 +1923,6 @@ } } - /* * H-TCP congestion control. The algorithm is detailed in: * R.N.Shorten, D.J.Leith: @@ -1943,7 +1931,6 @@ * http://www.hamilton.ie/net/htcp3.pdf */ - static int use_rtt_scaling = 1; static int use_bandwidth_switch = 1; @@ -2081,19 +2068,19 @@ if (diff > (uint32_t)hz) { diff -= hz; - factor = 1+ ( 10*diff + ((diff/2)*(diff/2)/hz))/hz; + factor = 1+ (10 * diff + ((diff / 2) * (diff / 2) / hz)) / hz; } if (use_rtt_scaling && minRTT) { - uint32_t scale = (hz<<3)/(10*minRTT); - scale = min(max(scale, 1U<<2), 10U<<3); /* clamping ratio to interval [0.5,10]<<3 */ - factor = (factor<<3)/scale; - if (!factor) + uint32_t scale = (hz << 3) / (10 * minRTT); + scale = min(max(scale, 1U << 2), 10U << 3); /* clamping ratio to interval [0.5,10]<<3 */ + factor = (factor << 3) / scale; + if (factor != 0) factor = 1; } - ca->alpha = 2*factor*((1<<7)-ca->beta); - if (!ca->alpha) + ca->alpha = 2 * factor * ((1 << 7) - ca->beta); + if (ca->alpha != 0) ca->alpha = ALPHA_BASE; } @@ -2131,10 +2118,10 @@ { /*- * How to handle these functions? - * if (!tcp_is_cwnd_limited(sk, in_flight)) RRS - good question. + * if (!tcp_is_cwnd_limited(sk, in_flight)) RRS - good question. * return; */ - if (net->cwnd <= net->ssthresh) { + if (net->cwnd <= net->ssthresh) { /* We are in slow start */ if (net->flight_size + net->net_ack >= net->cwnd) { if (net->net_ack > (net->mtu * SCTP_BASE_SYSCTL(sctp_L2_abc_variable))) { @@ -2150,7 +2137,6 @@ sctp_log_cwnd(stcb, net, net->net_ack, SCTP_CWND_LOG_FROM_SS); } - } sctp_enforce_cwnd_limit(&stcb->asoc, net); } else { @@ -2167,7 +2153,7 @@ */ /* What is snd_cwnd_cnt?? */ if (((net->partial_bytes_acked/net->mtu * net->cc_mod.htcp_ca.alpha) >> 7)*net->mtu >= net->cwnd) { - /*- + /*- * Does SCTP have a cwnd clamp? * if (net->snd_cwnd < net->snd_cwnd_clamp) - Nope (RRS). */ @@ -2238,7 +2224,6 @@ /* update cwnd and Early FR */ /******************************/ TAILQ_FOREACH(net, &asoc->nets, sctp_next) { - #ifdef JANA_CMT_FAST_RECOVERY /* * CMT fast recovery code. Need to debug. @@ -2258,7 +2243,7 @@ continue; } #ifdef JANA_CMT_FAST_RECOVERY - /* CMT fast recovery code + /* CMT fast recovery code */ /* if (sctp_cmt_on_off > 0 && net->fast_retran_loss_recovery && net->will_exit_fast_recovery == 0) { diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_constants.h firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_constants.h --- firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_constants.h 2022-12-05 23:01:07.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_constants.h 2023-01-09 15:01:10.000000000 +0000 @@ -34,7 +34,7 @@ #if defined(__FreeBSD__) && !defined(__Userspace__) #include -__FBSDID("$FreeBSD: head/sys/netinet/sctp_constants.h 362107 2020-06-12 16:40:10Z tuexen $"); +__FBSDID("$FreeBSD$"); #endif #ifndef _NETINET_SCTP_CONSTANTS_H_ @@ -42,8 +42,8 @@ #if defined(_WIN32) && defined(__Userspace__) extern void getwintimeofday(struct timeval *tv); -#endif +#endif /* IANA assigned port number for SCTP over UDP encapsulation */ #define SCTP_OVER_UDP_TUNNELING_PORT 9899 @@ -92,13 +92,11 @@ /* #define SCTP_AUDITING_ENABLED 1 used for debug/auditing */ #define SCTP_AUDIT_SIZE 256 - #define SCTP_KTRHEAD_NAME "sctp_iterator" #define SCTP_KTHREAD_PAGES 0 #define SCTP_MCORE_NAME "sctp_core_worker" - /* If you support Multi-VRF how big to * make the initial array of VRF's to. */ @@ -268,7 +266,6 @@ #define SCTP_LOCK_UNKNOWN 2 - /* number of associations by default for zone allocation */ #define SCTP_MAX_NUM_OF_ASOC 40000 /* how many addresses per assoc remote and local */ @@ -393,7 +390,6 @@ #define IS_SCTP_CONTROL(a) (((a)->chunk_type != SCTP_DATA) && ((a)->chunk_type != SCTP_IDATA)) #define IS_SCTP_DATA(a) (((a)->chunk_type == SCTP_DATA) || ((a)->chunk_type == SCTP_IDATA)) - /* SCTP parameter types */ /*************0x0000 series*************/ #define SCTP_HEARTBEAT_INFO 0x0001 @@ -458,7 +454,6 @@ /* mask to get sticky */ #define SCTP_STICKY_OPTIONS_MASK 0x0c - /* * SCTP states for internal state machine */ @@ -562,12 +557,11 @@ #define SCTP_IS_TIMER_TYPE_VALID(t) (((t) > SCTP_TIMER_TYPE_NONE) && \ ((t) < SCTP_TIMER_TYPE_LAST)) - #if defined(__APPLE__) && !defined(__Userspace__) /* Number of ticks to run the main timer at in msec */ #define SCTP_MAIN_TIMER_DEFAULT 10 -#endif +#endif /* max number of TSN's dup'd that I will hold */ #define SCTP_MAX_DUP_TSNS 20 @@ -616,8 +610,7 @@ #define SCTP_RTO_UPPER_BOUND (60000) /* 60 sec in ms */ #define SCTP_RTO_LOWER_BOUND (1000) /* 1 sec is ms */ -#define SCTP_RTO_INITIAL (3000) /* 3 sec in ms */ - +#define SCTP_RTO_INITIAL (1000) /* 1 sec in ms */ #define SCTP_INP_KILL_TIMEOUT 20 /* number of ms to retry kill of inpcb */ #define SCTP_ASOC_KILL_TIMEOUT 10 /* number of ms to retry kill of inpcb */ @@ -629,7 +622,6 @@ #define SCTP_DEF_PMTU_RAISE_SEC 600 /* 10 min between raise attempts */ - /* How many streams I request initially by default */ #define SCTP_OSTREAM_INITIAL 10 #define SCTP_ISTREAM_INITIAL 2048 @@ -699,8 +691,6 @@ /* amount peer is obligated to have in rwnd or I will abort */ #define SCTP_MIN_RWND 1500 -#define SCTP_DEFAULT_MAXSEGMENT 65535 - #define SCTP_CHUNK_BUFFER_SIZE 512 #define SCTP_PARAM_BUFFER_SIZE 512 @@ -712,7 +702,6 @@ #define SCTP_NUMBER_OF_SECRETS 8 /* or 8 * 4 = 32 octets */ #define SCTP_SECRET_SIZE 32 /* number of octets in a 256 bits */ - /* * SCTP upper layer notifications */ @@ -743,6 +732,7 @@ #define SCTP_NOTIFY_NO_PEER_AUTH 25 #define SCTP_NOTIFY_SENDER_DRY 26 #define SCTP_NOTIFY_REMOTE_ERROR 27 +#define SCTP_NOTIFY_ASSOC_TIMEDOUT 28 /* This is the value for messages that are NOT completely * copied down where we will start to split the message. @@ -753,7 +743,11 @@ #define SCTP_DEFAULT_SPLIT_POINT_MIN 2904 /* Maximum length of diagnostic information in error causes */ +#if defined(__Userspace__) +#define SCTP_DIAG_INFO_LEN 256 +#else #define SCTP_DIAG_INFO_LEN 128 +#endif /* ABORT CODES and other tell-tale location * codes are generated by adding the below @@ -811,6 +805,7 @@ #define SCTP_LOC_34 0x00000022 #define SCTP_LOC_35 0x00000023 #define SCTP_LOC_36 0x00000024 +#define SCTP_LOC_37 0x00000025 /* Free assoc codes */ #define SCTP_NORMAL_PROC 0 @@ -830,7 +825,6 @@ #define SCTP_DONOT_SETSCOPE 0 #define SCTP_DO_SETSCOPE 1 - /* This value determines the default for when * we try to add more on the send queue., if * there is room. This prevents us from cycling @@ -913,7 +907,6 @@ } \ } while (0) - #define SCTP_RETRAN_DONE -1 #define SCTP_RETRAN_EXIT -2 @@ -969,7 +962,6 @@ #define SCTP_SO_LOCKED 1 #define SCTP_SO_NOT_LOCKED 0 - /*- * For address locks, do we hold the lock? */ @@ -1003,7 +995,6 @@ #define SCTP_GETPTIME_TIMEVAL(x) gettimeofday(x, NULL) #endif #endif - #if defined(_KERNEL) #define SCTP_GETTIME_TIMEVAL(x) (getmicrouptime(x)) #define SCTP_GETPTIME_TIMEVAL(x) (microuptime(x)) @@ -1013,7 +1004,7 @@ #define sctp_sowwakeup(inp, so) \ do { \ if (inp->sctp_flags & SCTP_PCB_FLAGS_DONT_WAKE) { \ - inp->sctp_flags |= SCTP_PCB_FLAGS_WAKEOUTPUT; \ + sctp_pcb_add_flags(inp, SCTP_PCB_FLAGS_WAKEOUTPUT); \ } else { \ sowwakeup(so); \ } \ @@ -1023,8 +1014,8 @@ #define sctp_sowwakeup_locked(inp, so) \ do { \ if (inp->sctp_flags & SCTP_PCB_FLAGS_DONT_WAKE) { \ + sctp_pcb_add_flags(inp, SCTP_PCB_FLAGS_WAKEOUTPUT); \ SOCKBUF_UNLOCK(&((so)->so_snd)); \ - inp->sctp_flags |= SCTP_PCB_FLAGS_WAKEOUTPUT; \ } else { \ sowwakeup_locked(so); \ } \ @@ -1033,8 +1024,8 @@ #define sctp_sowwakeup_locked(inp, so) \ do { \ if (inp->sctp_flags & SCTP_PCB_FLAGS_DONT_WAKE) { \ + sctp_pcb_add_flags(inp, SCTP_PCB_FLAGS_WAKEOUTPUT); \ SOCKBUF_UNLOCK(&((so)->so_snd)); \ - inp->sctp_flags |= SCTP_PCB_FLAGS_WAKEOUTPUT; \ } else { \ sowwakeup(so); \ } \ @@ -1044,7 +1035,7 @@ #define sctp_sorwakeup(inp, so) \ do { \ if (inp->sctp_flags & SCTP_PCB_FLAGS_DONT_WAKE) { \ - inp->sctp_flags |= SCTP_PCB_FLAGS_WAKEINPUT; \ + sctp_pcb_add_flags(inp, SCTP_PCB_FLAGS_WAKEINPUT); \ } else { \ sorwakeup(so); \ } \ @@ -1054,7 +1045,7 @@ #define sctp_sorwakeup_locked(inp, so) \ do { \ if (inp->sctp_flags & SCTP_PCB_FLAGS_DONT_WAKE) { \ - inp->sctp_flags |= SCTP_PCB_FLAGS_WAKEINPUT; \ + sctp_pcb_add_flags(inp, SCTP_PCB_FLAGS_WAKEINPUT); \ SOCKBUF_UNLOCK(&((so)->so_rcv)); \ } else { \ sorwakeup_locked(so); \ @@ -1065,7 +1056,7 @@ #define sctp_sorwakeup_locked(inp, so) \ do { \ if (inp->sctp_flags & SCTP_PCB_FLAGS_DONT_WAKE) { \ - inp->sctp_flags |= SCTP_PCB_FLAGS_WAKEINPUT; \ + sctp_pcb_add_flags(inp, SCTP_PCB_FLAGS_WAKEINPUT); \ SOCKBUF_UNLOCK(&((so)->so_rcv)); \ } else { \ sorwakeup(so); \ diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_crc32.c firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_crc32.c --- firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_crc32.c 2022-12-05 23:00:55.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_crc32.c 2023-01-09 15:01:10.000000000 +0000 @@ -34,7 +34,7 @@ #if defined(__FreeBSD__) && !defined(__Userspace__) #include -__FBSDID("$FreeBSD: head/sys/netinet/sctp_crc32.c 362498 2020-06-22 14:36:14Z tuexen $"); +__FBSDID("$FreeBSD$"); #include "opt_sctp.h" @@ -733,31 +733,34 @@ #endif sctp_finalize_crc32c(uint32_t crc32c) { - uint32_t result; #if BYTE_ORDER == BIG_ENDIAN - uint8_t byte0, byte1, byte2, byte3; + uint32_t byte0, byte1, byte2, byte3; #endif - /* Complement the result */ - result = ~crc32c; #if BYTE_ORDER == BIG_ENDIAN /* - * For BIG-ENDIAN platforms the result is in little-endian form. So we - * must swap the bytes to return the result in network byte order. + * For BIG-ENDIAN platforms, the result is in LITTLE-ENDIAN byte order. + * For LITTLE-ENDIAN platforms, the result is in in BIG-ENDIAN byte + * order. So for BIG-ENDIAN platforms the bytes must be swapped to + * return the result always in network byte order (aka BIG-ENDIAN). */ - byte0 = result & 0x000000ff; - byte1 = (result >> 8) & 0x000000ff; - byte2 = (result >> 16) & 0x000000ff; - byte3 = (result >> 24) & 0x000000ff; + byte0 = crc32c & 0x000000ff; + byte1 = (crc32c >> 8) & 0x000000ff; + byte2 = (crc32c >> 16) & 0x000000ff; + byte3 = (crc32c >> 24) & 0x000000ff; crc32c = ((byte0 << 24) | (byte1 << 16) | (byte2 << 8) | byte3); -#else - /* - * For LITTLE ENDIAN platforms the result is in already in network - * byte order. - */ - crc32c = result; #endif - return (crc32c); + return (~crc32c); +} + +static int +sctp_calculate_cksum_cb(void *arg, void *data, u_int len) +{ + uint32_t *basep; + + basep = arg; + *basep = calculate_crc32c(*basep, data, len); + return (0); } /* @@ -767,32 +770,19 @@ * it is compiled on a kernel with SCTP support. */ uint32_t -sctp_calculate_cksum(struct mbuf *m, uint32_t offset) +sctp_calculate_cksum(struct mbuf *m, int32_t offset) { - uint32_t base = 0xffffffff; + uint32_t base; + int len; - while (offset > 0) { - KASSERT(m != NULL, ("sctp_calculate_cksum, offset > length of mbuf chain")); - if (offset < (uint32_t)m->m_len) { - break; - } - offset -= m->m_len; - m = m->m_next; - } - if (offset > 0) { - base = calculate_crc32c(base, - (unsigned char *)(m->m_data + offset), - (unsigned int)(m->m_len - offset)); - m = m->m_next; - } - while (m != NULL) { - base = calculate_crc32c(base, - (unsigned char *)m->m_data, - (unsigned int)m->m_len); - m = m->m_next; - } - base = sctp_finalize_crc32c(base); - return (base); + M_ASSERTPKTHDR(m); + KASSERT(offset < m->m_pkthdr.len, + ("%s: invalid offset %u into mbuf %p", __func__, offset, m)); + + base = 0xffffffff; + len = m->m_pkthdr.len - offset; + (void)m_apply(m, offset, len, sctp_calculate_cksum_cb, &base); + return (sctp_finalize_crc32c(base)); } #if defined(__FreeBSD__) && !defined(__Userspace__) diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_crc32.h firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_crc32.h --- firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_crc32.h 2022-12-05 23:01:11.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_crc32.h 2023-01-09 15:01:10.000000000 +0000 @@ -34,14 +34,14 @@ #if defined(__FreeBSD__) && !defined(__Userspace__) #include -__FBSDID("$FreeBSD: head/sys/netinet/sctp_crc32.h 362338 2020-06-18 19:32:34Z markj $"); +__FBSDID("$FreeBSD$"); #endif #ifndef _NETINET_SCTP_CRC32_H_ #define _NETINET_SCTP_CRC32_H_ #if defined(_KERNEL) -uint32_t sctp_calculate_cksum(struct mbuf *, uint32_t); +uint32_t sctp_calculate_cksum(struct mbuf *, int32_t); #if defined(__FreeBSD__) && !defined(__Userspace__) #if defined(SCTP) || defined(SCTP_SUPPORT) void sctp_delayed_cksum(struct mbuf *, uint32_t offset); @@ -51,6 +51,6 @@ #if defined(__Userspace__) uint32_t calculate_crc32c(uint32_t, const unsigned char *, unsigned int); uint32_t sctp_finalize_crc32c(uint32_t); -uint32_t sctp_calculate_cksum(struct mbuf *, uint32_t); +uint32_t sctp_calculate_cksum(struct mbuf *, int32_t); #endif #endif /* __crc32c_h__ */ diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_header.h firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_header.h --- firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_header.h 2022-12-05 23:01:12.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_header.h 2023-01-09 15:01:10.000000000 +0000 @@ -34,7 +34,7 @@ #if defined(__FreeBSD__) && !defined(__Userspace__) #include -__FBSDID("$FreeBSD: head/sys/netinet/sctp_header.h 309682 2016-12-07 19:30:59Z tuexen $"); +__FBSDID("$FreeBSD$"); #endif #ifndef _NETINET_SCTP_HEADER_H_ @@ -66,7 +66,6 @@ #define SCTP_V6_ADDR_BYTES 16 - struct sctp_ipv6addr_param { struct sctp_paramhdr ph;/* type=SCTP_IPV6_PARAM_TYPE, len=20 */ uint8_t addr[SCTP_V6_ADDR_BYTES]; /* IPV6 address */ @@ -110,14 +109,12 @@ char address[SCTP_ADDRMAX]; } SCTP_PACKED; - /* draft-ietf-tsvwg-prsctp */ /* PR-SCTP supported parameter */ struct sctp_prsctp_supported_param { struct sctp_paramhdr ph; } SCTP_PACKED; - /* draft-ietf-tsvwg-addip-sctp */ struct sctp_asconf_paramhdr { /* an ASCONF "parameter" */ struct sctp_paramhdr ph;/* a SCTP parameter header */ @@ -129,14 +126,12 @@ struct sctp_ipv6addr_param addrp; /* max storage size */ } SCTP_PACKED; - struct sctp_asconf_tag_param { /* an ASCONF NAT-Vtag parameter */ struct sctp_asconf_paramhdr aph; /* asconf "parameter" */ - uint32_t local_vtag; - uint32_t remote_vtag; + uint32_t local_vtag; + uint32_t remote_vtag; } SCTP_PACKED; - struct sctp_asconf_addrv4_param { /* an ASCONF address (v4) parameter */ struct sctp_asconf_paramhdr aph; /* asconf "parameter" */ struct sctp_ipv4addr_param addrp; /* max storage size */ @@ -149,7 +144,6 @@ uint8_t chunk_types[]; } SCTP_PACKED; - /* * Structures for DATA chunks */ @@ -260,7 +254,6 @@ #define sctp_init_ack_chunk sctp_init_chunk #define sctp_init_ack_msg sctp_init_msg - /* Selective Ack (SACK) */ struct sctp_gap_ack_block { uint16_t start; /* Gap Ack block start */ @@ -297,7 +290,6 @@ struct sctp_nr_sack nr_sack; } SCTP_PACKED; - /* Heartbeat Request (HEARTBEAT) */ struct sctp_heartbeat { struct sctp_heartbeat_info_param hb_info; @@ -312,7 +304,6 @@ #define sctp_heartbeat_ack sctp_heartbeat #define sctp_heartbeat_ack_chunk sctp_heartbeat_chunk - /* Abort Asssociation (ABORT) */ struct sctp_abort_chunk { struct sctp_chunkhdr ch; @@ -324,27 +315,23 @@ struct sctp_abort_chunk msg; } SCTP_PACKED; - /* Shutdown Association (SHUTDOWN) */ struct sctp_shutdown_chunk { struct sctp_chunkhdr ch; uint32_t cumulative_tsn_ack; } SCTP_PACKED; - /* Shutdown Acknowledgment (SHUTDOWN ACK) */ struct sctp_shutdown_ack_chunk { struct sctp_chunkhdr ch; } SCTP_PACKED; - /* Operation Error (ERROR) */ struct sctp_error_chunk { struct sctp_chunkhdr ch; /* optional error causes follow */ } SCTP_PACKED; - /* Cookie Echo (COOKIE ECHO) */ struct sctp_cookie_echo_chunk { struct sctp_chunkhdr ch; @@ -436,7 +423,6 @@ uint32_t tsn_ifany; } SCTP_PACKED; - struct sctp_pktdrop_chunk { struct sctp_chunkhdr ch; uint32_t bottle_bw; @@ -487,10 +473,10 @@ } SCTP_PACKED; struct sctp_stream_reset_add_strm { - struct sctp_paramhdr ph; - uint32_t request_seq; - uint16_t number_of_streams; - uint16_t reserved; + struct sctp_paramhdr ph; + uint32_t request_seq; + uint16_t number_of_streams; + uint16_t reserved; } SCTP_PACKED; #define SCTP_STREAM_RESET_RESULT_NOTHING_TO_DO 0x00000000 /* XXX: unused */ @@ -563,43 +549,41 @@ #ifndef SCTP_MAX_OVERHEAD #ifdef INET6 #define SCTP_MAX_OVERHEAD (sizeof(struct sctp_data_chunk) + \ - sizeof(struct sctphdr) + \ - sizeof(struct sctp_ecne_chunk) + \ - sizeof(struct sctp_sack_chunk) + \ - sizeof(struct ip6_hdr)) + sizeof(struct sctphdr) + \ + sizeof(struct sctp_ecne_chunk) + \ + sizeof(struct sctp_sack_chunk) + \ + sizeof(struct ip6_hdr)) #define SCTP_MED_OVERHEAD (sizeof(struct sctp_data_chunk) + \ - sizeof(struct sctphdr) + \ - sizeof(struct ip6_hdr)) - + sizeof(struct sctphdr) + \ + sizeof(struct ip6_hdr)) #define SCTP_MIN_OVERHEAD (sizeof(struct ip6_hdr) + \ - sizeof(struct sctphdr)) + sizeof(struct sctphdr)) #else #define SCTP_MAX_OVERHEAD (sizeof(struct sctp_data_chunk) + \ - sizeof(struct sctphdr) + \ - sizeof(struct sctp_ecne_chunk) + \ - sizeof(struct sctp_sack_chunk) + \ - sizeof(struct ip)) + sizeof(struct sctphdr) + \ + sizeof(struct sctp_ecne_chunk) + \ + sizeof(struct sctp_sack_chunk) + \ + sizeof(struct ip)) #define SCTP_MED_OVERHEAD (sizeof(struct sctp_data_chunk) + \ - sizeof(struct sctphdr) + \ - sizeof(struct ip)) - + sizeof(struct sctphdr) + \ + sizeof(struct ip)) #define SCTP_MIN_OVERHEAD (sizeof(struct ip) + \ - sizeof(struct sctphdr)) + sizeof(struct sctphdr)) #endif /* INET6 */ #endif /* !SCTP_MAX_OVERHEAD */ #define SCTP_MED_V4_OVERHEAD (sizeof(struct sctp_data_chunk) + \ - sizeof(struct sctphdr) + \ - sizeof(struct ip)) + sizeof(struct sctphdr) + \ + sizeof(struct ip)) #define SCTP_MIN_V4_OVERHEAD (sizeof(struct ip) + \ - sizeof(struct sctphdr)) + sizeof(struct sctphdr)) #if defined(_WIN32) && !defined(__Userspace__) #include diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_indata.c firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_indata.c --- firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_indata.c 2022-12-05 23:01:11.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_indata.c 2023-01-09 15:01:10.000000000 +0000 @@ -34,7 +34,7 @@ #if defined(__FreeBSD__) && !defined(__Userspace__) #include -__FBSDID("$FreeBSD: head/sys/netinet/sctp_indata.c 363076 2020-07-10 11:15:10Z tuexen $"); +__FBSDID("$FreeBSD$"); #endif #include @@ -74,7 +74,6 @@ struct sctp_association *asoc, struct sctp_tmit_chunk *chk, int hold_rlock); - void sctp_set_rwnd(struct sctp_tcb *stcb, struct sctp_association *asoc) { @@ -134,8 +133,6 @@ return (calc); } - - /* * Build out our readq entry based on the incoming packet. */ @@ -306,19 +303,18 @@ return (ret); } - static void sctp_mark_non_revokable(struct sctp_association *asoc, uint32_t tsn) { - uint32_t gap, i, cumackp1; - int fnd = 0; - int in_r=0, in_nr=0; + uint32_t gap, i; + int in_r, in_nr; + if (SCTP_BASE_SYSCTL(sctp_do_drain) == 0) { return; } - cumackp1 = asoc->cumulative_tsn + 1; - if (SCTP_TSN_GT(cumackp1, tsn)) { - /* this tsn is behind the cum ack and thus we don't + if (SCTP_TSN_GE(asoc->cumulative_tsn, tsn)) { + /* + * This tsn is behind the cum ack and thus we don't * need to worry about it being moved from one to the other. */ return; @@ -326,33 +322,27 @@ SCTP_CALC_TSN_TO_GAP(gap, tsn, asoc->mapping_array_base_tsn); in_r = SCTP_IS_TSN_PRESENT(asoc->mapping_array, gap); in_nr = SCTP_IS_TSN_PRESENT(asoc->nr_mapping_array, gap); - if ((in_r == 0) && (in_nr == 0)) { -#ifdef INVARIANTS - panic("Things are really messed up now"); -#else - SCTP_PRINTF("gap:%x tsn:%x\n", gap, tsn); - sctp_print_mapping_array(asoc); -#endif - } - if (in_nr == 0) + KASSERT(in_r || in_nr, ("%s: Things are really messed up now", __func__)); + if (!in_nr) { SCTP_SET_TSN_PRESENT(asoc->nr_mapping_array, gap); - if (in_r) - SCTP_UNSET_TSN_PRESENT(asoc->mapping_array, gap); - if (SCTP_TSN_GT(tsn, asoc->highest_tsn_inside_nr_map)) { - asoc->highest_tsn_inside_nr_map = tsn; + if (SCTP_TSN_GT(tsn, asoc->highest_tsn_inside_nr_map)) { + asoc->highest_tsn_inside_nr_map = tsn; + } } - if (tsn == asoc->highest_tsn_inside_map) { - /* We must back down to see what the new highest is */ - for (i = tsn - 1; SCTP_TSN_GE(i, asoc->mapping_array_base_tsn); i--) { - SCTP_CALC_TSN_TO_GAP(gap, i, asoc->mapping_array_base_tsn); - if (SCTP_IS_TSN_PRESENT(asoc->mapping_array, gap)) { - asoc->highest_tsn_inside_map = i; - fnd = 1; - break; + if (in_r) { + SCTP_UNSET_TSN_PRESENT(asoc->mapping_array, gap); + if (tsn == asoc->highest_tsn_inside_map) { + /* We must back down to see what the new highest is. */ + for (i = tsn - 1; SCTP_TSN_GE(i, asoc->mapping_array_base_tsn); i--) { + SCTP_CALC_TSN_TO_GAP(gap, i, asoc->mapping_array_base_tsn); + if (SCTP_IS_TSN_PRESENT(asoc->mapping_array, gap)) { + asoc->highest_tsn_inside_map = i; + break; + } + } + if (!SCTP_TSN_GE(i, asoc->mapping_array_base_tsn)) { + asoc->highest_tsn_inside_map = asoc->mapping_array_base_tsn - 1; } - } - if (!fnd) { - asoc->highest_tsn_inside_map = asoc->mapping_array_base_tsn - 1; } } } @@ -407,7 +397,7 @@ if (unordered) { control->on_strm_q = SCTP_ON_UNORDERED; } else { - control->on_strm_q = SCTP_ON_ORDERED ; + control->on_strm_q = SCTP_ON_ORDERED; } break; } else if (SCTP_MID_EQ(asoc->idata_supported, at->mid, control->mid)) { @@ -428,9 +418,9 @@ } TAILQ_INSERT_AFTER(q, at, control, next_instrm); if (unordered) { - control->on_strm_q = SCTP_ON_UNORDERED ; + control->on_strm_q = SCTP_ON_UNORDERED; } else { - control->on_strm_q = SCTP_ON_ORDERED ; + control->on_strm_q = SCTP_ON_ORDERED; } break; } @@ -472,7 +462,7 @@ chk->data = NULL; sctp_free_a_chunk(stcb, chk, SCTP_SO_NOT_LOCKED); stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_1; - sctp_abort_an_association(stcb->sctp_ep, stcb, oper, SCTP_SO_NOT_LOCKED); + sctp_abort_an_association(stcb->sctp_ep, stcb, oper, false, SCTP_SO_NOT_LOCKED); *abort_flag = 1; } @@ -524,7 +514,7 @@ * with TSN 1? If the peer is doing some sort of funky TSN/SSN * assignment this could happen... and I don't see how this would be * a violation. So for now I am undecided an will leave the sort by - * SSN alone. Maybe a hybred approach is the answer + * SSN alone. Maybe a hybrid approach is the answer * */ struct sctp_queued_to_read *at; @@ -560,10 +550,9 @@ } op_err = sctp_generate_cause(SCTP_CAUSE_PROTOCOL_VIOLATION, msg); stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_2; - sctp_abort_an_association(stcb->sctp_ep, stcb, op_err, SCTP_SO_NOT_LOCKED); + sctp_abort_an_association(stcb->sctp_ep, stcb, op_err, false, SCTP_SO_NOT_LOCKED); *abort_flag = 1; return; - } queue_needed = 1; asoc->size_on_all_streams += control->length; @@ -668,13 +657,12 @@ sctp_clean_up_control(stcb, control); op_err = sctp_generate_cause(SCTP_CAUSE_PROTOCOL_VIOLATION, msg); stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_3; - sctp_abort_an_association(stcb->sctp_ep, stcb, op_err, SCTP_SO_NOT_LOCKED); + sctp_abort_an_association(stcb->sctp_ep, stcb, op_err, false, SCTP_SO_NOT_LOCKED); *abort_flag = 1; } } } - static void sctp_setup_tail_pointer(struct sctp_queued_to_read *control) { @@ -850,7 +838,7 @@ } memset(nc, 0, sizeof(struct sctp_queued_to_read)); TAILQ_REMOVE(&control->reasm, chk, sctp_next); - sctp_add_chk_to_control(control, strm, stcb, asoc, chk, SCTP_READ_LOCK_NOT_HELD); + sctp_add_chk_to_control(control, strm, stcb, asoc, chk, inp_read_lock_held); fsn++; cnt_added++; chk = NULL; @@ -939,7 +927,7 @@ } if (cnt_added && strm->pd_api_started) { #if defined(__Userspace__) - sctp_invoke_recv_callback(stcb->sctp_ep, stcb, control, SCTP_READ_LOCK_NOT_HELD); + sctp_invoke_recv_callback(stcb->sctp_ep, stcb, control, inp_read_lock_held); #endif sctp_wakeup_the_read_socket(stcb->sctp_ep, stcb, SCTP_SO_NOT_LOCKED); } @@ -1005,7 +993,7 @@ * we started the pd-api on the higher TSN (since * the equals part is a TSN failure it must be that). * - * We are completly hosed in that case since I have + * We are completely hosed in that case since I have * no way to recover. This really will only happen * if we can get more TSN's higher before the pd-api-point. */ @@ -1079,7 +1067,6 @@ SCTP_FROM_SCTP_INDATA + SCTP_LOC_5); return; } - } if (inserted == 0) { /* Its at the end */ @@ -1134,7 +1121,7 @@ /* We just put the last bit on */ if (control->on_strm_q) { #ifdef INVARIANTS - if (control->on_strm_q != SCTP_ON_UNORDERED ) { + if (control->on_strm_q != SCTP_ON_UNORDERED) { panic("Huh control: %p on_q: %d -- not unordered?", control, control->on_strm_q); } @@ -1198,7 +1185,7 @@ if (control->end_added) { if (control->on_strm_q) { #ifdef INVARIANTS - if (control->on_strm_q != SCTP_ON_ORDERED ) { + if (control->on_strm_q != SCTP_ON_ORDERED) { panic("Huh control: %p on_q: %d -- not ordered?", control, control->on_strm_q); } @@ -1251,7 +1238,7 @@ /* We are done with it afterwards */ if (control->on_strm_q) { #ifdef INVARIANTS - if (control->on_strm_q != SCTP_ON_ORDERED ) { + if (control->on_strm_q != SCTP_ON_ORDERED) { panic("Huh control: %p on_q: %d -- not ordered?", control, control->on_strm_q); } @@ -1313,7 +1300,6 @@ return (ret); } - uint32_t sctp_add_chk_to_control(struct sctp_queued_to_read *control, struct sctp_stream_in *strm, @@ -1576,6 +1562,15 @@ chk->rec.data.fsn); TAILQ_FOREACH(at, &control->reasm, sctp_next) { if (SCTP_TSN_GT(at->rec.data.fsn, chk->rec.data.fsn)) { + if (chk->rec.data.rcv_flags & SCTP_DATA_LAST_FRAG) { + /* Last not at the end? huh? */ + SCTPDBG(SCTP_DEBUG_XXX, + "Last fragment not last in list: -- abort\n"); + sctp_abort_in_reasm(stcb, control, + chk, abort_flag, + SCTP_FROM_SCTP_INDATA + SCTP_LOC_14); + return; + } /* * This one in queue is bigger than the new one, insert * the new one before at. @@ -1602,7 +1597,7 @@ at->rec.data.fsn); sctp_abort_in_reasm(stcb, control, chk, abort_flag, - SCTP_FROM_SCTP_INDATA + SCTP_LOC_14); + SCTP_FROM_SCTP_INDATA + SCTP_LOC_15); return; } } @@ -1759,8 +1754,8 @@ * empty data chunk. */ op_err = sctp_generate_no_user_data_cause(tsn); - stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_15; - sctp_abort_an_association(stcb->sctp_ep, stcb, op_err, SCTP_SO_NOT_LOCKED); + stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_16; + sctp_abort_an_association(stcb->sctp_ep, stcb, op_err, false, SCTP_SO_NOT_LOCKED); *abort_flag = 1; return (0); } @@ -1826,7 +1821,7 @@ * receiver. Send peer an ABORT! */ op_err = sctp_generate_cause(SCTP_CAUSE_OUT_OF_RESC, ""); - sctp_abort_an_association(stcb->sctp_ep, stcb, op_err, SCTP_SO_NOT_LOCKED); + sctp_abort_an_association(stcb->sctp_ep, stcb, op_err, false, SCTP_SO_NOT_LOCKED); *abort_flag = 1; return (0); } @@ -1897,8 +1892,8 @@ SCTP_SNPRINTF(msg, sizeof(msg), "Reassembly problem (MID=%8.8x)", mid); err_out: op_err = sctp_generate_cause(SCTP_CAUSE_PROTOCOL_VIOLATION, msg); - stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_16; - sctp_abort_an_association(stcb->sctp_ep, stcb, op_err, SCTP_SO_NOT_LOCKED); + stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_17; + sctp_abort_an_association(stcb->sctp_ep, stcb, op_err, false, SCTP_SO_NOT_LOCKED); *abort_flag = 1; return (0); } @@ -1951,7 +1946,7 @@ * When we have NO room in the rwnd we check to make sure * the reader is doing its job... */ - if (stcb->sctp_socket->so_rcv.sb_cc) { + if (SCTP_SBAVAIL(&stcb->sctp_socket->so_rcv) > 0) { /* some to read, wake-up */ #if defined(__APPLE__) && !defined(__Userspace__) struct socket *so; @@ -2044,8 +2039,8 @@ (uint16_t)mid); } op_err = sctp_generate_cause(SCTP_CAUSE_PROTOCOL_VIOLATION, msg); - stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_17; - sctp_abort_an_association(stcb->sctp_ep, stcb, op_err, SCTP_SO_NOT_LOCKED); + stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_18; + sctp_abort_an_association(stcb->sctp_ep, stcb, op_err, false, SCTP_SO_NOT_LOCKED); *abort_flag = 1; return (0); } @@ -2241,7 +2236,6 @@ unsigned char inserted = 0; TAILQ_FOREACH_SAFE(lcontrol, &asoc->pending_reply_queue, next, nlcontrol) { if (SCTP_TSN_GT(control->sinfo_tsn, lcontrol->sinfo_tsn)) { - continue; } else { /* found it */ @@ -2417,7 +2411,6 @@ 0, 1, 0, 2, 0, 1, 0, 8 }; - void sctp_slide_mapping_arrays(struct sctp_tcb *stcb) { @@ -2553,7 +2546,6 @@ * we will be able to slide it forward. Really I * don't think this should happen :-0 */ - if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_MAP_LOGGING_ENABLE) { sctp_log_map((uint32_t) distance, (uint32_t) slide_from, (uint32_t) asoc->mapping_array_size, @@ -2565,7 +2557,6 @@ for (ii = 0; ii < distance; ii++) { asoc->mapping_array[ii] = asoc->mapping_array[slide_from + ii]; asoc->nr_mapping_array[ii] = asoc->nr_mapping_array[slide_from + ii]; - } for (ii = distance; ii < asoc->mapping_array_size; ii++) { asoc->mapping_array[ii] = 0; @@ -2617,7 +2608,7 @@ if (SCTP_OS_TIMER_PENDING(&stcb->asoc.dack_timer.timer)) { sctp_timer_stop(SCTP_TIMER_TYPE_RECV, stcb->sctp_ep, stcb, NULL, - SCTP_FROM_SCTP_INDATA + SCTP_LOC_18); + SCTP_FROM_SCTP_INDATA + SCTP_LOC_19); } sctp_send_shutdown(stcb, ((stcb->asoc.alternate) ? stcb->asoc.alternate : stcb->asoc.primary_destination)); @@ -2637,20 +2628,16 @@ (stcb->asoc.numduptsns) || /* we have dup's */ (is_a_gap) || /* is still a gap */ (stcb->asoc.delayed_ack == 0) || /* Delayed sack disabled */ - (stcb->asoc.data_pkts_seen >= stcb->asoc.sack_freq) /* hit limit of pkts */ - ) { - + (stcb->asoc.data_pkts_seen >= stcb->asoc.sack_freq)) { /* hit limit of pkts */ if ((stcb->asoc.sctp_cmt_on_off > 0) && (SCTP_BASE_SYSCTL(sctp_cmt_use_dac)) && (stcb->asoc.send_sack == 0) && (stcb->asoc.numduptsns == 0) && (stcb->asoc.delayed_ack) && (!SCTP_OS_TIMER_PENDING(&stcb->asoc.dack_timer.timer))) { - /* * CMT DAC algorithm: With CMT, * delay acks even in the face of - * reordering. Therefore, if acks * that do not have to be sent * because of the above reasons, @@ -2669,7 +2656,7 @@ * duplicates. */ sctp_timer_stop(SCTP_TIMER_TYPE_RECV, stcb->sctp_ep, stcb, NULL, - SCTP_FROM_SCTP_INDATA + SCTP_LOC_19); + SCTP_FROM_SCTP_INDATA + SCTP_LOC_20); sctp_send_sack(stcb, SCTP_SO_NOT_LOCKED); } } else { @@ -2768,10 +2755,10 @@ struct mbuf *op_err; char msg[SCTP_DIAG_INFO_LEN]; - SCTP_SNPRINTF(msg, sizeof(msg), "%s", "I-DATA chunk received when DATA was negotiated"); + SCTP_SNPRINTF(msg, sizeof(msg), "%s", "DATA chunk received when I-DATA was negotiated"); op_err = sctp_generate_cause(SCTP_CAUSE_PROTOCOL_VIOLATION, msg); - stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_20; - sctp_abort_an_association(inp, stcb, op_err, SCTP_SO_NOT_LOCKED); + stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_21; + sctp_abort_an_association(inp, stcb, op_err, false, SCTP_SO_NOT_LOCKED); return (2); } if ((asoc->idata_supported == 0) && @@ -2779,10 +2766,10 @@ struct mbuf *op_err; char msg[SCTP_DIAG_INFO_LEN]; - SCTP_SNPRINTF(msg, sizeof(msg), "%s", "DATA chunk received when I-DATA was negotiated"); + SCTP_SNPRINTF(msg, sizeof(msg), "%s", "I-DATA chunk received when DATA was negotiated"); op_err = sctp_generate_cause(SCTP_CAUSE_PROTOCOL_VIOLATION, msg); - stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_21; - sctp_abort_an_association(inp, stcb, op_err, SCTP_SO_NOT_LOCKED); + stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_22; + sctp_abort_an_association(inp, stcb, op_err, false, SCTP_SO_NOT_LOCKED); return (2); } if ((ch->chunk_type == SCTP_DATA) || @@ -2806,8 +2793,8 @@ ch->chunk_type == SCTP_DATA ? "DATA" : "I-DATA", chk_length); op_err = sctp_generate_cause(SCTP_CAUSE_PROTOCOL_VIOLATION, msg); - stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_22; - sctp_abort_an_association(inp, stcb, op_err, SCTP_SO_NOT_LOCKED); + stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_23; + sctp_abort_an_association(inp, stcb, op_err, false, SCTP_SO_NOT_LOCKED); return (2); } #ifdef SCTP_AUDITING_ENABLED @@ -2874,7 +2861,7 @@ SCTP_SNPRINTF(msg, sizeof(msg), "DATA chunk followed by chunk of type %2.2x", ch->chunk_type); op_err = sctp_generate_cause(SCTP_CAUSE_PROTOCOL_VIOLATION, msg); - sctp_abort_an_association(inp, stcb, op_err, SCTP_SO_NOT_LOCKED); + sctp_abort_an_association(inp, stcb, op_err, false, SCTP_SO_NOT_LOCKED); return (2); } default: @@ -2892,8 +2879,8 @@ SCTP_SNPRINTF(msg, sizeof(msg), "Chunk of length %u", chk_length); op_err = sctp_generate_cause(SCTP_CAUSE_PROTOCOL_VIOLATION, msg); - stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_23; - sctp_abort_an_association(inp, stcb, op_err, SCTP_SO_NOT_LOCKED); + stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_24; + sctp_abort_an_association(inp, stcb, op_err, false, SCTP_SO_NOT_LOCKED); return (2); } if (ch->chunk_type & 0x40) { @@ -3132,7 +3119,6 @@ tp1->do_rtt = 0; } } - } if (tp1->sent <= SCTP_DATAGRAM_RESEND) { if (SCTP_TSN_GT(tp1->rec.data.tsn, @@ -3207,7 +3193,6 @@ return (wake_him); /* Return value only used for nr-sack */ } - static int sctp_handle_segments(struct mbuf *m, int *offset, struct sctp_tcb *stcb, struct sctp_association *asoc, uint32_t last_tsn, uint32_t *biggest_tsn_acked, @@ -3328,7 +3313,6 @@ } } - static void sctp_strike_gap_ack_chunks(struct sctp_tcb *stcb, struct sctp_association *asoc, uint32_t biggest_tsn_acked, uint32_t biggest_tsn_newly_acked, uint32_t this_sack_lowest_newack, int accum_moved) @@ -3336,7 +3320,6 @@ struct sctp_tmit_chunk *tp1; int strike_flag = 0; struct timeval now; - int tot_retrans = 0; uint32_t sending_seq; struct sctp_nets *net; int num_dests_sacked = 0; @@ -3397,7 +3380,6 @@ continue; } } - } if (SCTP_TSN_GT(tp1->rec.data.tsn, asoc->this_sack_highest_gap) && !(accum_moved && asoc->fast_retran_loss_recovery)) { @@ -3418,7 +3400,7 @@ */ if (tp1->whoTo && tp1->whoTo->saw_newack == 0) { /* - * No new acks were receieved for data sent to this + * No new acks were received for data sent to this * dest. Therefore, according to the SFR algo for * CMT, no data sent to this dest can be marked for * FR using this SACK. @@ -3429,7 +3411,7 @@ tp1->whoTo->this_sack_highest_newack) && !(accum_moved && asoc->fast_retran_loss_recovery)) { /* - * CMT: New acks were receieved for data sent to + * CMT: New acks were received for data sent to * this dest. But no new acks were seen for data * sent after tp1. Therefore, according to the SFR * algo for CMT, tp1 cannot be marked for FR using @@ -3507,7 +3489,6 @@ (1) #endif ) { - if (SCTP_TSN_GE(biggest_tsn_newly_acked, tp1->rec.data.fast_retran_tsn)) { /* @@ -3694,9 +3675,7 @@ tp1->whoTo->find_pseudo_cumack = 1; tp1->whoTo->find_rtx_pseudo_cumack = 1; } - } else {/* CMT is OFF */ - #ifdef SCTP_FR_TO_ALTERNATE /* Can we find an alternate? */ alt = sctp_find_alternate_net(stcb, tp1->whoTo, 0); @@ -3711,7 +3690,6 @@ } tp1->rec.data.doing_fast_retransmit = 1; - tot_retrans++; /* mark the sending seq for possible subsequent FR's */ /* * SCTP_PRINTF("Marking TSN for FR new value %x\n", @@ -3812,7 +3790,7 @@ * Now is this one marked for resend and its time is * now up? */ -#if !(defined(__FreeBSD__) && !defined(__Userspace__)) +#if !(defined(__FreeBSD__) && !defined(__Userspace__)) if (timercmp(&now, &tp1->rec.data.timetodrop, >)) { #else if (timevalcmp(&now, &tp1->rec.data.timetodrop, >)) { @@ -3894,24 +3872,23 @@ if ((inflight > 0) || (inbetween > 0)) { #ifdef INVARIANTS - panic("Flight size-express incorrect? \n"); + panic("Flight size-express incorrect F: %d I: %d R: %d Ab: %d ACK: %d", + inflight, inbetween, resend, above, acked); #else SCTP_PRINTF("asoc->total_flight: %d cnt: %d\n", entry_flight, entry_cnt); - SCTP_PRINTF("Flight size-express incorrect F: %d I: %d R: %d Ab: %d ACK: %d\n", - inflight, inbetween, resend, above, acked); + inflight, inbetween, resend, above, acked); ret = 1; #endif } return (ret); } - static void sctp_window_probe_recovery(struct sctp_tcb *stcb, - struct sctp_association *asoc, - struct sctp_tmit_chunk *tp1) + struct sctp_association *asoc, + struct sctp_tmit_chunk *tp1) { tp1->window_probe = 0; if ((tp1->sent >= SCTP_DATAGRAM_ACKED) || (tp1->data == NULL)) { @@ -4025,8 +4002,8 @@ "Cum ack %8.8x greater or equal than TSN %8.8x", cumack, send_s); op_err = sctp_generate_cause(SCTP_CAUSE_PROTOCOL_VIOLATION, msg); - stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_24; - sctp_abort_an_association(stcb->sctp_ep, stcb, op_err, SCTP_SO_NOT_LOCKED); + stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_25; + sctp_abort_an_association(stcb->sctp_ep, stcb, op_err, false, SCTP_SO_NOT_LOCKED); return; } asoc->this_sack_highest_gap = cumack; @@ -4107,7 +4084,6 @@ tp1->whoTo->new_pseudo_cumack = 1; tp1->whoTo->find_pseudo_cumack = 1; tp1->whoTo->find_rtx_pseudo_cumack = 1; - if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_CWND_LOGGING_ENABLE) { /* sa_ignore NO_NULL_CHK */ sctp_log_cwnd(stcb, tp1->whoTo, tp1->rec.data.tsn, SCTP_CWND_LOG_FROM_SACK); @@ -4156,7 +4132,6 @@ break; } } - } #if defined(__Userspace__) if (stcb->sctp_ep->recv_callback) { @@ -4176,7 +4151,7 @@ (inp->send_sb_threshold == 0))) { atomic_add_int(&stcb->asoc.refcnt, 1); SCTP_TCB_UNLOCK(stcb); - inp->send_callback(stcb->sctp_socket, sb_free_now); + inp->send_callback(stcb->sctp_socket, sb_free_now, inp->ulp_info); SCTP_TCB_LOCK(stcb); atomic_subtract_int(&stcb->asoc.refcnt, 1); } @@ -4227,7 +4202,7 @@ * is optional. */ net->error_count = 0; - if (!(net->dest_state & SCTP_ADDR_REACHABLE)) { + if ((net->dest_state & SCTP_ADDR_REACHABLE) == 0) { /* addr came good */ net->dest_state |= SCTP_ADDR_REACHABLE; sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_UP, stcb, @@ -4244,7 +4219,7 @@ net->dest_state &= ~SCTP_ADDR_PF; sctp_timer_stop(SCTP_TIMER_TYPE_HEARTBEAT, stcb->sctp_ep, stcb, net, - SCTP_FROM_SCTP_INDATA + SCTP_LOC_25); + SCTP_FROM_SCTP_INDATA + SCTP_LOC_26); sctp_timer_start(SCTP_TIMER_TYPE_HEARTBEAT, stcb->sctp_ep, stcb, net); asoc->cc_functions.sctp_cwnd_update_exit_pf(stcb, net); /* Done with this net */ @@ -4319,7 +4294,7 @@ } else if (SCTP_OS_TIMER_PENDING(&net->rxt_timer.timer)) { sctp_timer_stop(SCTP_TIMER_TYPE_SEND, stcb->sctp_ep, stcb, net, - SCTP_FROM_SCTP_INDATA + SCTP_LOC_26); + SCTP_FROM_SCTP_INDATA + SCTP_LOC_27); } } } @@ -4371,8 +4346,8 @@ *abort_now = 1; /* XXX */ op_err = sctp_generate_cause(SCTP_CAUSE_USER_INITIATED_ABT, ""); - stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_27; - sctp_abort_an_association(stcb->sctp_ep, stcb, op_err, SCTP_SO_NOT_LOCKED); + stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_28; + sctp_abort_an_association(stcb->sctp_ep, stcb, op_err, false, SCTP_SO_NOT_LOCKED); return; } if ((asoc->state & SCTP_STATE_SHUTDOWN_PENDING) && @@ -4493,7 +4468,7 @@ * old sack, if so discard. 2) If there is nothing left in the send * queue (cum-ack is equal to last acked) then you have a duplicate * too, update any rwnd change and verify no timers are running. - * then return. 3) Process any new consequtive data i.e. cum-ack + * then return. 3) Process any new consecutive data i.e. cum-ack * moved process these first and note that it moved. 4) Process any * sack blocks. 5) Drop any acked from the queue. 6) Check for any * revoked blocks and mark. 7) Update the cwnd. 8) Nothing left, @@ -4586,8 +4561,8 @@ "Cum ack %8.8x greater or equal than TSN %8.8x", cum_ack, send_s); op_err = sctp_generate_cause(SCTP_CAUSE_PROTOCOL_VIOLATION, msg); - stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_28; - sctp_abort_an_association(stcb->sctp_ep, stcb, op_err, SCTP_SO_NOT_LOCKED); + stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_29; + sctp_abort_an_association(stcb->sctp_ep, stcb, op_err, false, SCTP_SO_NOT_LOCKED); return; } /**********************/ @@ -4618,7 +4593,7 @@ /* stop any timers */ TAILQ_FOREACH(net, &asoc->nets, sctp_next) { sctp_timer_stop(SCTP_TIMER_TYPE_SEND, stcb->sctp_ep, - stcb, net, SCTP_FROM_SCTP_INDATA + SCTP_LOC_29); + stcb, net, SCTP_FROM_SCTP_INDATA + SCTP_LOC_30); net->partial_bytes_acked = 0; net->flight_size = 0; } @@ -4630,7 +4605,7 @@ * We init netAckSz and netAckSz2 to 0. These are used to track 2 * things. The total byte count acked is tracked in netAckSz AND * netAck2 is used to track the total bytes acked that are un- - * amibguious and were never retransmitted. We track these on a per + * ambiguous and were never retransmitted. We track these on a per * destination address basis. */ TAILQ_FOREACH(net, &asoc->nets, sctp_next) { @@ -4745,8 +4720,6 @@ tp1->whoTo->new_pseudo_cumack = 1; tp1->whoTo->find_pseudo_cumack = 1; tp1->whoTo->find_rtx_pseudo_cumack = 1; - - if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SACK_LOGGING_ENABLE) { sctp_log_sack(asoc->last_acked_seq, cum_ack, @@ -4784,7 +4757,6 @@ asoc->this_sack_highest_gap = last_tsn; if ((num_seg > 0) || (num_nr_seg > 0)) { - /* * thisSackHighestGap will increase while handling NEW * segments this_sack_highest_newack will increase while @@ -4818,14 +4790,13 @@ if (net->new_pseudo_cumack) sctp_timer_stop(SCTP_TIMER_TYPE_SEND, stcb->sctp_ep, stcb, net, - SCTP_FROM_SCTP_INDATA + SCTP_LOC_30); - + SCTP_FROM_SCTP_INDATA + SCTP_LOC_31); } } else { if (accum_moved) { TAILQ_FOREACH(net, &asoc->nets, sctp_next) { sctp_timer_stop(SCTP_TIMER_TYPE_SEND, stcb->sctp_ep, - stcb, net, SCTP_FROM_SCTP_INDATA + SCTP_LOC_31); + stcb, net, SCTP_FROM_SCTP_INDATA + SCTP_LOC_32); } } } @@ -4904,7 +4875,7 @@ (inp->send_sb_threshold == 0))) { atomic_add_int(&stcb->asoc.refcnt, 1); SCTP_TCB_UNLOCK(stcb); - inp->send_callback(stcb->sctp_socket, sb_free_now); + inp->send_callback(stcb->sctp_socket, sb_free_now, inp->ulp_info); SCTP_TCB_LOCK(stcb); atomic_subtract_int(&stcb->asoc.refcnt, 1); } @@ -5011,7 +4982,7 @@ * is optional. */ net->error_count = 0; - if (!(net->dest_state & SCTP_ADDR_REACHABLE)) { + if ((net->dest_state & SCTP_ADDR_REACHABLE) == 0) { /* addr came good */ net->dest_state |= SCTP_ADDR_REACHABLE; sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_UP, stcb, @@ -5030,7 +5001,7 @@ net->dest_state &= ~SCTP_ADDR_PF; sctp_timer_stop(SCTP_TIMER_TYPE_HEARTBEAT, stcb->sctp_ep, stcb, net, - SCTP_FROM_SCTP_INDATA + SCTP_LOC_32); + SCTP_FROM_SCTP_INDATA + SCTP_LOC_33); sctp_timer_start(SCTP_TIMER_TYPE_HEARTBEAT, stcb->sctp_ep, stcb, net); asoc->cc_functions.sctp_cwnd_update_exit_pf(stcb, net); /* Done with this net */ @@ -5055,7 +5026,7 @@ /* stop all timers */ sctp_timer_stop(SCTP_TIMER_TYPE_SEND, stcb->sctp_ep, stcb, net, - SCTP_FROM_SCTP_INDATA + SCTP_LOC_33); + SCTP_FROM_SCTP_INDATA + SCTP_LOC_34); net->flight_size = 0; net->partial_bytes_acked = 0; } @@ -5093,8 +5064,8 @@ *abort_now = 1; /* XXX */ op_err = sctp_generate_cause(SCTP_CAUSE_USER_INITIATED_ABT, ""); - stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_34; - sctp_abort_an_association(stcb->sctp_ep, stcb, op_err, SCTP_SO_NOT_LOCKED); + stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_35; + sctp_abort_an_association(stcb->sctp_ep, stcb, op_err, false, SCTP_SO_NOT_LOCKED); return; } if ((asoc->state & SCTP_STATE_SHUTDOWN_PENDING) && @@ -5234,12 +5205,11 @@ if (!SCTP_OS_TIMER_PENDING(&net->rxt_timer.timer)) { sctp_timer_start(SCTP_TIMER_TYPE_SEND, stcb->sctp_ep, stcb, net); - } } else if (SCTP_OS_TIMER_PENDING(&net->rxt_timer.timer)) { sctp_timer_stop(SCTP_TIMER_TYPE_SEND, stcb->sctp_ep, stcb, net, - SCTP_FROM_SCTP_INDATA + SCTP_LOC_35); + SCTP_FROM_SCTP_INDATA + SCTP_LOC_36); } } } @@ -5356,7 +5326,7 @@ TAILQ_FOREACH_SAFE(control, &strmin->inqueue, next_instrm, ncontrol) { if (SCTP_MID_GE(asoc->idata_supported, mid, control->mid)) { /* this is deliverable now */ - if (((control->sinfo_flags >> 8) & SCTP_DATA_NOT_FRAG) == SCTP_DATA_NOT_FRAG) { + if (((control->sinfo_flags >> 8) & SCTP_DATA_NOT_FRAG) == SCTP_DATA_NOT_FRAG) { if (control->on_strm_q) { if (control->on_strm_q == SCTP_ON_ORDERED) { TAILQ_REMOVE(&strmin->inqueue, control, next_instrm); @@ -5458,7 +5428,6 @@ control, &stcb->sctp_socket->so_rcv, 1, SCTP_READ_LOCK_HELD, SCTP_SO_NOT_LOCKED); - } mid = strmin->last_mid_delivered + 1; } else { @@ -5479,17 +5448,12 @@ } } - - static void sctp_flush_reassm_for_str_seq(struct sctp_tcb *stcb, - struct sctp_association *asoc, - uint16_t stream, uint32_t mid, int ordered, uint32_t cumtsn) + struct sctp_association *asoc, struct sctp_stream_in *strm, + struct sctp_queued_to_read *control, int ordered, uint32_t cumtsn) { - struct sctp_queued_to_read *control; - struct sctp_stream_in *strm; struct sctp_tmit_chunk *chk, *nchk; - int cnt_removed=0; /* * For now large messages held on the stream reasm that are @@ -5499,23 +5463,18 @@ * delivery function... to see if it can be delivered... But * for now we just dump everything on the queue. */ - strm = &asoc->strmin[stream]; - control = sctp_find_reasm_entry(strm, mid, ordered, asoc->idata_supported); - if (control == NULL) { - /* Not found */ - return; - } - if (!asoc->idata_supported && !ordered && SCTP_TSN_GT(control->fsn_included, cumtsn)) { + if (!asoc->idata_supported && !ordered && + control->first_frag_seen && + SCTP_TSN_GT(control->fsn_included, cumtsn)) { return; } TAILQ_FOREACH_SAFE(chk, &control->reasm, sctp_next, nchk) { /* Purge hanging chunks */ - if (!asoc->idata_supported && (ordered == 0)) { + if (!asoc->idata_supported && !ordered) { if (SCTP_TSN_GT(chk->rec.data.tsn, cumtsn)) { break; } } - cnt_removed++; TAILQ_REMOVE(&control->reasm, chk, sctp_next); if (asoc->size_on_reasm_queue >= chk->send_size) { asoc->size_on_reasm_queue -= chk->send_size; @@ -5605,7 +5564,7 @@ unsigned int i, fwd_sz, m_size; uint32_t str_seq; struct sctp_stream_in *strm; - struct sctp_queued_to_read *control, *sv; + struct sctp_queued_to_read *control, *ncontrol, *sv; asoc = &stcb->asoc; if ((fwd_sz = ntohs(fwd->ch.chunk_length)) < sizeof(struct sctp_forward_tsn_chunk)) { @@ -5643,8 +5602,8 @@ "New cum ack %8.8x too high, highest TSN %8.8x", new_cum_tsn, asoc->highest_tsn_inside_map); op_err = sctp_generate_cause(SCTP_CAUSE_PROTOCOL_VIOLATION, msg); - stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_36; - sctp_abort_an_association(stcb->sctp_ep, stcb, op_err, SCTP_SO_NOT_LOCKED); + stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_37; + sctp_abort_an_association(stcb->sctp_ep, stcb, op_err, false, SCTP_SO_NOT_LOCKED); return; } SCTP_STAT_INCR(sctps_fwdtsn_map_over); @@ -5678,10 +5637,14 @@ /* This is now done as part of clearing up the stream/seq */ if (asoc->idata_supported == 0) { uint16_t sid; + /* Flush all the un-ordered data based on cum-tsn */ SCTP_INP_READ_LOCK(stcb->sctp_ep); - for (sid = 0 ; sid < asoc->streamincnt; sid++) { - sctp_flush_reassm_for_str_seq(stcb, asoc, sid, 0, 0, new_cum_tsn); + for (sid = 0; sid < asoc->streamincnt; sid++) { + strm = &asoc->strmin[sid]; + if (!TAILQ_EMPTY(&strm->uno_inqueue)) { + sctp_flush_reassm_for_str_seq(stcb, asoc, strm, TAILQ_FIRST(&strm->uno_inqueue), 0, new_cum_tsn); + } } SCTP_INP_READ_UNLOCK(stcb->sctp_ep); } @@ -5693,7 +5656,7 @@ if (m && fwd_sz) { /* New method. */ unsigned int num_str; - uint32_t mid, cur_mid; + uint32_t mid; uint16_t sid; uint16_t ordered, flags; struct sctp_strseq *stseq, strseqbuf; @@ -5757,8 +5720,24 @@ asoc->fragmented_delivery_inprogress = 0; } strm = &asoc->strmin[sid]; - for (cur_mid = strm->last_mid_delivered; SCTP_MID_GE(asoc->idata_supported, mid, cur_mid); cur_mid++) { - sctp_flush_reassm_for_str_seq(stcb, asoc, sid, cur_mid, ordered, new_cum_tsn); + if (ordered) { + TAILQ_FOREACH_SAFE(control, &strm->inqueue, next_instrm, ncontrol) { + if (SCTP_MID_GE(asoc->idata_supported, mid, control->mid)) { + sctp_flush_reassm_for_str_seq(stcb, asoc, strm, control, ordered, new_cum_tsn); + } + } + } else { + if (asoc->idata_supported) { + TAILQ_FOREACH_SAFE(control, &strm->uno_inqueue, next_instrm, ncontrol) { + if (SCTP_MID_GE(asoc->idata_supported, mid, control->mid)) { + sctp_flush_reassm_for_str_seq(stcb, asoc, strm, control, ordered, new_cum_tsn); + } + } + } else { + if (!TAILQ_EMPTY(&strm->uno_inqueue)) { + sctp_flush_reassm_for_str_seq(stcb, asoc, strm, TAILQ_FIRST(&strm->uno_inqueue), ordered, new_cum_tsn); + } + } } TAILQ_FOREACH(control, &stcb->sctp_ep->read_queue, next) { if ((control->sinfo_stream == sid) && diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_indata.h firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_indata.h --- firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_indata.h 2022-12-05 23:01:11.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_indata.h 2023-01-09 15:01:10.000000000 +0000 @@ -34,7 +34,7 @@ #if defined(__FreeBSD__) && !defined(__Userspace__) #include -__FBSDID("$FreeBSD: head/sys/netinet/sctp_indata.h 361116 2020-05-16 19:26:39Z tuexen $"); +__FBSDID("$FreeBSD$"); #endif #ifndef _NETINET_SCTP_INDATA_H_ @@ -44,12 +44,11 @@ struct sctp_queued_to_read * sctp_build_readq_entry(struct sctp_tcb *stcb, - struct sctp_nets *net, - uint32_t tsn, uint32_t ppid, - uint32_t context, uint16_t sid, - uint32_t mid, uint8_t flags, - struct mbuf *dm); - + struct sctp_nets *net, + uint32_t tsn, uint32_t ppid, + uint32_t context, uint16_t sid, + uint32_t mid, uint8_t flags, + struct mbuf *dm); #define sctp_build_readq_entry_mac(_ctl, in_it, context, net, tsn, ppid, sid, flags, dm, tfsn, mid) do { \ if (_ctl) { \ @@ -76,11 +75,9 @@ } \ } while (0) - - struct mbuf * sctp_build_ctl_nchunk(struct sctp_inpcb *inp, - struct sctp_sndrcvinfo *sinfo); + struct sctp_sndrcvinfo *sinfo); void sctp_set_rwnd(struct sctp_tcb *, struct sctp_association *); @@ -89,7 +86,7 @@ void sctp_express_handle_sack(struct sctp_tcb *stcb, uint32_t cumack, - uint32_t rwnd, int *abort_now, int ecne_seen); + uint32_t rwnd, int *abort_now, int ecne_seen); void sctp_handle_sack(struct mbuf *m, int offset_seg, int offset_dup, @@ -101,7 +98,7 @@ /* draft-ietf-tsvwg-usctp */ void sctp_handle_forward_tsn(struct sctp_tcb *, - struct sctp_forward_tsn_chunk *, int *, struct mbuf *, int); + struct sctp_forward_tsn_chunk *, int *, struct mbuf *, int); struct sctp_tmit_chunk * sctp_try_advance_peer_ack_point(struct sctp_tcb *, struct sctp_association *); @@ -113,8 +110,8 @@ int sctp_process_data(struct mbuf **, int, int *, int, - struct sctp_inpcb *, struct sctp_tcb *, - struct sctp_nets *, uint32_t *); + struct sctp_inpcb *, struct sctp_tcb *, + struct sctp_nets *, uint32_t *); void sctp_slide_mapping_arrays(struct sctp_tcb *stcb); diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_input.c firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_input.c --- firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_input.c 2022-12-05 23:01:11.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_input.c 2023-01-09 15:01:10.000000000 +0000 @@ -34,7 +34,7 @@ #if defined(__FreeBSD__) && !defined(__Userspace__) #include -__FBSDID("$FreeBSD: head/sys/netinet/sctp_input.c 362153 2020-06-13 18:38:59Z tuexen $"); +__FBSDID("$FreeBSD$"); #endif #include @@ -94,7 +94,7 @@ sctp_handle_init(struct mbuf *m, int iphlen, int offset, struct sockaddr *src, struct sockaddr *dst, struct sctphdr *sh, struct sctp_init_chunk *cp, struct sctp_inpcb *inp, - struct sctp_tcb *stcb, struct sctp_nets *net, int *abort_no_unlock, + struct sctp_tcb *stcb, struct sctp_nets *net, #if defined(__FreeBSD__) && !defined(__Userspace__) uint8_t mflowtype, uint32_t mflowid, #endif @@ -108,66 +108,21 @@ if (stcb == NULL) { SCTP_INP_RLOCK(inp); } - /* validate length */ - if (ntohs(cp->ch.chunk_length) < sizeof(struct sctp_init_chunk)) { - op_err = sctp_generate_cause(SCTP_CAUSE_INVALID_PARAM, ""); - sctp_abort_association(inp, stcb, m, iphlen, src, dst, sh, op_err, -#if defined(__FreeBSD__) && !defined(__Userspace__) - mflowtype, mflowid, -#endif - vrf_id, port); - if (stcb) - *abort_no_unlock = 1; - goto outnow; - } - /* validate parameters */ + /* Validate parameters */ init = &cp->init; - if (init->initiate_tag == 0) { - /* protocol error... send abort */ - op_err = sctp_generate_cause(SCTP_CAUSE_INVALID_PARAM, ""); - sctp_abort_association(inp, stcb, m, iphlen, src, dst, sh, op_err, -#if defined(__FreeBSD__) && !defined(__Userspace__) - mflowtype, mflowid, -#endif - vrf_id, port); - if (stcb) - *abort_no_unlock = 1; - goto outnow; - } - if (ntohl(init->a_rwnd) < SCTP_MIN_RWND) { - /* invalid parameter... send abort */ - op_err = sctp_generate_cause(SCTP_CAUSE_INVALID_PARAM, ""); - sctp_abort_association(inp, stcb, m, iphlen, src, dst, sh, op_err, -#if defined(__FreeBSD__) && !defined(__Userspace__) - mflowtype, mflowid, -#endif - vrf_id, port); - if (stcb) - *abort_no_unlock = 1; - goto outnow; - } - if (init->num_inbound_streams == 0) { - /* protocol error... send abort */ - op_err = sctp_generate_cause(SCTP_CAUSE_INVALID_PARAM, ""); - sctp_abort_association(inp, stcb, m, iphlen, src, dst, sh, op_err, -#if defined(__FreeBSD__) && !defined(__Userspace__) - mflowtype, mflowid, -#endif - vrf_id, port); - if (stcb) - *abort_no_unlock = 1; + if (ntohl(init->initiate_tag) == 0) { goto outnow; } - if (init->num_outbound_streams == 0) { + if ((ntohl(init->a_rwnd) < SCTP_MIN_RWND) || + (ntohs(init->num_inbound_streams) == 0) || + (ntohs(init->num_outbound_streams) == 0)) { /* protocol error... send abort */ op_err = sctp_generate_cause(SCTP_CAUSE_INVALID_PARAM, ""); - sctp_abort_association(inp, stcb, m, iphlen, src, dst, sh, op_err, + sctp_send_abort(m, iphlen, src, dst, sh, init->initiate_tag, op_err, #if defined(__FreeBSD__) && !defined(__Userspace__) - mflowtype, mflowid, + mflowtype, mflowid, inp->fibnum, #endif - vrf_id, port); - if (stcb) - *abort_no_unlock = 1; + vrf_id, port); goto outnow; } if (sctp_validate_init_auth_params(m, offset + sizeof(*cp), @@ -175,13 +130,11 @@ /* auth parameter(s) error... send abort */ op_err = sctp_generate_cause(SCTP_BASE_SYSCTL(sctp_diag_info_code), "Problem with AUTH parameters"); - sctp_abort_association(inp, stcb, m, iphlen, src, dst, sh, op_err, + sctp_send_abort(m, iphlen, src, dst, sh, init->initiate_tag, op_err, #if defined(__FreeBSD__) && !defined(__Userspace__) - mflowtype, mflowid, + mflowtype, mflowid, inp->fibnum, #endif - vrf_id, port); - if (stcb) - *abort_no_unlock = 1; + vrf_id, port); goto outnow; } /* We are only accepting if we have a listening socket.*/ @@ -244,13 +197,14 @@ struct sctp_stream_queue_pending *sp; struct sctp_association *asoc; + SCTP_TCB_LOCK_ASSERT(stcb); + /* This function returns if any stream has true unsent data on it. * Note that as it looks through it will clean up any places that * have old data that has been sent but left at top of stream queue. */ asoc = &stcb->asoc; unsent_data = 0; - SCTP_TCB_SEND_LOCK(stcb); if (!stcb->asoc.ss_functions.sctp_ss_is_empty(stcb, asoc)) { /* Check to see if some data queued */ for (i = 0; i < stcb->asoc.streamoutcnt; i++) { @@ -260,7 +214,7 @@ continue; } if ((sp->msg_is_complete) && - (sp->length == 0) && + (sp->length == 0) && (sp->sender_all_done)) { /* We are doing differed cleanup. Last * time through when we took all the data @@ -276,7 +230,7 @@ } atomic_subtract_int(&stcb->asoc.stream_queue_cnt, 1); TAILQ_REMOVE(&stcb->asoc.strmout[i].outqueue, sp, next); - stcb->asoc.ss_functions.sctp_ss_remove_from_stream(stcb, asoc, &asoc->strmout[i], sp, 1); + stcb->asoc.ss_functions.sctp_ss_remove_from_stream(stcb, asoc, &asoc->strmout[i], sp); if (sp->net) { sctp_free_remote_addr(sp->net); sp->net = NULL; @@ -297,7 +251,6 @@ } } } - SCTP_TCB_SEND_UNLOCK(stcb); return (unsent_data); } @@ -309,6 +262,8 @@ struct sctp_nets *lnet; unsigned int i; + SCTP_TCB_LOCK_ASSERT(stcb); + init = &cp->init; asoc = &stcb->asoc; /* save off parameters */ @@ -324,10 +279,8 @@ if (SCTP_BASE_SYSCTL(sctp_logging_level) & (SCTP_CWND_MONITOR_ENABLE|SCTP_CWND_LOGGING_ENABLE)) { sctp_log_cwnd(stcb, lnet, 0, SCTP_CWND_INITIALIZATION); } - } } - SCTP_TCB_SEND_LOCK(stcb); if (asoc->pre_open_streams > ntohs(init->num_inbound_streams)) { unsigned int newcnt; struct sctp_stream_out *outs; @@ -366,7 +319,7 @@ TAILQ_FOREACH_SAFE(sp, &outs->outqueue, next, nsp) { atomic_subtract_int(&stcb->asoc.stream_queue_cnt, 1); TAILQ_REMOVE(&outs->outqueue, sp, next); - stcb->asoc.ss_functions.sctp_ss_remove_from_stream(stcb, asoc, outs, sp, 1); + stcb->asoc.ss_functions.sctp_ss_remove_from_stream(stcb, asoc, outs, sp); sctp_ulp_notify(SCTP_NOTIFY_SPECIAL_SP_FAIL, stcb, 0, sp, SCTP_SO_NOT_LOCKED); if (sp->data) { @@ -387,7 +340,6 @@ /* cut back the count */ asoc->pre_open_streams = newcnt; } - SCTP_TCB_SEND_UNLOCK(stcb); asoc->streamoutcnt = asoc->pre_open_streams; if (asoc->strmout) { for (i = 0; i < asoc->streamoutcnt; i++) { @@ -478,7 +430,12 @@ &nat_friendly, &cookie_found); if (abort_flag) { /* Send an abort and notify peer */ - sctp_abort_an_association(stcb->sctp_ep, stcb, op_err, SCTP_SO_NOT_LOCKED); + sctp_abort_association(stcb->sctp_ep, stcb, m, iphlen, + src, dst, sh, op_err, +#if defined(__FreeBSD__) && !defined(__Userspace__) + mflowtype, mflowid, +#endif + vrf_id, net->port); *abort_no_unlock = 1; return (-1); } @@ -504,37 +461,45 @@ cause->type[0] = htons(SCTP_STATE_COOKIE); } sctp_abort_association(stcb->sctp_ep, stcb, m, iphlen, - src, dst, sh, op_err, + src, dst, sh, op_err, #if defined(__FreeBSD__) && !defined(__Userspace__) - mflowtype, mflowid, + mflowtype, mflowid, #endif - vrf_id, net->port); + vrf_id, net->port); *abort_no_unlock = 1; return (-3); } asoc = &stcb->asoc; asoc->peer_supports_nat = (uint8_t)nat_friendly; /* process the peer's parameters in the INIT-ACK */ - retval = sctp_process_init((struct sctp_init_chunk *)cp, stcb); - if (retval < 0) { + if (sctp_process_init((struct sctp_init_chunk *)cp, stcb) < 0) { if (op_err != NULL) { sctp_m_freem(op_err); } - return (retval); + op_err = sctp_generate_cause(SCTP_CAUSE_OUT_OF_RESC, ""); + SCTPDBG(SCTP_DEBUG_INPUT1, "sctp_process_init() failed\n"); + sctp_abort_association(stcb->sctp_ep, stcb, m, iphlen, + src, dst, sh, op_err, +#if defined(__FreeBSD__) && !defined(__Userspace__) + mflowtype, mflowid, +#endif + vrf_id, net->port); + *abort_no_unlock = 1; + return (-1); } initack_limit = offset + ntohs(cp->ch.chunk_length); /* load all addresses */ if ((retval = sctp_load_addresses_from_init(stcb, m, - (offset + sizeof(struct sctp_init_chunk)), initack_limit, - src, dst, NULL, stcb->asoc.port))) { + offset + sizeof(struct sctp_init_chunk), + initack_limit, src, dst, NULL, stcb->asoc.port)) < 0) { if (op_err != NULL) { sctp_m_freem(op_err); } op_err = sctp_generate_cause(SCTP_BASE_SYSCTL(sctp_diag_info_code), "Problem with address parameters"); SCTPDBG(SCTP_DEBUG_INPUT1, - "Load addresses from INIT causes an abort %d\n", - retval); + "Load addresses from INIT causes an abort %d\n", + retval); sctp_abort_association(stcb->sctp_ep, stcb, m, iphlen, src, dst, sh, op_err, #if defined(__FreeBSD__) && !defined(__Userspace__) @@ -574,7 +539,7 @@ /* * Cancel the INIT timer, We do this first before queueing the - * cookie. We always cancel at the primary to assue that we are + * cookie. We always cancel at the primary to assume that we are * canceling the timer started by the INIT which always goes to the * primary. */ @@ -602,7 +567,7 @@ (inp->send_sb_threshold == 0))) { atomic_add_int(&stcb->asoc.refcnt, 1); SCTP_TCB_UNLOCK(stcb); - inp->send_callback(stcb->sctp_socket, sb_free_now); + inp->send_callback(stcb->sctp_socket, sb_free_now, inp->ulp_info); SCTP_TCB_LOCK(stcb); atomic_subtract_int(&stcb->asoc.refcnt, 1); } @@ -726,7 +691,7 @@ /* Now lets do a RTO with this */ sctp_calculate_rto(stcb, &stcb->asoc, r_net, &tv, SCTP_RTT_FROM_NON_DATA); - if (!(r_net->dest_state & SCTP_ADDR_REACHABLE)) { + if ((r_net->dest_state & SCTP_ADDR_REACHABLE) == 0) { r_net->dest_state |= SCTP_ADDR_REACHABLE; sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_UP, stcb, 0, (void *)r_net, SCTP_SO_NOT_LOCKED); @@ -755,19 +720,18 @@ SCTP_MOBILITY_FASTHANDOFF)) && sctp_is_mobility_feature_on(stcb->sctp_ep, SCTP_MOBILITY_PRIM_DELETED)) { - sctp_timer_stop(SCTP_TIMER_TYPE_PRIM_DELETED, stcb->sctp_ep, stcb, NULL, SCTP_FROM_SCTP_INPUT + SCTP_LOC_6); if (sctp_is_mobility_feature_on(stcb->sctp_ep, - SCTP_MOBILITY_FASTHANDOFF)) { + SCTP_MOBILITY_FASTHANDOFF)) { sctp_assoc_immediate_retrans(stcb, - stcb->asoc.primary_destination); + stcb->asoc.primary_destination); } if (sctp_is_mobility_feature_on(stcb->sctp_ep, - SCTP_MOBILITY_BASE)) { + SCTP_MOBILITY_BASE)) { sctp_move_chunks_from_net(stcb, - stcb->asoc.deleted_primary); + stcb->asoc.deleted_primary); } sctp_delete_prim_timer(stcb->sctp_ep, stcb); } @@ -786,7 +750,6 @@ if ((SCTP_GET_STATE(stcb) == SCTP_STATE_COOKIE_WAIT) || (SCTP_GET_STATE(stcb) == SCTP_STATE_COOKIE_ECHOED)) { - new_vtag = sctp_select_a_tag(stcb->sctp_ep, stcb->sctp_ep->sctp_lport, stcb->rport, 1); atomic_add_int(&stcb->asoc.refcnt, 1); SCTP_TCB_UNLOCK(stcb); SCTP_INP_INFO_WLOCK(); @@ -795,6 +758,7 @@ } else { return (0); } + new_vtag = sctp_select_a_tag(stcb->sctp_ep, stcb->sctp_ep->sctp_lport, stcb->rport, 1); if (SCTP_GET_STATE(stcb) == SCTP_STATE_COOKIE_WAIT) { /* generate a new vtag and send init */ LIST_REMOVE(stcb, sctp_asocs); @@ -842,7 +806,6 @@ return (1); } - /* Returns 1 if the stcb was aborted, 0 otherwise */ static int sctp_handle_abort(struct sctp_abort_chunk *abort, @@ -869,13 +832,13 @@ cause = (struct sctp_error_cause *)(abort + 1); error = ntohs(cause->code); if (error == SCTP_CAUSE_NAT_COLLIDING_STATE) { - SCTPDBG(SCTP_DEBUG_INPUT2, "Received Colliding state abort flags:%x\n", + SCTPDBG(SCTP_DEBUG_INPUT2, "Received Colliding state, ABORT flags:%x\n", abort->ch.chunk_flags); if (sctp_handle_nat_colliding_state(stcb)) { return (0); } } else if (error == SCTP_CAUSE_NAT_MISSING_STATE) { - SCTPDBG(SCTP_DEBUG_INPUT2, "Received missing state abort flags:%x\n", + SCTPDBG(SCTP_DEBUG_INPUT2, "Received missing state, ABORT flags:%x\n", abort->ch.chunk_flags); if (sctp_handle_nat_missing_state(stcb, net)) { return (0); @@ -888,7 +851,7 @@ sctp_timer_stop(SCTP_TIMER_TYPE_RECV, stcb->sctp_ep, stcb, NULL, SCTP_FROM_SCTP_INPUT + SCTP_LOC_7); /* notify user of the abort and clean up... */ - sctp_abort_notification(stcb, 1, error, abort, SCTP_SO_NOT_LOCKED); + sctp_abort_notification(stcb, true, false, error, abort, SCTP_SO_NOT_LOCKED); /* free the tcb */ SCTP_STAT_INCR_COUNTER32(sctps_aborted); if ((SCTP_GET_STATE(stcb) == SCTP_STATE_OPEN) || @@ -906,7 +869,6 @@ SCTP_TCB_LOCK(stcb); atomic_subtract_int(&stcb->asoc.refcnt, 1); #endif - SCTP_ADD_SUBSTATE(stcb, SCTP_STATE_WAS_ABORTED); (void)sctp_free_assoc(stcb->sctp_ep, stcb, SCTP_NORMAL_PROC, SCTP_FROM_SCTP_INPUT + SCTP_LOC_8); #if defined(__APPLE__) && !defined(__Userspace__) @@ -946,7 +908,6 @@ } } - static void sctp_handle_shutdown(struct sctp_shutdown_chunk *cp, struct sctp_tcb *stcb, struct sctp_nets *net, int *abort_flag) @@ -1147,7 +1108,7 @@ if (stcb->sctp_socket) { if ((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL)) { - stcb->sctp_socket->so_snd.sb_cc = 0; + SCTP_SB_CLEAR(stcb->sctp_socket->so_snd); } sctp_ulp_notify(SCTP_NOTIFY_ASSOC_DOWN, stcb, 0, NULL, SCTP_SO_NOT_LOCKED); } @@ -1276,14 +1237,14 @@ cause_code); break; case SCTP_CAUSE_NAT_COLLIDING_STATE: - SCTPDBG(SCTP_DEBUG_INPUT2, "Received Colliding state abort flags: %x\n", + SCTPDBG(SCTP_DEBUG_INPUT2, "Received Colliding state, ERROR flags: %x\n", ch->chunk_flags); if (sctp_handle_nat_colliding_state(stcb)) { return (0); } break; case SCTP_CAUSE_NAT_MISSING_STATE: - SCTPDBG(SCTP_DEBUG_INPUT2, "Received missing state abort flags: %x\n", + SCTPDBG(SCTP_DEBUG_INPUT2, "Received missing state, ERROR flags: %x\n", ch->chunk_flags); if (sctp_handle_nat_missing_state(stcb, net)) { return (0); @@ -1299,17 +1260,14 @@ struct sctp_error_stale_cookie *stale_cookie; stale_cookie = (struct sctp_error_stale_cookie *)cause; - asoc->cookie_preserve_req = ntohl(stale_cookie->stale_time); - /* Double it to be more robust on RTX */ - if (asoc->cookie_preserve_req <= UINT32_MAX / 2) { - asoc->cookie_preserve_req *= 2; - } else { - asoc->cookie_preserve_req = UINT32_MAX; - } + /* stable_time is in usec, convert to msec. */ + asoc->cookie_preserve_req = ntohl(stale_cookie->stale_time) / 1000; + /* Double it to be more robust on RTX. */ + asoc->cookie_preserve_req *= 2; asoc->stale_cookie_count++; if (asoc->stale_cookie_count > asoc->max_init_times) { - sctp_abort_notification(stcb, 0, 0, NULL, SCTP_SO_NOT_LOCKED); + sctp_abort_notification(stcb, false, true, 0, NULL, SCTP_SO_NOT_LOCKED); /* now free the asoc */ #if defined(__APPLE__) && !defined(__Userspace__) so = SCTP_INP_SO(stcb->sctp_ep); @@ -1428,73 +1386,25 @@ "sctp_handle_init_ack: TCB is null\n"); return (-1); } - if (ntohs(cp->ch.chunk_length) < sizeof(struct sctp_init_ack_chunk)) { - /* Invalid length */ - op_err = sctp_generate_cause(SCTP_CAUSE_INVALID_PARAM, ""); - sctp_abort_association(stcb->sctp_ep, stcb, m, iphlen, - src, dst, sh, op_err, -#if defined(__FreeBSD__) && !defined(__Userspace__) - mflowtype, mflowid, -#endif - vrf_id, net->port); - *abort_no_unlock = 1; - return (-1); - } - init_ack = &cp->init; - /* validate parameters */ - if (init_ack->initiate_tag == 0) { - /* protocol error... send an abort */ - op_err = sctp_generate_cause(SCTP_CAUSE_INVALID_PARAM, ""); - sctp_abort_association(stcb->sctp_ep, stcb, m, iphlen, - src, dst, sh, op_err, -#if defined(__FreeBSD__) && !defined(__Userspace__) - mflowtype, mflowid, -#endif - vrf_id, net->port); - *abort_no_unlock = 1; - return (-1); - } - if (ntohl(init_ack->a_rwnd) < SCTP_MIN_RWND) { - /* protocol error... send an abort */ - op_err = sctp_generate_cause(SCTP_CAUSE_INVALID_PARAM, ""); - sctp_abort_association(stcb->sctp_ep, stcb, m, iphlen, - src, dst, sh, op_err, -#if defined(__FreeBSD__) && !defined(__Userspace__) - mflowtype, mflowid, -#endif - vrf_id, net->port); - *abort_no_unlock = 1; - return (-1); - } - if (init_ack->num_inbound_streams == 0) { - /* protocol error... send an abort */ - op_err = sctp_generate_cause(SCTP_CAUSE_INVALID_PARAM, ""); - sctp_abort_association(stcb->sctp_ep, stcb, m, iphlen, - src, dst, sh, op_err, -#if defined(__FreeBSD__) && !defined(__Userspace__) - mflowtype, mflowid, -#endif - vrf_id, net->port); - *abort_no_unlock = 1; - return (-1); - } - if (init_ack->num_outbound_streams == 0) { - /* protocol error... send an abort */ - op_err = sctp_generate_cause(SCTP_CAUSE_INVALID_PARAM, ""); - sctp_abort_association(stcb->sctp_ep, stcb, m, iphlen, - src, dst, sh, op_err, -#if defined(__FreeBSD__) && !defined(__Userspace__) - mflowtype, mflowid, -#endif - vrf_id, net->port); - *abort_no_unlock = 1; - return (-1); - } - /* process according to association state... */ - switch (SCTP_GET_STATE(stcb)) { - case SCTP_STATE_COOKIE_WAIT: - /* this is the expected state for this chunk */ - /* process the INIT-ACK parameters */ + /* Only process the INIT-ACK chunk in COOKIE WAIT state.*/ + if (SCTP_GET_STATE(stcb) == SCTP_STATE_COOKIE_WAIT) { + init_ack = &cp->init; + /* Validate parameters. */ + if ((ntohl(init_ack->initiate_tag) == 0) || + (ntohl(init_ack->a_rwnd) < SCTP_MIN_RWND) || + (ntohs(init_ack->num_inbound_streams) == 0) || + (ntohs(init_ack->num_outbound_streams) == 0)) { + /* One of the mandatory parameters is illegal. */ + op_err = sctp_generate_cause(SCTP_CAUSE_INVALID_PARAM, ""); + sctp_abort_association(stcb->sctp_ep, stcb, m, iphlen, + src, dst, sh, op_err, + #if defined(__FreeBSD__) && !defined(__Userspace__) + mflowtype, mflowid, + #endif + vrf_id, net->port); + *abort_no_unlock = 1; + return (-1); + } if (stcb->asoc.primary_destination->dest_state & SCTP_ADDR_UNCONFIRMED) { /* @@ -1517,49 +1427,35 @@ /* error in parsing parameters */ return (-1); } - /* update our state */ + /* Update our state. */ SCTPDBG(SCTP_DEBUG_INPUT2, "moving to COOKIE-ECHOED state\n"); SCTP_SET_STATE(stcb, SCTP_STATE_COOKIE_ECHOED); - /* reset the RTO calc */ + /* Reset the RTO calculation. */ if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_THRESHOLD_LOGGING) { sctp_misc_ints(SCTP_THRESHOLD_CLEAR, - stcb->asoc.overall_error_count, - 0, - SCTP_FROM_SCTP_INPUT, - __LINE__); + stcb->asoc.overall_error_count, + 0, + SCTP_FROM_SCTP_INPUT, + __LINE__); } stcb->asoc.overall_error_count = 0; (void)SCTP_GETTIME_TIMEVAL(&stcb->asoc.time_entered); /* - * collapse the init timer back in case of a exponential - * backoff + * Collapse the init timer back in case of a exponential + * backoff. */ sctp_timer_start(SCTP_TIMER_TYPE_COOKIE, stcb->sctp_ep, stcb, net); /* - * the send at the end of the inbound data processing will - * cause the cookie to be sent + * The output routine at the end of the inbound data processing + * will cause the cookie to be sent. */ - break; - case SCTP_STATE_SHUTDOWN_SENT: - /* incorrect state... discard */ - break; - case SCTP_STATE_COOKIE_ECHOED: - /* incorrect state... discard */ - break; - case SCTP_STATE_OPEN: - /* incorrect state... discard */ - break; - case SCTP_STATE_EMPTY: - case SCTP_STATE_INUSE: - default: - /* incorrect state... discard */ + SCTPDBG(SCTP_DEBUG_INPUT1, "Leaving handle-init-ack end\n"); + return (0); + } else { return (-1); - break; } - SCTPDBG(SCTP_DEBUG_INPUT1, "Leaving handle-init-ack end\n"); - return (0); } static struct sctp_tcb * @@ -1574,7 +1470,6 @@ #endif uint32_t vrf_id, uint16_t port); - /* * handle a state cookie for an existing association m: input packet mbuf * chain-- assumes a pullup on IP/SCTP/COOKIE-ECHO chunk note: this is a @@ -1633,6 +1528,7 @@ vrf_id, net->port); if (how_indx < sizeof(asoc->cookie_how)) asoc->cookie_how[how_indx] = 2; + SCTP_TCB_UNLOCK(stcb); return (NULL); } /* @@ -1647,9 +1543,11 @@ (uint8_t *) & init_buf); if (init_cp == NULL) { /* could not pull a INIT chunk in cookie */ + SCTP_TCB_UNLOCK(stcb); return (NULL); } if (init_cp->ch.chunk_type != SCTP_INITIATION) { + SCTP_TCB_UNLOCK(stcb); return (NULL); } /* @@ -1662,9 +1560,11 @@ (uint8_t *) & initack_buf); if (initack_cp == NULL) { /* could not pull INIT-ACK chunk in cookie */ + SCTP_TCB_UNLOCK(stcb); return (NULL); } if (initack_cp->ch.chunk_type != SCTP_INITIATION_ACK) { + SCTP_TCB_UNLOCK(stcb); return (NULL); } if ((ntohl(initack_cp->init.initiate_tag) == asoc->my_vtag) && @@ -1682,7 +1582,7 @@ * ----INIT-ACK(tag=t)--> * ----INIT(tag=t)------> *1 * <---INIT-ACK(tag=a)--- - * <----CE(tag=t)------------- *2 + * <----CE(tag=t)------------- *2 * * At point *1 we should be generating a different * tag t'. Which means we would throw away the CE and send @@ -1690,8 +1590,8 @@ */ if (how_indx < sizeof(asoc->cookie_how)) asoc->cookie_how[how_indx] = 17; + SCTP_TCB_UNLOCK(stcb); return (NULL); - } switch (SCTP_GET_STATE(stcb)) { case SCTP_STATE_COOKIE_WAIT: @@ -1703,10 +1603,17 @@ * have the right seq no's. */ /* First we must process the INIT !! */ - retval = sctp_process_init(init_cp, stcb); - if (retval < 0) { + if (sctp_process_init(init_cp, stcb) < 0) { if (how_indx < sizeof(asoc->cookie_how)) asoc->cookie_how[how_indx] = 3; + op_err = sctp_generate_cause(SCTP_CAUSE_OUT_OF_RESC, ""); + SCTPDBG(SCTP_DEBUG_INPUT1, "sctp_process_init() failed\n"); + sctp_abort_association(stcb->sctp_ep, stcb, m, iphlen, + src, dst, sh, op_err, +#if defined(__FreeBSD__) && !defined(__Userspace__) + mflowtype, mflowid, +#endif + vrf_id, net->port); return (NULL); } /* we have already processed the INIT so no problem */ @@ -1741,16 +1648,16 @@ * init/init-ack/cookie done before the * init-ack came back.. */ - stcb->sctp_ep->sctp_flags |= - SCTP_PCB_FLAGS_CONNECTED; + sctp_pcb_add_flags(stcb->sctp_ep, SCTP_PCB_FLAGS_CONNECTED); #if defined(__APPLE__) && !defined(__Userspace__) so = SCTP_INP_SO(stcb->sctp_ep); atomic_add_int(&stcb->asoc.refcnt, 1); SCTP_TCB_UNLOCK(stcb); SCTP_SOCKET_LOCK(so, 1); SCTP_TCB_LOCK(stcb); - atomic_add_int(&stcb->asoc.refcnt, -1); + atomic_subtract_int(&stcb->asoc.refcnt, 1); if (stcb->asoc.state & SCTP_STATE_CLOSED_SOCKET) { + SCTP_TCB_UNLOCK(stcb); SCTP_SOCKET_UNLOCK(so, 1); return (NULL); } @@ -1775,7 +1682,7 @@ if (stcb->asoc.sctp_autoclose_ticks && (sctp_is_feature_on(inp, SCTP_PCB_FLAGS_AUTOCLOSE))) { sctp_timer_start(SCTP_TIMER_TYPE_AUTOCLOSE, - inp, stcb, NULL); + inp, stcb, NULL); } break; default: @@ -1786,16 +1693,22 @@ break; } /* end switch */ sctp_stop_all_cookie_timers(stcb); - /* - * We ignore the return code here.. not sure if we should - * somehow abort.. but we do have an existing asoc. This - * really should not fail. - */ - if (sctp_load_addresses_from_init(stcb, m, - init_offset + sizeof(struct sctp_init_chunk), - initack_offset, src, dst, init_src, stcb->asoc.port)) { + if ((retval = sctp_load_addresses_from_init(stcb, m, + init_offset + sizeof(struct sctp_init_chunk), + initack_offset, src, dst, init_src, stcb->asoc.port)) < 0) { if (how_indx < sizeof(asoc->cookie_how)) asoc->cookie_how[how_indx] = 4; + op_err = sctp_generate_cause(SCTP_BASE_SYSCTL(sctp_diag_info_code), + "Problem with address parameters"); + SCTPDBG(SCTP_DEBUG_INPUT1, + "Load addresses from INIT causes an abort %d\n", + retval); + sctp_abort_association(stcb->sctp_ep, stcb, m, iphlen, + src, dst, sh, op_err, +#if defined(__FreeBSD__) && !defined(__Userspace__) + mflowtype, mflowid, +#endif + vrf_id, net->port); return (NULL); } /* respond with a COOKIE-ACK */ @@ -1815,12 +1728,13 @@ */ if (how_indx < sizeof(asoc->cookie_how)) asoc->cookie_how[how_indx] = 6; + SCTP_TCB_UNLOCK(stcb); return (NULL); } /* If nat support, and the below and stcb is established, * send back a ABORT(colliding state) if we are established. */ - if ((SCTP_GET_STATE(stcb) == SCTP_STATE_OPEN) && + if ((SCTP_GET_STATE(stcb) == SCTP_STATE_OPEN) && (asoc->peer_supports_nat) && ((ntohl(initack_cp->init.initiate_tag) == asoc->my_vtag) && ((ntohl(init_cp->init.initiate_tag) != asoc->peer_vtag) || @@ -1840,6 +1754,7 @@ mflowtype, mflowid, inp->fibnum, #endif vrf_id, port); + SCTP_TCB_UNLOCK(stcb); return (NULL); } if ((ntohl(initack_cp->init.initiate_tag) == asoc->my_vtag) && @@ -1855,7 +1770,7 @@ * generator returned the same vtag when we * first sent our INIT-ACK and when we later sent * our INIT. The side with the seq numbers that are - * different will be the one that normnally would + * different will be the one that normally would * have hit case C. This in effect "extends" our vtags * in this collision case to be 64 bits. The same collision * could occur aka you get both vtag and seq number the @@ -1869,6 +1784,7 @@ if (how_indx < sizeof(asoc->cookie_how)) asoc->cookie_how[how_indx] = 7; + SCTP_TCB_UNLOCK(stcb); return (NULL); } if (how_indx < sizeof(asoc->cookie_how)) @@ -1884,7 +1800,7 @@ if (stcb->asoc.sctp_autoclose_ticks && sctp_is_feature_on(inp, SCTP_PCB_FLAGS_AUTOCLOSE)) { sctp_timer_start(SCTP_TIMER_TYPE_AUTOCLOSE, inp, stcb, - NULL); + NULL); } asoc->my_rwnd = ntohl(initack_cp->init.a_rwnd); if (asoc->pre_open_streams < asoc->streamoutcnt) { @@ -1899,7 +1815,8 @@ * kick us so it COULD still take a timeout * to move these.. but it can't hurt to mark them. */ - TAILQ_FOREACH(chk, &stcb->asoc.sent_queue, sctp_next) { + + TAILQ_FOREACH(chk, &stcb->asoc.sent_queue, sctp_next) { if (chk->sent < SCTP_DATAGRAM_RESEND) { chk->sent = SCTP_DATAGRAM_RESEND; sctp_flight_size_decrease(chk); @@ -1908,20 +1825,37 @@ spec_flag++; } } - } /* process the INIT info (peer's info) */ - retval = sctp_process_init(init_cp, stcb); - if (retval < 0) { + if (sctp_process_init(init_cp, stcb) < 0) { if (how_indx < sizeof(asoc->cookie_how)) asoc->cookie_how[how_indx] = 9; + op_err = sctp_generate_cause(SCTP_CAUSE_OUT_OF_RESC, ""); + SCTPDBG(SCTP_DEBUG_INPUT1, "sctp_process_init() failed\n"); + sctp_abort_association(stcb->sctp_ep, stcb, m, iphlen, + src, dst, sh, op_err, +#if defined(__FreeBSD__) && !defined(__Userspace__) + mflowtype, mflowid, +#endif + vrf_id, net->port); return (NULL); } - if (sctp_load_addresses_from_init(stcb, m, - init_offset + sizeof(struct sctp_init_chunk), - initack_offset, src, dst, init_src, stcb->asoc.port)) { + if ((retval = sctp_load_addresses_from_init(stcb, m, + init_offset + sizeof(struct sctp_init_chunk), + initack_offset, src, dst, init_src, stcb->asoc.port)) < 0) { if (how_indx < sizeof(asoc->cookie_how)) asoc->cookie_how[how_indx] = 10; + op_err = sctp_generate_cause(SCTP_BASE_SYSCTL(sctp_diag_info_code), + "Problem with address parameters"); + SCTPDBG(SCTP_DEBUG_INPUT1, + "Load addresses from INIT causes an abort %d\n", + retval); + sctp_abort_association(stcb->sctp_ep, stcb, m, iphlen, + src, dst, sh, op_err, +#if defined(__FreeBSD__) && !defined(__Userspace__) + mflowtype, mflowid, +#endif + vrf_id, net->port); return (NULL); } if ((SCTP_GET_STATE(stcb) == SCTP_STATE_COOKIE_WAIT) || @@ -1934,16 +1868,16 @@ #if defined(__APPLE__) && !defined(__Userspace__) struct socket *so; #endif - stcb->sctp_ep->sctp_flags |= - SCTP_PCB_FLAGS_CONNECTED; + sctp_pcb_add_flags(stcb->sctp_ep, SCTP_PCB_FLAGS_CONNECTED); #if defined(__APPLE__) && !defined(__Userspace__) so = SCTP_INP_SO(stcb->sctp_ep); atomic_add_int(&stcb->asoc.refcnt, 1); SCTP_TCB_UNLOCK(stcb); SCTP_SOCKET_LOCK(so, 1); SCTP_TCB_LOCK(stcb); - atomic_add_int(&stcb->asoc.refcnt, -1); + atomic_subtract_int(&stcb->asoc.refcnt, 1); if (stcb->asoc.state & SCTP_STATE_CLOSED_SOCKET) { + SCTP_TCB_UNLOCK(stcb); SCTP_SOCKET_UNLOCK(so, 1); return (NULL); } @@ -1996,19 +1930,25 @@ #endif if (asoc->peer_supports_nat) { + struct sctp_tcb *local_stcb; + /* This is a gross gross hack. * Just call the cookie_new code since we * are allowing a duplicate association. * I hope this works... */ - return (sctp_process_cookie_new(m, iphlen, offset, src, dst, - sh, cookie, cookie_len, - inp, netp, init_src,notification, - auth_skipped, auth_offset, auth_len, + local_stcb = sctp_process_cookie_new(m, iphlen, offset, src, dst, + sh, cookie, cookie_len, + inp, netp, init_src,notification, + auth_skipped, auth_offset, auth_len, #if defined(__FreeBSD__) && !defined(__Userspace__) - mflowtype, mflowid, + mflowtype, mflowid, #endif - vrf_id, port)); + vrf_id, port); + if (local_stcb == NULL) { + SCTP_TCB_UNLOCK(stcb); + } + return (local_stcb); } /* * case A in Section 5.2.4 Table 2: XXMM (peer restarted) @@ -2016,11 +1956,7 @@ /* temp code */ if (how_indx < sizeof(asoc->cookie_how)) asoc->cookie_how[how_indx] = 12; - sctp_timer_stop(SCTP_TIMER_TYPE_INIT, inp, stcb, net, - SCTP_FROM_SCTP_INPUT + SCTP_LOC_16); - sctp_timer_stop(SCTP_TIMER_TYPE_HEARTBEAT, inp, stcb, net, - SCTP_FROM_SCTP_INPUT + SCTP_LOC_17); - + sctp_stop_association_timers(stcb, false); /* notify upper layer */ *notification = SCTP_NOTIFY_ASSOC_RESTART; atomic_add_int(&stcb->asoc.refcnt, 1); @@ -2049,12 +1985,14 @@ asoc->init_seq_number = ntohl(initack_cp->init.initial_tsn); asoc->sending_seq = asoc->asconf_seq_out = asoc->str_reset_seq_out = asoc->init_seq_number; asoc->asconf_seq_out_acked = asoc->asconf_seq_out - 1; - asoc->asconf_seq_in = asoc->last_acked_seq = asoc->init_seq_number - 1; - asoc->str_reset_seq_in = asoc->init_seq_number; - asoc->advanced_peer_ack_point = asoc->last_acked_seq; + asoc->send_sack = 1; + asoc->data_pkts_seen = 0; + asoc->last_data_chunk_from = NULL; + asoc->last_control_chunk_from = NULL; + asoc->last_net_cmt_send_started = NULL; if (asoc->mapping_array) { memset(asoc->mapping_array, 0, asoc->mapping_array_size); @@ -2071,11 +2009,9 @@ SCTP_INP_INFO_WLOCK(); SCTP_INP_WLOCK(stcb->sctp_ep); SCTP_TCB_LOCK(stcb); - atomic_add_int(&stcb->asoc.refcnt, -1); + atomic_subtract_int(&stcb->asoc.refcnt, 1); /* send up all the data */ - SCTP_TCB_SEND_LOCK(stcb); - - sctp_report_all_outbound(stcb, 0, 1, SCTP_SO_LOCKED); + sctp_report_all_outbound(stcb, 0, SCTP_SO_LOCKED); for (i = 0; i < stcb->asoc.streamoutcnt; i++) { stcb->asoc.strmout[i].chunks_on_queues = 0; #if defined(SCTP_DETAILED_STR_STATS) @@ -2087,9 +2023,9 @@ asoc->strmout[i].abandoned_sent[0] = 0; asoc->strmout[i].abandoned_unsent[0] = 0; #endif - stcb->asoc.strmout[i].sid = i; stcb->asoc.strmout[i].next_mid_ordered = 0; stcb->asoc.strmout[i].next_mid_unordered = 0; + stcb->asoc.strmout[i].sid = i; stcb->asoc.strmout[i].last_msg_incomplete = 0; } TAILQ_FOREACH_SAFE(strrst, &asoc->resetHead, next_resp, nstrrst) { @@ -2119,6 +2055,9 @@ SCTP_ZONE_FREE(SCTP_BASE_INFO(ipi_zone_chunk), chk); SCTP_DECR_CHK_COUNT(); } + asoc->ctrl_queue_cnt = 0; + asoc->str_reset = NULL; + asoc->stream_reset_outstanding = 0; TAILQ_FOREACH_SAFE(chk, &asoc->asconf_send_queue, sctp_next, nchk) { TAILQ_REMOVE(&asoc->asconf_send_queue, chk, sctp_next); if (chk->data) { @@ -2143,7 +2082,6 @@ SCTP_ZONE_FREE(SCTP_BASE_INFO(ipi_zone_asconf_ack), aack); } - /* process the INIT-ACK info (my info) */ asoc->my_vtag = ntohl(initack_cp->init.initiate_tag); asoc->my_rwnd = ntohl(initack_cp->init.a_rwnd); @@ -2152,14 +2090,13 @@ LIST_REMOVE(stcb, sctp_asocs); /* re-insert to new vtag position */ head = &SCTP_BASE_INFO(sctp_asochash)[SCTP_PCBHASH_ASOC(stcb->asoc.my_vtag, - SCTP_BASE_INFO(hashasocmark))]; + SCTP_BASE_INFO(hashasocmark))]; /* * put it in the bucket in the vtag hash of assoc's for the * system */ LIST_INSERT_HEAD(head, stcb, sctp_asocs); - SCTP_TCB_SEND_UNLOCK(stcb); SCTP_INP_WUNLOCK(stcb->sctp_ep); SCTP_INP_INFO_WUNLOCK(); #if defined(__APPLE__) && !defined(__Userspace__) @@ -2168,11 +2105,17 @@ asoc->total_flight = 0; asoc->total_flight_count = 0; /* process the INIT info (peer's info) */ - retval = sctp_process_init(init_cp, stcb); - if (retval < 0) { + if (sctp_process_init(init_cp, stcb) < 0) { if (how_indx < sizeof(asoc->cookie_how)) asoc->cookie_how[how_indx] = 13; - + op_err = sctp_generate_cause(SCTP_CAUSE_OUT_OF_RESC, ""); + SCTPDBG(SCTP_DEBUG_INPUT1, "sctp_process_init() failed\n"); + sctp_abort_association(stcb->sctp_ep, stcb, m, iphlen, + src, dst, sh, op_err, +#if defined(__FreeBSD__) && !defined(__Userspace__) + mflowtype, mflowid, +#endif + vrf_id, net->port); return (NULL); } /* @@ -2181,30 +2124,41 @@ */ net->hb_responded = 1; - if (sctp_load_addresses_from_init(stcb, m, - init_offset + sizeof(struct sctp_init_chunk), - initack_offset, src, dst, init_src, stcb->asoc.port)) { + if ((retval = sctp_load_addresses_from_init(stcb, m, + init_offset + sizeof(struct sctp_init_chunk), + initack_offset, src, dst, init_src, stcb->asoc.port)) < 0) { if (how_indx < sizeof(asoc->cookie_how)) asoc->cookie_how[how_indx] = 14; - + op_err = sctp_generate_cause(SCTP_BASE_SYSCTL(sctp_diag_info_code), + "Problem with address parameters"); + SCTPDBG(SCTP_DEBUG_INPUT1, + "Load addresses from INIT causes an abort %d\n", + retval); + sctp_abort_association(stcb->sctp_ep, stcb, m, iphlen, + src, dst, sh, op_err, +#if defined(__FreeBSD__) && !defined(__Userspace__) + mflowtype, mflowid, +#endif + vrf_id, net->port); return (NULL); } /* respond with a COOKIE-ACK */ - sctp_stop_all_cookie_timers(stcb); - sctp_toss_old_cookies(stcb, asoc); sctp_send_cookie_ack(stcb); if (how_indx < sizeof(asoc->cookie_how)) asoc->cookie_how[how_indx] = 15; - + if (sctp_is_feature_on(inp, SCTP_PCB_FLAGS_AUTOCLOSE) && + (asoc->sctp_autoclose_ticks > 0)) { + sctp_timer_start(SCTP_TIMER_TYPE_AUTOCLOSE, inp, stcb, NULL); + } return (stcb); } if (how_indx < sizeof(asoc->cookie_how)) asoc->cookie_how[how_indx] = 16; /* all other cases... */ + SCTP_TCB_UNLOCK(stcb); return (NULL); } - /* * handle a state cookie for a new association m: input packet mbuf chain-- * assumes a pullup on IP/SCTP/COOKIE-ECHO chunk note: this is a "split" mbuf @@ -2230,7 +2184,6 @@ union sctp_sockstore store; struct sctp_association *asoc; int init_offset, initack_offset, initack_limit; - int retval; int error = 0; uint8_t auth_chunk_buf[SCTP_CHUNK_BUFFER_SIZE]; #if defined(__APPLE__) && !defined(__Userspace__) @@ -2284,7 +2237,7 @@ /* * now that we know the INIT/INIT-ACK are in place, create a new TCB - * and popluate + * and populate */ /* @@ -2294,7 +2247,8 @@ * Since we are getting a cookie, we cannot be unbound. */ stcb = sctp_aloc_assoc(inp, init_src, &error, - ntohl(initack_cp->init.initiate_tag), vrf_id, + ntohl(initack_cp->init.initiate_tag), + ntohl(initack_cp->init.initial_tsn), vrf_id, ntohs(initack_cp->init.num_outbound_streams), port, #if defined(__FreeBSD__) && !defined(__Userspace__) @@ -2364,19 +2318,10 @@ return (NULL); } /* process the INIT-ACK info (my info) */ - asoc->my_vtag = ntohl(initack_cp->init.initiate_tag); asoc->my_rwnd = ntohl(initack_cp->init.a_rwnd); - asoc->init_seq_number = ntohl(initack_cp->init.initial_tsn); - asoc->sending_seq = asoc->asconf_seq_out = asoc->str_reset_seq_out = asoc->init_seq_number; - asoc->asconf_seq_out_acked = asoc->asconf_seq_out - 1; - asoc->asconf_seq_in = asoc->last_acked_seq = asoc->init_seq_number - 1; - asoc->str_reset_seq_in = asoc->init_seq_number; - - asoc->advanced_peer_ack_point = asoc->last_acked_seq; /* process the INIT info (peer's info) */ - retval = sctp_process_init(init_cp, stcb); - if (retval < 0) { + if (sctp_process_init(init_cp, stcb) < 0) { #if defined(__APPLE__) && !defined(__Userspace__) atomic_add_int(&stcb->asoc.refcnt, 1); SCTP_TCB_UNLOCK(stcb); @@ -2393,8 +2338,8 @@ } /* load all addresses */ if (sctp_load_addresses_from_init(stcb, m, - init_offset + sizeof(struct sctp_init_chunk), initack_offset, - src, dst, init_src, port)) { + init_offset + sizeof(struct sctp_init_chunk), + initack_offset, src, dst, init_src, port) < 0) { #if defined(__APPLE__) && !defined(__Userspace__) atomic_add_int(&stcb->asoc.refcnt, 1); SCTP_TCB_UNLOCK(stcb); @@ -2532,8 +2477,10 @@ * INIT/INIT-ACK/COOKIE arrived. But of course then it * should have went to the other code.. not here.. oh well.. * a bit of protection is worth having.. + * + * XXXMJ unlocked */ - stcb->sctp_ep->sctp_flags |= SCTP_PCB_FLAGS_CONNECTED; + sctp_pcb_add_flags(stcb->sctp_ep, SCTP_PCB_FLAGS_CONNECTED); #if defined(__APPLE__) && !defined(__Userspace__) atomic_add_int(&stcb->asoc.refcnt, 1); SCTP_TCB_UNLOCK(stcb); @@ -2590,7 +2537,6 @@ &store.sa, cookie->local_scope, cookie->site_scope, cookie->ipv4_scope, cookie->loopback_scope); - return (stcb); } @@ -2601,7 +2547,7 @@ head = &SCTP_BASE_INFO(sctp_asochash)[SCTP_PCBHASH_ASOC(tag, SCTP_BASE_INFO(hashasocmark))]; LIST_FOREACH(stcb, head, sctp_asocs) { - if ((stcb->asoc.my_vtag == tag) && (stcb->rport == rport) && (inp == stcb->sctp_ep)) { + if ((stcb->asoc.my_vtag == tag) && (stcb->rport == rport) && (inp == stcb->sctp_ep)) { -- SEND ABORT - TRY AGAIN -- } } @@ -2631,11 +2577,15 @@ struct mbuf *m_sig; uint8_t calc_sig[SCTP_SIGNATURE_SIZE], tmp_sig[SCTP_SIGNATURE_SIZE]; uint8_t *sig; +#if defined(__Userspace__) && defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) + uint8_t cookie_ok = 1; +#else uint8_t cookie_ok = 0; +#endif unsigned int sig_offset, cookie_offset; unsigned int cookie_len; struct timeval now; - struct timeval time_expires; + struct timeval time_entered, time_expires; int notification = 0; struct sctp_nets *netl; int had_a_existing_tcb = 0; @@ -2718,15 +2668,22 @@ /* * compute the signature/digest for the cookie */ - ep = &(*inp_p)->sctp_ep; - l_inp = *inp_p; - if (l_stcb) { + if (l_stcb != NULL) { + atomic_add_int(&l_stcb->asoc.refcnt, 1); SCTP_TCB_UNLOCK(l_stcb); } + l_inp = *inp_p; SCTP_INP_RLOCK(l_inp); - if (l_stcb) { + if (l_stcb != NULL) { SCTP_TCB_LOCK(l_stcb); + atomic_subtract_int(&l_stcb->asoc.refcnt, 1); + } + if (l_inp->sctp_flags & (SCTP_PCB_FLAGS_SOCKET_GONE | SCTP_PCB_FLAGS_SOCKET_ALLGONE)) { + SCTP_INP_RUNLOCK(l_inp); + sctp_m_freem(m_sig); + return (NULL); } + ep = &(*inp_p)->sctp_ep; /* which cookie is it? */ if ((cookie->time_entered.tv_sec < (long)ep->time_of_secret_change) && (ep->current_secret_number != ep->last_secret_number)) { @@ -2787,13 +2744,34 @@ return (NULL); } + if (sctp_ticks_to_msecs(cookie->cookie_life) > SCTP_MAX_COOKIE_LIFE) { + SCTPDBG(SCTP_DEBUG_INPUT2, "handle_cookie_echo: Invalid cookie lifetime\n"); + return (NULL); + } + time_entered.tv_sec = cookie->time_entered.tv_sec; + time_entered.tv_usec = cookie->time_entered.tv_usec; + if ((time_entered.tv_sec < 0) || + (time_entered.tv_usec < 0) || + (time_entered.tv_usec >= 1000000)) { + /* Invalid time stamp. Cookie must have been modified. */ + SCTPDBG(SCTP_DEBUG_INPUT2, "handle_cookie_echo: Invalid time stamp\n"); + return (NULL); + } + (void)SCTP_GETTIME_TIMEVAL(&now); +#if !(defined(__FreeBSD__) && !defined(__Userspace__)) + if (timercmp(&now, &time_entered, <)) { +#else + if (timevalcmp(&now, &time_entered, <)) { +#endif + SCTPDBG(SCTP_DEBUG_INPUT2, "handle_cookie_echo: cookie generated in the future!\n"); + return (NULL); + } /* - * check the cookie timestamps to be sure it's not stale + * Check the cookie timestamps to be sure it's not stale. + * cookie_life is in ticks, so we convert to seconds. */ - (void)SCTP_GETTIME_TIMEVAL(&now); - /* Expire time is in Ticks, so we convert to seconds */ - time_expires.tv_sec = cookie->time_entered.tv_sec + sctp_ticks_to_secs(cookie->cookie_life); - time_expires.tv_usec = cookie->time_entered.tv_usec; + time_expires.tv_sec = time_entered.tv_sec + sctp_ticks_to_secs(cookie->cookie_life); + time_expires.tv_usec = time_entered.tv_usec; #if !(defined(__FreeBSD__) && !defined(__Userspace__)) if (timercmp(&now, &time_expires, >)) #else @@ -2816,8 +2794,7 @@ SCTP_BUF_LEN(op_err) = sizeof(struct sctp_error_stale_cookie); cause = mtod(op_err, struct sctp_error_stale_cookie *); cause->cause.code = htons(SCTP_CAUSE_STALE_COOKIE); - cause->cause.length = htons((sizeof(struct sctp_paramhdr) + - (sizeof(uint32_t)))); + cause->cause.length = htons(sizeof(struct sctp_error_stale_cookie)); #if !(defined(__FreeBSD__) && !defined(__Userspace__)) timersub(&now, &time_expires, &diff); #else @@ -2827,10 +2804,10 @@ if ((uint32_t)diff.tv_sec > UINT32_MAX / 1000000) { staleness = UINT32_MAX; } else { - staleness = diff.tv_sec * 1000000; + staleness = (uint32_t)diff.tv_sec * 1000000; } if (UINT32_MAX - staleness >= (uint32_t)diff.tv_usec) { - staleness += diff.tv_usec; + staleness += (uint32_t)diff.tv_usec; } else { staleness = UINT32_MAX; } @@ -2948,12 +2925,15 @@ had_a_existing_tcb = 1; *stcb = sctp_process_cookie_existing(m, iphlen, offset, src, dst, sh, - cookie, cookie_len, *inp_p, *stcb, netp, to, - ¬ification, auth_skipped, auth_offset, auth_len, + cookie, cookie_len, *inp_p, *stcb, netp, to, + ¬ification, auth_skipped, auth_offset, auth_len, #if defined(__FreeBSD__) && !defined(__Userspace__) mflowtype, mflowid, #endif vrf_id, port); + if (*stcb == NULL) { + *locked_tcb = NULL; + } } if (*stcb == NULL) { @@ -3096,7 +3076,6 @@ inp->sctp_context = (*inp_p)->sctp_context; inp->local_strreset_support = (*inp_p)->local_strreset_support; inp->fibnum = (*inp_p)->fibnum; - inp->inp_starting_point_for_iterator = NULL; #if defined(__Userspace__) inp->ulp_info = (*inp_p)->ulp_info; inp->recv_callback = (*inp_p)->recv_callback; @@ -3141,7 +3120,6 @@ SCTP_TCB_LOCK((*stcb)); atomic_subtract_int(&(*stcb)->asoc.refcnt, 1); - /* now we must check to see if we were aborted while * the move was going on and the lock/unlock happened. */ @@ -3221,7 +3199,6 @@ if (asoc->state & SCTP_STATE_SHUTDOWN_PENDING) { sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWNGUARD, stcb->sctp_ep, stcb, NULL); - } /* update RTO */ SCTP_STAT_INCR_COUNTER32(sctps_activeestab); @@ -3238,7 +3215,7 @@ struct socket *so; #endif - stcb->sctp_ep->sctp_flags |= SCTP_PCB_FLAGS_CONNECTED; + sctp_pcb_add_flags(stcb->sctp_ep, SCTP_PCB_FLAGS_CONNECTED); #if defined(__APPLE__) && !defined(__Userspace__) so = SCTP_INP_SO(stcb->sctp_ep); atomic_add_int(&stcb->asoc.refcnt, 1); @@ -3270,7 +3247,6 @@ sctp_timer_start(SCTP_TIMER_TYPE_HEARTBEAT, stcb->sctp_ep, stcb, net); - if (stcb->asoc.sctp_autoclose_ticks && sctp_is_feature_on(stcb->sctp_ep, SCTP_PCB_FLAGS_AUTOCLOSE)) { sctp_timer_start(SCTP_TIMER_TYPE_AUTOCLOSE, @@ -3321,10 +3297,6 @@ unsigned int pkt_cnt; len = ntohs(cp->ch.chunk_length); - if ((len != sizeof(struct sctp_ecne_chunk)) && - (len != sizeof(struct old_sctp_ecne_chunk))) { - return; - } if (len == sizeof(struct old_sctp_ecne_chunk)) { /* Its the old format */ memcpy(&bkup, cp, sizeof(struct old_sctp_ecne_chunk)); @@ -3528,7 +3500,8 @@ { switch (desc->chunk_type) { case SCTP_DATA: - /* find the tsn to resend (possibly */ + case SCTP_IDATA: + /* find the tsn to resend (possibly) */ { uint32_t tsn; struct sctp_tmit_chunk *tp1; @@ -3562,8 +3535,6 @@ SCTP_STAT_INCR(sctps_pdrptsnnf); } if ((tp1) && (tp1->sent < SCTP_DATAGRAM_ACKED)) { - uint8_t *ddp; - if (((flg & SCTP_BADCRC) == 0) && ((flg & SCTP_FROM_MIDDLE_BOX) == 0)) { return (0); @@ -3578,20 +3549,18 @@ SCTP_STAT_INCR(sctps_pdrpdizrw); return (0); } - ddp = (uint8_t *) (mtod(tp1->data, caddr_t) + - sizeof(struct sctp_data_chunk)); - { - unsigned int iii; - - for (iii = 0; iii < sizeof(desc->data_bytes); - iii++) { - if (ddp[iii] != desc->data_bytes[iii]) { - SCTP_STAT_INCR(sctps_pdrpbadd); - return (-1); - } - } + if ((uint32_t)SCTP_BUF_LEN(tp1->data) < + SCTP_DATA_CHUNK_OVERHEAD(stcb) + SCTP_NUM_DB_TO_VERIFY) { + /* Payload not matching. */ + SCTP_STAT_INCR(sctps_pdrpbadd); + return (-1); + } + if (memcmp(mtod(tp1->data, caddr_t) + SCTP_DATA_CHUNK_OVERHEAD(stcb), + desc->data_bytes, SCTP_NUM_DB_TO_VERIFY) != 0) { + /* Payload not matching. */ + SCTP_STAT_INCR(sctps_pdrpbadd); + return (-1); } - if (tp1->do_rtt) { /* * this guy had a RTO calculation @@ -3835,7 +3804,6 @@ } } - struct sctp_stream_reset_request * sctp_find_stream_reset(struct sctp_tcb *stcb, uint32_t seq, struct sctp_tmit_chunk **bchk) { @@ -3846,19 +3814,16 @@ int len, clen; asoc = &stcb->asoc; - if (TAILQ_EMPTY(&stcb->asoc.control_send_queue)) { - asoc->stream_reset_outstanding = 0; - return (NULL); - } - if (stcb->asoc.str_reset == NULL) { + chk = asoc->str_reset; + if (TAILQ_EMPTY(&asoc->control_send_queue) || + (chk == NULL)) { asoc->stream_reset_outstanding = 0; return (NULL); } - chk = stcb->asoc.str_reset; if (chk->data == NULL) { return (NULL); } - if (bchk) { + if (bchk != NULL) { /* he wants a copy of the chk pointer */ *bchk = chk; } @@ -3904,7 +3869,6 @@ sctp_free_a_chunk(stcb, chk, SCTP_SO_NOT_LOCKED); } - static int sctp_handle_stream_reset_response(struct sctp_tcb *stcb, uint32_t seq, uint32_t action, @@ -3981,7 +3945,7 @@ if (action == SCTP_STREAM_RESET_RESULT_PERFORMED) { /* Put the new streams into effect */ int i; - for ( i = asoc->streamoutcnt; i< (asoc->streamoutcnt + num_stream); i++) { + for (i = asoc->streamoutcnt; i < (asoc->streamoutcnt + num_stream); i++) { asoc->strmout[i].state = SCTP_STREAM_OPEN; } asoc->streamoutcnt += num_stream; @@ -4086,7 +4050,7 @@ seq = ntohl(req->request_seq); if (asoc->str_reset_seq_in == seq) { asoc->last_reset_action[1] = asoc->last_reset_action[0]; - if (!(asoc->local_strreset_support & SCTP_ENABLE_RESET_STREAM_REQ)) { + if ((asoc->local_strreset_support & SCTP_ENABLE_RESET_STREAM_REQ) == 0) { asoc->last_reset_action[0] = SCTP_STREAM_RESET_RESULT_DENIED; } else if (trunc) { /* Can't do it, since they exceeded our buffer size */ @@ -4152,7 +4116,7 @@ seq = ntohl(req->request_seq); if (asoc->str_reset_seq_in == seq) { asoc->last_reset_action[1] = stcb->asoc.last_reset_action[0]; - if (!(asoc->local_strreset_support & SCTP_ENABLE_CHANGE_ASSOC_REQ)) { + if ((asoc->local_strreset_support & SCTP_ENABLE_CHANGE_ASSOC_REQ) == 0) { asoc->last_reset_action[0] = SCTP_STREAM_RESET_RESULT_DENIED; } else { fwdtsn.ch.chunk_length = htons(sizeof(struct sctp_forward_tsn_chunk)); @@ -4224,7 +4188,7 @@ /* move the reset action back one */ asoc->last_reset_action[1] = asoc->last_reset_action[0]; - if (!(asoc->local_strreset_support & SCTP_ENABLE_RESET_STREAM_REQ)) { + if ((asoc->local_strreset_support & SCTP_ENABLE_RESET_STREAM_REQ) == 0) { asoc->last_reset_action[0] = SCTP_STREAM_RESET_RESULT_DENIED; } else if (trunc) { asoc->last_reset_action[0] = SCTP_STREAM_RESET_RESULT_DENIED; @@ -4296,7 +4260,7 @@ if (asoc->str_reset_seq_in == seq) { num_stream += stcb->asoc.streamincnt; stcb->asoc.last_reset_action[1] = stcb->asoc.last_reset_action[0]; - if (!(asoc->local_strreset_support & SCTP_ENABLE_CHANGE_ASSOC_REQ)) { + if ((asoc->local_strreset_support & SCTP_ENABLE_CHANGE_ASSOC_REQ) == 0) { asoc->last_reset_action[0] = SCTP_STREAM_RESET_RESULT_DENIED; } else if ((num_stream > stcb->asoc.max_inbound_streams) || (num_stream > 0xffff)) { @@ -4365,7 +4329,6 @@ sctp_add_stream_reset_result(chk, seq, asoc->last_reset_action[1]); } else { sctp_add_stream_reset_result(chk, seq, SCTP_STREAM_RESET_RESULT_ERR_BAD_SEQNO); - } } @@ -4388,7 +4351,7 @@ /* Now what would be the new total? */ if (asoc->str_reset_seq_in == seq) { stcb->asoc.last_reset_action[1] = stcb->asoc.last_reset_action[0]; - if (!(asoc->local_strreset_support & SCTP_ENABLE_CHANGE_ASSOC_REQ)) { + if ((asoc->local_strreset_support & SCTP_ENABLE_CHANGE_ASSOC_REQ) == 0) { asoc->last_reset_action[0] = SCTP_STREAM_RESET_RESULT_DENIED; } else if (stcb->asoc.stream_reset_outstanding) { /* We must reject it we have something pending */ @@ -4604,110 +4567,122 @@ * Handle a router or endpoints report of a packet loss, there are two ways * to handle this, either we get the whole packet and must disect it * ourselves (possibly with truncation and or corruption) or it is a summary - * from a middle box that did the disectting for us. + * from a middle box that did the disecting for us. */ static void sctp_handle_packet_dropped(struct sctp_pktdrop_chunk *cp, struct sctp_tcb *stcb, struct sctp_nets *net, uint32_t limit) { - uint32_t bottle_bw, on_queue; - uint16_t trunc_len; - unsigned int chlen; - unsigned int at; struct sctp_chunk_desc desc; - struct sctp_chunkhdr *ch; - - chlen = ntohs(cp->ch.chunk_length); - chlen -= sizeof(struct sctp_pktdrop_chunk); - /* XXX possible chlen underflow */ - if (chlen == 0) { - ch = NULL; - if (cp->ch.chunk_flags & SCTP_FROM_MIDDLE_BOX) + struct sctp_chunkhdr *chk_hdr; + struct sctp_data_chunk *data_chunk; + struct sctp_idata_chunk *idata_chunk; + uint32_t bottle_bw, on_queue; + uint32_t offset, chk_len; + uint16_t pktdrp_len; + uint8_t pktdrp_flags; + + KASSERT(sizeof(struct sctp_pktdrop_chunk) <= limit, + ("PKTDROP chunk too small")); + pktdrp_flags = cp->ch.chunk_flags; + pktdrp_len = ntohs(cp->ch.chunk_length); + KASSERT(limit <= pktdrp_len, ("Inconsistent limit")); + if (pktdrp_flags & SCTP_PACKET_TRUNCATED) { + if (ntohs(cp->trunc_len) <= pktdrp_len - sizeof(struct sctp_pktdrop_chunk)) { + /* The peer plays games with us. */ + return; + } + } + limit -= sizeof(struct sctp_pktdrop_chunk); + offset = 0; + if (offset == limit) { + if (pktdrp_flags & SCTP_FROM_MIDDLE_BOX) { SCTP_STAT_INCR(sctps_pdrpbwrpt); + } + } else if (offset + sizeof(struct sctphdr) > limit) { + /* Only a partial SCTP common header. */ + SCTP_STAT_INCR(sctps_pdrpcrupt); + offset = limit; } else { - ch = (struct sctp_chunkhdr *)(cp->data + sizeof(struct sctphdr)); - chlen -= sizeof(struct sctphdr); - /* XXX possible chlen underflow */ - memset(&desc, 0, sizeof(desc)); - } - trunc_len = (uint16_t) ntohs(cp->trunc_len); - if (trunc_len > limit) { - trunc_len = limit; + /* XXX: Check embedded SCTP common header. */ + offset += sizeof(struct sctphdr); } - - /* now the chunks themselves */ - while ((ch != NULL) && (chlen >= sizeof(struct sctp_chunkhdr))) { - desc.chunk_type = ch->chunk_type; - /* get amount we need to move */ - at = ntohs(ch->chunk_length); - if (at < sizeof(struct sctp_chunkhdr)) { - /* corrupt chunk, maybe at the end? */ + /* Now parse through the chunks themselves. */ + while (offset < limit) { + if (offset + sizeof(struct sctp_chunkhdr) > limit) { SCTP_STAT_INCR(sctps_pdrpcrupt); break; } - if (trunc_len == 0) { - /* we are supposed to have all of it */ - if (at > chlen) { - /* corrupt skip it */ - SCTP_STAT_INCR(sctps_pdrpcrupt); + chk_hdr = (struct sctp_chunkhdr *)(cp->data + offset); + desc.chunk_type = chk_hdr->chunk_type; + /* get amount we need to move */ + chk_len = (uint32_t)ntohs(chk_hdr->chunk_length); + if (chk_len < sizeof(struct sctp_chunkhdr)) { + /* Someone is lying... */ + break; + } + if (desc.chunk_type == SCTP_DATA) { + if (stcb->asoc.idata_supported) { + /* Some is playing games with us. */ break; } - } else { - /* is there enough of it left ? */ - if (desc.chunk_type == SCTP_DATA) { - if (chlen < (sizeof(struct sctp_data_chunk) + - sizeof(desc.data_bytes))) { - break; - } - } else { - if (chlen < sizeof(struct sctp_chunkhdr)) { - break; - } + if (chk_len <= sizeof(struct sctp_data_chunk)) { + /* Some is playing games with us. */ + break; } - } - if (desc.chunk_type == SCTP_DATA) { - /* can we get out the tsn? */ - if ((cp->ch.chunk_flags & SCTP_FROM_MIDDLE_BOX)) + if (chk_len < sizeof(struct sctp_data_chunk) + SCTP_NUM_DB_TO_VERIFY) { + /* Not enough data bytes available in the chunk. */ + SCTP_STAT_INCR(sctps_pdrpnedat); + goto next_chunk; + } + if (offset + sizeof(struct sctp_data_chunk) + SCTP_NUM_DB_TO_VERIFY > limit) { + /* Not enough data in buffer. */ + break; + } + data_chunk = (struct sctp_data_chunk *)(cp->data + offset); + memcpy(desc.data_bytes, data_chunk + 1, SCTP_NUM_DB_TO_VERIFY); + desc.tsn_ifany = data_chunk->dp.tsn; + if (pktdrp_flags & SCTP_FROM_MIDDLE_BOX) { SCTP_STAT_INCR(sctps_pdrpmbda); - - if (chlen >= (sizeof(struct sctp_data_chunk) + sizeof(uint32_t))) { - /* yep */ - struct sctp_data_chunk *dcp; - uint8_t *ddp; - unsigned int iii; - - dcp = (struct sctp_data_chunk *)ch; - ddp = (uint8_t *) (dcp + 1); - for (iii = 0; iii < sizeof(desc.data_bytes); iii++) { - desc.data_bytes[iii] = ddp[iii]; - } - desc.tsn_ifany = dcp->dp.tsn; - } else { - /* nope we are done. */ + } + } else if (desc.chunk_type == SCTP_IDATA) { + if (!stcb->asoc.idata_supported) { + /* Some is playing games with us. */ + break; + } + if (chk_len <= sizeof(struct sctp_idata_chunk)) { + /* Some is playing games with us. */ + break; + } + if (chk_len < sizeof(struct sctp_idata_chunk) + SCTP_NUM_DB_TO_VERIFY) { + /* Not enough data bytes available in the chunk. */ SCTP_STAT_INCR(sctps_pdrpnedat); + goto next_chunk; + } + if (offset + sizeof(struct sctp_idata_chunk) + SCTP_NUM_DB_TO_VERIFY > limit) { + /* Not enough data in buffer. */ break; } + idata_chunk = (struct sctp_idata_chunk *)(cp->data + offset); + memcpy(desc.data_bytes, idata_chunk + 1, SCTP_NUM_DB_TO_VERIFY); + desc.tsn_ifany = idata_chunk->dp.tsn; + if (pktdrp_flags & SCTP_FROM_MIDDLE_BOX) { + SCTP_STAT_INCR(sctps_pdrpmbda); + } } else { - if ((cp->ch.chunk_flags & SCTP_FROM_MIDDLE_BOX)) + if (pktdrp_flags & SCTP_FROM_MIDDLE_BOX) { SCTP_STAT_INCR(sctps_pdrpmbct); + } } - - if (process_chunk_drop(stcb, &desc, net, cp->ch.chunk_flags)) { + if (process_chunk_drop(stcb, &desc, net, pktdrp_flags)) { SCTP_STAT_INCR(sctps_pdrppdbrk); break; } - if (SCTP_SIZE32(at) > chlen) { - break; - } - chlen -= SCTP_SIZE32(at); - if (chlen < sizeof(struct sctp_chunkhdr)) { - /* done, none left */ - break; - } - ch = (struct sctp_chunkhdr *)((caddr_t)ch + SCTP_SIZE32(at)); +next_chunk: + offset += SCTP_SIZE32(chk_len); } /* Now update any rwnd --- possibly */ - if ((cp->ch.chunk_flags & SCTP_FROM_MIDDLE_BOX) == 0) { + if ((pktdrp_flags & SCTP_FROM_MIDDLE_BOX) == 0) { /* From a peer, we get a rwnd report */ uint32_t a_rwnd; @@ -4743,7 +4718,7 @@ } /* now middle boxes in sat networks get a cwnd bump */ - if ((cp->ch.chunk_flags & SCTP_FROM_MIDDLE_BOX) && + if ((pktdrp_flags & SCTP_FROM_MIDDLE_BOX) && (stcb->asoc.sat_t3_loss_recovery == 0) && (stcb->asoc.sat_network)) { /* @@ -4787,6 +4762,7 @@ int ret; int abort_no_unlock = 0; int ecne_seen = 0; + int abort_flag; /* * How big should this be, and should it be alloc'd? Lets try the * d-mtu-ceiling for now (2k) and that should hopefully work ... @@ -4951,29 +4927,6 @@ } return (NULL); } - } else if (ch->chunk_type == SCTP_SHUTDOWN_ACK) { - if (vtag_in != asoc->my_vtag) { - /* - * this could be a stale SHUTDOWN-ACK or the - * peer never got the SHUTDOWN-COMPLETE and - * is still hung; we have started a new asoc - * but it won't complete until the shutdown - * is completed - */ - if (stcb != NULL) { - SCTP_TCB_UNLOCK(stcb); - } - SCTP_SNPRINTF(msg, sizeof(msg), "OOTB, %s:%d at %s", __FILE__, __LINE__, __func__); - op_err = sctp_generate_cause(SCTP_BASE_SYSCTL(sctp_diag_info_code), - msg); - sctp_handle_ootb(m, iphlen, *offset, src, dst, - sh, inp, op_err, -#if defined(__FreeBSD__) && !defined(__Userspace__) - mflowtype, mflowid, fibnum, -#endif - vrf_id, port); - return (NULL); - } } else { /* for all other chunks, vtag must match */ if (vtag_in != asoc->my_vtag) { @@ -5036,10 +4989,7 @@ chunk_buf); if (ch == NULL) { *offset = length; - if (stcb != NULL) { - SCTP_TCB_UNLOCK(stcb); - } - return (NULL); + return (stcb); } num_chunks++; @@ -5073,34 +5023,36 @@ /* The INIT chunk must be the only chunk. */ if ((num_chunks > 1) || (length - *offset > (int)SCTP_SIZE32(chk_length))) { - /* RFC 4960 requires that no ABORT is sent */ + /* + * RFC 4960bis requires stopping the + * processing of the packet. + */ *offset = length; - if (stcb != NULL) { - SCTP_TCB_UNLOCK(stcb); - } - return (NULL); + return (stcb); } /* Honor our resource limit. */ if (chk_length > SCTP_LARGEST_INIT_ACCEPTED) { op_err = sctp_generate_cause(SCTP_CAUSE_OUT_OF_RESC, ""); - sctp_abort_association(inp, stcb, m, iphlen, - src, dst, sh, op_err, + sctp_send_abort(m, iphlen, src, dst, sh, 0, op_err, #if defined(__FreeBSD__) && !defined(__Userspace__) - mflowtype, mflowid, + mflowtype, mflowid, inp->fibnum, #endif - vrf_id, port); + vrf_id, port); *offset = length; + if (stcb != NULL) { + SCTP_TCB_UNLOCK(stcb); + } return (NULL); } sctp_handle_init(m, iphlen, *offset, src, dst, sh, (struct sctp_init_chunk *)ch, inp, - stcb, *netp, &abort_no_unlock, + stcb, *netp, #if defined(__FreeBSD__) && !defined(__Userspace__) mflowtype, mflowid, #endif vrf_id, port); *offset = length; - if ((!abort_no_unlock) && (stcb != NULL)) { + if (stcb != NULL) { SCTP_TCB_UNLOCK(stcb); } return (NULL); @@ -5285,20 +5237,19 @@ if ((stcb != NULL) && (netp != NULL) && (*netp != NULL)) { SCTP_STAT_INCR(sctps_recvheartbeat); sctp_send_heartbeat_ack(stcb, m, *offset, - chk_length, *netp); + chk_length, *netp); } break; case SCTP_HEARTBEAT_ACK: SCTPDBG(SCTP_DEBUG_INPUT3, "SCTP_HEARTBEAT_ACK\n"); if ((stcb == NULL) || (chk_length != sizeof(struct sctp_heartbeat_chunk))) { /* Its not ours */ - *offset = length; - return (stcb); + break; } SCTP_STAT_INCR(sctps_recvheartbeatack); if ((netp != NULL) && (*netp != NULL)) { sctp_handle_heartbeat_ack((struct sctp_heartbeat_chunk *)ch, - stcb, *netp); + stcb, *netp); } break; case SCTP_ABORT_ASSOCIATION: @@ -5319,14 +5270,12 @@ SCTPDBG(SCTP_DEBUG_INPUT3, "SCTP_SHUTDOWN, stcb %p\n", (void *)stcb); if ((stcb == NULL) || (chk_length != sizeof(struct sctp_shutdown_chunk))) { - *offset = length; - return (stcb); + break; } if ((netp != NULL) && (*netp != NULL)) { - int abort_flag = 0; - + abort_flag = 0; sctp_handle_shutdown((struct sctp_shutdown_chunk *)ch, - stcb, *netp, &abort_flag); + stcb, *netp, &abort_flag); if (abort_flag) { *offset = length; return (NULL); @@ -5335,11 +5284,12 @@ break; case SCTP_SHUTDOWN_ACK: SCTPDBG(SCTP_DEBUG_INPUT3, "SCTP_SHUTDOWN_ACK, stcb %p\n", (void *)stcb); - if ((stcb != NULL) && (netp != NULL) && (*netp != NULL)) { + if ((chk_length == sizeof(struct sctp_shutdown_ack_chunk)) && + (stcb != NULL) && (netp != NULL) && (*netp != NULL)) { sctp_handle_shutdown_ack((struct sctp_shutdown_ack_chunk *)ch, stcb, *netp); + *offset = length; + return (NULL); } - *offset = length; - return (NULL); break; case SCTP_OPERATION_ERROR: SCTPDBG(SCTP_DEBUG_INPUT3, "SCTP_OP_ERR\n"); @@ -5384,7 +5334,7 @@ */ if ((stcb == NULL) && (!SCTP_IS_LISTENING(inp) || - (!(inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) && + (((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) == 0) && #if defined(__FreeBSD__) && !defined(__Userspace__) inp->sctp_socket->sol_qlen >= inp->sctp_socket->sol_qlimit))) { #else @@ -5407,6 +5357,11 @@ struct sctp_inpcb *linp; struct sctp_tmit_chunk *chk; + if (inp->sctp_flags & (SCTP_PCB_FLAGS_SOCKET_GONE | + SCTP_PCB_FLAGS_SOCKET_ALLGONE)) { + goto abend; + } + if (stcb) { linp = NULL; } else { @@ -5415,11 +5370,6 @@ if (linp != NULL) { SCTP_ASOC_CREATE_LOCK(linp); - if ((inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) || - (inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_ALLGONE)) { - SCTP_ASOC_CREATE_UNLOCK(linp); - goto abend; - } } if (netp != NULL) { @@ -5483,7 +5433,7 @@ case SCTP_COOKIE_ACK: SCTPDBG(SCTP_DEBUG_INPUT3, "SCTP_COOKIE_ACK, stcb %p\n", (void *)stcb); if ((stcb == NULL) || chk_length != sizeof(struct sctp_cookie_ack_chunk)) { - return (stcb); + break; } if (inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) { /* We are not interested anymore */ @@ -5513,26 +5463,30 @@ break; case SCTP_ECN_ECHO: SCTPDBG(SCTP_DEBUG_INPUT3, "SCTP_ECN_ECHO\n"); - if ((stcb == NULL) || (chk_length != sizeof(struct sctp_ecne_chunk))) { - /* Its not ours */ - *offset = length; - return (stcb); + if (stcb == NULL) { + break; } if (stcb->asoc.ecn_supported == 0) { goto unknown_chunk; } + if ((chk_length != sizeof(struct sctp_ecne_chunk)) && + (chk_length != sizeof(struct old_sctp_ecne_chunk))) { + break; + } sctp_handle_ecn_echo((struct sctp_ecne_chunk *)ch, stcb); ecne_seen = 1; break; case SCTP_ECN_CWR: SCTPDBG(SCTP_DEBUG_INPUT3, "SCTP_ECN_CWR\n"); - if ((stcb == NULL) || (chk_length != sizeof(struct sctp_cwr_chunk))) { - *offset = length; - return (stcb); + if (stcb == NULL) { + break; } if (stcb->asoc.ecn_supported == 0) { goto unknown_chunk; } + if (chk_length != sizeof(struct sctp_cwr_chunk)) { + break; + } sctp_handle_ecn_cwr((struct sctp_cwr_chunk *)ch, stcb, *netp); break; case SCTP_SHUTDOWN_COMPLETE: @@ -5543,12 +5497,13 @@ *offset = length; return (stcb); } - if ((stcb != NULL) && (netp != NULL) && (*netp != NULL)) { + if ((chk_length == sizeof(struct sctp_shutdown_complete_chunk)) && + (stcb != NULL) && (netp != NULL) && (*netp != NULL)) { sctp_handle_shutdown_complete((struct sctp_shutdown_complete_chunk *)ch, - stcb, *netp); + stcb, *netp); + *offset = length; + return (NULL); } - *offset = length; - return (NULL); break; case SCTP_ASCONF: SCTPDBG(SCTP_DEBUG_INPUT3, "SCTP_ASCONF\n"); @@ -5557,93 +5512,105 @@ goto unknown_chunk; } sctp_handle_asconf(m, *offset, src, - (struct sctp_asconf_chunk *)ch, stcb, asconf_cnt == 0); + (struct sctp_asconf_chunk *)ch, stcb, asconf_cnt == 0); asconf_cnt++; } break; case SCTP_ASCONF_ACK: SCTPDBG(SCTP_DEBUG_INPUT3, "SCTP_ASCONF_ACK\n"); + if (stcb == NULL) { + break; + } + if (stcb->asoc.asconf_supported == 0) { + goto unknown_chunk; + } if (chk_length < sizeof(struct sctp_asconf_ack_chunk)) { - /* Its not ours */ - *offset = length; - return (stcb); + break; } - if ((stcb != NULL) && (netp != NULL) && (*netp != NULL)) { - if (stcb->asoc.asconf_supported == 0) { - goto unknown_chunk; - } + if ((netp != NULL) && (*netp != NULL)) { /* He's alive so give him credit */ if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_THRESHOLD_LOGGING) { sctp_misc_ints(SCTP_THRESHOLD_CLEAR, - stcb->asoc.overall_error_count, - 0, - SCTP_FROM_SCTP_INPUT, - __LINE__); + stcb->asoc.overall_error_count, + 0, + SCTP_FROM_SCTP_INPUT, + __LINE__); } stcb->asoc.overall_error_count = 0; sctp_handle_asconf_ack(m, *offset, - (struct sctp_asconf_ack_chunk *)ch, stcb, *netp, &abort_no_unlock); + (struct sctp_asconf_ack_chunk *)ch, stcb, *netp, &abort_no_unlock); if (abort_no_unlock) return (NULL); } break; case SCTP_FORWARD_CUM_TSN: case SCTP_IFORWARD_CUM_TSN: - SCTPDBG(SCTP_DEBUG_INPUT3, "SCTP_FWD_TSN\n"); + SCTPDBG(SCTP_DEBUG_INPUT3, "%s\n", + ch->chunk_type == SCTP_FORWARD_CUM_TSN ? "FORWARD_TSN" : "I_FORWARD_TSN"); + if (stcb == NULL) { + break; + } + if (stcb->asoc.prsctp_supported == 0) { + goto unknown_chunk; + } if (chk_length < sizeof(struct sctp_forward_tsn_chunk)) { - /* Its not ours */ - *offset = length; - return (stcb); + break; } - - if (stcb != NULL) { - int abort_flag = 0; - - if (stcb->asoc.prsctp_supported == 0) { - goto unknown_chunk; + if (((stcb->asoc.idata_supported == 1) && (ch->chunk_type == SCTP_FORWARD_CUM_TSN)) || + ((stcb->asoc.idata_supported == 0) && (ch->chunk_type == SCTP_IFORWARD_CUM_TSN))) { + if (ch->chunk_type == SCTP_FORWARD_CUM_TSN) { + SCTP_SNPRINTF(msg, sizeof(msg), "%s", "FORWARD-TSN chunk received when I-FORWARD-TSN was negotiated"); + } else { + SCTP_SNPRINTF(msg, sizeof(msg), "%s", "I-FORWARD-TSN chunk received when FORWARD-TSN was negotiated"); } - *fwd_tsn_seen = 1; - if (inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) { - /* We are not interested anymore */ + op_err = sctp_generate_cause(SCTP_CAUSE_PROTOCOL_VIOLATION, msg); + sctp_abort_an_association(inp, stcb, op_err, false, SCTP_SO_NOT_LOCKED); + *offset = length; + return (NULL); + } + *fwd_tsn_seen = 1; + if (inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) { + /* We are not interested anymore */ #if defined(__APPLE__) && !defined(__Userspace__) - so = SCTP_INP_SO(inp); - atomic_add_int(&stcb->asoc.refcnt, 1); - SCTP_TCB_UNLOCK(stcb); - SCTP_SOCKET_LOCK(so, 1); - SCTP_TCB_LOCK(stcb); - atomic_subtract_int(&stcb->asoc.refcnt, 1); + so = SCTP_INP_SO(inp); + atomic_add_int(&stcb->asoc.refcnt, 1); + SCTP_TCB_UNLOCK(stcb); + SCTP_SOCKET_LOCK(so, 1); + SCTP_TCB_LOCK(stcb); + atomic_subtract_int(&stcb->asoc.refcnt, 1); #endif - (void)sctp_free_assoc(inp, stcb, SCTP_NORMAL_PROC, - SCTP_FROM_SCTP_INPUT + SCTP_LOC_31); + (void)sctp_free_assoc(inp, stcb, SCTP_NORMAL_PROC, + SCTP_FROM_SCTP_INPUT + SCTP_LOC_31); #if defined(__APPLE__) && !defined(__Userspace__) - SCTP_SOCKET_UNLOCK(so, 1); + SCTP_SOCKET_UNLOCK(so, 1); #endif - *offset = length; - return (NULL); - } - /* - * For sending a SACK this looks like DATA - * chunks. - */ - stcb->asoc.last_data_chunk_from = stcb->asoc.last_control_chunk_from; - sctp_handle_forward_tsn(stcb, - (struct sctp_forward_tsn_chunk *)ch, &abort_flag, m, *offset); - if (abort_flag) { - *offset = length; - return (NULL); - } + *offset = length; + return (NULL); + } + /* + * For sending a SACK this looks like DATA + * chunks. + */ + stcb->asoc.last_data_chunk_from = stcb->asoc.last_control_chunk_from; + abort_flag = 0; + sctp_handle_forward_tsn(stcb, + (struct sctp_forward_tsn_chunk *)ch, &abort_flag, m, *offset); + if (abort_flag) { + *offset = length; + return (NULL); } break; case SCTP_STREAM_RESET: SCTPDBG(SCTP_DEBUG_INPUT3, "SCTP_STREAM_RESET\n"); - if (((stcb == NULL) || (ch == NULL) || (chk_length < sizeof(struct sctp_stream_reset_tsn_req)))) { - /* Its not ours */ - *offset = length; - return (stcb); + if (stcb == NULL) { + break; } if (stcb->asoc.reconfig_supported == 0) { goto unknown_chunk; } + if (chk_length < sizeof(struct sctp_stream_reset_tsn_req)) { + break; + } if (sctp_handle_stream_reset(stcb, m, *offset, ch)) { /* stop processing */ *offset = length; @@ -5652,20 +5619,19 @@ break; case SCTP_PACKET_DROPPED: SCTPDBG(SCTP_DEBUG_INPUT3, "SCTP_PACKET_DROPPED\n"); - /* re-get it all please */ + if (stcb == NULL) { + break; + } + if (stcb->asoc.pktdrop_supported == 0) { + goto unknown_chunk; + } if (chk_length < sizeof(struct sctp_pktdrop_chunk)) { - /* Its not ours */ - *offset = length; - return (stcb); + break; } - - if ((ch != NULL) && (stcb != NULL) && (netp != NULL) && (*netp != NULL)) { - if (stcb->asoc.pktdrop_supported == 0) { - goto unknown_chunk; - } + if ((netp != NULL) && (*netp != NULL)) { sctp_handle_packet_dropped((struct sctp_pktdrop_chunk *)ch, - stcb, *netp, - min(chk_length, contiguous)); + stcb, *netp, + min(chk_length, contiguous)); } break; case SCTP_AUTHENTICATION: @@ -5678,25 +5644,24 @@ auth_skipped = 1; } /* skip this chunk (temporarily) */ - goto next_chunk; + break; } if (stcb->asoc.auth_supported == 0) { goto unknown_chunk; } if ((chk_length < (sizeof(struct sctp_auth_chunk))) || (chk_length > (sizeof(struct sctp_auth_chunk) + - SCTP_AUTH_DIGEST_LEN_MAX))) { + SCTP_AUTH_DIGEST_LEN_MAX))) { /* Its not ours */ *offset = length; return (stcb); } if (got_auth == 1) { /* skip this chunk... it's already auth'd */ - goto next_chunk; + break; } got_auth = 1; - if ((ch == NULL) || sctp_handle_auth(stcb, (struct sctp_auth_chunk *)ch, - m, *offset)) { + if (sctp_handle_auth(stcb, (struct sctp_auth_chunk *)ch, m, *offset)) { /* auth HMAC failed so dump the packet */ *offset = length; return (stcb); @@ -5709,7 +5674,11 @@ default: unknown_chunk: /* it's an unknown chunk! */ - if ((ch->chunk_type & 0x40) && (stcb != NULL)) { + if ((ch->chunk_type & 0x40) && + (stcb != NULL) && + (SCTP_GET_STATE(stcb) != SCTP_STATE_EMPTY) && + (SCTP_GET_STATE(stcb) != SCTP_STATE_INUSE) && + (SCTP_GET_STATE(stcb) != SCTP_STATE_COOKIE_WAIT)) { struct sctp_gen_error_cause *cause; int len; @@ -5718,7 +5687,7 @@ if (op_err != NULL) { len = min(SCTP_SIZE32(chk_length), (uint32_t)(length - *offset)); cause = mtod(op_err, struct sctp_gen_error_cause *); - cause->code = htons(SCTP_CAUSE_UNRECOG_CHUNK); + cause->code = htons(SCTP_CAUSE_UNRECOG_CHUNK); cause->length = htons((uint16_t)(len + sizeof(struct sctp_gen_error_cause))); SCTP_BUF_LEN(op_err) = sizeof(struct sctp_gen_error_cause); SCTP_BUF_NEXT(op_err) = SCTP_M_COPYM(m, *offset, len, M_NOWAIT); @@ -5742,7 +5711,6 @@ break; } /* switch (ch->chunk_type) */ - next_chunk: /* get the next chunk */ *offset += SCTP_SIZE32(chk_length); @@ -5751,7 +5719,7 @@ break; } ch = (struct sctp_chunkhdr *)sctp_m_getptr(m, *offset, - sizeof(struct sctp_chunkhdr), chunk_buf); + sizeof(struct sctp_chunkhdr), chunk_buf); if (ch == NULL) { *offset = length; return (stcb); @@ -5764,7 +5732,6 @@ return (stcb); } - /* * common input chunk processing (v4 and v6) */ @@ -5816,7 +5783,7 @@ /* UDP encapsulation turned on. */ net->mtu -= sizeof(struct udphdr); if (stcb->asoc.smallest_mtu > net->mtu) { - sctp_pathmtu_adjustment(stcb, net->mtu); + sctp_pathmtu_adjustment(stcb, net->mtu, true); } } else if (port == 0) { /* UDP encapsulation turned off. */ @@ -5858,7 +5825,7 @@ /* UDP encapsulation turned on. */ net->mtu -= sizeof(struct udphdr); if (stcb->asoc.smallest_mtu > net->mtu) { - sctp_pathmtu_adjustment(stcb, net->mtu); + sctp_pathmtu_adjustment(stcb, net->mtu, true); } } else if (port == 0) { /* UDP encapsulation turned off. */ @@ -5885,6 +5852,7 @@ } #endif if (ch->chunk_type == SCTP_SHUTDOWN_ACK) { + SCTP_STAT_INCR_COUNTER64(sctps_incontrolchunks); sctp_send_shutdown_complete2(src, dst, sh, #if defined(__FreeBSD__) && !defined(__Userspace__) mflowtype, mflowid, fibnum, @@ -5893,6 +5861,7 @@ goto out; } if (ch->chunk_type == SCTP_SHUTDOWN_COMPLETE) { + SCTP_STAT_INCR_COUNTER64(sctps_incontrolchunks); goto out; } if (ch->chunk_type != SCTP_ABORT_ASSOCIATION) { @@ -5948,7 +5917,7 @@ } #if defined(__Userspace__) if ((stcb != NULL) && - !(stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) && + ((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) == 0) && (stcb->sctp_socket != NULL)) { if (stcb->sctp_socket->so_head != NULL) { upcall_socket = stcb->sctp_socket->so_head; @@ -5982,7 +5951,7 @@ /* UDP encapsulation turned on. */ net->mtu -= sizeof(struct udphdr); if (stcb->asoc.smallest_mtu > net->mtu) { - sctp_pathmtu_adjustment(stcb, net->mtu); + sctp_pathmtu_adjustment(stcb, net->mtu, true); } } else if (port == 0) { /* UDP encapsulation turned off. */ @@ -6051,7 +6020,7 @@ } #if defined(__Userspace__) if ((upcall_socket == NULL) && - !(stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) && + ((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) == 0) && (stcb->sctp_socket != NULL)) { if (stcb->sctp_socket->so_head != NULL) { upcall_socket = stcb->sctp_socket->so_head; @@ -6138,7 +6107,9 @@ stcb = NULL; goto out; } - data_processed = 1; + if (retval == 0) { + data_processed = 1; + } /* * Anything important needs to have been m_copy'ed in * process_data diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_input.h firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_input.h --- firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_input.h 2022-12-05 23:00:38.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_input.h 2023-01-09 15:01:10.000000000 +0000 @@ -34,7 +34,7 @@ #if defined(__FreeBSD__) && !defined(__Userspace__) #include -__FBSDID("$FreeBSD: head/sys/netinet/sctp_input.h 326672 2017-12-07 22:19:08Z tuexen $"); +__FBSDID("$FreeBSD$"); #endif #ifndef _NETINET_SCTP_INPUT_H_ @@ -56,9 +56,9 @@ sctp_find_stream_reset(struct sctp_tcb *stcb, uint32_t seq, struct sctp_tmit_chunk **bchk); -void sctp_reset_in_stream(struct sctp_tcb *stcb, uint32_t number_entries, - uint16_t *list); - +void +sctp_reset_in_stream(struct sctp_tcb *stcb, uint32_t number_entries, + uint16_t *list); int sctp_is_there_unsent_data(struct sctp_tcb *stcb, int so_locked); diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_lock_userspace.h firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_lock_userspace.h --- firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_lock_userspace.h 2022-12-05 23:00:38.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_lock_userspace.h 2023-01-09 15:01:10.000000000 +0000 @@ -63,6 +63,9 @@ #define SCTP_INP_INFO_TRYLOCK() 1 #define SCTP_INP_INFO_RUNLOCK() #define SCTP_INP_INFO_WUNLOCK() +#define SCTP_INP_INFO_LOCK_ASSERT() +#define SCTP_INP_INFO_RLOCK_ASSERT() +#define SCTP_INP_INFO_WLOCK_ASSERT() #define SCTP_WQ_ADDR_INIT() #define SCTP_WQ_ADDR_DESTROY() @@ -76,6 +79,8 @@ #define SCTP_IPI_ADDR_WLOCK() #define SCTP_IPI_ADDR_RUNLOCK() #define SCTP_IPI_ADDR_WUNLOCK() +#define SCTP_IPI_ADDR_LOCK_ASSERT() +#define SCTP_IPI_ADDR_WLOCK_ASSERT() #define SCTP_IPI_ITERATOR_WQ_INIT() #define SCTP_IPI_ITERATOR_WQ_DESTROY() @@ -109,11 +114,6 @@ #define SCTP_ASOC_CREATE_LOCK_CONTENDED(_inp) (0) /* Don't know if this is possible */ -#define SCTP_TCB_SEND_LOCK_INIT(_tcb) -#define SCTP_TCB_SEND_LOCK_DESTROY(_tcb) -#define SCTP_TCB_SEND_LOCK(_tcb) -#define SCTP_TCB_SEND_UNLOCK(_tcb) - #define SCTP_INP_INCR_REF(_inp) #define SCTP_INP_DECR_REF(_inp) diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_os.h firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_os.h --- firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_os.h 2022-12-05 23:00:39.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_os.h 2023-01-09 15:01:10.000000000 +0000 @@ -34,7 +34,7 @@ #if defined(__FreeBSD__) && !defined(__Userspace__) #include -__FBSDID("$FreeBSD: head/sys/netinet/sctp_os.h 361872 2020-06-06 18:20:09Z tuexen $"); +__FBSDID("$FreeBSD$"); #endif #ifndef _NETINET_SCTP_OS_H_ @@ -69,15 +69,12 @@ #else #define MODULE_GLOBAL(_B) (_B) #endif - #if defined(__Userspace__) #include #endif - #if defined(__APPLE__) && !defined(__Userspace__) #include #endif - #if defined(_WIN32) && !defined(__Userspace__) #include #endif diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_os_userspace.h firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_os_userspace.h --- firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_os_userspace.h 2022-12-05 23:00:50.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_os_userspace.h 2023-01-09 15:01:10.000000000 +0000 @@ -52,6 +52,7 @@ #include "user_environment.h" typedef CRITICAL_SECTION userland_mutex_t; #if WINVER < 0x0600 +typedef CRITICAL_SECTION userland_rwlock_t; enum { C_SIGNAL = 0, C_BROADCAST = 1, @@ -72,6 +73,7 @@ #define SleepConditionVariableCS(cond, mtx, time) SleepXPConditionVariable(cond, mtx) #define WakeAllConditionVariable(cond) WakeAllXPConditionVariable(cond) #else +typedef SRWLOCK userland_rwlock_t; #define DeleteConditionVariable(cond) typedef CONDITION_VARIABLE userland_cond_t; #endif @@ -283,10 +285,15 @@ #else /* !defined(Userspace_os_Windows) */ #include -#if defined(__DragonFly__) || defined(__FreeBSD__) || defined(__linux__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__native_client__) || defined(__Fuchsia__) -#include + +#if defined(__EMSCRIPTEN__) && !defined(__EMSCRIPTEN_PTHREADS__) +#error "Unsupported build configuration." #endif + +#include + typedef pthread_mutex_t userland_mutex_t; +typedef pthread_rwlock_t userland_rwlock_t; typedef pthread_cond_t userland_cond_t; typedef pthread_t userland_thread_t; #endif @@ -509,7 +516,7 @@ #if !defined(_WIN32) #include #endif -#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__linux__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(_WIN32) +#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__linux__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(_WIN32) || defined(__EMSCRIPTEN__) #include "user_ip6_var.h" #else #include @@ -876,14 +883,12 @@ /*************************/ /* MTU */ /*************************/ -int sctp_userspace_get_mtu_from_ifn(uint32_t if_index, int af); +int sctp_userspace_get_mtu_from_ifn(uint32_t if_index); -#define SCTP_GATHER_MTU_FROM_IFN_INFO(ifn, ifn_index, af) sctp_userspace_get_mtu_from_ifn(ifn_index, af) +#define SCTP_GATHER_MTU_FROM_IFN_INFO(ifn, ifn_index) sctp_userspace_get_mtu_from_ifn(ifn_index) #define SCTP_GATHER_MTU_FROM_ROUTE(sctp_ifa, sa, rt) ((rt != NULL) ? rt->rt_rmx.rmx_mtu : 0) -#define SCTP_GATHER_MTU_FROM_INTFC(sctp_ifn) (sctp_ifn->ifn_mtu) - #define SCTP_SET_MTU_OF_ROUTE(sa, rt, mtu) do { \ if (rt != NULL) \ rt->rt_rmx.rmx_mtu = mtu; \ @@ -955,6 +960,8 @@ /* wakeup a socket */ #define SCTP_SOWAKEUP(so) wakeup(&(so)->so_timeo, so) +/* number of bytes ready to read */ +#define SCTP_SBAVAIL(sb) (sb)->sb_cc /* clear the socket buffer state */ #define SCTP_SB_CLEAR(sb) \ (sb).sb_cc = 0; \ @@ -1034,13 +1041,13 @@ sctp_route_t *ro, void *stcb, uint32_t vrf_id); -#define SCTP_IP_OUTPUT(result, o_pak, ro, stcb, vrf_id) sctp_userspace_ip_output(&result, o_pak, ro, stcb, vrf_id); +#define SCTP_IP_OUTPUT(result, o_pak, ro, inp, vrf_id) sctp_userspace_ip_output(&result, o_pak, ro, inp, vrf_id); #if defined(INET6) extern void sctp_userspace_ip6_output(int *result, struct mbuf *o_pak, struct route_in6 *ro, void *stcb, uint32_t vrf_id); -#define SCTP_IP6_OUTPUT(result, o_pak, ro, ifp, stcb, vrf_id) sctp_userspace_ip6_output(&result, o_pak, ro, stcb, vrf_id); +#define SCTP_IP6_OUTPUT(result, o_pak, ro, ifp, inp, vrf_id) sctp_userspace_ip6_output(&result, o_pak, ro, inp, vrf_id); #endif @@ -1132,7 +1139,7 @@ #define SCTP_IS_LISTENING(inp) ((inp->sctp_flags & SCTP_PCB_FLAGS_ACCEPTING) != 0) -#if defined(__APPLE__) || defined(__DragonFly__) || defined(__linux__) || defined(__native_client__) || defined(__NetBSD__) || defined(_WIN32) || defined(__Fuchsia__) +#if defined(__APPLE__) || defined(__DragonFly__) || defined(__linux__) || defined(__native_client__) || defined(__NetBSD__) || defined(_WIN32) || defined(__Fuchsia__) || defined(__EMSCRIPTEN__) int timingsafe_bcmp(const void *, const void *, size_t); #endif diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_output.c firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_output.c --- firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_output.c 2022-12-05 23:01:06.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_output.c 2023-01-09 15:01:10.000000000 +0000 @@ -34,7 +34,7 @@ #if defined(__FreeBSD__) && !defined(__Userspace__) #include -__FBSDID("$FreeBSD: head/sys/netinet/sctp_output.c 362178 2020-06-14 16:05:08Z tuexen $"); +__FBSDID("$FreeBSD$"); #endif #include @@ -79,7 +79,6 @@ #if defined(__Userspace__) && defined(INET6) #include #endif - #if defined(__APPLE__) && !defined(__Userspace__) #if !(defined(APPLE_LEOPARD) || defined(APPLE_SNOWLEOPARD)) #define SCTP_MAX_LINKHDR 16 @@ -1890,7 +1889,6 @@ } }; - int sctp_is_address_in_scope(struct sctp_ifa *ifa, struct sctp_scoping *scope, @@ -1941,7 +1939,7 @@ /* ok to use deprecated addresses? */ sin6 = &ifa->address.sin6; if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) { - /* skip unspecifed addresses */ + /* skip unspecified addresses */ return (0); } if ( /* (local_scope == 0) && */ @@ -2059,7 +2057,6 @@ #endif } - struct mbuf * sctp_add_addresses_to_i_ia(struct sctp_inpcb *inp, struct sctp_tcb *stcb, struct sctp_scoping *scope, @@ -2480,7 +2477,6 @@ return (0); } - int sctp_is_addr_in_ep(struct sctp_inpcb *inp, struct sctp_ifa *ifa) { @@ -2501,8 +2497,6 @@ return (0); } - - static struct sctp_ifa * sctp_choose_boundspecific_inp(struct sctp_inpcb *inp, sctp_route_t *ro, @@ -2637,8 +2631,6 @@ return (NULL); } - - static struct sctp_ifa * sctp_choose_boundspecific_stcb(struct sctp_inpcb *inp, struct sctp_tcb *stcb, @@ -2667,7 +2659,7 @@ ifn = SCTP_GET_IFN_VOID_FROM_ROUTE(ro); ifn_index = SCTP_GET_IF_INDEX_FROM_ROUTE(ro); - sctp_ifn = sctp_find_ifn( ifn, ifn_index); + sctp_ifn = sctp_find_ifn(ifn, ifn_index); /* * first question, is the ifn we will emit on in our list? If so, @@ -2747,7 +2739,6 @@ return (sifa); } } - } /* * if we can't find one like that then we must look at all @@ -2839,14 +2830,13 @@ #else struct sctp_inpcb *inp SCTP_UNUSED, #endif - struct sctp_tcb *stcb, - int non_asoc_addr_ok, - uint8_t dest_is_loop, - uint8_t dest_is_priv, - int addr_wanted, - sa_family_t fam, - sctp_route_t *ro - ) + struct sctp_tcb *stcb, + int non_asoc_addr_ok, + uint8_t dest_is_loop, + uint8_t dest_is_priv, + int addr_wanted, + sa_family_t fam, + sctp_route_t *ro) { struct sctp_ifa *ifa, *sifa; int num_eligible_addr = 0; @@ -2925,8 +2915,7 @@ #ifdef INET6 if (stcb && fam == AF_INET6 && sctp_is_mobility_feature_on(stcb->sctp_ep, SCTP_MOBILITY_BASE)) { - if (sctp_v6src_match_nexthop(&sifa->address.sin6, ro) - == 0) { + if (sctp_v6src_match_nexthop(&sifa->address.sin6, ro) == 0) { continue; } } @@ -2965,7 +2954,6 @@ return (NULL); } - static int sctp_count_num_preferred_boundall(struct sctp_ifn *ifn, #if defined(__FreeBSD__) && !defined(__Userspace__) @@ -3385,8 +3373,6 @@ return (sifa); } - - /* tcb may be NULL */ struct sctp_ifa * sctp_source_address_selection(struct sctp_inpcb *inp, @@ -3412,7 +3398,7 @@ * have the best source. * - If not we must rotate amongst the addresses. * - * Cavets and issues + * Caveats and issues * * Do we need to pay attention to scope. We can have a private address * or a global address we are sourcing or sending to. So if we draw @@ -3565,7 +3551,7 @@ return (answer); } -static int +static bool sctp_find_cmsg(int c_type, void *data, struct mbuf *control, size_t cpsize) { #if defined(_WIN32) @@ -3577,13 +3563,13 @@ struct sctp_prinfo prinfo; struct sctp_authinfo authinfo; int tot_len, rem_len, cmsg_data_len, cmsg_data_off, off; - int found; + bool found; /* * Independent of how many mbufs, find the c_type inside the control * structure and copy out the data. */ - found = 0; + found = false; tot_len = SCTP_BUF_LEN(control); for (off = 0; off < tot_len; off += CMSG_ALIGN(cmh.cmsg_len)) { rem_len = tot_len - off; @@ -3622,7 +3608,7 @@ struct sctp_sndrcvinfo *sndrcvinfo; sndrcvinfo = (struct sctp_sndrcvinfo *)data; - if (found == 0) { + if (!found) { if (cpsize < sizeof(struct sctp_sndrcvinfo)) { return (found); } @@ -3663,7 +3649,7 @@ default: return (found); } - found = 1; + found = true; } } } @@ -3749,9 +3735,8 @@ } for (i = 0; i < stcb->asoc.streamoutcnt; i++) { TAILQ_INIT(&stcb->asoc.strmout[i].outqueue); + stcb->asoc.ss_functions.sctp_ss_init_stream(stcb, &stcb->asoc.strmout[i], NULL); stcb->asoc.strmout[i].chunks_on_queues = 0; - stcb->asoc.strmout[i].next_mid_ordered = 0; - stcb->asoc.strmout[i].next_mid_unordered = 0; #if defined(SCTP_DETAILED_STR_STATS) for (j = 0; j < SCTP_PR_SCTP_MAX + 1; j++) { stcb->asoc.strmout[i].abandoned_sent[j] = 0; @@ -3761,10 +3746,11 @@ stcb->asoc.strmout[i].abandoned_sent[0] = 0; stcb->asoc.strmout[i].abandoned_unsent[0] = 0; #endif + stcb->asoc.strmout[i].next_mid_ordered = 0; + stcb->asoc.strmout[i].next_mid_unordered = 0; stcb->asoc.strmout[i].sid = i; stcb->asoc.strmout[i].last_msg_incomplete = 0; stcb->asoc.strmout[i].state = SCTP_STREAM_OPENING; - stcb->asoc.ss_functions.sctp_ss_init_stream(stcb, &stcb->asoc.strmout[i], NULL); } } break; @@ -4444,7 +4430,7 @@ #if defined(__FreeBSD__) && !defined(__Userspace__) SCTP_PROBE5(send, NULL, stcb, ip, stcb, sctphdr); #endif - SCTP_IP_OUTPUT(ret, o_pak, ro, stcb, vrf_id); + SCTP_IP_OUTPUT(ret, o_pak, ro, inp, vrf_id); #if defined(__APPLE__) && !defined(__Userspace__) if ((SCTP_BASE_SYSCTL(sctp_output_unlocked)) && (so_locked)) { atomic_add_int(&stcb->asoc.refcnt, 1); @@ -4494,10 +4480,10 @@ mtu -= sizeof(struct udphdr); } if (mtu < net->mtu) { + net->mtu = mtu; if ((stcb != NULL) && (stcb->asoc.smallest_mtu > mtu)) { - sctp_mtu_size_reset(inp, &stcb->asoc, mtu); + sctp_pathmtu_adjustment(stcb, mtu, true); } - net->mtu = mtu; } } #if defined(__FreeBSD__) && !defined(__Userspace__) @@ -4547,7 +4533,7 @@ * This means especially, that it is not set at the * SCTP layer. So use the value from the IP layer. */ -#if defined(__APPLE__) && !defined(__Userspace__) && (!defined(APPLE_LEOPARD) && !defined(APPLE_SNOWLEOPARD) && !defined(APPLE_LION) && !defined(APPLE_MOUNTAINLION)) +#if defined(__APPLE__) && !defined(__Userspace__) && (!defined(APPLE_LEOPARD) && !defined(APPLE_SNOWLEOPARD) && !defined(APPLE_LION) && !defined(APPLE_MOUNTAINLION)) flowlabel = ntohl(inp->ip_inp.inp.inp_flow); #else flowlabel = ntohl(((struct inpcb *)inp)->inp_flow); @@ -4624,7 +4610,7 @@ * This means especially, that it is not set at the * SCTP layer. So use the value from the IP layer. */ -#if defined(__APPLE__) && !defined(__Userspace__) && (!defined(APPLE_LEOPARD) && !defined(APPLE_SNOWLEOPARD) && !defined(APPLE_LION) && !defined(APPLE_MOUNTAINLION)) +#if defined(__APPLE__) && !defined(__Userspace__) && (!defined(APPLE_LEOPARD) && !defined(APPLE_SNOWLEOPARD) && !defined(APPLE_LION) && !defined(APPLE_MOUNTAINLION)) tos_value = (ntohl(inp->ip_inp.inp.inp_flow) >> 20) & 0xff; #else tos_value = (ntohl(((struct inpcb *)inp)->inp_flow) >> 20) & 0xff; @@ -4912,9 +4898,9 @@ #if defined(__FreeBSD__) SCTP_PROBE5(send, NULL, stcb, ip6h, stcb, sctphdr); #endif - SCTP_IP6_OUTPUT(ret, o_pak, (struct route_in6 *)ro, &ifp, stcb, vrf_id); + SCTP_IP6_OUTPUT(ret, o_pak, (struct route_in6 *)ro, &ifp, inp, vrf_id); #else - SCTP_IP6_OUTPUT(ret, o_pak, (struct route_in6 *)ro, NULL, stcb, vrf_id); + SCTP_IP6_OUTPUT(ret, o_pak, (struct route_in6 *)ro, NULL, inp, vrf_id); #endif #if defined(__APPLE__) && !defined(__Userspace__) if ((SCTP_BASE_SYSCTL(sctp_output_unlocked)) && (so_locked)) { @@ -4984,24 +4970,22 @@ mtu -= sizeof(struct udphdr); } if (mtu < net->mtu) { + net->mtu = mtu; if ((stcb != NULL) && (stcb->asoc.smallest_mtu > mtu)) { - sctp_mtu_size_reset(inp, &stcb->asoc, mtu); + sctp_pathmtu_adjustment(stcb, mtu, false); } - net->mtu = mtu; } } } #if !defined(__Userspace__) - else if (ifp) { + else if (ifp != NULL) { #if defined(_WIN32) #define ND_IFINFO(ifp) (ifp) #define linkmtu if_mtu #endif - if (ND_IFINFO(ifp)->linkmtu && + if ((ND_IFINFO(ifp)->linkmtu > 0) && (stcb->asoc.smallest_mtu > ND_IFINFO(ifp)->linkmtu)) { - sctp_mtu_size_reset(inp, - &stcb->asoc, - ND_IFINFO(ifp)->linkmtu); + sctp_pathmtu_adjustment(stcb, ND_IFINFO(ifp)->linkmtu, false); } } #endif @@ -5029,6 +5013,7 @@ SCTP_BUF_NEXT(newm) = m; m = newm; packet_length = sctp_calculate_len(m); + m->m_pkthdr.len = packet_length; sctphdr = mtod(m, struct sctphdr *); sctphdr->src_port = src_port; sctphdr->dest_port = dest_port; @@ -5068,7 +5053,6 @@ } } - void sctp_send_initiate(struct sctp_inpcb *inp, struct sctp_tcb *stcb, int so_locked) { @@ -5277,7 +5261,7 @@ } /* now any cookie time extensions */ - if (stcb->asoc.cookie_preserve_req) { + if (stcb->asoc.cookie_preserve_req > 0) { struct sctp_cookie_perserve_param *cookie_preserve; if (padding_len > 0) { @@ -5654,7 +5638,6 @@ at += SCTP_SIZE32(plen); } break; - } phdr = sctp_get_next_param(mat, at, ¶ms, sizeof(params)); } @@ -5727,7 +5710,6 @@ bool fnd, check_src; *op_err = NULL; - #ifdef INET memset(&sin4, 0, sizeof(sin4)); sin4.sin_family = AF_INET; @@ -5954,7 +5936,7 @@ struct sockaddr *src, struct sockaddr *dst, struct sctphdr *sh, struct sctp_init_chunk *init_chk, #if defined(__FreeBSD__) && !defined(__Userspace__) - uint8_t mflowtype, uint32_t mflowid, + uint8_t mflowtype, uint32_t mflowid, #endif uint32_t vrf_id, uint16_t port) { @@ -6145,7 +6127,7 @@ /* scope_id is only for v6 */ stc.scope_id = 0; if ((IN4_ISPRIVATE_ADDRESS(&src4->sin_addr)) || - (IN4_ISPRIVATE_ADDRESS(&dst4->sin_addr))){ + (IN4_ISPRIVATE_ADDRESS(&dst4->sin_addr))) { stc.ipv4_scope = 1; } /* Must use the address in this case */ @@ -6291,7 +6273,6 @@ } net->src_addr_selected = 1; - } stc.laddress[0] = net->ro._s_addr->address.sin.sin_addr.s_addr; stc.laddress[1] = 0; @@ -6378,8 +6359,10 @@ atomic_add_int(&asoc->refcnt, 1); SCTP_TCB_UNLOCK(stcb); new_tag: + SCTP_INP_INFO_RLOCK(); vtag = sctp_select_a_tag(inp, inp->sctp_lport, sh->src_port, 1); - if ((asoc->peer_supports_nat) && (vtag == asoc->my_vtag)) { + SCTP_INP_INFO_RUNLOCK(); + if ((asoc->peer_supports_nat) && (vtag == asoc->my_vtag)) { /* Got a duplicate vtag on some guy behind a nat * make sure we don't use it. */ @@ -6390,11 +6373,13 @@ itsn = sctp_select_initial_TSN(&inp->sctp_ep); initack->init.initial_tsn = htonl(itsn); SCTP_TCB_LOCK(stcb); - atomic_add_int(&asoc->refcnt, -1); + atomic_subtract_int(&asoc->refcnt, 1); } else { SCTP_INP_INCR_REF(inp); SCTP_INP_RUNLOCK(inp); + SCTP_INP_INFO_RLOCK(); vtag = sctp_select_a_tag(inp, inp->sctp_lport, sh->src_port, 1); + SCTP_INP_INFO_RUNLOCK(); initack->init.initiate_tag = htonl(vtag); /* get a TSN to use too */ initack->init.initial_tsn = htonl(sctp_select_initial_TSN(&inp->sctp_ep)); @@ -6716,11 +6701,10 @@ SCTP_STAT_INCR_COUNTER64(sctps_outcontrolchunks); } - static void sctp_prune_prsctp(struct sctp_tcb *stcb, struct sctp_association *asoc, - struct sctp_sndrcvinfo *srcv, + struct sctp_nonpad_sndrcvinfo *srcv, int dataout) { int freed_spc = 0; @@ -6798,51 +6782,57 @@ } /* if enabled in asoc */ } -int -sctp_get_frag_point(struct sctp_tcb *stcb, - struct sctp_association *asoc) +uint32_t +sctp_get_frag_point(struct sctp_tcb *stcb) { - int siz, ovh; + struct sctp_association *asoc; + uint32_t frag_point, overhead; - /* - * For endpoints that have both v6 and v4 addresses we must reserve - * room for the ipv6 header, for those that are only dealing with V4 - * we use a larger frag point. - */ + asoc = &stcb->asoc; + /* Consider IP header and SCTP common header. */ if (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) { - ovh = SCTP_MIN_OVERHEAD; + overhead = SCTP_MIN_OVERHEAD; } else { #if defined(__Userspace__) if (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_BOUND_CONN) { - ovh = sizeof(struct sctphdr); + overhead = sizeof(struct sctphdr); } else { - ovh = SCTP_MIN_V4_OVERHEAD; + overhead = SCTP_MIN_V4_OVERHEAD; } #else - ovh = SCTP_MIN_V4_OVERHEAD; + overhead = SCTP_MIN_V4_OVERHEAD; #endif } - ovh += SCTP_DATA_CHUNK_OVERHEAD(stcb); - if (stcb->asoc.sctp_frag_point > asoc->smallest_mtu) - siz = asoc->smallest_mtu - ovh; - else - siz = (stcb->asoc.sctp_frag_point - ovh); - /* - * if (siz > (MCLBYTES-sizeof(struct sctp_data_chunk))) { - */ - /* A data chunk MUST fit in a cluster */ - /* siz = (MCLBYTES - sizeof(struct sctp_data_chunk)); */ - /* } */ - - /* adjust for an AUTH chunk if DATA requires auth */ - if (sctp_auth_is_required_chunk(SCTP_DATA, stcb->asoc.peer_auth_chunks)) - siz -= sctp_get_auth_chunk_len(stcb->asoc.peer_hmac_id); - - if (siz % 4) { - /* make it an even word boundary please */ - siz -= (siz % 4); + /* Consider DATA/IDATA chunk header and AUTH header, if needed. */ + if (asoc->idata_supported) { + overhead += sizeof(struct sctp_idata_chunk); + if (sctp_auth_is_required_chunk(SCTP_IDATA, asoc->peer_auth_chunks)) { + overhead += sctp_get_auth_chunk_len(asoc->peer_hmac_id); + } + } else { + overhead += sizeof(struct sctp_data_chunk); + if (sctp_auth_is_required_chunk(SCTP_DATA, asoc->peer_auth_chunks)) { + overhead += sctp_get_auth_chunk_len(asoc->peer_hmac_id); + } + } + KASSERT(overhead % 4 == 0, + ("overhead (%u) not a multiple of 4", overhead)); + /* Consider padding. */ + if (asoc->smallest_mtu % 4 > 0) { + overhead += (asoc->smallest_mtu % 4); + } + KASSERT(asoc->smallest_mtu > overhead, + ("Association MTU (%u) too small for overhead (%u)", + asoc->smallest_mtu, overhead)); + frag_point = asoc->smallest_mtu - overhead; + KASSERT(frag_point % 4 == 0, + ("frag_point (%u) not a multiple of 4", frag_point)); + /* Honor MAXSEG socket option. */ + if ((asoc->sctp_frag_point > 0) && + (asoc->sctp_frag_point < frag_point)) { + frag_point = asoc->sctp_frag_point; } - return (siz); + return (frag_point); } static void @@ -6906,13 +6896,15 @@ sctp_msg_append(struct sctp_tcb *stcb, struct sctp_nets *net, struct mbuf *m, - struct sctp_sndrcvinfo *srcv, int hold_stcb_lock) + struct sctp_nonpad_sndrcvinfo *srcv) { int error = 0; struct mbuf *at; struct sctp_stream_queue_pending *sp = NULL; struct sctp_stream_out *strm; + SCTP_TCB_LOCK_ASSERT(stcb); + /* Given an mbuf chain, put it * into the association send queue and * place it on the wheel @@ -6929,15 +6921,26 @@ error = EINVAL; goto out_now; } - strm = &stcb->asoc.strmout[srcv->sinfo_stream]; + if ((stcb->asoc.strmout[srcv->sinfo_stream].state != SCTP_STREAM_OPEN) && + (stcb->asoc.strmout[srcv->sinfo_stream].state != SCTP_STREAM_OPENING)) { + /* + * Can't queue any data while stream reset is underway. + */ + if (stcb->asoc.strmout[srcv->sinfo_stream].state > SCTP_STREAM_OPEN) { + error = EAGAIN; + } else { + error = EINVAL; + } + goto out_now; + } /* Now can we send this? */ if ((SCTP_GET_STATE(stcb) == SCTP_STATE_SHUTDOWN_SENT) || (SCTP_GET_STATE(stcb) == SCTP_STATE_SHUTDOWN_ACK_SENT) || (SCTP_GET_STATE(stcb) == SCTP_STATE_SHUTDOWN_RECEIVED) || (stcb->asoc.state & SCTP_STATE_SHUTDOWN_PENDING)) { /* got data while shutting down */ - SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTP_OUTPUT, ECONNRESET); - error = ECONNRESET; + SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTP_OUTPUT, EPIPE); + error = EPIPE; goto out_now; } sctp_alloc_a_strmoq(stcb, sp); @@ -6984,17 +6987,12 @@ sctp_auth_key_acquire(stcb, sp->auth_keyid); sp->holds_key_ref = 1; } - if (hold_stcb_lock == 0) { - SCTP_TCB_SEND_LOCK(stcb); - } + strm = &stcb->asoc.strmout[srcv->sinfo_stream]; sctp_snd_sb_alloc(stcb, sp->length); atomic_add_int(&stcb->asoc.stream_queue_cnt, 1); TAILQ_INSERT_TAIL(&strm->outqueue, sp, next); - stcb->asoc.ss_functions.sctp_ss_add_to_stream(stcb, &stcb->asoc, strm, sp, 1); + stcb->asoc.ss_functions.sctp_ss_add_to_stream(stcb, &stcb->asoc, strm, sp); m = NULL; - if (hold_stcb_lock == 0) { - SCTP_TCB_SEND_UNLOCK(stcb); - } out_now: if (m) { sctp_m_freem(m); @@ -7002,7 +7000,6 @@ return (error); } - static struct mbuf * sctp_copy_mbufchain(struct mbuf *clonechain, struct mbuf *outchain, @@ -7158,7 +7155,8 @@ int *num_out, int *reason_code, int control_only, int from_where, - struct timeval *now, int *now_filled, int frag_point, int so_locked); + struct timeval *now, int *now_filled, + uint32_t frag_point, int so_locked); static void sctp_sendall_iterator(struct sctp_inpcb *inp, struct sctp_tcb *stcb, void *ptr, @@ -7221,7 +7219,7 @@ * dis-appearing on us. */ atomic_add_int(&stcb->asoc.refcnt, 1); - sctp_abort_an_association(inp, stcb, m, SCTP_SO_NOT_LOCKED); + sctp_abort_an_association(inp, stcb, m, false, SCTP_SO_NOT_LOCKED); /* sctp_abort_an_association calls sctp_free_asoc() * free association will NOT free it since we * incremented the refcnt .. we do this to prevent @@ -7234,12 +7232,11 @@ * must relock.. to unlock in the iterator timer :-0 */ SCTP_TCB_LOCK(stcb); - atomic_add_int(&stcb->asoc.refcnt, -1); + atomic_subtract_int(&stcb->asoc.refcnt, 1); goto no_chunk_output; } else { - if (m) { - ret = sctp_msg_append(stcb, net, m, - &ca->sndrcv, 1); + if (m != NULL) { + ret = sctp_msg_append(stcb, net, m, &ca->sndrcv); } asoc = &stcb->asoc; if (ca->sndrcv.sinfo_flags & SCTP_EOF) { @@ -7299,15 +7296,14 @@ msg); atomic_add_int(&stcb->asoc.refcnt, 1); sctp_abort_an_association(stcb->sctp_ep, stcb, - op_err, SCTP_SO_NOT_LOCKED); - atomic_add_int(&stcb->asoc.refcnt, -1); + op_err, false, SCTP_SO_NOT_LOCKED); + atomic_subtract_int(&stcb->asoc.refcnt, 1); goto no_chunk_output; } sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWNGUARD, stcb->sctp_ep, stcb, NULL); } } - } } un_sent = ((stcb->asoc.total_output_queue_size - stcb->asoc.total_flight) + @@ -7321,13 +7317,13 @@ if (do_chunk_output) sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_USR_SEND, SCTP_SO_NOT_LOCKED); else if (added_control) { - int num_out, reason, now_filled = 0; struct timeval now; - int frag_point; + int num_out, reason, now_filled = 0; - frag_point = sctp_get_frag_point(stcb, &stcb->asoc); (void)sctp_med_chunk_output(inp, stcb, &stcb->asoc, &num_out, - &reason, 1, 1, &now, &now_filled, frag_point, SCTP_SO_NOT_LOCKED); + &reason, 1, 1, &now, &now_filled, + sctp_get_frag_point(stcb), + SCTP_SO_NOT_LOCKED); } no_chunk_output: if (ret) { @@ -7355,7 +7351,9 @@ /* now free everything */ if (ca->inp) { /* Lets clear the flag to allow others to run. */ + SCTP_INP_WLOCK(ca->inp); ca->inp->sctp_flags &= ~SCTP_PCB_FLAGS_SND_ITERATOR_UP; + SCTP_INP_WUNLOCK(ca->inp); } sctp_m_freem(ca->m); SCTP_FREE(ca, SCTP_M_COPYAL); @@ -7405,15 +7403,11 @@ static int sctp_sendall(struct sctp_inpcb *inp, struct uio *uio, struct mbuf *m, - struct sctp_sndrcvinfo *srcv) + struct sctp_nonpad_sndrcvinfo *srcv) { int ret; struct sctp_copy_all *ca; - if (inp->sctp_flags & SCTP_PCB_FLAGS_SND_ITERATOR_UP) { - /* There is another. */ - return (EBUSY); - } #if defined(__APPLE__) && !defined(__Userspace__) #if defined(APPLE_LEOPARD) if (uio->uio_resid > SCTP_BASE_SYSCTL(sctp_sendall_limit)) { @@ -7436,9 +7430,21 @@ memset(ca, 0, sizeof(struct sctp_copy_all)); ca->inp = inp; - if (srcv) { + if (srcv != NULL) { memcpy(&ca->sndrcv, srcv, sizeof(struct sctp_nonpad_sndrcvinfo)); } + + /* Serialize. */ + SCTP_INP_WLOCK(inp); + if ((inp->sctp_flags & SCTP_PCB_FLAGS_SND_ITERATOR_UP) != 0) { + SCTP_INP_WUNLOCK(inp); + sctp_m_freem(m); + SCTP_FREE(ca, SCTP_M_COPYAL); + return (EBUSY); + } + inp->sctp_flags |= SCTP_PCB_FLAGS_SND_ITERATOR_UP; + SCTP_INP_WUNLOCK(inp); + /* * take off the sendall flag, it would be bad if we failed to do * this :-0 @@ -7464,6 +7470,10 @@ #endif if (ca->m == NULL) { SCTP_FREE(ca, SCTP_M_COPYAL); + sctp_m_freem(m); + SCTP_INP_WLOCK(inp); + inp->sctp_flags &= ~SCTP_PCB_FLAGS_SND_ITERATOR_UP; + SCTP_INP_WUNLOCK(inp); SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_OUTPUT, ENOMEM); return (ENOMEM); } @@ -7476,14 +7486,15 @@ ca->sndlen += SCTP_BUF_LEN(mat); } } - inp->sctp_flags |= SCTP_PCB_FLAGS_SND_ITERATOR_UP; ret = sctp_initiate_iterator(NULL, sctp_sendall_iterator, NULL, SCTP_PCB_ANY_FLAGS, SCTP_PCB_ANY_FEATURES, SCTP_ASOC_ANY_STATE, (void *)ca, 0, sctp_sendall_completes, inp, 1); if (ret) { + SCTP_INP_WLOCK(inp); inp->sctp_flags &= ~SCTP_PCB_FLAGS_SND_ITERATOR_UP; + SCTP_INP_WUNLOCK(inp); SCTP_FREE(ca, SCTP_M_COPYAL); SCTP_LTRACE_ERR_RET_PKT(m, inp, NULL, NULL, SCTP_FROM_SCTP_OUTPUT, EFAULT); return (EFAULT); @@ -7491,7 +7502,6 @@ return (0); } - void sctp_toss_old_cookies(struct sctp_tcb *stcb, struct sctp_association *asoc) { @@ -7539,7 +7549,6 @@ } } - static void sctp_clean_up_datalist(struct sctp_tcb *stcb, struct sctp_association *asoc, @@ -7557,7 +7566,7 @@ if (i > 0) { /* * Any chunk NOT 0 you zap the time chunk 0 gets - * zapped or set based on if a RTO measurment is + * zapped or set based on if a RTO measurement is * needed. */ data_list[i]->do_rtt = 0; @@ -7713,7 +7722,7 @@ } if ((length <= space_left) || ((length - space_left) < SCTP_BASE_SYSCTL(sctp_min_residual))) { - /* Sub-optimial residual don't split in non-eeor mode. */ + /* Sub-optimal residual don't split in non-eeor mode. */ return (0); } /* If we reach here length is larger @@ -7730,6 +7739,7 @@ static uint32_t sctp_move_to_outqueue(struct sctp_tcb *stcb, + struct sctp_nets *net, struct sctp_stream_out *strq, uint32_t space_left, uint32_t frag_point, @@ -7748,7 +7758,6 @@ int leading; uint8_t rcv_flags = 0; uint8_t some_taken; - uint8_t send_lock_up = 0; SCTP_TCB_LOCK_ASSERT(stcb); asoc = &stcb->asoc; @@ -7756,10 +7765,6 @@ /*sa_ignore FREED_MEMORY*/ sp = TAILQ_FIRST(&strq->outqueue); if (sp == NULL) { - if (send_lock_up == 0) { - SCTP_TCB_SEND_LOCK(stcb); - send_lock_up = 1; - } sp = TAILQ_FIRST(&strq->outqueue); if (sp) { goto one_more_time; @@ -7773,10 +7778,6 @@ strq->last_msg_incomplete = 0; } to_move = 0; - if (send_lock_up) { - SCTP_TCB_SEND_UNLOCK(stcb); - send_lock_up = 0; - } goto out_of; } if ((sp->msg_is_complete) && (sp->length == 0)) { @@ -7787,20 +7788,15 @@ */ if ((sp->put_last_out == 0) && (sp->discard_rest == 0)) { SCTP_PRINTF("Gak, put out entire msg with NO end!-1\n"); - SCTP_PRINTF("sender_done:%d len:%d msg_comp:%d put_last_out:%d send_lock:%d\n", + SCTP_PRINTF("sender_done:%d len:%d msg_comp:%d put_last_out:%d\n", sp->sender_all_done, sp->length, sp->msg_is_complete, - sp->put_last_out, - send_lock_up); - } - if ((TAILQ_NEXT(sp, next) == NULL) && (send_lock_up == 0)) { - SCTP_TCB_SEND_LOCK(stcb); - send_lock_up = 1; + sp->put_last_out); } atomic_subtract_int(&asoc->stream_queue_cnt, 1); TAILQ_REMOVE(&strq->outqueue, sp, next); - stcb->asoc.ss_functions.sctp_ss_remove_from_stream(stcb, asoc, strq, sp, send_lock_up); + stcb->asoc.ss_functions.sctp_ss_remove_from_stream(stcb, asoc, strq, sp); if ((strq->state == SCTP_STREAM_RESET_PENDING) && (strq->chunks_on_queues == 0) && TAILQ_EMPTY(&strq->outqueue)) { @@ -7815,11 +7811,6 @@ sp->data = NULL; } sctp_free_a_strmoq(stcb, sp, so_locked); - /* we can't be locked to it */ - if (send_lock_up) { - SCTP_TCB_SEND_UNLOCK(stcb); - send_lock_up = 0; - } /* back to get the next msg */ goto one_more_time; } else { @@ -7838,10 +7829,6 @@ to_move = 0; goto out_of; } else if (sp->discard_rest) { - if (send_lock_up == 0) { - SCTP_TCB_SEND_LOCK(stcb); - send_lock_up = 1; - } /* Whack down the size */ atomic_subtract_int(&stcb->asoc.total_output_queue_size, sp->length); if ((stcb->sctp_socket != NULL) && @@ -7862,7 +7849,6 @@ } } some_taken = sp->some_taken; -re_look: length = sp->length; if (sp->msg_is_complete) { /* The message is complete */ @@ -7887,28 +7873,9 @@ } } else { to_move = sctp_can_we_split_this(stcb, length, space_left, frag_point, eeor_mode); - if (to_move) { - /*- - * We use a snapshot of length in case it - * is expanding during the compare. - */ - uint32_t llen; - - llen = length; - if (to_move >= llen) { - to_move = llen; - if (send_lock_up == 0) { - /*- - * We are taking all of an incomplete msg - * thus we need a send lock. - */ - SCTP_TCB_SEND_LOCK(stcb); - send_lock_up = 1; - if (sp->msg_is_complete) { - /* the sender finished the msg */ - goto re_look; - } - } + if (to_move > 0) { + if (to_move >= length) { + to_move = length; } if (sp->some_taken == 0) { rcv_flags |= SCTP_DATA_FIRST_FRAG; @@ -7946,10 +7913,6 @@ if (to_move >= length) { /* we think we can steal the whole thing */ - if ((sp->sender_all_done == 0) && (send_lock_up == 0)) { - SCTP_TCB_SEND_LOCK(stcb); - send_lock_up = 1; - } if (to_move < sp->length) { /* bail, it changed */ goto dont_do_it; @@ -7980,7 +7943,7 @@ /* Now lets work our way down and compact it */ m = sp->data; while (m && (SCTP_BUF_LEN(m) == 0)) { - sp->data = SCTP_BUF_NEXT(m); + sp->data = SCTP_BUF_NEXT(m); SCTP_BUF_NEXT(m) = NULL; if (sp->tail_mbuf == m) { /*- @@ -7989,13 +7952,12 @@ * than the sp->length. */ #ifdef INVARIANTS - panic("Huh, freing tail? - TSNH"); + panic("Huh, freeing tail? - TSNH"); #else SCTP_PRINTF("Huh, freeing tail? - TSNH\n"); sp->tail_mbuf = sp->data = NULL; sp->length = 0; #endif - } sctp_m_free(m); m = sp->data; @@ -8042,10 +8004,6 @@ * all the data if there is no leading space, so we * must put the data back and restore. */ - if (send_lock_up == 0) { - SCTP_TCB_SEND_LOCK(stcb); - send_lock_up = 1; - } if (sp->data == NULL) { /* unsteal the data */ sp->data = chk->data; @@ -8075,7 +8033,7 @@ if (chk->data == NULL) { /* HELP, TSNH since we assured it would not above? */ #ifdef INVARIANTS - panic("prepend failes HELP?"); + panic("prepend fails HELP?"); #else SCTP_PRINTF("prepend fails HELP?\n"); sctp_free_a_chunk(stcb, chk, so_locked); @@ -8135,6 +8093,7 @@ sctp_auth_key_acquire(stcb, chk->auth_keyid); chk->holds_key_ref = 1; } + stcb->asoc.ss_functions.sctp_ss_scheduled(stcb, net, asoc, strq, to_move); #if defined(__FreeBSD__) && !defined(__Userspace__) chk->rec.data.tsn = atomic_fetchadd_int(&asoc->sending_seq, 1); #else @@ -8156,8 +8115,8 @@ * earlier in previous loop prior to padding. */ -#ifdef SCTP_ASOCLOG_OF_TSNS SCTP_TCB_LOCK_ASSERT(stcb); +#ifdef SCTP_ASOCLOG_OF_TSNS if (asoc->tsn_out_at >= SCTP_TSN_LOG_SIZE) { asoc->tsn_out_at = 0; asoc->tsn_out_wrapped = 1; @@ -8215,20 +8174,15 @@ /* All done pull and kill the message */ if (sp->put_last_out == 0) { SCTP_PRINTF("Gak, put out entire msg with NO end!-2\n"); - SCTP_PRINTF("sender_done:%d len:%d msg_comp:%d put_last_out:%d send_lock:%d\n", + SCTP_PRINTF("sender_done:%d len:%d msg_comp:%d put_last_out:%d\n", sp->sender_all_done, sp->length, sp->msg_is_complete, - sp->put_last_out, - send_lock_up); - } - if ((send_lock_up == 0) && (TAILQ_NEXT(sp, next) == NULL)) { - SCTP_TCB_SEND_LOCK(stcb); - send_lock_up = 1; + sp->put_last_out); } atomic_subtract_int(&asoc->stream_queue_cnt, 1); TAILQ_REMOVE(&strq->outqueue, sp, next); - stcb->asoc.ss_functions.sctp_ss_remove_from_stream(stcb, asoc, strq, sp, send_lock_up); + stcb->asoc.ss_functions.sctp_ss_remove_from_stream(stcb, asoc, strq, sp); if ((strq->state == SCTP_STREAM_RESET_PENDING) && (strq->chunks_on_queues == 0) && TAILQ_EMPTY(&strq->outqueue)) { @@ -8249,16 +8203,13 @@ TAILQ_INSERT_TAIL(&asoc->send_queue, chk, sctp_next); asoc->send_queue_cnt++; out_of: - if (send_lock_up) { - SCTP_TCB_SEND_UNLOCK(stcb); - } return (to_move); } - static void -sctp_fill_outqueue(struct sctp_tcb *stcb, - struct sctp_nets *net, int frag_point, int eeor_mode, int *quit_now, int so_locked) +sctp_fill_outqueue(struct sctp_tcb *stcb, struct sctp_nets *net, + uint32_t frag_point, int eeor_mode, int *quit_now, + int so_locked) { struct sctp_association *asoc; struct sctp_stream_out *strq; @@ -8298,9 +8249,9 @@ giveup = 0; bail = 0; while ((space_left > 0) && (strq != NULL)) { - moved = sctp_move_to_outqueue(stcb, strq, space_left, frag_point, - &giveup, eeor_mode, &bail, so_locked); - stcb->asoc.ss_functions.sctp_ss_scheduled(stcb, net, asoc, strq, moved); + moved = sctp_move_to_outqueue(stcb, net, strq, space_left, + frag_point, &giveup, eeor_mode, + &bail, so_locked); if ((giveup != 0) || (bail != 0)) { break; } @@ -8377,12 +8328,13 @@ int sctp_med_chunk_output(struct sctp_inpcb *inp, - struct sctp_tcb *stcb, - struct sctp_association *asoc, - int *num_out, - int *reason_code, - int control_only, int from_where, - struct timeval *now, int *now_filled, int frag_point, int so_locked) + struct sctp_tcb *stcb, + struct sctp_association *asoc, + int *num_out, + int *reason_code, + int control_only, int from_where, + struct timeval *now, int *now_filled, + uint32_t frag_point, int so_locked) { /** * Ok this is the generic chunk service queue. we must do the @@ -8390,10 +8342,10 @@ * - Service the stream queue that is next, moving any * message (note I must get a complete message i.e. FIRST/MIDDLE and * LAST to the out queue in one pass) and assigning TSN's. This - * only applys though if the peer does not support NDATA. For NDATA + * only applies though if the peer does not support NDATA. For NDATA * chunks its ok to not send the entire message ;-) * - Check to see if the cwnd/rwnd allows any output, if so we go ahead and - * fomulate and send the low level chunks. Making sure to combine + * formulate and send the low level chunks. Making sure to combine * any control in the control chunk queue also. */ struct sctp_nets *net, *start_at, *sack_goes_to = NULL, *old_start_at = NULL; @@ -8502,7 +8454,6 @@ break; } } - } if ((no_data_chunks == 0) && (skip_fill_up == 0) && @@ -8522,11 +8473,11 @@ net->window_probe = 0; if ((net != stcb->asoc.alternate) && ((net->dest_state & SCTP_ADDR_PF) || - (!(net->dest_state & SCTP_ADDR_REACHABLE)) || + ((net->dest_state & SCTP_ADDR_REACHABLE) == 0) || (net->dest_state & SCTP_ADDR_UNCONFIRMED))) { if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_CWND_LOGGING_ENABLE) { sctp_log_cwnd(stcb, net, 1, - SCTP_CWND_LOG_FILL_OUTQ_CALLED); + SCTP_CWND_LOG_FILL_OUTQ_CALLED); } continue; } @@ -8538,7 +8489,7 @@ /* skip this network, no room - can't fill */ if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_CWND_LOGGING_ENABLE) { sctp_log_cwnd(stcb, net, 3, - SCTP_CWND_LOG_FILL_OUTQ_CALLED); + SCTP_CWND_LOG_FILL_OUTQ_CALLED); } continue; } @@ -8590,11 +8541,11 @@ } old_start_at = NULL; again_one_more_time: - for (net = start_at ; net != NULL; net = TAILQ_NEXT(net, sctp_next)) { + for (net = start_at; net != NULL; net = TAILQ_NEXT(net, sctp_next)) { /* how much can we send? */ /* SCTPDBG("Examine for sending net:%x\n", (uint32_t)net); */ if (old_start_at && (old_start_at == net)) { - /* through list ocmpletely. */ + /* through list completely. */ break; } tsns_sent = 0xa; @@ -9298,7 +9249,7 @@ SCTP_LTRACE_ERR_RET(inp, stcb, NULL, SCTP_FROM_SCTP_OUTPUT, ENOMEM); return (ENOMEM); } - /* upate our MTU size */ + /* update our MTU size */ /* Do clear IP_DF ? */ if (chk->flags & CHUNK_FLAGS_FRAGMENT_OK) { no_fragmentflg = 0; @@ -9432,7 +9383,7 @@ * the top of the for, but just to make sure * I will reset these again here. */ - ctl_cnt = bundle_at = 0; + ctl_cnt = 0; continue; /* This takes us back to the for() for the nets. */ } else { asoc->ifp_had_enobuf = 0; @@ -9746,7 +9697,6 @@ return; } - void sctp_send_shutdown_ack(struct sctp_tcb *stcb, struct sctp_nets *net) { @@ -9997,7 +9947,6 @@ return; } - static int sctp_chunk_retransmission(struct sctp_inpcb *inp, struct sctp_tcb *stcb, @@ -10021,7 +9970,7 @@ struct mbuf *m, *endofchain; struct sctp_nets *net = NULL; uint32_t tsns_sent = 0; - int no_fragmentflg, bundle_at, cnt_thru; + int no_fragmentflg, bundle_at; unsigned int mtu; int error, i, one_chunk, fwd_tsn, ctl_cnt, tmr_started; struct sctp_auth_chunk *auth = NULL; @@ -10039,7 +9988,7 @@ } #endif SCTP_TCB_LOCK_ASSERT(stcb); - tmr_started = ctl_cnt = bundle_at = error = 0; + tmr_started = ctl_cnt = 0; no_fragmentflg = 1; fwd_tsn = 0; *cnt_out = 0; @@ -10097,7 +10046,6 @@ } } one_chunk = 0; - cnt_thru = 0; /* do we have control chunks to retransmit? */ if (m != NULL) { /* Start a timer no matter if we succeed or fail */ @@ -10181,7 +10129,7 @@ msg); atomic_add_int(&stcb->asoc.refcnt, 1); sctp_abort_an_association(stcb->sctp_ep, stcb, op_err, - so_locked); + false, so_locked); SCTP_TCB_LOCK(stcb); atomic_subtract_int(&stcb->asoc.refcnt, 1); return (SCTP_RETRAN_EXIT); @@ -10300,7 +10248,7 @@ if (chk->flags & CHUNK_FLAGS_FRAGMENT_OK) { no_fragmentflg = 0; } - /* upate our MTU size */ + /* update our MTU size */ if (mtu > (chk->send_size + dmtu)) mtu -= (chk->send_size + dmtu); else @@ -10357,7 +10305,7 @@ if (fwd->flags & CHUNK_FLAGS_FRAGMENT_OK) { no_fragmentflg = 0; } - /* upate our MTU size */ + /* update our MTU size */ if (mtu > (fwd->send_size + dmtu)) mtu -= (fwd->send_size + dmtu); else @@ -10419,7 +10367,6 @@ /* (void)SCTP_GETTIME_TIMEVAL(&net->last_sent_time); */ /* For auto-close */ - cnt_thru++; if (*now_filled == 0) { (void)SCTP_GETTIME_TIMEVAL(&asoc->time_last_sent); *now = asoc->time_last_sent; @@ -10462,10 +10409,8 @@ * also double the output queue size, since this * get shrunk when we free by this amount. */ - atomic_add_int(&((asoc)->total_output_queue_size),data_list[i]->book_size); + atomic_add_int(&((asoc)->total_output_queue_size), data_list[i]->book_size); data_list[i]->book_size *= 2; - - } else { if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LOG_RWND_ENABLE) { sctp_log_rwnd(SCTP_DECREASE_PEER_RWND, @@ -10574,7 +10519,7 @@ * FIRST/MIDDLE and LAST to the out queue in one pass) and assigning * TSN's * - Check to see if the cwnd/rwnd allows any output, if so we - * go ahead and fomulate and send the low level chunks. Making sure + * go ahead and formulate and send the low level chunks. Making sure * to combine any control in the control chunk queue also. */ struct sctp_association *asoc; @@ -10584,7 +10529,7 @@ struct timeval now; int now_filled = 0; int nagle_on; - int frag_point = sctp_get_frag_point(stcb, &stcb->asoc); + uint32_t frag_point = sctp_get_frag_point(stcb); int un_sent = 0; int fr_done; unsigned int tot_frs = 0; @@ -10635,13 +10580,13 @@ */ if (from_where == SCTP_OUTPUT_FROM_COOKIE_ACK) { /*- - * Special hook for handling cookiess discarded + * Special hook for handling cookies discarded * by peer that carried data. Send cookie-ack only * and then the next call with get the retran's. */ (void)sctp_med_chunk_output(inp, stcb, asoc, &num_out, &reason_code, 1, - from_where, - &now, &now_filled, frag_point, so_locked); + from_where, + &now, &now_filled, frag_point, so_locked); return; } else if (from_where != SCTP_OUTPUT_FROM_HB_TMR) { /* if its not from a HB then do it */ @@ -10665,8 +10610,8 @@ * if queued too. */ (void)sctp_med_chunk_output(inp, stcb, asoc, &num_out, &reason_code, 1, - from_where, - &now, &now_filled, frag_point, so_locked); + from_where, + &now, &now_filled, frag_point, so_locked); #ifdef SCTP_AUDITING_ENABLED sctp_auditing(8, inp, stcb, NULL); #endif @@ -10693,7 +10638,7 @@ #endif /* Push out any control */ (void)sctp_med_chunk_output(inp, stcb, asoc, &num_out, &reason_code, 1, from_where, - &now, &now_filled, frag_point, so_locked); + &now, &now_filled, frag_point, so_locked); return; } if ((asoc->fr_max_burst > 0) && (tot_frs >= asoc->fr_max_burst)) { @@ -10710,7 +10655,7 @@ #endif /* Check for bad destinations, if they exist move chunks around. */ TAILQ_FOREACH(net, &asoc->nets, sctp_next) { - if (!(net->dest_state & SCTP_ADDR_REACHABLE)) { + if ((net->dest_state & SCTP_ADDR_REACHABLE) == 0) { /*- * if possible move things off of this address we * still may send below due to the dormant state but @@ -10745,13 +10690,12 @@ } } } - } burst_cnt = 0; do { error = sctp_med_chunk_output(inp, stcb, asoc, &num_out, - &reason_code, 0, from_where, - &now, &now_filled, frag_point, so_locked); + &reason_code, 0, from_where, + &now, &now_filled, frag_point, so_locked); if (error) { SCTPDBG(SCTP_DEBUG_OUTPUT1, "Error %d was returned from med-c-op\n", error); if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LOG_MAXBURST_ENABLE) { @@ -10828,14 +10772,13 @@ sctp_fix_ecn_echo(asoc); if (stcb->asoc.trigger_reset) { - if (sctp_send_stream_reset_out_if_possible(stcb, so_locked) == 0) { + if (sctp_send_stream_reset_out_if_possible(stcb, so_locked) == 0) { goto do_it_again; } } return; } - int sctp_output( struct sctp_inpcb *inp, @@ -11053,7 +10996,7 @@ /*- * Now populate the strseq list. This is done blindly * without pulling out duplicate stream info. This is - * inefficent but won't harm the process since the peer will + * inefficient but won't harm the process since the peer will * look at these in sequence and will thus release anything. * It could mean we exceed the PMTU and chop off some that * we could have included.. but this is unlikely (aka 1432/4 @@ -11182,7 +11125,7 @@ a_chk->sent = SCTP_DATAGRAM_UNSENT; a_chk->whoTo = NULL; - if (!(asoc->last_data_chunk_from->dest_state & SCTP_ADDR_REACHABLE)) { + if ((asoc->last_data_chunk_from->dest_state & SCTP_ADDR_REACHABLE) == 0) { /*- * Ok, the destination for the SACK is unreachable, lets see if * we can select an alternate to asoc->last_data_chunk_from @@ -11359,7 +11302,6 @@ } if ((type == SCTP_NR_SELECTIVE_ACK) && (limit_reached == 0)) { - mergeable = 0; if (asoc->highest_tsn_inside_nr_map > asoc->mapping_array_base_tsn) { @@ -11995,7 +11937,7 @@ sconn = (struct sockaddr_conn *)src; if (SCTP_BASE_VAR(crc32c_offloaded) == 0) { - shout->checksum = sctp_calculate_cksum(mout, 0); + shout->checksum = sctp_calculate_cksum(o_pak, 0); SCTP_STAT_INCR(sctps_sendswcrc); } else { SCTP_STAT_INCR(sctps_sendhwcrc); @@ -12007,13 +11949,13 @@ #endif /* Don't alloc/free for each packet */ if ((buffer = malloc(len)) != NULL) { - m_copydata(mout, 0, len, buffer); + m_copydata(o_pak, 0, len, buffer); ret = SCTP_BASE_VAR(conn_output)(sconn->sconn_addr, buffer, len, 0, 0); free(buffer); } else { ret = ENOMEM; } - sctp_m_freem(mout); + sctp_m_freem(o_pak); break; } #endif @@ -12116,7 +12058,7 @@ /* Fill out hb parameter */ hb->heartbeat.hb_info.ph.param_type = htons(SCTP_HEARTBEAT_INFO); hb->heartbeat.hb_info.ph.param_length = htons(sizeof(struct sctp_heartbeat_info_param)); - hb->heartbeat.hb_info.time_value_1 = now.tv_sec; + hb->heartbeat.hb_info.time_value_1 = (uint32_t)now.tv_sec; hb->heartbeat.hb_info.time_value_2 = now.tv_usec; /* Did our user request this one, put it in */ hb->heartbeat.hb_info.addr_family = (uint8_t)net->ro._l_addr.sa.sa_family; @@ -12390,7 +12332,7 @@ drp->current_onq = htonl(asoc->size_on_reasm_queue + asoc->size_on_all_streams + asoc->my_rwnd_control_len + - stcb->sctp_socket->so_rcv.sb_cc); + SCTP_SBAVAIL(&stcb->sctp_socket->so_rcv)); } else { /*- * If my rwnd is 0, possibly from mbuf depletion as well as @@ -12441,7 +12383,7 @@ chk->rec.chunk_id.id = SCTP_ECN_CWR; chk->rec.chunk_id.can_take_data = 1; chk->flags = 0; - chk->asoc = &stcb->asoc; + chk->asoc = asoc; chk->send_size = sizeof(struct sctp_cwr_chunk); chk->data = sctp_get_mbuf_for_msg(chk->send_size, 0, M_NOWAIT, 1, MT_HEADER); if (chk->data == NULL) { @@ -12459,7 +12401,7 @@ cwr->ch.chunk_flags = override; cwr->ch.chunk_length = htons(sizeof(struct sctp_cwr_chunk)); cwr->tsn = htonl(high_tsn); - TAILQ_INSERT_TAIL(&stcb->asoc.control_send_queue, chk, sctp_next); + TAILQ_INSERT_TAIL(&asoc->control_send_queue, chk, sctp_next); asoc->ctrl_queue_cnt++; } @@ -12880,6 +12822,8 @@ int can_send_out_req=0; uint32_t seq; + SCTP_TCB_LOCK_ASSERT(stcb); + asoc = &stcb->asoc; if (asoc->stream_reset_outstanding) { /*- @@ -12948,7 +12892,8 @@ seq = stcb->asoc.str_reset_seq_out; if (can_send_out_req) { int ret; - ret = sctp_add_stream_reset_out(stcb, chk, seq, (stcb->asoc.str_reset_seq_in - 1), (stcb->asoc.sending_seq - 1)); + + ret = sctp_add_stream_reset_out(stcb, chk, seq, (stcb->asoc.str_reset_seq_in - 1), (stcb->asoc.sending_seq - 1)); if (ret) { seq++; asoc->stream_reset_outstanding++; @@ -12980,28 +12925,35 @@ /* Ok now we proceed with copying the old out stuff and * initializing the new stuff. */ - SCTP_TCB_SEND_LOCK(stcb); - stcb->asoc.ss_functions.sctp_ss_clear(stcb, &stcb->asoc, 0, 1); + stcb->asoc.ss_functions.sctp_ss_clear(stcb, &stcb->asoc, false); for (i = 0; i < stcb->asoc.streamoutcnt; i++) { TAILQ_INIT(&stcb->asoc.strmout[i].outqueue); + /* FIX ME FIX ME */ + /* This should be a SS_COPY operation FIX ME STREAM SCHEDULER EXPERT */ + stcb->asoc.ss_functions.sctp_ss_init_stream(stcb, &stcb->asoc.strmout[i], &oldstream[i]); stcb->asoc.strmout[i].chunks_on_queues = oldstream[i].chunks_on_queues; +#if defined(SCTP_DETAILED_STR_STATS) + for (j = 0; j < SCTP_PR_SCTP_MAX + 1; j++) { + stcb->asoc.strmout[i].abandoned_sent[j] = oldstream[i].abandoned_sent[j]; + stcb->asoc.strmout[i].abandoned_unsent[j] = oldstream[i].abandoned_unsent[j]; + } +#else + stcb->asoc.strmout[i].abandoned_sent[0] = oldstream[i].abandoned_sent[0]; + stcb->asoc.strmout[i].abandoned_unsent[0] = oldstream[i].abandoned_unsent[0]; +#endif stcb->asoc.strmout[i].next_mid_ordered = oldstream[i].next_mid_ordered; stcb->asoc.strmout[i].next_mid_unordered = oldstream[i].next_mid_unordered; stcb->asoc.strmout[i].last_msg_incomplete = oldstream[i].last_msg_incomplete; stcb->asoc.strmout[i].sid = i; stcb->asoc.strmout[i].state = oldstream[i].state; - /* FIX ME FIX ME */ - /* This should be a SS_COPY operation FIX ME STREAM SCHEDULER EXPERT */ - stcb->asoc.ss_functions.sctp_ss_init_stream(stcb, &stcb->asoc.strmout[i], &oldstream[i]); /* now anything on those queues? */ TAILQ_FOREACH_SAFE(sp, &oldstream[i].outqueue, next, nsp) { TAILQ_REMOVE(&oldstream[i].outqueue, sp, next); TAILQ_INSERT_TAIL(&stcb->asoc.strmout[i].outqueue, sp, next); } - } /* now the new streams */ - stcb->asoc.ss_functions.sctp_ss_init(stcb, &stcb->asoc, 1); + stcb->asoc.ss_functions.sctp_ss_init(stcb, &stcb->asoc); for (i = stcb->asoc.streamoutcnt; i < (stcb->asoc.streamoutcnt + adding_o); i++) { TAILQ_INIT(&stcb->asoc.strmout[i].outqueue); stcb->asoc.strmout[i].chunks_on_queues = 0; @@ -13023,7 +12975,6 @@ } stcb->asoc.strm_realoutsize = stcb->asoc.streamoutcnt + adding_o; SCTP_FREE(oldstream, SCTP_M_STRMO); - SCTP_TCB_SEND_UNLOCK(stcb); } skip_stuff: if ((add_stream & 1) && (adding_o > 0)) { @@ -13114,8 +13065,9 @@ m = m_uiotombuf(uio, M_WAITOK, max_send_len, 0, (M_PKTHDR | (user_marks_eor ? M_EOR : 0))); if (m == NULL) { - SCTP_LTRACE_ERR_RET(NULL, NULL, NULL, SCTP_FROM_SCTP_OUTPUT, ENOBUFS); - *error = ENOBUFS; + /* The only possible error is EFAULT. */ + SCTP_LTRACE_ERR_RET(NULL, NULL, NULL, SCTP_FROM_SCTP_OUTPUT, EFAULT); + *error = EFAULT; } else { *sndout = m_length(m, NULL); *new_tail = m_last(m); @@ -13144,7 +13096,7 @@ cancpy = (int)M_TRAILINGSPACE(head); willcpy = min(cancpy, left); *error = uiomove(mtod(head, caddr_t), willcpy, uio); - if (*error) { + if (*error != 0) { sctp_m_freem(head); return (NULL); } @@ -13167,11 +13119,10 @@ cancpy = (int)M_TRAILINGSPACE(m); willcpy = min(cancpy, left); *error = uiomove(mtod(m, caddr_t), willcpy, uio); - if (*error) { + if (*error != 0) { sctp_m_freem(head); *new_tail = NULL; - SCTP_LTRACE_ERR_RET(NULL, NULL, NULL, SCTP_FROM_SCTP_OUTPUT, EFAULT); - *error = EFAULT; + SCTP_LTRACE_ERR_RET(NULL, NULL, NULL, SCTP_FROM_SCTP_OUTPUT, *error); return (NULL); } SCTP_BUF_LEN(m) = willcpy; @@ -13192,13 +13143,12 @@ int resv_upfront) { #if defined(__FreeBSD__) || defined(__Userspace__) - sp->data = m_uiotombuf(uio, M_WAITOK, sp->length, - resv_upfront, 0); + sp->data = m_uiotombuf(uio, M_WAITOK, sp->length, resv_upfront, 0); if (sp->data == NULL) { - SCTP_LTRACE_ERR_RET(NULL, NULL, NULL, SCTP_FROM_SCTP_OUTPUT, ENOBUFS); - return (ENOBUFS); + /* The only possible error is EFAULT. */ + SCTP_LTRACE_ERR_RET(NULL, NULL, NULL, SCTP_FROM_SCTP_OUTPUT, EFAULT); + return (EFAULT); } - sp->tail_mbuf = m_last(sp->data); return (0); #else @@ -13256,12 +13206,10 @@ #endif } - - static struct sctp_stream_queue_pending * sctp_copy_it_in(struct sctp_tcb *stcb, struct sctp_association *asoc, - struct sctp_sndrcvinfo *srcv, + struct sctp_nonpad_sndrcvinfo *srcv, struct uio *uio, struct sctp_nets *net, ssize_t max_send_len, @@ -13276,20 +13224,10 @@ * sb is locked however. When data is copied the protocol processing * should be enabled since this is a slower operation... */ - struct sctp_stream_queue_pending *sp = NULL; + struct sctp_stream_queue_pending *sp; int resv_in_first; *error = 0; - /* Now can we send this? */ - if ((SCTP_GET_STATE(stcb) == SCTP_STATE_SHUTDOWN_SENT) || - (SCTP_GET_STATE(stcb) == SCTP_STATE_SHUTDOWN_ACK_SENT) || - (SCTP_GET_STATE(stcb) == SCTP_STATE_SHUTDOWN_RECEIVED) || - (asoc->state & SCTP_STATE_SHUTDOWN_PENDING)) { - /* got data while shutting down */ - SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTP_OUTPUT, ECONNRESET); - *error = ECONNRESET; - goto out_now; - } sctp_alloc_a_strmoq(stcb, sp); if (sp == NULL) { SCTP_LTRACE_ERR_RET(NULL, stcb, net, SCTP_FROM_SCTP_OUTPUT, ENOMEM); @@ -13304,7 +13242,6 @@ sp->context = srcv->sinfo_context; sp->fsn = 0; (void)SCTP_GETTIME_TIMEVAL(&sp->ts); - sp->sid = srcv->sinfo_stream; #if defined(__APPLE__) && !defined(__Userspace__) #if defined(APPLE_LEOPARD) @@ -13378,7 +13315,6 @@ return (sp); } - int sctp_sosend(struct socket *so, struct sockaddr *addr, @@ -13386,13 +13322,13 @@ struct mbuf *top, struct mbuf *control, #if defined(__APPLE__) && !defined(__Userspace__) - int flags + int flags) #else int flags, #if defined(__FreeBSD__) && !defined(__Userspace__) - struct thread *p + struct thread *p) #elif defined(_WIN32) && !defined(__Userspace__) - PKTHREAD p + PKTHREAD p) #else #if defined(__Userspace__) /* @@ -13400,180 +13336,135 @@ * to sctp_lower_sosend */ #endif - struct proc *p + struct proc *p) #endif #endif -) { -#if defined(__APPLE__) && !defined(__Userspace__) - struct proc *p = current_proc(); -#endif - int error, use_sndinfo = 0; struct sctp_sndrcvinfo sndrcvninfo; - struct sockaddr *addr_to_use; #if defined(INET) && defined(INET6) struct sockaddr_in sin; #endif - + struct sockaddr *addr_to_use; #if defined(__APPLE__) && !defined(__Userspace__) - SCTP_SOCKET_LOCK(so, 1); + struct proc *p = current_proc(); #endif - if (control) { + int error; + bool use_sndinfo; + + if (control != NULL) { /* process cmsg snd/rcv info (maybe a assoc-id) */ - if (sctp_find_cmsg(SCTP_SNDRCV, (void *)&sndrcvninfo, control, - sizeof(sndrcvninfo))) { - /* got one */ - use_sndinfo = 1; - } + use_sndinfo = sctp_find_cmsg(SCTP_SNDRCV, (void *)&sndrcvninfo, control, sizeof(sndrcvninfo)); + } else { + use_sndinfo = false; } - addr_to_use = addr; #if defined(INET) && defined(INET6) - if ((addr) && (addr->sa_family == AF_INET6)) { + if ((addr != NULL) && (addr->sa_family == AF_INET6)) { struct sockaddr_in6 *sin6; +#ifdef HAVE_SA_LEN + if (addr->sa_len != sizeof(struct sockaddr_in6)) { + SCTP_LTRACE_ERR_RET(NULL, NULL, NULL, SCTP_FROM_SCTP_OUTPUT, EINVAL); + return (EINVAL); + } +#endif sin6 = (struct sockaddr_in6 *)addr; if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) { in6_sin6_2_sin(&sin, sin6); addr_to_use = (struct sockaddr *)&sin; + } else { + addr_to_use = addr; } + } else { + addr_to_use = addr; } +#else + addr_to_use = addr; #endif - error = sctp_lower_sosend(so, addr_to_use, uio, top, - control, - flags, - use_sndinfo ? &sndrcvninfo: NULL -#if !defined(__Userspace__) - , p +#if defined(__APPLE__) && !defined(__Userspace__) + SCTP_SOCKET_LOCK(so, 1); +#endif + error = sctp_lower_sosend(so, addr_to_use, uio, top, control, flags, +#if defined(__Userspace__) + use_sndinfo ? &sndrcvninfo : NULL); +#else + use_sndinfo ? &sndrcvninfo : NULL, p); #endif - ); #if defined(__APPLE__) && !defined(__Userspace__) SCTP_SOCKET_UNLOCK(so, 1); #endif return (error); } - int sctp_lower_sosend(struct socket *so, struct sockaddr *addr, struct uio *uio, - struct mbuf *i_pak, + struct mbuf *top, struct mbuf *control, int flags, - struct sctp_sndrcvinfo *srcv -#if !defined(__Userspace__) - , +#if defined(__Userspace__) + struct sctp_sndrcvinfo *srcv) +#else + struct sctp_sndrcvinfo *srcv, #if defined(__FreeBSD__) - struct thread *p + struct thread *p) #elif defined(_WIN32) - PKTHREAD p + PKTHREAD p) #else - struct proc *p + struct proc *p) #endif #endif - ) { + struct sctp_nonpad_sndrcvinfo sndrcvninfo_buf; #if defined(__FreeBSD__) && !defined(__Userspace__) struct epoch_tracker et; #endif - ssize_t sndlen = 0, max_len, local_add_more; - int error, len; - struct mbuf *top = NULL; - int queue_only = 0, queue_only_for_init = 0; - int free_cnt_applied = 0; - int un_sent; - int now_filled = 0; - unsigned int inqueue_bytes = 0; + struct timeval now; struct sctp_block_entry be; struct sctp_inpcb *inp; struct sctp_tcb *stcb = NULL; - struct timeval now; struct sctp_nets *net; struct sctp_association *asoc; struct sctp_inpcb *t_inp; + struct sctp_nonpad_sndrcvinfo *sndrcvninfo; + ssize_t sndlen = 0, max_len, local_add_more; + ssize_t local_soresv = 0; + sctp_assoc_t sinfo_assoc_id; int user_marks_eor; - int create_lock_applied = 0; int nagle_applies = 0; - int some_on_control = 0; - int got_all_of_the_send = 0; - int hold_tcblock = 0; - int non_blocking = 0; - ssize_t local_soresv = 0; + int error; + int queue_only = 0, queue_only_for_init = 0; + int un_sent; + int now_filled = 0; + unsigned int inqueue_bytes = 0; uint16_t port; uint16_t sinfo_flags; - sctp_assoc_t sinfo_assoc_id; + uint16_t sinfo_stream; + bool create_lock_applied = false; + bool free_cnt_applied = false; + bool some_on_control; + bool got_all_of_the_send = false; + bool non_blocking = false; error = 0; net = NULL; stcb = NULL; - asoc = NULL; #if defined(__APPLE__) && !defined(__Userspace__) sctp_lock_assert(so); #endif - t_inp = inp = (struct sctp_inpcb *)so->so_pcb; - if (inp == NULL) { - SCTP_LTRACE_ERR_RET(NULL, NULL, NULL, SCTP_FROM_SCTP_OUTPUT, EINVAL); + if ((uio == NULL) && (top == NULL)) { error = EINVAL; - if (i_pak) { - SCTP_RELEASE_PKT(i_pak); - } - return (error); - } - if ((uio == NULL) && (i_pak == NULL)) { - SCTP_LTRACE_ERR_RET(inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, EINVAL); - return (EINVAL); - } - user_marks_eor = sctp_is_feature_on(inp, SCTP_PCB_FLAGS_EXPLICIT_EOR); - atomic_add_int(&inp->total_sends, 1); - if (uio) { -#if defined(__APPLE__) && !defined(__Userspace__) -#if defined(APPLE_LEOPARD) - if (uio->uio_resid < 0) { -#else - if (uio_resid(uio) < 0) { -#endif -#else - if (uio->uio_resid < 0) { -#endif - SCTP_LTRACE_ERR_RET(inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, EINVAL); - return (EINVAL); - } -#if defined(__APPLE__) && !defined(__Userspace__) -#if defined(APPLE_LEOPARD) - sndlen = uio->uio_resid; -#else - sndlen = uio_resid(uio); -#endif -#else - sndlen = uio->uio_resid; -#endif - } else { - top = SCTP_HEADER_TO_CHAIN(i_pak); - sndlen = SCTP_HEADER_LEN(i_pak); - } - SCTPDBG(SCTP_DEBUG_OUTPUT1, "Send called addr:%p send length %zd\n", - (void *)addr, - sndlen); - if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) && - SCTP_IS_LISTENING(inp)) { - /* The listener can NOT send */ - SCTP_LTRACE_ERR_RET(NULL, NULL, NULL, SCTP_FROM_SCTP_OUTPUT, ENOTCONN); - error = ENOTCONN; goto out_unlocked; } - /** - * Pre-screen address, if one is given the sin-len - * must be set correctly! - */ - if (addr) { + if (addr != NULL) { union sctp_sockstore *raddr = (union sctp_sockstore *)addr; + switch (raddr->sa.sa_family) { #ifdef INET case AF_INET: #ifdef HAVE_SIN_LEN if (raddr->sin.sin_len != sizeof(struct sockaddr_in)) { - SCTP_LTRACE_ERR_RET(inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, EINVAL); error = EINVAL; goto out_unlocked; } @@ -13585,7 +13476,6 @@ case AF_INET6: #ifdef HAVE_SIN6_LEN if (raddr->sin6.sin6_len != sizeof(struct sockaddr_in6)) { - SCTP_LTRACE_ERR_RET(inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, EINVAL); error = EINVAL; goto out_unlocked; } @@ -13597,7 +13487,6 @@ case AF_CONN: #ifdef HAVE_SCONN_LEN if (raddr->sconn.sconn_len != sizeof(struct sockaddr_conn)) { - SCTP_LTRACE_ERR_RET(inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, EINVAL); error = EINVAL; goto out_unlocked; } @@ -13606,25 +13495,76 @@ break; #endif default: - SCTP_LTRACE_ERR_RET(inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, EAFNOSUPPORT); error = EAFNOSUPPORT; goto out_unlocked; } - } else + } else { port = 0; + } + if (uio != NULL) { +#if defined(__APPLE__) && !defined(__Userspace__) +#if defined(APPLE_LEOPARD) + if (uio->uio_resid < 0) { +#else + if (uio_resid(uio) < 0) { +#endif +#else + if (uio->uio_resid < 0) { +#endif + error = EINVAL; + goto out_unlocked; + } +#if defined(__APPLE__) && !defined(__Userspace__) +#if defined(APPLE_LEOPARD) + sndlen = uio->uio_resid; +#else + sndlen = uio_resid(uio); +#endif +#else + sndlen = uio->uio_resid; +#endif + } else { + sndlen = SCTP_HEADER_LEN(top); + } + SCTPDBG(SCTP_DEBUG_OUTPUT1, "Send called addr:%p send length %zd\n", + (void *)addr, sndlen); + + t_inp = inp = (struct sctp_inpcb *)so->so_pcb; + if (inp == NULL) { + error = EINVAL; + goto out_unlocked; + } + user_marks_eor = sctp_is_feature_on(inp, SCTP_PCB_FLAGS_EXPLICIT_EOR); + if ((uio == NULL) && (user_marks_eor != 0)) { + /*- + * We do not support eeor mode for + * sending with mbuf chains (like sendfile). + */ + error = EINVAL; + goto out_unlocked; + } + if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) && + SCTP_IS_LISTENING(inp)) { + /* The listener can NOT send. */ + error = EINVAL; + goto out_unlocked; + } + atomic_add_int(&inp->total_sends, 1); - if (srcv) { - sinfo_flags = srcv->sinfo_flags; - sinfo_assoc_id = srcv->sinfo_assoc_id; + if (srcv != NULL) { + sndrcvninfo = (struct sctp_nonpad_sndrcvinfo *)srcv; + sinfo_assoc_id = sndrcvninfo->sinfo_assoc_id; + sinfo_flags = sndrcvninfo->sinfo_flags; if (INVALID_SINFO_FLAG(sinfo_flags) || PR_SCTP_INVALID_POLICY(sinfo_flags)) { - SCTP_LTRACE_ERR_RET(inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, EINVAL); error = EINVAL; goto out_unlocked; } - if (srcv->sinfo_flags) + if (sinfo_flags != 0) { SCTP_STAT_INCR(sctps_sends_with_flags); + } } else { + sndrcvninfo = NULL; sinfo_flags = inp->def_send.sinfo_flags; sinfo_assoc_id = inp->def_send.sinfo_assoc_id; } @@ -13636,65 +13576,69 @@ sinfo_flags |= SCTP_EOF; } #endif - if (sinfo_flags & SCTP_SENDALL) { - /* its a sendall */ - error = sctp_sendall(inp, uio, top, srcv); - top = NULL; - goto out_unlocked; - } if ((sinfo_flags & SCTP_ADDR_OVER) && (addr == NULL)) { - SCTP_LTRACE_ERR_RET(inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, EINVAL); error = EINVAL; goto out_unlocked; } - /* now we must find the assoc */ + SCTP_INP_RLOCK(inp); + if ((sinfo_flags & SCTP_SENDALL) && + (inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE)) { + SCTP_INP_RUNLOCK(inp); + error = sctp_sendall(inp, uio, top, sndrcvninfo); + top = NULL; + goto out_unlocked; + } + /* Now we must find the association. */ if ((inp->sctp_flags & SCTP_PCB_FLAGS_CONNECTED) || (inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL)) { - SCTP_INP_RLOCK(inp); stcb = LIST_FIRST(&inp->sctp_asoc_list); - if (stcb) { + if (stcb != NULL) { SCTP_TCB_LOCK(stcb); - hold_tcblock = 1; } SCTP_INP_RUNLOCK(inp); - } else if (sinfo_assoc_id) { - stcb = sctp_findassociation_ep_asocid(inp, sinfo_assoc_id, 1); + } else if (sinfo_assoc_id > SCTP_ALL_ASSOC) { + stcb = sctp_findasoc_ep_asocid_locked(inp, sinfo_assoc_id, 1); + SCTP_INP_RUNLOCK(inp); if (stcb != NULL) { - hold_tcblock = 1; + SCTP_TCB_LOCK_ASSERT(stcb); } - } else if (addr) { + } else if (addr != NULL) { /*- * Since we did not use findep we must * increment it, and if we don't find a tcb * decrement it. */ - SCTP_INP_WLOCK(inp); SCTP_INP_INCR_REF(inp); - SCTP_INP_WUNLOCK(inp); + SCTP_INP_RUNLOCK(inp); stcb = sctp_findassociation_ep_addr(&t_inp, addr, &net, NULL, NULL); if (stcb == NULL) { SCTP_INP_WLOCK(inp); SCTP_INP_DECR_REF(inp); SCTP_INP_WUNLOCK(inp); } else { - hold_tcblock = 1; + SCTP_TCB_LOCK_ASSERT(stcb); } + } else { + SCTP_INP_RUNLOCK(inp); + } + +#ifdef INVARIANTS + if (stcb != NULL) { + SCTP_TCB_LOCK_ASSERT(stcb); } - if ((stcb == NULL) && (addr)) { +#endif + + if ((stcb == NULL) && (addr != NULL)) { /* Possible implicit send? */ SCTP_ASOC_CREATE_LOCK(inp); - create_lock_applied = 1; + create_lock_applied = true; if ((inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) || (inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_ALLGONE)) { - /* Should I really unlock ? */ - SCTP_LTRACE_ERR_RET(NULL, NULL, NULL, SCTP_FROM_SCTP_OUTPUT, EINVAL); error = EINVAL; goto out_unlocked; - } if (((inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) == 0) && (addr->sa_family == AF_INET6)) { - SCTP_LTRACE_ERR_RET(inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, EINVAL); error = EINVAL; goto out_unlocked; } @@ -13713,20 +13657,20 @@ SCTP_INP_DECR_REF(inp); SCTP_INP_WUNLOCK(inp); } else { - hold_tcblock = 1; + SCTP_TCB_LOCK_ASSERT(stcb); + SCTP_ASOC_CREATE_UNLOCK(inp); + create_lock_applied = false; } - if (error) { + if (error != 0) { goto out_unlocked; } if (t_inp != inp) { - SCTP_LTRACE_ERR_RET(inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, ENOTCONN); error = ENOTCONN; goto out_unlocked; } } if (stcb == NULL) { if (addr == NULL) { - SCTP_LTRACE_ERR_RET(inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, ENOENT); error = ENOENT; goto out_unlocked; } else { @@ -13736,57 +13680,43 @@ if ((sinfo_flags & SCTP_ABORT) || ((sinfo_flags & SCTP_EOF) && (sndlen == 0))) { /*- - * User asks to abort a non-existant assoc, - * or EOF a non-existant assoc with no data + * User asks to abort a non-existent assoc, + * or EOF a non-existent assoc with no data */ - SCTP_LTRACE_ERR_RET(inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, ENOENT); error = ENOENT; goto out_unlocked; } /* get an asoc/stcb struct */ vrf_id = inp->def_vrf_id; -#ifdef INVARIANTS - if (create_lock_applied == 0) { - panic("Error, should hold create lock and I don't?"); - } -#endif - stcb = sctp_aloc_assoc(inp, addr, &error, 0, vrf_id, - inp->sctp_ep.pre_open_stream_count, - inp->sctp_ep.port, + KASSERT(create_lock_applied, ("create_lock_applied is false")); + stcb = sctp_aloc_assoc_connected(inp, addr, &error, 0, 0, vrf_id, + inp->sctp_ep.pre_open_stream_count, + inp->sctp_ep.port, #if !defined(__Userspace__) - p, + p, #else - (struct proc *)NULL, + (struct proc *)NULL, #endif - SCTP_INITIALIZE_AUTH_PARAMS); + SCTP_INITIALIZE_AUTH_PARAMS); if (stcb == NULL) { - /* Error is setup for us in the call */ + /* error is setup for us in the call. */ + KASSERT(error != 0, ("error is 0 although stcb is NULL")); goto out_unlocked; } - if (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) { - stcb->sctp_ep->sctp_flags |= SCTP_PCB_FLAGS_CONNECTED; - /* Set the connected flag so we can queue data */ - soisconnecting(so); - } - hold_tcblock = 1; - if (create_lock_applied) { - SCTP_ASOC_CREATE_UNLOCK(inp); - create_lock_applied = 0; - } else { - SCTP_PRINTF("Huh-3? create lock should have been on??\n"); - } + SCTP_TCB_LOCK_ASSERT(stcb); + SCTP_ASOC_CREATE_UNLOCK(inp); + create_lock_applied = false; /* Turn on queue only flag to prevent data from being sent */ queue_only = 1; - asoc = &stcb->asoc; SCTP_SET_STATE(stcb, SCTP_STATE_COOKIE_WAIT); - (void)SCTP_GETTIME_TIMEVAL(&asoc->time_entered); - - if (control) { + (void)SCTP_GETTIME_TIMEVAL(&stcb->asoc.time_entered); + if (control != NULL) { if (sctp_process_cmsgs_for_init(stcb, control, &error)) { - sctp_free_assoc(inp, stcb, SCTP_PCBFREE_FORCE, + sctp_free_assoc(inp, stcb, SCTP_NORMAL_PROC, SCTP_FROM_SCTP_OUTPUT + SCTP_LOC_6); - hold_tcblock = 0; stcb = NULL; + KASSERT(error != 0, + ("error is 0 although sctp_process_cmsgs_for_init() indicated an error")); goto out_unlocked; } } @@ -13799,248 +13729,137 @@ * change it BEFORE we append the message. */ } - } else - asoc = &stcb->asoc; - if (srcv == NULL) { - srcv = (struct sctp_sndrcvinfo *)&asoc->def_send; - sinfo_flags = srcv->sinfo_flags; -#if defined(__FreeBSD__) && !defined(__Userspace__) - if (flags & MSG_EOR) { - sinfo_flags |= SCTP_EOR; - } - if (flags & MSG_EOF) { - sinfo_flags |= SCTP_EOF; - } -#endif } - if (sinfo_flags & SCTP_ADDR_OVER) { - if (addr) - net = sctp_findnet(stcb, addr); - else - net = NULL; - if ((net == NULL) || - ((port != 0) && (port != stcb->rport))) { - SCTP_LTRACE_ERR_RET(inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, EINVAL); - error = EINVAL; - goto out_unlocked; - } - } else { - if (stcb->asoc.alternate) { - net = stcb->asoc.alternate; - } else { - net = stcb->asoc.primary_destination; - } - } - atomic_add_int(&stcb->total_sends, 1); - /* Keep the stcb from being freed under our feet */ - atomic_add_int(&asoc->refcnt, 1); - free_cnt_applied = 1; - if (sctp_is_feature_on(inp, SCTP_PCB_FLAGS_NO_FRAGMENT)) { - if (sndlen > (ssize_t)asoc->smallest_mtu) { - SCTP_LTRACE_ERR_RET(inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, EMSGSIZE); - error = EMSGSIZE; - goto out_unlocked; - } - } -#if defined(__Userspace__) - if (inp->recv_callback) { - non_blocking = 1; - } -#endif - if (SCTP_SO_IS_NBIO(so) -#if defined(__FreeBSD__) && !defined(__Userspace__) - || (flags & (MSG_NBIO | MSG_DONTWAIT)) != 0 -#endif - ) { - non_blocking = 1; - } - /* would we block? */ - if (non_blocking) { - ssize_t amount; + KASSERT(!create_lock_applied, ("create_lock_applied is true")); + KASSERT(stcb != NULL, ("stcb is NULL")); + SCTP_TCB_LOCK_ASSERT(stcb); - if (hold_tcblock == 0) { - SCTP_TCB_LOCK(stcb); - hold_tcblock = 1; - } - inqueue_bytes = stcb->asoc.total_output_queue_size - (stcb->asoc.chunks_on_out_queue * SCTP_DATA_CHUNK_OVERHEAD(stcb)); - if (user_marks_eor == 0) { - amount = sndlen; - } else { - amount = 1; - } - if ((SCTP_SB_LIMIT_SND(so) < (amount + inqueue_bytes + stcb->asoc.sb_send_resv)) || - (stcb->asoc.chunks_on_out_queue >= SCTP_BASE_SYSCTL(sctp_max_chunks_on_queue))) { - SCTP_LTRACE_ERR_RET(inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, EWOULDBLOCK); - if (sndlen > (ssize_t)SCTP_SB_LIMIT_SND(so)) - error = EMSGSIZE; - else - error = EWOULDBLOCK; - goto out_unlocked; - } - stcb->asoc.sb_send_resv += (uint32_t)sndlen; - SCTP_TCB_UNLOCK(stcb); - hold_tcblock = 0; - } else { - atomic_add_int(&stcb->asoc.sb_send_resv, sndlen); - } - local_soresv = sndlen; - if (stcb->asoc.state & SCTP_STATE_ABOUT_TO_BE_FREED) { - SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTP_OUTPUT, ECONNRESET); - error = ECONNRESET; - goto out_unlocked; - } - if (create_lock_applied) { - SCTP_ASOC_CREATE_UNLOCK(inp); - create_lock_applied = 0; - } - /* Is the stream no. valid? */ - if (srcv->sinfo_stream >= asoc->streamoutcnt) { - /* Invalid stream number */ - SCTP_LTRACE_ERR_RET(inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, EINVAL); - error = EINVAL; - goto out_unlocked; - } - if ((asoc->strmout[srcv->sinfo_stream].state != SCTP_STREAM_OPEN) && - (asoc->strmout[srcv->sinfo_stream].state != SCTP_STREAM_OPENING)) { - /* - * Can't queue any data while stream reset is underway. - */ - if (asoc->strmout[srcv->sinfo_stream].state > SCTP_STREAM_OPEN) { - error = EAGAIN; + asoc = &stcb->asoc; + if ((asoc->state & SCTP_STATE_ABOUT_TO_BE_FREED) || + (asoc->state & SCTP_STATE_WAS_ABORTED)) { + if (asoc->state & SCTP_STATE_WAS_ABORTED) { + /* XXX: Could also be ECONNABORTED, not enough info. */ + error = ECONNRESET; } else { - error = EINVAL; + error = ENOTCONN; } - SCTP_LTRACE_ERR_RET(inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, error); goto out_unlocked; } if ((SCTP_GET_STATE(stcb) == SCTP_STATE_COOKIE_WAIT) || (SCTP_GET_STATE(stcb) == SCTP_STATE_COOKIE_ECHOED)) { queue_only = 1; } - /* we are now done with all control */ - if (control) { - sctp_m_freem(control); - control = NULL; - } - if ((SCTP_GET_STATE(stcb) == SCTP_STATE_SHUTDOWN_SENT) || - (SCTP_GET_STATE(stcb) == SCTP_STATE_SHUTDOWN_RECEIVED) || - (SCTP_GET_STATE(stcb) == SCTP_STATE_SHUTDOWN_ACK_SENT) || - (asoc->state & SCTP_STATE_SHUTDOWN_PENDING)) { - if (sinfo_flags & SCTP_ABORT) { - ; - } else { - SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTP_OUTPUT, ECONNRESET); - error = ECONNRESET; - goto out_unlocked; + /* Keep the stcb from being freed under our feet. */ + atomic_add_int(&asoc->refcnt, 1); + free_cnt_applied = true; + if (sndrcvninfo == NULL) { + /* Use a local copy to have a consistent view. */ + sndrcvninfo_buf = asoc->def_send; + sndrcvninfo = &sndrcvninfo_buf; + sinfo_flags = sndrcvninfo->sinfo_flags; +#if defined(__FreeBSD__) && !defined(__Userspace__) + if (flags & MSG_EOR) { + sinfo_flags |= SCTP_EOR; + } + if (flags & MSG_EOF) { + sinfo_flags |= SCTP_EOF; } - } - /* Ok, we will attempt a msgsnd :> */ -#if !(defined(_WIN32) || defined(__Userspace__)) - if (p) { -#if defined(__FreeBSD__) - p->td_ru.ru_msgsnd++; -#else - p->p_stats->p_ru.ru_msgsnd++; #endif } -#endif /* Are we aborting? */ if (sinfo_flags & SCTP_ABORT) { struct mbuf *mm; + struct sctp_paramhdr *ph; ssize_t tot_demand, tot_out = 0, max_out; SCTP_STAT_INCR(sctps_sends_with_abort); if ((SCTP_GET_STATE(stcb) == SCTP_STATE_COOKIE_WAIT) || (SCTP_GET_STATE(stcb) == SCTP_STATE_COOKIE_ECHOED)) { - /* It has to be up before we abort */ - /* how big is the user initiated abort? */ - SCTP_LTRACE_ERR_RET(inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, EINVAL); + /* It has to be up before we abort. */ error = EINVAL; - goto out; - } - if (hold_tcblock) { - SCTP_TCB_UNLOCK(stcb); - hold_tcblock = 0; + goto out_unlocked; } - if (top) { - struct mbuf *cntm = NULL; + /* How big is the user initiated abort? */ + if (top != NULL) { + struct mbuf *cntm; - mm = sctp_get_mbuf_for_msg(sizeof(struct sctp_paramhdr), 0, M_WAITOK, 1, MT_DATA); if (sndlen != 0) { for (cntm = top; cntm; cntm = SCTP_BUF_NEXT(cntm)) { tot_out += SCTP_BUF_LEN(cntm); } } + mm = sctp_get_mbuf_for_msg(sizeof(struct sctp_paramhdr), 0, M_NOWAIT, 1, MT_DATA); } else { /* Must fit in a MTU */ tot_out = sndlen; tot_demand = (tot_out + sizeof(struct sctp_paramhdr)); if (tot_demand > SCTP_DEFAULT_ADD_MORE) { - /* To big */ - SCTP_LTRACE_ERR_RET(NULL, stcb, net, SCTP_FROM_SCTP_OUTPUT, EMSGSIZE); error = EMSGSIZE; - goto out; + goto out_unlocked; } - mm = sctp_get_mbuf_for_msg((unsigned int)tot_demand, 0, M_WAITOK, 1, MT_DATA); + mm = sctp_get_mbuf_for_msg((unsigned int)tot_demand, 0, M_NOWAIT, 1, MT_DATA); } if (mm == NULL) { - SCTP_LTRACE_ERR_RET(NULL, stcb, net, SCTP_FROM_SCTP_OUTPUT, ENOMEM); error = ENOMEM; - goto out; + goto out_unlocked; } max_out = asoc->smallest_mtu - sizeof(struct sctp_paramhdr); max_out -= sizeof(struct sctp_abort_msg); if (tot_out > max_out) { tot_out = max_out; } - if (mm) { - struct sctp_paramhdr *ph; - - /* now move forward the data pointer */ - ph = mtod(mm, struct sctp_paramhdr *); - ph->param_type = htons(SCTP_CAUSE_USER_INITIATED_ABT); - ph->param_length = htons((uint16_t)(sizeof(struct sctp_paramhdr) + tot_out)); - ph++; - SCTP_BUF_LEN(mm) = (int)(tot_out + sizeof(struct sctp_paramhdr)); - if (top == NULL) { + ph = mtod(mm, struct sctp_paramhdr *); + ph->param_type = htons(SCTP_CAUSE_USER_INITIATED_ABT); + ph->param_length = htons((uint16_t)(sizeof(struct sctp_paramhdr) + tot_out)); + ph++; + SCTP_BUF_LEN(mm) = (int)(tot_out + sizeof(struct sctp_paramhdr)); + if (top == NULL) { + SCTP_TCB_UNLOCK(stcb); #if defined(__APPLE__) && !defined(__Userspace__) - SCTP_SOCKET_UNLOCK(so, 0); + SCTP_SOCKET_UNLOCK(so, 0); #endif - error = uiomove((caddr_t)ph, (int)tot_out, uio); + error = uiomove((caddr_t)ph, (int)tot_out, uio); #if defined(__APPLE__) && !defined(__Userspace__) - SCTP_SOCKET_LOCK(so, 0); + SCTP_SOCKET_LOCK(so, 0); #endif - if (error) { - /*- - * Here if we can't get his data we - * still abort we just don't get to - * send the users note :-0 - */ - sctp_m_freem(mm); - mm = NULL; - } - } else { - if (sndlen != 0) { - SCTP_BUF_NEXT(mm) = top; + SCTP_TCB_LOCK(stcb); + if ((asoc->state & SCTP_STATE_ABOUT_TO_BE_FREED) || + (asoc->state & SCTP_STATE_WAS_ABORTED)) { + sctp_m_freem(mm); + if (asoc->state & SCTP_STATE_WAS_ABORTED) { + /* XXX: Could also be ECONNABORTED, not enough info. */ + error = ECONNRESET; + } else { + error = ENOTCONN; } + goto out_unlocked; + } + if (error != 0) { + /*- + * Here if we can't get his data we + * still abort we just don't get to + * send the users note :-0 + */ + sctp_m_freem(mm); + mm = NULL; + error = 0; + } + } else { + if (sndlen != 0) { + SCTP_BUF_NEXT(mm) = top; } } - if (hold_tcblock == 0) { - SCTP_TCB_LOCK(stcb); - } - atomic_add_int(&stcb->asoc.refcnt, -1); - free_cnt_applied = 0; + atomic_subtract_int(&asoc->refcnt, 1); + free_cnt_applied = false; /* release this lock, otherwise we hang on ourselves */ #if defined(__FreeBSD__) && !defined(__Userspace__) NET_EPOCH_ENTER(et); #endif - sctp_abort_an_association(stcb->sctp_ep, stcb, mm, SCTP_SO_LOCKED); + sctp_abort_an_association(stcb->sctp_ep, stcb, mm, false, SCTP_SO_LOCKED); #if defined(__FreeBSD__) && !defined(__Userspace__) NET_EPOCH_EXIT(et); #endif - /* now relock the stcb so everything is sane */ - hold_tcblock = 0; stcb = NULL; /* In this case top is already chained to mm * avoid double free, since we free it below if @@ -14052,43 +13871,134 @@ } goto out_unlocked; } - /* Calculate the maximum we can send */ - inqueue_bytes = stcb->asoc.total_output_queue_size - (stcb->asoc.chunks_on_out_queue * SCTP_DATA_CHUNK_OVERHEAD(stcb)); - if (SCTP_SB_LIMIT_SND(so) > inqueue_bytes) { - max_len = SCTP_SB_LIMIT_SND(so) - inqueue_bytes; + + KASSERT(stcb != NULL, ("stcb is NULL")); + SCTP_TCB_LOCK_ASSERT(stcb); + KASSERT((asoc->state & SCTP_STATE_ABOUT_TO_BE_FREED) == 0, + ("Association about to be freed")); + KASSERT((asoc->state & SCTP_STATE_WAS_ABORTED) == 0, + ("Association was aborted")); + + if (sinfo_flags & SCTP_ADDR_OVER) { + if (addr != NULL) { + net = sctp_findnet(stcb, addr); + } else { + net = NULL; + } + if ((net == NULL) || + ((port != 0) && (port != stcb->rport))) { + error = EINVAL; + goto out_unlocked; + } } else { - max_len = 0; + if (asoc->alternate != NULL) { + net = asoc->alternate; + } else { + net = asoc->primary_destination; + } } - if (hold_tcblock) { - SCTP_TCB_UNLOCK(stcb); - hold_tcblock = 0; + if (sndlen == 0) { + if (sinfo_flags & SCTP_EOF) { + got_all_of_the_send = true; + goto dataless_eof; + } else { + error = EINVAL; + goto out_unlocked; + } + } + if (sctp_is_feature_on(inp, SCTP_PCB_FLAGS_NO_FRAGMENT)) { + if (sndlen > (ssize_t)asoc->smallest_mtu) { + error = EMSGSIZE; + goto out_unlocked; + } + } + sinfo_stream = sndrcvninfo->sinfo_stream; + /* Is the stream no. valid? */ + if (sinfo_stream >= asoc->streamoutcnt) { + /* Invalid stream number */ + error = EINVAL; + goto out_unlocked; } - if (asoc->strmout == NULL) { - /* huh? software error */ - SCTP_LTRACE_ERR_RET(inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, EFAULT); - error = EFAULT; + if ((asoc->strmout[sinfo_stream].state != SCTP_STREAM_OPEN) && + (asoc->strmout[sinfo_stream].state != SCTP_STREAM_OPENING)) { + /* + * Can't queue any data while stream reset is underway. + */ + if (asoc->strmout[sinfo_stream].state > SCTP_STREAM_OPEN) { + error = EAGAIN; + } else { + error = EINVAL; + } goto out_unlocked; } + atomic_add_int(&stcb->total_sends, 1); +#if defined(__Userspace__) + if (inp->recv_callback != NULL) { + non_blocking = true; + } +#endif +#if defined(__FreeBSD__) && !defined(__Userspace__) + if (SCTP_SO_IS_NBIO(so) || (flags & (MSG_NBIO | MSG_DONTWAIT)) != 0) { +#else + if (SCTP_SO_IS_NBIO(so)) { +#endif + non_blocking = true; + } + if (non_blocking) { + ssize_t amount; + + inqueue_bytes = asoc->total_output_queue_size - (asoc->chunks_on_out_queue * SCTP_DATA_CHUNK_OVERHEAD(stcb)); + if (user_marks_eor == 0) { + amount = sndlen; + } else { + amount = 1; + } + if ((SCTP_SB_LIMIT_SND(so) < (amount + inqueue_bytes + asoc->sb_send_resv)) || + (asoc->chunks_on_out_queue >= SCTP_BASE_SYSCTL(sctp_max_chunks_on_queue))) { + if ((sndlen > (ssize_t)SCTP_SB_LIMIT_SND(so)) && + (user_marks_eor == 0)) { + error = EMSGSIZE; + } else { + error = EWOULDBLOCK; + } + goto out_unlocked; + } + } + atomic_add_int(&asoc->sb_send_resv, (int)sndlen); + local_soresv = sndlen; + KASSERT(stcb != NULL, ("stcb is NULL")); + SCTP_TCB_LOCK_ASSERT(stcb); + KASSERT((asoc->state & SCTP_STATE_ABOUT_TO_BE_FREED) == 0, + ("Association about to be freed")); + KASSERT((asoc->state & SCTP_STATE_WAS_ABORTED) == 0, + ("Association was aborted")); + + /* Ok, we will attempt a msgsnd :> */ +#if !(defined(_WIN32) || defined(__Userspace__)) + if (p != NULL) { +#if defined(__FreeBSD__) + p->td_ru.ru_msgsnd++; +#else + p->p_stats->p_ru.ru_msgsnd++; +#endif + } +#endif + /* Calculate the maximum we can send */ + inqueue_bytes = asoc->total_output_queue_size - (asoc->chunks_on_out_queue * SCTP_DATA_CHUNK_OVERHEAD(stcb)); + if (SCTP_SB_LIMIT_SND(so) > inqueue_bytes) { + max_len = SCTP_SB_LIMIT_SND(so) - inqueue_bytes; + } else { + max_len = 0; + } /* Unless E_EOR mode is on, we must make a send FIT in one call. */ if ((user_marks_eor == 0) && (sndlen > (ssize_t)SCTP_SB_LIMIT_SND(stcb->sctp_socket))) { - /* It will NEVER fit */ - SCTP_LTRACE_ERR_RET(NULL, stcb, net, SCTP_FROM_SCTP_OUTPUT, EMSGSIZE); + /* It will NEVER fit. */ error = EMSGSIZE; goto out_unlocked; } - if ((uio == NULL) && user_marks_eor) { - /*- - * We do not support eeor mode for - * sending with mbuf chains (like sendfile). - */ - SCTP_LTRACE_ERR_RET(NULL, stcb, net, SCTP_FROM_SCTP_OUTPUT, EINVAL); - error = EINVAL; - goto out_unlocked; - } - - if (user_marks_eor) { + if (user_marks_eor != 0) { local_add_more = (ssize_t)min(SCTP_SB_LIMIT_SND(so), SCTP_BASE_SYSCTL(sctp_add_more_threshold)); } else { /*- @@ -14097,25 +14007,23 @@ */ local_add_more = sndlen; } - len = 0; if (non_blocking) { goto skip_preblock; } - if (((max_len <= local_add_more) && - ((ssize_t)SCTP_SB_LIMIT_SND(so) >= local_add_more)) || + if (((max_len <= local_add_more) && ((ssize_t)SCTP_SB_LIMIT_SND(so) >= local_add_more)) || (max_len == 0) || - ((stcb->asoc.chunks_on_out_queue+stcb->asoc.stream_queue_cnt) >= SCTP_BASE_SYSCTL(sctp_max_chunks_on_queue))) { - /* No room right now ! */ + ((asoc->chunks_on_out_queue + asoc->stream_queue_cnt) >= SCTP_BASE_SYSCTL(sctp_max_chunks_on_queue))) { + /* No room right now! */ + inqueue_bytes = asoc->total_output_queue_size - (asoc->chunks_on_out_queue * SCTP_DATA_CHUNK_OVERHEAD(stcb)); SOCKBUF_LOCK(&so->so_snd); - inqueue_bytes = stcb->asoc.total_output_queue_size - (stcb->asoc.chunks_on_out_queue * SCTP_DATA_CHUNK_OVERHEAD(stcb)); while ((SCTP_SB_LIMIT_SND(so) < (inqueue_bytes + local_add_more)) || - ((stcb->asoc.stream_queue_cnt + stcb->asoc.chunks_on_out_queue) >= SCTP_BASE_SYSCTL(sctp_max_chunks_on_queue))) { + ((asoc->stream_queue_cnt + asoc->chunks_on_out_queue) >= SCTP_BASE_SYSCTL(sctp_max_chunks_on_queue))) { SCTPDBG(SCTP_DEBUG_OUTPUT1,"pre_block limit:%u <(inq:%d + %zd) || (%d+%d > %d)\n", (unsigned int)SCTP_SB_LIMIT_SND(so), inqueue_bytes, local_add_more, - stcb->asoc.stream_queue_cnt, - stcb->asoc.chunks_on_out_queue, + asoc->stream_queue_cnt, + asoc->chunks_on_out_queue, SCTP_BASE_SYSCTL(sctp_max_chunks_on_queue)); if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_BLK_LOGGING_ENABLE) { sctp_log_block(SCTP_BLOCK_LOG_INTO_BLKA, asoc, sndlen); @@ -14124,31 +14032,45 @@ #if !(defined(_WIN32) && !defined(__Userspace__)) stcb->block_entry = &be; #endif + SCTP_TCB_UNLOCK(stcb); +#if defined(__FreeBSD__) && !defined(__Userspace__) + error = sbwait(so, SO_SND); +#else error = sbwait(&so->so_snd); +#endif + if (error == 0) { + if (so->so_error != 0) { + error = so->so_error; + } + if (be.error != 0) { + error = be.error; + } + } + SOCKBUF_UNLOCK(&so->so_snd); + SCTP_TCB_LOCK(stcb); stcb->block_entry = NULL; - if (error || so->so_error || be.error) { - if (error == 0) { - if (so->so_error) - error = so->so_error; - if (be.error) { - error = be.error; - } + if (error != 0) { + goto out_unlocked; + } + if ((asoc->state & SCTP_STATE_ABOUT_TO_BE_FREED) || + (asoc->state & SCTP_STATE_WAS_ABORTED)) { + if (asoc->state & SCTP_STATE_WAS_ABORTED) { + /* XXX: Could also be ECONNABORTED, not enough info. */ + error = ECONNRESET; + } else { + error = ENOTCONN; } - SOCKBUF_UNLOCK(&so->so_snd); goto out_unlocked; } if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_BLK_LOGGING_ENABLE) { sctp_log_block(SCTP_BLOCK_LOG_OUTOF_BLK, - asoc, stcb->asoc.total_output_queue_size); - } - if (stcb->asoc.state & SCTP_STATE_ABOUT_TO_BE_FREED) { - SOCKBUF_UNLOCK(&so->so_snd); - goto out_unlocked; + asoc, asoc->total_output_queue_size); } - inqueue_bytes = stcb->asoc.total_output_queue_size - (stcb->asoc.chunks_on_out_queue * SCTP_DATA_CHUNK_OVERHEAD(stcb)); + inqueue_bytes = asoc->total_output_queue_size - (asoc->chunks_on_out_queue * SCTP_DATA_CHUNK_OVERHEAD(stcb)); + SOCKBUF_LOCK(&so->so_snd); } if (SCTP_SB_LIMIT_SND(so) > inqueue_bytes) { - max_len = SCTP_SB_LIMIT_SND(so) - inqueue_bytes; + max_len = SCTP_SB_LIMIT_SND(so) - inqueue_bytes; } else { max_len = 0; } @@ -14156,49 +14078,76 @@ } skip_preblock: - if (stcb->asoc.state & SCTP_STATE_ABOUT_TO_BE_FREED) { - goto out_unlocked; - } + KASSERT(stcb != NULL, ("stcb is NULL")); + SCTP_TCB_LOCK_ASSERT(stcb); + KASSERT((asoc->state & SCTP_STATE_ABOUT_TO_BE_FREED) == 0, + ("Association about to be freed")); + KASSERT((asoc->state & SCTP_STATE_WAS_ABORTED) == 0, + ("Association was aborted")); + #if defined(__APPLE__) && !defined(__Userspace__) error = sblock(&so->so_snd, SBLOCKWAIT(flags)); + if (error != 0) { + goto out_unlocked; + } #endif /* sndlen covers for mbuf case * uio_resid covers for the non-mbuf case * NOTE: uio will be null when top/mbuf is passed */ - if (sndlen == 0) { - if (sinfo_flags & SCTP_EOF) { - got_all_of_the_send = 1; - goto dataless_eof; - } else { - SCTP_LTRACE_ERR_RET(inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, EINVAL); - error = EINVAL; - goto out; - } - } if (top == NULL) { struct sctp_stream_queue_pending *sp; struct sctp_stream_out *strm; uint32_t sndout; - SCTP_TCB_SEND_LOCK(stcb); if ((asoc->stream_locked) && - (asoc->stream_locked_on != srcv->sinfo_stream)) { - SCTP_TCB_SEND_UNLOCK(stcb); - SCTP_LTRACE_ERR_RET(inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, EINVAL); + (asoc->stream_locked_on != sinfo_stream)) { error = EINVAL; goto out; } - SCTP_TCB_SEND_UNLOCK(stcb); - - strm = &stcb->asoc.strmout[srcv->sinfo_stream]; + strm = &asoc->strmout[sinfo_stream]; if (strm->last_msg_incomplete == 0) { do_a_copy_in: - sp = sctp_copy_it_in(stcb, asoc, srcv, uio, net, max_len, user_marks_eor, &error); - if (error) { + SCTP_TCB_UNLOCK(stcb); + sp = sctp_copy_it_in(stcb, asoc, sndrcvninfo, uio, net, max_len, user_marks_eor, &error); + SCTP_TCB_LOCK(stcb); + if ((asoc->state & SCTP_STATE_ABOUT_TO_BE_FREED) || + (asoc->state & SCTP_STATE_WAS_ABORTED)) { + if (asoc->state & SCTP_STATE_WAS_ABORTED) { + /* XXX: Could also be ECONNABORTED, not enough info. */ + error = ECONNRESET; + } else { + error = ENOTCONN; + } + goto out; + } + if (error != 0) { goto out; } - SCTP_TCB_SEND_LOCK(stcb); + /* + * Reject the sending of a new user message, if the + * association is about to be shut down. + */ + if ((SCTP_GET_STATE(stcb) == SCTP_STATE_SHUTDOWN_SENT) || + (SCTP_GET_STATE(stcb) == SCTP_STATE_SHUTDOWN_RECEIVED) || + (SCTP_GET_STATE(stcb) == SCTP_STATE_SHUTDOWN_ACK_SENT) || + (asoc->state & SCTP_STATE_SHUTDOWN_PENDING)) { + if (sp->data != 0) { + sctp_m_freem(sp->data); + sp->data = NULL; + sp->tail_mbuf = NULL; + sp->length = 0; + } + if (sp->net != NULL) { + sctp_free_remote_addr(sp->net); + sp->net = NULL; + } + sctp_free_a_strmoq(stcb, sp, SCTP_SO_LOCKED); + error = EPIPE; + goto out_unlocked; + } + /* The out streams might be reallocated. */ + strm = &asoc->strmout[sinfo_stream]; if (sp->msg_is_complete) { strm->last_msg_incomplete = 0; asoc->stream_locked = 0; @@ -14207,9 +14156,9 @@ * case of an interrupt. */ strm->last_msg_incomplete = 1; - if (stcb->asoc.idata_supported == 0) { + if (asoc->idata_supported == 0) { asoc->stream_locked = 1; - asoc->stream_locked_on = srcv->sinfo_stream; + asoc->stream_locked_on = sinfo_stream; } sp->sender_all_done = 0; } @@ -14218,13 +14167,11 @@ if (sinfo_flags & SCTP_UNORDERED) { SCTP_STAT_INCR(sctps_sends_with_unord); } + sp->processing = 1; TAILQ_INSERT_TAIL(&strm->outqueue, sp, next); - stcb->asoc.ss_functions.sctp_ss_add_to_stream(stcb, asoc, strm, sp, 1); - SCTP_TCB_SEND_UNLOCK(stcb); + asoc->ss_functions.sctp_ss_add_to_stream(stcb, asoc, strm, sp); } else { - SCTP_TCB_SEND_LOCK(stcb); sp = TAILQ_LAST(&strm->outqueue, sctp_streamhead); - SCTP_TCB_SEND_UNLOCK(stcb); if (sp == NULL) { /* ???? Huh ??? last msg is gone */ #ifdef INVARIANTS @@ -14234,9 +14181,22 @@ strm->last_msg_incomplete = 0; #endif goto do_a_copy_in; - + } + if (sp->processing != 0) { + error = EINVAL; + goto out; + } else { + sp->processing = 1; } } + + KASSERT(stcb != NULL, ("stcb is NULL")); + SCTP_TCB_LOCK_ASSERT(stcb); + KASSERT((asoc->state & SCTP_STATE_ABOUT_TO_BE_FREED) == 0, + ("Association about to be freed")); + KASSERT((asoc->state & SCTP_STATE_WAS_ABORTED) == 0, + ("Association was aborted")); + #if defined(__APPLE__) && !defined(__Userspace__) #if defined(APPLE_LEOPARD) while (uio->uio_resid > 0) { @@ -14249,32 +14209,29 @@ /* How much room do we have? */ struct mbuf *new_tail, *mm; - inqueue_bytes = stcb->asoc.total_output_queue_size - (stcb->asoc.chunks_on_out_queue * SCTP_DATA_CHUNK_OVERHEAD(stcb)); - if (SCTP_SB_LIMIT_SND(so) > inqueue_bytes) + inqueue_bytes = asoc->total_output_queue_size - (asoc->chunks_on_out_queue * SCTP_DATA_CHUNK_OVERHEAD(stcb)); + if (SCTP_SB_LIMIT_SND(so) > inqueue_bytes) { max_len = SCTP_SB_LIMIT_SND(so) - inqueue_bytes; - else + } else { max_len = 0; - + } if ((max_len > (ssize_t)SCTP_BASE_SYSCTL(sctp_add_more_threshold)) || - (max_len && (SCTP_SB_LIMIT_SND(so) < SCTP_BASE_SYSCTL(sctp_add_more_threshold))) || + ((max_len > 0 ) && (SCTP_SB_LIMIT_SND(so) < SCTP_BASE_SYSCTL(sctp_add_more_threshold))) || #if defined(__APPLE__) && !defined(__Userspace__) #if defined(APPLE_LEOPARD) - (uio->uio_resid && (uio->uio_resid <= max_len))) { + (uio->uio_resid <= max_len)) { #else - (uio_resid(uio) && (uio_resid(uio) <= max_len))) { + (uio_resid(uio) <= max_len)) { #endif #else - (uio->uio_resid && (uio->uio_resid <= max_len))) { + (uio->uio_resid <= max_len)) { #endif - sndout = 0; - new_tail = NULL; - if (hold_tcblock) { - SCTP_TCB_UNLOCK(stcb); - hold_tcblock = 0; - } + SCTP_TCB_UNLOCK(stcb); #if defined(__APPLE__) && !defined(__Userspace__) SCTP_SOCKET_UNLOCK(so, 0); #endif + sndout = 0; + new_tail = NULL; #if defined(__FreeBSD__) || defined(__Userspace__) mm = sctp_copy_resume(uio, (int)max_len, user_marks_eor, &error, &sndout, &new_tail); #else @@ -14283,38 +14240,41 @@ #if defined(__APPLE__) && !defined(__Userspace__) SCTP_SOCKET_LOCK(so, 0); #endif - if ((mm == NULL) || error) { - if (mm) { - sctp_m_freem(mm); - } - goto out; - } - /* Update the mbuf and count */ - SCTP_TCB_SEND_LOCK(stcb); - if (stcb->asoc.state & SCTP_STATE_ABOUT_TO_BE_FREED) { - /* we need to get out. + SCTP_TCB_LOCK(stcb); + if ((asoc->state & SCTP_STATE_ABOUT_TO_BE_FREED) || + (asoc->state & SCTP_STATE_WAS_ABORTED)) { + /* We need to get out. * Peer probably aborted. */ sctp_m_freem(mm); - if (stcb->asoc.state & SCTP_PCB_FLAGS_WAS_ABORTED) { - SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTP_OUTPUT, ECONNRESET); + if (asoc->state & SCTP_STATE_WAS_ABORTED) { + /* XXX: Could also be ECONNABORTED, not enough info. */ error = ECONNRESET; + } else { + error = ENOTCONN; + } + goto out; + } + if ((mm == NULL) || (error != 0)) { + if (mm != NULL) { + sctp_m_freem(mm); + } + if (sp != NULL) { + sp->processing = 0; } - SCTP_TCB_SEND_UNLOCK(stcb); goto out; } - if (sp->tail_mbuf) { - /* tack it to the end */ + /* Update the mbuf and count */ + if (sp->tail_mbuf != NULL) { + /* Tack it to the end. */ SCTP_BUF_NEXT(sp->tail_mbuf) = mm; - sp->tail_mbuf = new_tail; } else { - /* A stolen mbuf */ + /* A stolen mbuf. */ sp->data = mm; - sp->tail_mbuf = new_tail; } + sp->tail_mbuf = new_tail; sctp_snd_sb_alloc(stcb, sndout); atomic_add_int(&sp->length, sndout); - len += sndout; if (sinfo_flags & SCTP_SACK_IMMEDIATELY) { sp->sinfo_flags |= SCTP_SACK_IMMEDIATELY; } @@ -14336,8 +14296,15 @@ } else { sp->msg_is_complete = 0; } - SCTP_TCB_SEND_UNLOCK(stcb); } + + KASSERT(stcb != NULL, ("stcb is NULL")); + SCTP_TCB_LOCK_ASSERT(stcb); + KASSERT((asoc->state & SCTP_STATE_ABOUT_TO_BE_FREED) == 0, + ("Association about to be freed")); + KASSERT((asoc->state & SCTP_STATE_WAS_ABORTED) == 0, + ("Association was aborted")); + #if defined(__APPLE__) && !defined(__Userspace__) #if defined(APPLE_LEOPARD) if (uio->uio_resid == 0) { @@ -14353,12 +14320,8 @@ /* PR-SCTP? */ if ((asoc->prsctp_supported) && (asoc->sent_queue_cnt_removeable > 0)) { /* This is ugly but we must assure locking order */ - if (hold_tcblock == 0) { - SCTP_TCB_LOCK(stcb); - hold_tcblock = 1; - } - sctp_prune_prsctp(stcb, asoc, srcv, (int)sndlen); - inqueue_bytes = stcb->asoc.total_output_queue_size - (stcb->asoc.chunks_on_out_queue * SCTP_DATA_CHUNK_OVERHEAD(stcb)); + sctp_prune_prsctp(stcb, asoc, sndrcvninfo, (int)sndlen); + inqueue_bytes = asoc->total_output_queue_size - (asoc->chunks_on_out_queue * SCTP_DATA_CHUNK_OVERHEAD(stcb)); if (SCTP_SB_LIMIT_SND(so) > inqueue_bytes) max_len = SCTP_SB_LIMIT_SND(so) - inqueue_bytes; else @@ -14366,20 +14329,17 @@ if (max_len > 0) { continue; } - SCTP_TCB_UNLOCK(stcb); - hold_tcblock = 0; } /* wait for space now */ if (non_blocking) { /* Non-blocking io in place out */ + if (sp != NULL) { + sp->processing = 0; + } goto skip_out_eof; } /* What about the INIT, send it maybe */ if (queue_only_for_init) { - if (hold_tcblock == 0) { - SCTP_TCB_LOCK(stcb); - hold_tcblock = 1; - } if (SCTP_GET_STATE(stcb) == SCTP_STATE_OPEN) { /* a collision took us forward? */ queue_only = 0; @@ -14406,12 +14366,11 @@ } asoc->ifp_had_enobuf = 0; } - un_sent = stcb->asoc.total_output_queue_size - stcb->asoc.total_flight; + un_sent = asoc->total_output_queue_size - asoc->total_flight; if ((sctp_is_feature_off(inp, SCTP_PCB_FLAGS_NODELAY)) && - (stcb->asoc.total_flight > 0) && - (stcb->asoc.stream_queue_cnt < SCTP_MAX_DATA_BUNDLING) && - (un_sent < (int)(stcb->asoc.smallest_mtu - SCTP_MIN_OVERHEAD))) { - + (asoc->total_flight > 0) && + (asoc->stream_queue_cnt < SCTP_MAX_DATA_BUNDLING) && + (un_sent < (int)(asoc->smallest_mtu - SCTP_MIN_OVERHEAD))) { /*- * Ok, Nagle is set on and we have data outstanding. * Don't send anything and let SACKs drive out the @@ -14431,15 +14390,15 @@ nagle_applies = 0; } if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_BLK_LOGGING_ENABLE) { - sctp_misc_ints(SCTP_CWNDLOG_PRESEND, queue_only_for_init, queue_only, - nagle_applies, un_sent); - sctp_misc_ints(SCTP_CWNDLOG_PRESEND, stcb->asoc.total_output_queue_size, - stcb->asoc.total_flight, - stcb->asoc.chunks_on_out_queue, stcb->asoc.total_flight_count); + nagle_applies, un_sent); + sctp_misc_ints(SCTP_CWNDLOG_PRESEND, asoc->total_output_queue_size, + asoc->total_flight, + asoc->chunks_on_out_queue, asoc->total_flight_count); } - if (queue_only_for_init) + if (queue_only_for_init) { queue_only_for_init = 0; + } if ((queue_only == 0) && (nagle_applies == 0)) { /*- * need to start chunk output @@ -14451,27 +14410,12 @@ #if defined(__FreeBSD__) && !defined(__Userspace__) NET_EPOCH_ENTER(et); #endif - if (hold_tcblock == 0) { - if (SCTP_TCB_TRYLOCK(stcb)) { - hold_tcblock = 1; - sctp_chunk_output(inp, - stcb, - SCTP_OUTPUT_FROM_USR_SEND, SCTP_SO_LOCKED); - } - } else { - sctp_chunk_output(inp, - stcb, - SCTP_OUTPUT_FROM_USR_SEND, SCTP_SO_LOCKED); - } + sctp_chunk_output(inp, stcb, + SCTP_OUTPUT_FROM_USR_SEND, SCTP_SO_LOCKED); #if defined(__FreeBSD__) && !defined(__Userspace__) NET_EPOCH_EXIT(et); #endif } - if (hold_tcblock == 1) { - SCTP_TCB_UNLOCK(stcb); - hold_tcblock = 0; - } - SOCKBUF_LOCK(&so->so_snd); /*- * This is a bit strange, but I think it will * work. The total_output_queue_size is locked and @@ -14486,81 +14430,105 @@ * size we KNOW we will get to sleep safely with the * wakeup flag in place. */ - inqueue_bytes = stcb->asoc.total_output_queue_size - (stcb->asoc.chunks_on_out_queue * SCTP_DATA_CHUNK_OVERHEAD(stcb)); + inqueue_bytes = asoc->total_output_queue_size - (asoc->chunks_on_out_queue * SCTP_DATA_CHUNK_OVERHEAD(stcb)); + SOCKBUF_LOCK(&so->so_snd); if (SCTP_SB_LIMIT_SND(so) <= (inqueue_bytes + - min(SCTP_BASE_SYSCTL(sctp_add_more_threshold), SCTP_SB_LIMIT_SND(so)))) { + min(SCTP_BASE_SYSCTL(sctp_add_more_threshold), SCTP_SB_LIMIT_SND(so)))) { if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_BLK_LOGGING_ENABLE) { #if defined(__APPLE__) && !defined(__Userspace__) #if defined(APPLE_LEOPARD) sctp_log_block(SCTP_BLOCK_LOG_INTO_BLK, - asoc, uio->uio_resid); + asoc, uio->uio_resid); #else sctp_log_block(SCTP_BLOCK_LOG_INTO_BLK, - asoc, uio_resid(uio)); + asoc, uio_resid(uio)); #endif #else sctp_log_block(SCTP_BLOCK_LOG_INTO_BLK, - asoc, uio->uio_resid); + asoc, uio->uio_resid); #endif } be.error = 0; #if !(defined(_WIN32) && !defined(__Userspace__)) stcb->block_entry = &be; #endif + SCTP_TCB_UNLOCK(stcb); #if defined(__APPLE__) && !defined(__Userspace__) sbunlock(&so->so_snd, 1); #endif +#if defined(__FreeBSD__) && !defined(__Userspace__) + error = sbwait(so, SO_SND); +#else error = sbwait(&so->so_snd); +#endif + if (error == 0) { + if (so->so_error != 0) + error = so->so_error; + if (be.error != 0) { + error = be.error; + } + } + SOCKBUF_UNLOCK(&so->so_snd); + SCTP_TCB_LOCK(stcb); stcb->block_entry = NULL; - - if (error || so->so_error || be.error) { - if (error == 0) { - if (so->so_error) - error = so->so_error; - if (be.error) { - error = be.error; - } + if ((asoc->state & SCTP_STATE_ABOUT_TO_BE_FREED) || + (asoc->state & SCTP_STATE_WAS_ABORTED)) { + if (asoc->state & SCTP_STATE_WAS_ABORTED) { + /* XXX: Could also be ECONNABORTED, not enough info. */ + error = ECONNRESET; + } else { + error = ENOTCONN; + } + goto out_unlocked; + } + if (error != 0) { + if (sp != NULL) { + sp->processing = 0; } - SOCKBUF_UNLOCK(&so->so_snd); goto out_unlocked; } - #if defined(__APPLE__) && !defined(__Userspace__) error = sblock(&so->so_snd, SBLOCKWAIT(flags)); -#endif - if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_BLK_LOGGING_ENABLE) { - sctp_log_block(SCTP_BLOCK_LOG_OUTOF_BLK, - asoc, stcb->asoc.total_output_queue_size); + if (error != 0) { + goto out_unlocked; } +#endif + } else { + SOCKBUF_UNLOCK(&so->so_snd); } - SOCKBUF_UNLOCK(&so->so_snd); - if (stcb->asoc.state & SCTP_STATE_ABOUT_TO_BE_FREED) { - goto out_unlocked; + if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_BLK_LOGGING_ENABLE) { + sctp_log_block(SCTP_BLOCK_LOG_OUTOF_BLK, + asoc, asoc->total_output_queue_size); } } - SCTP_TCB_SEND_LOCK(stcb); - if (stcb->asoc.state & SCTP_STATE_ABOUT_TO_BE_FREED) { - SCTP_TCB_SEND_UNLOCK(stcb); - goto out_unlocked; - } - if (sp) { + + KASSERT(stcb != NULL, ("stcb is NULL")); + SCTP_TCB_LOCK_ASSERT(stcb); + KASSERT((asoc->state & SCTP_STATE_ABOUT_TO_BE_FREED) == 0, + ("Association about to be freed")); + KASSERT((asoc->state & SCTP_STATE_WAS_ABORTED) == 0, + ("Association was aborted")); + + /* The out streams might be reallocated. */ + strm = &asoc->strmout[sinfo_stream]; + if (sp != NULL) { if (sp->msg_is_complete == 0) { strm->last_msg_incomplete = 1; - if (stcb->asoc.idata_supported == 0) { + if (asoc->idata_supported == 0) { asoc->stream_locked = 1; - asoc->stream_locked_on = srcv->sinfo_stream; + asoc->stream_locked_on = sinfo_stream; } } else { sp->sender_all_done = 1; strm->last_msg_incomplete = 0; asoc->stream_locked = 0; } + sp->processing = 0; } else { SCTP_PRINTF("Huh no sp TSNH?\n"); strm->last_msg_incomplete = 0; asoc->stream_locked = 0; } - SCTP_TCB_SEND_UNLOCK(stcb); #if defined(__APPLE__) && !defined(__Userspace__) #if defined(APPLE_LEOPARD) if (uio->uio_resid == 0) { @@ -14570,29 +14538,31 @@ #else if (uio->uio_resid == 0) { #endif - got_all_of_the_send = 1; + got_all_of_the_send = true; } } else { - /* We send in a 0, since we do NOT have any locks */ - error = sctp_msg_append(stcb, net, top, srcv, 0); + error = sctp_msg_append(stcb, net, top, sndrcvninfo); top = NULL; - if (sinfo_flags & SCTP_EOF) { - got_all_of_the_send = 1; + if ((sinfo_flags & SCTP_EOF) != 0) { + got_all_of_the_send = true; } } - if (error) { + if (error != 0) { goto out; } + dataless_eof: + KASSERT(stcb != NULL, ("stcb is NULL")); + SCTP_TCB_LOCK_ASSERT(stcb); + KASSERT((asoc->state & SCTP_STATE_ABOUT_TO_BE_FREED) == 0, + ("Association about to be freed")); + KASSERT((asoc->state & SCTP_STATE_WAS_ABORTED) == 0, + ("Association was aborted")); + /* EOF thing ? */ - if ((sinfo_flags & SCTP_EOF) && - (got_all_of_the_send == 1)) { + if ((sinfo_flags & SCTP_EOF) && got_all_of_the_send) { SCTP_STAT_INCR(sctps_sends_with_eof); error = 0; - if (hold_tcblock == 0) { - SCTP_TCB_LOCK(stcb); - hold_tcblock = 1; - } if (TAILQ_EMPTY(&asoc->send_queue) && TAILQ_EMPTY(&asoc->sent_queue) && sctp_is_there_unsent_data(stcb, SCTP_SO_LOCKED) == 0) { @@ -14611,10 +14581,10 @@ } SCTP_SET_STATE(stcb, SCTP_STATE_SHUTDOWN_SENT); sctp_stop_timers_for_shutdown(stcb); - if (stcb->asoc.alternate) { - netp = stcb->asoc.alternate; + if (asoc->alternate != NULL) { + netp = asoc->alternate; } else { - netp = stcb->asoc.primary_destination; + netp = asoc->primary_destination; } sctp_send_shutdown(stcb, netp); sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWN, stcb->sctp_ep, stcb, @@ -14636,10 +14606,6 @@ if ((SCTP_GET_STATE(stcb) != SCTP_STATE_SHUTDOWN_SENT) && (SCTP_GET_STATE(stcb) != SCTP_STATE_SHUTDOWN_RECEIVED) && (SCTP_GET_STATE(stcb) != SCTP_STATE_SHUTDOWN_ACK_SENT)) { - if (hold_tcblock == 0) { - SCTP_TCB_LOCK(stcb); - hold_tcblock = 1; - } if ((*asoc->ss_functions.sctp_ss_is_user_msgs_incomplete)(stcb, asoc)) { SCTP_ADD_SUBSTATE(stcb, SCTP_STATE_PARTIAL_MSG_LEFT); } @@ -14652,8 +14618,8 @@ abort_anyway: if (free_cnt_applied) { - atomic_add_int(&stcb->asoc.refcnt, -1); - free_cnt_applied = 0; + atomic_subtract_int(&asoc->refcnt, 1); + free_cnt_applied = false; } SCTP_SNPRINTF(msg, sizeof(msg), "%s:%d at %s", __FILE__, __LINE__, __func__); @@ -14663,13 +14629,12 @@ NET_EPOCH_ENTER(et); #endif sctp_abort_an_association(stcb->sctp_ep, stcb, - op_err, SCTP_SO_LOCKED); + op_err, false, SCTP_SO_LOCKED); #if defined(__FreeBSD__) && !defined(__Userspace__) NET_EPOCH_EXIT(et); #endif - /* now relock the stcb so everything is sane */ - hold_tcblock = 0; stcb = NULL; + error = ECONNABORTED; goto out; } sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWNGUARD, stcb->sctp_ep, stcb, @@ -14678,15 +14643,17 @@ } } } + skip_out_eof: - if (!TAILQ_EMPTY(&stcb->asoc.control_send_queue)) { - some_on_control = 1; - } + KASSERT(stcb != NULL, ("stcb is NULL")); + SCTP_TCB_LOCK_ASSERT(stcb); + KASSERT((asoc->state & SCTP_STATE_ABOUT_TO_BE_FREED) == 0, + ("Association about to be freed")); + KASSERT((asoc->state & SCTP_STATE_WAS_ABORTED) == 0, + ("Association was aborted")); + + some_on_control = !TAILQ_EMPTY(&asoc->control_send_queue); if (queue_only_for_init) { - if (hold_tcblock == 0) { - SCTP_TCB_LOCK(stcb); - hold_tcblock = 1; - } if (SCTP_GET_STATE(stcb) == SCTP_STATE_OPEN) { /* a collision took us forward? */ queue_only = 0; @@ -14702,8 +14669,16 @@ queue_only = 1; } } + + KASSERT(stcb != NULL, ("stcb is NULL")); + SCTP_TCB_LOCK_ASSERT(stcb); + KASSERT((asoc->state & SCTP_STATE_ABOUT_TO_BE_FREED) == 0, + ("Association about to be freed")); + KASSERT((asoc->state & SCTP_STATE_WAS_ABORTED) == 0, + ("Association was aborted")); + if ((net->flight_size > net->cwnd) && - (stcb->asoc.sctp_cmt_on_off == 0)) { + (asoc->sctp_cmt_on_off == 0)) { SCTP_STAT_INCR(sctps_send_cwnd_avoid); queue_only = 1; } else if (asoc->ifp_had_enobuf) { @@ -14713,11 +14688,11 @@ } asoc->ifp_had_enobuf = 0; } - un_sent = stcb->asoc.total_output_queue_size - stcb->asoc.total_flight; + un_sent = asoc->total_output_queue_size - asoc->total_flight; if ((sctp_is_feature_off(inp, SCTP_PCB_FLAGS_NODELAY)) && - (stcb->asoc.total_flight > 0) && - (stcb->asoc.stream_queue_cnt < SCTP_MAX_DATA_BUNDLING) && - (un_sent < (int)(stcb->asoc.smallest_mtu - SCTP_MIN_OVERHEAD))) { + (asoc->total_flight > 0) && + (asoc->stream_queue_cnt < SCTP_MAX_DATA_BUNDLING) && + (un_sent < (int)(asoc->smallest_mtu - SCTP_MIN_OVERHEAD))) { /*- * Ok, Nagle is set on and we have data outstanding. * Don't send anything and let SACKs drive out the @@ -14739,93 +14714,79 @@ if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_BLK_LOGGING_ENABLE) { sctp_misc_ints(SCTP_CWNDLOG_PRESEND, queue_only_for_init, queue_only, nagle_applies, un_sent); - sctp_misc_ints(SCTP_CWNDLOG_PRESEND, stcb->asoc.total_output_queue_size, - stcb->asoc.total_flight, - stcb->asoc.chunks_on_out_queue, stcb->asoc.total_flight_count); + sctp_misc_ints(SCTP_CWNDLOG_PRESEND, asoc->total_output_queue_size, + asoc->total_flight, + asoc->chunks_on_out_queue, asoc->total_flight_count); } + + KASSERT(stcb != NULL, ("stcb is NULL")); + SCTP_TCB_LOCK_ASSERT(stcb); + KASSERT((asoc->state & SCTP_STATE_ABOUT_TO_BE_FREED) == 0, + ("Association about to be freed")); + KASSERT((asoc->state & SCTP_STATE_WAS_ABORTED) == 0, + ("Association was aborted")); + #if defined(__FreeBSD__) && !defined(__Userspace__) NET_EPOCH_ENTER(et); #endif - if ((queue_only == 0) && (nagle_applies == 0) && (stcb->asoc.peers_rwnd && un_sent)) { - /* we can attempt to send too. */ - if (hold_tcblock == 0) { - /* If there is activity recv'ing sacks no need to send */ - if (SCTP_TCB_TRYLOCK(stcb)) { - sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_USR_SEND, SCTP_SO_LOCKED); - hold_tcblock = 1; - } - } else { - sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_USR_SEND, SCTP_SO_LOCKED); - } + if ((queue_only == 0) && (nagle_applies == 0) && (asoc->peers_rwnd && un_sent)) { + sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_USR_SEND, SCTP_SO_LOCKED); } else if ((queue_only == 0) && - (stcb->asoc.peers_rwnd == 0) && - (stcb->asoc.total_flight == 0)) { + (asoc->peers_rwnd == 0) && + (asoc->total_flight == 0)) { /* We get to have a probe outstanding */ - if (hold_tcblock == 0) { - hold_tcblock = 1; - SCTP_TCB_LOCK(stcb); - } sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_USR_SEND, SCTP_SO_LOCKED); } else if (some_on_control) { - int num_out, reason, frag_point; + int num_out, reason; /* Here we do control only */ - if (hold_tcblock == 0) { - hold_tcblock = 1; - SCTP_TCB_LOCK(stcb); - } - frag_point = sctp_get_frag_point(stcb, &stcb->asoc); - (void)sctp_med_chunk_output(inp, stcb, &stcb->asoc, &num_out, - &reason, 1, 1, &now, &now_filled, frag_point, SCTP_SO_LOCKED); + (void)sctp_med_chunk_output(inp, stcb, asoc, &num_out, + &reason, 1, 1, &now, &now_filled, + sctp_get_frag_point(stcb), + SCTP_SO_LOCKED); } #if defined(__FreeBSD__) && !defined(__Userspace__) NET_EPOCH_EXIT(et); #endif SCTPDBG(SCTP_DEBUG_OUTPUT1, "USR Send complete qo:%d prw:%d unsent:%d tf:%d cooq:%d toqs:%d err:%d\n", - queue_only, stcb->asoc.peers_rwnd, un_sent, - stcb->asoc.total_flight, stcb->asoc.chunks_on_out_queue, - stcb->asoc.total_output_queue_size, error); + queue_only, asoc->peers_rwnd, un_sent, + asoc->total_flight, asoc->chunks_on_out_queue, + asoc->total_output_queue_size, error); + + KASSERT(stcb != NULL, ("stcb is NULL")); + SCTP_TCB_LOCK_ASSERT(stcb); + KASSERT((asoc->state & SCTP_STATE_ABOUT_TO_BE_FREED) == 0, + ("Association about to be freed")); + KASSERT((asoc->state & SCTP_STATE_WAS_ABORTED) == 0, + ("Association was aborted")); out: #if defined(__APPLE__) && !defined(__Userspace__) sbunlock(&so->so_snd, 1); #endif out_unlocked: - - if (local_soresv && stcb) { - atomic_subtract_int(&stcb->asoc.sb_send_resv, sndlen); - } if (create_lock_applied) { SCTP_ASOC_CREATE_UNLOCK(inp); } - if ((stcb) && hold_tcblock) { - SCTP_TCB_UNLOCK(stcb); - } - if (stcb && free_cnt_applied) { - atomic_add_int(&stcb->asoc.refcnt, -1); - } -#ifdef INVARIANTS -#if defined(__FreeBSD__) && !defined(__Userspace__) - if (stcb) { - if (mtx_owned(&stcb->tcb_mtx)) { - panic("Leaving with tcb mtx owned?"); + if (stcb != NULL) { + if (local_soresv) { + atomic_subtract_int(&asoc->sb_send_resv, (int)sndlen); } - if (mtx_owned(&stcb->tcb_send_mtx)) { - panic("Leaving with tcb send mtx owned?"); + if (free_cnt_applied) { + atomic_subtract_int(&asoc->refcnt, 1); } + SCTP_TCB_UNLOCK(stcb); } -#endif -#endif - if (top) { + if (top != NULL) { sctp_m_freem(top); } - if (control) { + if (control != NULL) { sctp_m_freem(control); } + SCTP_LTRACE_ERR_RET(inp, stcb, net, SCTP_FROM_SCTP_OUTPUT, error); return (error); } - /* * generate an AUTHentication chunk, if required */ diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_output.h firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_output.h --- firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_output.h 2022-12-05 23:01:12.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_output.h 2023-01-09 15:01:10.000000000 +0000 @@ -34,7 +34,7 @@ #if defined(__FreeBSD__) && !defined(__Userspace__) #include -__FBSDID("$FreeBSD: head/sys/netinet/sctp_output.h 362054 2020-06-11 13:34:09Z tuexen $"); +__FBSDID("$FreeBSD$"); #endif #ifndef _NETINET_SCTP_OUTPUT_H_ @@ -44,38 +44,34 @@ #if defined(_KERNEL) || defined(__Userspace__) - struct mbuf * sctp_add_addresses_to_i_ia(struct sctp_inpcb *inp, struct sctp_tcb *stcb, - struct sctp_scoping *scope, - struct mbuf *m_at, - int cnt_inits_to, - uint16_t *padding_len, uint16_t *chunk_len); - + struct sctp_scoping *scope, + struct mbuf *m_at, + int cnt_inits_to, + uint16_t *padding_len, uint16_t *chunk_len); int sctp_is_addr_restricted(struct sctp_tcb *, struct sctp_ifa *); - int sctp_is_address_in_scope(struct sctp_ifa *ifa, struct sctp_scoping *scope, - int do_update); + int do_update); int sctp_is_addr_in_ep(struct sctp_inpcb *inp, struct sctp_ifa *ifa); struct sctp_ifa * sctp_source_address_selection(struct sctp_inpcb *inp, - struct sctp_tcb *stcb, - sctp_route_t *ro, struct sctp_nets *net, - int non_asoc_addr_ok, uint32_t vrf_id); + struct sctp_tcb *stcb, + sctp_route_t *ro, struct sctp_nets *net, + int non_asoc_addr_ok, uint32_t vrf_id); #if defined(__FreeBSD__) || defined(__APPLE__) || defined(__Userspace__) -int -sctp_v6src_match_nexthop(struct sockaddr_in6 *src6, sctp_route_t *ro); -int -sctp_v4src_match_nexthop(struct sctp_ifa *sifa, sctp_route_t *ro); +int sctp_v6src_match_nexthop(struct sockaddr_in6 *src6, sctp_route_t *ro); + +int sctp_v4src_match_nexthop(struct sctp_ifa *sifa, sctp_route_t *ro); #endif void sctp_send_initiate(struct sctp_inpcb *, struct sctp_tcb *, int); @@ -93,24 +89,23 @@ struct mbuf * sctp_arethere_unrecognized_parameters(struct mbuf *, int, int *, - struct sctp_chunkhdr *, int *, int *); + struct sctp_chunkhdr *, int *, int *); void sctp_queue_op_err(struct sctp_tcb *, struct mbuf *); int sctp_send_cookie_echo(struct mbuf *, int, int, struct sctp_tcb *, - struct sctp_nets *); + struct sctp_nets *); void sctp_send_cookie_ack(struct sctp_tcb *); void sctp_send_heartbeat_ack(struct sctp_tcb *, struct mbuf *, int, int, - struct sctp_nets *); + struct sctp_nets *); void sctp_remove_from_wheel(struct sctp_tcb *stcb, - struct sctp_association *asoc, - struct sctp_stream_out *strq, int holds_lock); - + struct sctp_association *asoc, + struct sctp_stream_out *strq, int holds_lock); void sctp_send_shutdown(struct sctp_tcb *, struct sctp_nets *); @@ -129,7 +124,7 @@ void sctp_send_asconf_ack(struct sctp_tcb *); -int sctp_get_frag_point(struct sctp_tcb *, struct sctp_association *); +uint32_t sctp_get_frag_point(struct sctp_tcb *); void sctp_toss_old_cookies(struct sctp_tcb *, struct sctp_association *); @@ -139,10 +134,9 @@ void sctp_move_chunks_from_net(struct sctp_tcb *stcb, struct sctp_nets *net); - #define SCTP_DATA_CHUNK_OVERHEAD(stcb) ((stcb)->asoc.idata_supported ? \ - sizeof(struct sctp_idata_chunk) : \ - sizeof(struct sctp_data_chunk)) + sizeof(struct sctp_idata_chunk) : \ + sizeof(struct sctp_data_chunk)) #if defined(__FreeBSD__) && !defined(__Userspace__) int @@ -179,18 +173,15 @@ sctp_send_packet_dropped(struct sctp_tcb *, struct sctp_nets *, struct mbuf *, int, int, int); - - void sctp_send_cwr(struct sctp_tcb *, struct sctp_nets *, uint32_t, uint8_t); - void sctp_add_stream_reset_result(struct sctp_tmit_chunk *, uint32_t, uint32_t); void sctp_send_deferred_reset_response(struct sctp_tcb *, - struct sctp_stream_reset_list *, - int); + struct sctp_stream_reset_list *, + int); void sctp_add_stream_reset_result_tsn(struct sctp_tmit_chunk *, @@ -210,12 +201,13 @@ #endif uint32_t, uint16_t); -void sctp_send_operr_to(struct sockaddr *, struct sockaddr *, - struct sctphdr *, uint32_t, struct mbuf *, +void +sctp_send_operr_to(struct sockaddr *, struct sockaddr *, + struct sctphdr *, uint32_t, struct mbuf *, #if defined(__FreeBSD__) && !defined(__Userspace__) - uint8_t, uint32_t, uint16_t, + uint8_t, uint32_t, uint16_t, #endif - uint32_t, uint16_t); + uint32_t, uint16_t); #endif /* _KERNEL || __Userspace__ */ diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_pcb.c firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_pcb.c --- firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_pcb.c 2022-12-05 23:01:11.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_pcb.c 2023-01-09 15:01:10.000000000 +0000 @@ -34,7 +34,7 @@ #if defined(__FreeBSD__) && !defined(__Userspace__) #include -__FBSDID("$FreeBSD: head/sys/netinet/sctp_pcb.c 362497 2020-06-22 14:01:31Z markj $"); +__FBSDID("$FreeBSD$"); #endif #include @@ -250,7 +250,6 @@ return (vrf); } - struct sctp_ifn * sctp_find_ifn(void *ifn, uint32_t ifn_index) { @@ -260,6 +259,7 @@ /* We assume the lock is held for the addresses * if that's wrong problems could occur :-) */ + SCTP_IPI_ADDR_LOCK_ASSERT(); hash_ifn_head = &SCTP_BASE_INFO(vrf_ifn_hash)[(ifn_index & SCTP_BASE_INFO(vrf_ifn_hashmark))]; LIST_FOREACH(sctp_ifnp, hash_ifn_head, next_bucket) { if (sctp_ifnp->ifn_index == ifn_index) { @@ -272,7 +272,6 @@ return (NULL); } - struct sctp_vrf * sctp_find_vrf(uint32_t vrf_id) { @@ -288,7 +287,6 @@ return (NULL); } - void sctp_free_vrf(struct sctp_vrf *vrf) { @@ -304,7 +302,6 @@ } } - void sctp_free_ifn(struct sctp_ifn *sctp_ifnp) { @@ -318,7 +315,6 @@ } } - void sctp_update_ifn_mtu(uint32_t ifn_index, uint32_t mtu) { @@ -330,7 +326,6 @@ } } - void sctp_free_ifa(struct sctp_ifa *sctp_ifap) { @@ -344,7 +339,6 @@ } } - static void sctp_delete_ifn(struct sctp_ifn *sctp_ifnp, int hold_addr_lock) { @@ -355,17 +349,20 @@ /* Not in the list.. sorry */ return; } - if (hold_addr_lock == 0) + if (hold_addr_lock == 0) { SCTP_IPI_ADDR_WLOCK(); + } else { + SCTP_IPI_ADDR_WLOCK_ASSERT(); + } LIST_REMOVE(sctp_ifnp, next_bucket); LIST_REMOVE(sctp_ifnp, next_ifn); - if (hold_addr_lock == 0) + if (hold_addr_lock == 0) { SCTP_IPI_ADDR_WUNLOCK(); + } /* Take away the reference, and possibly free it */ sctp_free_ifn(sctp_ifnp); } - void sctp_mark_ifa_addr_down(uint32_t vrf_id, struct sockaddr *addr, const char *if_name, uint32_t ifn_index) @@ -378,7 +375,6 @@ if (vrf == NULL) { SCTPDBG(SCTP_DEBUG_PCB4, "Can't find vrf_id 0x%x\n", vrf_id); goto out; - } sctp_ifap = sctp_find_ifa_by_addr(addr, vrf->vrf_id, SCTP_ADDR_LOCKED); if (sctp_ifap == NULL) { @@ -409,7 +405,6 @@ SCTP_IPI_ADDR_RUNLOCK(); } - void sctp_mark_ifa_addr_up(uint32_t vrf_id, struct sockaddr *addr, const char *if_name, uint32_t ifn_index) @@ -422,7 +417,6 @@ if (vrf == NULL) { SCTPDBG(SCTP_DEBUG_PCB4, "Can't find vrf_id 0x%x\n", vrf_id); goto out; - } sctp_ifap = sctp_find_ifa_by_addr(addr, vrf->vrf_id, SCTP_ADDR_LOCKED); if (sctp_ifap == NULL) { @@ -453,7 +447,6 @@ SCTP_IPI_ADDR_RUNLOCK(); } - /*- * Add an ifa to an ifn. * Register the interface as necessary. @@ -490,7 +483,6 @@ } } - /*- * Remove an ifa from its ifn. * If no more addresses exist, remove the ifn too. Otherwise, re-register @@ -538,7 +530,6 @@ } } - struct sctp_ifa * sctp_add_addr_to_vrf(uint32_t vrf_id, void *ifn, uint32_t ifn_index, uint32_t ifn_type, const char *if_name, void *ifa, @@ -546,8 +537,8 @@ int dynamic_add) { struct sctp_vrf *vrf; - struct sctp_ifn *sctp_ifnp = NULL; - struct sctp_ifa *sctp_ifap = NULL; + struct sctp_ifn *sctp_ifnp, *new_sctp_ifnp; + struct sctp_ifa *sctp_ifap, *new_sctp_ifap; struct sctp_ifalist *hash_addr_head; struct sctp_ifnlist *hash_ifn_head; uint32_t hash_of_addr; @@ -557,6 +548,23 @@ SCTPDBG(SCTP_DEBUG_PCB4, "vrf_id 0x%x: adding address: ", vrf_id); SCTPDBG_ADDR(SCTP_DEBUG_PCB4, addr); #endif + SCTP_MALLOC(new_sctp_ifnp, struct sctp_ifn *, + sizeof(struct sctp_ifn), SCTP_M_IFN); + if (new_sctp_ifnp == NULL) { +#ifdef INVARIANTS + panic("No memory for IFN"); +#endif + return (NULL); + } + SCTP_MALLOC(new_sctp_ifap, struct sctp_ifa *, sizeof(struct sctp_ifa), SCTP_M_IFA); + if (new_sctp_ifap == NULL) { +#ifdef INVARIANTS + panic("No memory for IFA"); +#endif + SCTP_FREE(new_sctp_ifnp, SCTP_M_IFN); + return (NULL); + } + SCTP_IPI_ADDR_WLOCK(); sctp_ifnp = sctp_find_ifn(ifn, ifn_index); if (sctp_ifnp) { @@ -567,6 +575,8 @@ vrf = sctp_allocate_vrf(vrf_id); if (vrf == NULL) { SCTP_IPI_ADDR_WUNLOCK(); + SCTP_FREE(new_sctp_ifnp, SCTP_M_IFN); + SCTP_FREE(new_sctp_ifap, SCTP_M_IFA); return (NULL); } } @@ -575,15 +585,8 @@ /* build one and add it, can't hold lock * until after malloc done though. */ - SCTP_IPI_ADDR_WUNLOCK(); - SCTP_MALLOC(sctp_ifnp, struct sctp_ifn *, - sizeof(struct sctp_ifn), SCTP_M_IFN); - if (sctp_ifnp == NULL) { -#ifdef INVARIANTS - panic("No memory for IFN"); -#endif - return (NULL); - } + sctp_ifnp = new_sctp_ifnp; + new_sctp_ifnp = NULL; memset(sctp_ifnp, 0, sizeof(struct sctp_ifn)); sctp_ifnp->ifn_index = ifn_index; sctp_ifnp->ifn_p = ifn; @@ -591,7 +594,7 @@ sctp_ifnp->refcount = 0; sctp_ifnp->vrf = vrf; atomic_add_int(&vrf->refcount, 1); - sctp_ifnp->ifn_mtu = SCTP_GATHER_MTU_FROM_IFN_INFO(ifn, ifn_index, addr->sa_family); + sctp_ifnp->ifn_mtu = SCTP_GATHER_MTU_FROM_IFN_INFO(ifn, ifn_index); if (if_name != NULL) { SCTP_SNPRINTF(sctp_ifnp->ifn_name, SCTP_IFNAMSIZ, "%s", if_name); } else { @@ -599,7 +602,6 @@ } hash_ifn_head = &SCTP_BASE_INFO(vrf_ifn_hash)[(ifn_index & SCTP_BASE_INFO(vrf_ifn_hashmark))]; LIST_INIT(&sctp_ifnp->ifalist); - SCTP_IPI_ADDR_WLOCK(); LIST_INSERT_HEAD(hash_ifn_head, sctp_ifnp, next_bucket); LIST_INSERT_HEAD(&vrf->ifnlist, sctp_ifnp, next_ifn); atomic_add_int(&SCTP_BASE_INFO(ipi_count_ifns), 1); @@ -626,6 +628,10 @@ } exit_stage_left: SCTP_IPI_ADDR_WUNLOCK(); + if (new_sctp_ifnp != NULL) { + SCTP_FREE(new_sctp_ifnp, SCTP_M_IFN); + } + SCTP_FREE(new_sctp_ifap, SCTP_M_IFA); return (sctp_ifap); } else { if (sctp_ifap->ifn_p) { @@ -652,14 +658,7 @@ goto exit_stage_left; } } - SCTP_IPI_ADDR_WUNLOCK(); - SCTP_MALLOC(sctp_ifap, struct sctp_ifa *, sizeof(struct sctp_ifa), SCTP_M_IFA); - if (sctp_ifap == NULL) { -#ifdef INVARIANTS - panic("No memory for IFA"); -#endif - return (NULL); - } + sctp_ifap = new_sctp_ifap; memset(sctp_ifap, 0, sizeof(struct sctp_ifa)); sctp_ifap->ifn_p = sctp_ifnp; atomic_add_int(&sctp_ifnp->refcount, 1); @@ -748,7 +747,6 @@ (sctp_ifap->src_is_loop == 0)) { sctp_ifap->src_is_glob = 1; } - SCTP_IPI_ADDR_WLOCK(); hash_addr_head = &vrf->vrf_addr_hash[(hash_of_addr & vrf->vrf_addr_hashmark)]; LIST_INSERT_HEAD(hash_addr_head, sctp_ifap, next_bucket); sctp_ifap->refcount = 1; @@ -760,6 +758,10 @@ sctp_ifnp->registered_af = new_ifn_af; } SCTP_IPI_ADDR_WUNLOCK(); + if (new_sctp_ifnp != NULL) { + SCTP_FREE(new_sctp_ifnp, SCTP_M_IFN); + } + if (dynamic_add) { /* Bump up the refcount so that when the timer * completes it will drop back down. @@ -849,7 +851,7 @@ } SCTPDBG(SCTP_DEBUG_PCB4, "Deleting ifa %p\n", (void *)sctp_ifap); sctp_ifap->localifa_flags &= SCTP_ADDR_VALID; - /* + /* * We don't set the flag. This means that the structure will * hang around in EP's that have bound specific to it until * they close. This gives us TCP like behavior if someone @@ -905,7 +907,6 @@ return; } - static int sctp_does_stcb_own_this_addr(struct sctp_tcb *stcb, struct sockaddr *to) { @@ -1120,14 +1121,12 @@ /* TSNH */ break; } - } } SCTP_IPI_ADDR_RUNLOCK(); return (0); } - static struct sctp_tcb * sctp_tcb_special_locate(struct sctp_inpcb **inp_p, struct sockaddr *from, struct sockaddr *to, struct sctp_nets **netp, uint32_t vrf_id) @@ -1261,7 +1260,6 @@ int match = 0; LIST_FOREACH(laddr, &inp->sctp_addr_list, sctp_nxt_addr) { - if (laddr->ifa == NULL) { SCTPDBG(SCTP_DEBUG_PCB1, "%s: NULL ifa\n", __func__); continue; @@ -1357,7 +1355,6 @@ } /* Does this TCB have a matching address? */ TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) { - if (net->ro._l_addr.sa.sa_family != from->sa_family) { /* not the same family, can't be a match */ continue; @@ -1436,7 +1433,6 @@ return (NULL); } - /* * rules for use * @@ -1803,7 +1799,6 @@ return (NULL); } - /* * Find an association for a specific endpoint using the association id given * out in the COMM_UP notification @@ -1818,10 +1813,6 @@ struct sctp_tcb *stcb; uint32_t id; - if (inp == NULL) { - SCTP_PRINTF("TSNH ep_associd\n"); - return (NULL); - } if (inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_ALLGONE) { SCTP_PRINTF("TSNH ep_associd0\n"); return (NULL); @@ -1855,7 +1846,6 @@ return (NULL); } - struct sctp_tcb * sctp_findassociation_ep_asocid(struct sctp_inpcb *inp, sctp_assoc_t asoc_id, int want_lock) { @@ -1867,7 +1857,6 @@ return (stcb); } - /* * Endpoint probe expects that the INP_INFO is locked. */ @@ -2115,7 +2104,6 @@ return (NULL); } - static struct sctp_inpcb * sctp_isport_inuse(struct sctp_inpcb *inp, uint16_t lport, uint32_t vrf_id) { @@ -2176,7 +2164,6 @@ return (NULL); } - int sctp_swap_inpcb_for_listen(struct sctp_inpcb *inp) { @@ -2184,6 +2171,9 @@ struct sctppcbhead *head; struct sctp_inpcb *tinp, *ninp; + SCTP_INP_INFO_WLOCK_ASSERT(); + SCTP_INP_WLOCK_ASSERT(inp); + if (sctp_is_feature_off(inp, SCTP_PCB_FLAGS_PORTREUSE)) { /* only works with port reuse on */ return (-1); @@ -2191,8 +2181,7 @@ if ((inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) == 0) { return (0); } - SCTP_INP_RUNLOCK(inp); - SCTP_INP_INFO_WLOCK(); + SCTP_INP_WUNLOCK(inp); head = &SCTP_BASE_INFO(sctp_ephash)[SCTP_PCBHASH_ALLADDR(inp->sctp_lport, SCTP_BASE_INFO(hashmark))]; /* Kick out all non-listeners to the TCP hash */ @@ -2222,13 +2211,9 @@ inp->sctp_flags &= ~SCTP_PCB_FLAGS_IN_TCPPOOL; head = &SCTP_BASE_INFO(sctp_ephash)[SCTP_PCBHASH_ALLADDR(inp->sctp_lport, SCTP_BASE_INFO(hashmark))]; LIST_INSERT_HEAD(head, inp, sctp_hash); - SCTP_INP_WUNLOCK(inp); - SCTP_INP_RLOCK(inp); - SCTP_INP_INFO_WUNLOCK(); return (0); } - struct sctp_inpcb * sctp_pcb_findep(struct sockaddr *nam, int find_tcp_pool, int have_lock, uint32_t vrf_id) @@ -2314,7 +2299,6 @@ return (inp); } - /* * Find an association for an endpoint with the pointer to whom you want to * send to and the endpoint pointer. The address can be IPv4 or IPv6. We may @@ -2366,7 +2350,6 @@ return (stcb); } - /* * This routine will grub through the mbuf that is a INIT or INIT-ACK and * find all addresses that the sender has specified in any address list. Each @@ -2575,7 +2558,6 @@ return (NULL); } - /* * Find an association with the pointer to the inbound IP packet. This can be * a IPv4 or IPv6 packet. @@ -2745,7 +2727,6 @@ return (stcb); } - /* * allocate a sctp_inpcb and setup a temporary binding to a port/all * addresses. This way if we don't get a bind we by default pick a ephemeral @@ -2805,7 +2786,7 @@ #endif inp->sctp_associd_counter = 1; inp->partial_delivery_point = SCTP_SB_LIMIT_RCV(so) >> SCTP_PARTIAL_DELIVERY_SHIFT; - inp->sctp_frag_point = SCTP_DEFAULT_MAXSEGMENT; + inp->sctp_frag_point = 0; inp->max_cwnd = 0; inp->sctp_cmt_on_off = SCTP_BASE_SYSCTL(sctp_cmt_on_off); inp->ecn_supported = (uint8_t)SCTP_BASE_SYSCTL(sctp_ecn_enable); @@ -2936,7 +2917,8 @@ SCTP_INP_INFO_WLOCK(); SCTP_INP_LOCK_INIT(inp); #if defined(__FreeBSD__) && !defined(__Userspace__) - INP_LOCK_INIT(&inp->ip_inp.inp, "inp", "sctpinp"); + rw_init_flags(&inp->ip_inp.inp.inp_lock, "sctpinp", + RW_RECURSE | RW_DUPOK); #endif SCTP_INP_READ_INIT(inp); SCTP_ASOC_CREATE_LOCK_INIT(inp); @@ -3018,7 +3000,7 @@ /* Setup the initial secret */ (void)SCTP_GETTIME_TIMEVAL(&time); - m->time_of_secret_change = time.tv_sec; + m->time_of_secret_change = (unsigned int)time.tv_sec; for (i = 0; i < SCTP_NUMBER_OF_SECRETS; i++) { m->secret_key[0][i] = sctp_select_initial_TSN(m); @@ -3052,7 +3034,6 @@ return (error); } - void sctp_move_pcb_and_assoc(struct sctp_inpcb *old_inp, struct sctp_inpcb *new_inp, struct sctp_tcb *stcb) @@ -3070,6 +3051,25 @@ SCTP_TCB_LOCK(stcb); atomic_subtract_int(&stcb->asoc.refcnt, 1); +#if defined(__FreeBSD__) && !defined(__Userspace__) +#ifdef INET6 + if (old_inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) { + new_inp->ip_inp.inp.inp_flags |= old_inp->ip_inp.inp.inp_flags & INP_CONTROLOPTS; + if (old_inp->ip_inp.inp.in6p_outputopts) { + new_inp->ip_inp.inp.in6p_outputopts = ip6_copypktopts(old_inp->ip_inp.inp.in6p_outputopts, M_NOWAIT); + } + } +#endif +#if defined(INET) && defined(INET6) + else +#endif +#ifdef INET + { + new_inp->ip_inp.inp.inp_ip_tos = old_inp->ip_inp.inp.inp_ip_tos; + new_inp->ip_inp.inp.inp_ip_ttl = old_inp->ip_inp.inp.inp_ip_ttl; + } +#endif +#endif new_inp->sctp_ep.time_of_secret_change = old_inp->sctp_ep.time_of_secret_change; memcpy(new_inp->sctp_ep.secret_key, old_inp->sctp_ep.secret_key, @@ -3150,23 +3150,54 @@ } } } - /* Now any running timers need to be adjusted - * since we really don't care if they are running - * or not just blast in the new_inp into all of - * them. - */ - - stcb->asoc.dack_timer.ep = (void *)new_inp; - stcb->asoc.asconf_timer.ep = (void *)new_inp; - stcb->asoc.strreset_timer.ep = (void *)new_inp; - stcb->asoc.shut_guard_timer.ep = (void *)new_inp; - stcb->asoc.autoclose_timer.ep = (void *)new_inp; - stcb->asoc.delete_prim_timer.ep = (void *)new_inp; + /* Now any running timers need to be adjusted. */ + if (stcb->asoc.dack_timer.ep == old_inp) { + SCTP_INP_DECR_REF(old_inp); + stcb->asoc.dack_timer.ep = new_inp; + SCTP_INP_INCR_REF(new_inp); + } + if (stcb->asoc.asconf_timer.ep == old_inp) { + SCTP_INP_DECR_REF(old_inp); + stcb->asoc.asconf_timer.ep = new_inp; + SCTP_INP_INCR_REF(new_inp); + } + if (stcb->asoc.strreset_timer.ep == old_inp) { + SCTP_INP_DECR_REF(old_inp); + stcb->asoc.strreset_timer.ep = new_inp; + SCTP_INP_INCR_REF(new_inp); + } + if (stcb->asoc.shut_guard_timer.ep == old_inp) { + SCTP_INP_DECR_REF(old_inp); + stcb->asoc.shut_guard_timer.ep = new_inp; + SCTP_INP_INCR_REF(new_inp); + } + if (stcb->asoc.autoclose_timer.ep == old_inp) { + SCTP_INP_DECR_REF(old_inp); + stcb->asoc.autoclose_timer.ep = new_inp; + SCTP_INP_INCR_REF(new_inp); + } + if (stcb->asoc.delete_prim_timer.ep == old_inp) { + SCTP_INP_DECR_REF(old_inp); + stcb->asoc.delete_prim_timer.ep = new_inp; + SCTP_INP_INCR_REF(new_inp); + } /* now what about the nets? */ TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) { - net->pmtu_timer.ep = (void *)new_inp; - net->hb_timer.ep = (void *)new_inp; - net->rxt_timer.ep = (void *)new_inp; + if (net->pmtu_timer.ep == old_inp) { + SCTP_INP_DECR_REF(old_inp); + net->pmtu_timer.ep = new_inp; + SCTP_INP_INCR_REF(new_inp); + } + if (net->hb_timer.ep == old_inp) { + SCTP_INP_DECR_REF(old_inp); + net->hb_timer.ep = new_inp; + SCTP_INP_INCR_REF(new_inp); + } + if (net->rxt_timer.ep == old_inp) { + SCTP_INP_DECR_REF(old_inp); + net->rxt_timer.ep = new_inp; + SCTP_INP_INCR_REF(new_inp); + } } SCTP_INP_WUNLOCK(new_inp); SCTP_INP_WUNLOCK(old_inp); @@ -3211,8 +3242,8 @@ SCTP_ZONE_FREE(SCTP_BASE_INFO(ipi_zone_laddr), laddr); SCTP_DECR_LADDR_COUNT(); } - #if !(defined(__FreeBSD__) || defined(__APPLE__) || defined(__Userspace__)) + /* * Don't know why, but without this there is an unknown reference when * compiling NetBSD... hmm @@ -3220,23 +3251,27 @@ extern void in6_sin6_2_sin(struct sockaddr_in *, struct sockaddr_in6 *sin6); #endif - -/* sctp_ifap is used to bypass normal local address validation checks */ +/* + * Bind the socket, with the PCB and global info locks held. Note, if a + * socket address is specified, the PCB lock may be dropped and re-acquired. + * + * sctp_ifap is used to bypass normal local address validation checks. + */ int #if defined(__FreeBSD__) && !defined(__Userspace__) -sctp_inpcb_bind(struct socket *so, struct sockaddr *addr, - struct sctp_ifa *sctp_ifap, struct thread *p) +sctp_inpcb_bind_locked(struct sctp_inpcb *inp, struct sockaddr *addr, + struct sctp_ifa *sctp_ifap, struct thread *td) #elif defined(_WIN32) && !defined(__Userspace__) -sctp_inpcb_bind(struct socket *so, struct sockaddr *addr, - struct sctp_ifa *sctp_ifap, PKTHREAD p) +sctp_inpcb_bind_locked(struct sctp_inpcb *inp, struct sockaddr *addr, + struct sctp_ifa *sctp_ifap, PKTHREAD p) #else -sctp_inpcb_bind(struct socket *so, struct sockaddr *addr, - struct sctp_ifa *sctp_ifap, struct proc *p) +sctp_inpcb_bind_locked(struct sctp_inpcb *inp, struct sockaddr *addr, + struct sctp_ifa *sctp_ifap, struct proc *p) #endif { /* bind a ep to a socket address */ struct sctppcbhead *head; - struct sctp_inpcb *inp, *inp_tmp; + struct sctp_inpcb *inp_tmp; #if (defined(__FreeBSD__) || defined(__APPLE__)) && !defined(__Userspace__) struct inpcb *ip_inp; #endif @@ -3249,12 +3284,20 @@ int error; uint32_t vrf_id; +#if defined(__FreeBSD__) && !defined(__Userspace__) + KASSERT(td != NULL, ("%s: null thread", __func__)); + +#endif + error = 0; lport = 0; bindall = 1; - inp = (struct sctp_inpcb *)so->so_pcb; #if (defined(__FreeBSD__) || defined(__APPLE__)) && !defined(__Userspace__) - ip_inp = (struct inpcb *)so->so_pcb; + ip_inp = &inp->ip_inp.inp; #endif + + SCTP_INP_INFO_WLOCK_ASSERT(); + SCTP_INP_WLOCK_ASSERT(inp); + #ifdef SCTP_DEBUG if (addr) { SCTPDBG(SCTP_DEBUG_PCB1, "Bind called port: %d\n", @@ -3264,16 +3307,11 @@ } #endif if ((inp->sctp_flags & SCTP_PCB_FLAGS_UNBOUND) == 0) { + error = EINVAL; /* already did a bind, subsequent binds NOT allowed ! */ - SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, EINVAL); - return (EINVAL); + SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, error); + goto out; } -#if defined(__FreeBSD__) && !defined(__Userspace__) -#ifdef INVARIANTS - if (p == NULL) - panic("null proc/thread"); -#endif -#endif if (addr != NULL) { switch (addr->sa_family) { #ifdef INET @@ -3283,13 +3321,15 @@ /* IPV6_V6ONLY socket? */ if (SCTP_IPV6_V6ONLY(inp)) { - SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, EINVAL); - return (EINVAL); + error = EINVAL; + SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, error); + goto out; } #ifdef HAVE_SA_LEN if (addr->sa_len != sizeof(*sin)) { - SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, EINVAL); - return (EINVAL); + error = EINVAL; + SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, error); + goto out; } #endif @@ -3300,9 +3340,9 @@ * For LOOPBACK the prison_local_ip4() call will transmute the ip address * to the proper value. */ - if (p && (error = prison_local_ip4(p->td_ucred, &sin->sin_addr)) != 0) { + if ((error = prison_local_ip4(td->td_ucred, &sin->sin_addr)) != 0) { SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, error); - return (error); + goto out; } #endif if (sin->sin_addr.s_addr != INADDR_ANY) { @@ -3318,11 +3358,11 @@ struct sockaddr_in6 *sin6; sin6 = (struct sockaddr_in6 *)addr; - #ifdef HAVE_SA_LEN if (addr->sa_len != sizeof(*sin6)) { - SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, EINVAL); - return (EINVAL); + error = EINVAL; + SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, error); + goto out; } #endif lport = sin6->sin6_port; @@ -3331,10 +3371,10 @@ * For LOOPBACK the prison_local_ip6() call will transmute the ipv6 address * to the proper value. */ - if (p && (error = prison_local_ip6(p->td_ucred, &sin6->sin6_addr, + if ((error = prison_local_ip6(td->td_ucred, &sin6->sin6_addr, (SCTP_IPV6_V6ONLY(inp) != 0))) != 0) { SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, error); - return (error); + goto out; } #endif if (!IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) { @@ -3343,8 +3383,9 @@ /* KAME hack: embed scopeid */ #if defined(SCTP_KAME) if (sa6_embedscope(sin6, MODULE_GLOBAL(ip6_use_defzone)) != 0) { - SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, EINVAL); - return (EINVAL); + error = EINVAL; + SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, error); + goto out; } #elif defined(__APPLE__) && !defined(__Userspace__) #if defined(APPLE_LEOPARD) || defined(APPLE_SNOWLEOPARD) @@ -3352,19 +3393,22 @@ #else if (in6_embedscope(&sin6->sin6_addr, sin6, ip_inp, NULL, NULL) != 0) { #endif - SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, EINVAL); - return (EINVAL); + error = EINVAL; + SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, error); + goto out; } #elif defined(__FreeBSD__) && !defined(__Userspace__) error = scope6_check_id(sin6, MODULE_GLOBAL(ip6_use_defzone)); if (error != 0) { + error = EINVAL; SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, error); - return (error); + goto out; } #else if (in6_embedscope(&sin6->sin6_addr, sin6) != 0) { - SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, EINVAL); - return (EINVAL); + error = EINVAL; + SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, error); + goto out; } #endif #endif /* SCTP_EMBEDDED_V6_SCOPE */ @@ -3383,8 +3427,9 @@ #ifdef HAVE_SA_LEN if (addr->sa_len != sizeof(struct sockaddr_conn)) { - SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, EINVAL); - return (EINVAL); + error = EINVAL; + SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, error); + goto out; } #endif sconn = (struct sockaddr_conn *)addr; @@ -3396,17 +3441,14 @@ } #endif default: - SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, EAFNOSUPPORT); - return (EAFNOSUPPORT); + error = EAFNOSUPPORT; + SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, error); + goto out; } } - SCTP_INP_INFO_WLOCK(); - SCTP_INP_WLOCK(inp); /* Setup a vrf_id to be the default for the non-bind-all case. */ vrf_id = inp->def_vrf_id; - /* increase our count due to the unlock we do */ - SCTP_INP_INCR_REF(inp); if (lport) { /* * Did the caller specify a port? if so we must see if an ep @@ -3414,25 +3456,21 @@ */ /* got to be root to get at low ports */ #if !(defined(_WIN32) && !defined(__Userspace__)) - if (ntohs(lport) < IPPORT_RESERVED) { - if ((p != NULL) && ((error = + if (ntohs(lport) < IPPORT_RESERVED && #if defined(__FreeBSD__) && !defined(__Userspace__) - priv_check(p, PRIV_NETINET_RESERVEDPORT) + (error = priv_check(td, PRIV_NETINET_RESERVEDPORT)) != 0) { #elif defined(__APPLE__) && !defined(__Userspace__) - suser(p->p_ucred, &p->p_acflag) -#elif defined(__Userspace__) /* must be true to use raw socket */ - 1 + (error = suser(p->p_ucred, &p->p_acflag)) != 0) { +#elif defined(__Userspace__) + /* TODO ensure uid is 0, etc... */ + 0) { #else - suser(p, 0) + (error = suser(p, 0)) != 0) { #endif - ) != 0)) { - SCTP_INP_DECR_REF(inp); - SCTP_INP_WUNLOCK(inp); - SCTP_INP_INFO_WUNLOCK(); - return (error); - } + goto out; } #endif + SCTP_INP_INCR_REF(inp); SCTP_INP_WUNLOCK(inp); if (bindall) { #ifdef SCTP_MVRF @@ -3459,10 +3497,11 @@ port_reuse_active = 1; goto continue_anyway; } + SCTP_INP_WLOCK(inp); SCTP_INP_DECR_REF(inp); - SCTP_INP_INFO_WUNLOCK(); - SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, EADDRINUSE); - return (EADDRINUSE); + error = EADDRINUSE; + SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, error); + goto out; } #ifdef SCTP_MVRF } @@ -3485,14 +3524,16 @@ port_reuse_active = 1; goto continue_anyway; } + SCTP_INP_WLOCK(inp); SCTP_INP_DECR_REF(inp); - SCTP_INP_INFO_WUNLOCK(); - SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, EADDRINUSE); - return (EADDRINUSE); + error = EADDRINUSE; + SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, error); + goto out; } } continue_anyway: SCTP_INP_WLOCK(inp); + SCTP_INP_DECR_REF(inp); if (bindall) { /* verify that no lport is not used by a singleton */ if ((port_reuse_active == 0) && @@ -3502,55 +3543,42 @@ (sctp_is_feature_on(inp_tmp, SCTP_PCB_FLAGS_PORTREUSE))) { port_reuse_active = 1; } else { - SCTP_INP_DECR_REF(inp); - SCTP_INP_WUNLOCK(inp); - SCTP_INP_INFO_WUNLOCK(); - SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, EADDRINUSE); - return (EADDRINUSE); + error = EADDRINUSE; + SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, error); + goto out; } } } } else { uint16_t first, last, candidate; uint16_t count; - int done; -#if defined(_WIN32) && !defined(__Userspace__) +#if defined(__Userspace__) + first = MODULE_GLOBAL(ipport_firstauto); + last = MODULE_GLOBAL(ipport_lastauto); +#elif defined(_WIN32) first = 1; last = 0xffff; -#else -#if defined(__Userspace__) - /* TODO ensure uid is 0, etc... */ -#elif (defined(__FreeBSD__) || defined(__APPLE__)) && !defined(__Userspace__) +#elif defined(__FreeBSD__) || defined(__APPLE__) if (ip_inp->inp_flags & INP_HIGHPORT) { first = MODULE_GLOBAL(ipport_hifirstauto); last = MODULE_GLOBAL(ipport_hilastauto); } else if (ip_inp->inp_flags & INP_LOWPORT) { - if (p && (error = #if defined(__FreeBSD__) - priv_check(p, PRIV_NETINET_RESERVEDPORT) -#elif defined(__APPLE__) - suser(p->p_ucred, &p->p_acflag) + if ((error = priv_check(td, PRIV_NETINET_RESERVEDPORT)) != 0) { #else - suser(p, 0) + if ((error = suser(p->p_ucred, &p->p_acflag)) != 0) { #endif - )) { - SCTP_INP_DECR_REF(inp); - SCTP_INP_WUNLOCK(inp); - SCTP_INP_INFO_WUNLOCK(); SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, error); - return (error); + goto out; } first = MODULE_GLOBAL(ipport_lowfirstauto); last = MODULE_GLOBAL(ipport_lowlastauto); } else { -#endif first = MODULE_GLOBAL(ipport_firstauto); last = MODULE_GLOBAL(ipport_lastauto); -#if (defined(__FreeBSD__) || defined(__APPLE__)) && !defined(__Userspace__) } #endif -#endif if (first > last) { uint16_t temp; @@ -3561,8 +3589,7 @@ count = last - first + 1; /* number of candidates */ candidate = first + sctp_select_initial_TSN(&inp->sctp_ep) % (count); - done = 0; - while (!done) { + for (;;) { #ifdef SCTP_MVRF for (i = 0; i < inp->num_vrfs; i++) { if (sctp_isport_inuse(inp, htons(candidate), inp->m_vrf_ids[i]) != NULL) { @@ -3570,40 +3597,35 @@ } } if (i == inp->num_vrfs) { - done = 1; + lport = htons(candidate); + break; } #else if (sctp_isport_inuse(inp, htons(candidate), inp->def_vrf_id) == NULL) { - done = 1; + lport = htons(candidate); + break; } #endif - if (!done) { - if (--count == 0) { - SCTP_INP_DECR_REF(inp); - SCTP_INP_WUNLOCK(inp); - SCTP_INP_INFO_WUNLOCK(); - SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, EADDRINUSE); - return (EADDRINUSE); - } - if (candidate == last) - candidate = first; - else - candidate = candidate + 1; + if (--count == 0) { + error = EADDRINUSE; + SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, error); + goto out; } + if (candidate == last) + candidate = first; + else + candidate = candidate + 1; } - lport = htons(candidate); } - SCTP_INP_DECR_REF(inp); if (inp->sctp_flags & (SCTP_PCB_FLAGS_SOCKET_GONE | SCTP_PCB_FLAGS_SOCKET_ALLGONE)) { /* * this really should not happen. The guy did a non-blocking * bind and then did a close at the same time. */ - SCTP_INP_WUNLOCK(inp); - SCTP_INP_INFO_WUNLOCK(); - SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, EINVAL); - return (EINVAL); + error = EINVAL; + SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, error); + goto out; } /* ok we look clear to give out this port, so lets setup the binding */ if (bindall) { @@ -3695,21 +3717,19 @@ vrf_id, SCTP_ADDR_NOT_LOCKED); } if (ifa == NULL) { + error = EADDRNOTAVAIL; /* Can't find an interface with that address */ - SCTP_INP_WUNLOCK(inp); - SCTP_INP_INFO_WUNLOCK(); - SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, EADDRNOTAVAIL); - return (EADDRNOTAVAIL); + SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, error); + goto out; } #ifdef INET6 if (addr->sa_family == AF_INET6) { /* GAK, more FIXME IFA lock? */ if (ifa->localifa_flags & SCTP_ADDR_IFA_UNUSEABLE) { /* Can't bind a non-existent addr. */ - SCTP_INP_WUNLOCK(inp); - SCTP_INP_INFO_WUNLOCK(); - SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, EINVAL); - return (EINVAL); + error = EINVAL; + SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, error); + goto out; } } #endif @@ -3722,11 +3742,8 @@ /* add this address to the endpoint list */ error = sctp_insert_laddr(&inp->sctp_addr_list, ifa, 0); - if (error != 0) { - SCTP_INP_WUNLOCK(inp); - SCTP_INP_INFO_WUNLOCK(); - return (error); - } + if (error != 0) + goto out; inp->laddr_count++; } /* find the bucket */ @@ -3745,13 +3762,41 @@ inp->sctp_lport = lport; /* turn off just the unbound flag */ + KASSERT((inp->sctp_flags & SCTP_PCB_FLAGS_UNBOUND) != 0, + ("%s: inp %p is already bound", __func__, inp)); inp->sctp_flags &= ~SCTP_PCB_FLAGS_UNBOUND; +out: + return (error); +} + +int +#if defined(__FreeBSD__) && !defined(__Userspace__) +sctp_inpcb_bind(struct socket *so, struct sockaddr *addr, + struct sctp_ifa *sctp_ifap, struct thread *td) +#elif defined(_WIN32) && !defined(__Userspace__) +sctp_inpcb_bind(struct socket *so, struct sockaddr *addr, + struct sctp_ifa *sctp_ifap, PKTHREAD p) +#else +sctp_inpcb_bind(struct socket *so, struct sockaddr *addr, + struct sctp_ifa *sctp_ifap, struct proc *p) +#endif +{ + struct sctp_inpcb *inp; + int error; + + inp = so->so_pcb; + SCTP_INP_INFO_WLOCK(); + SCTP_INP_WLOCK(inp); +#if defined(__FreeBSD__) && !defined(__Userspace__) + error = sctp_inpcb_bind_locked(inp, addr, sctp_ifap, td); +#else + error = sctp_inpcb_bind_locked(inp, addr, sctp_ifap, p); +#endif SCTP_INP_WUNLOCK(inp); SCTP_INP_INFO_WUNLOCK(); - return (0); + return (error); } - static void sctp_iterator_inp_being_freed(struct sctp_inpcb *inp) { @@ -3833,7 +3878,7 @@ * freeing. a) Any local lists. b) Any associations. c) The hash of * all associations. d) finally the ep itself. */ - struct sctp_tcb *asoc, *nasoc; + struct sctp_tcb *stcb, *nstcb; struct sctp_laddr *laddr, *nladdr; struct inpcb *ip_pcb; struct socket *so; @@ -3847,7 +3892,6 @@ int cnt; sctp_sharedkey_t *shared_key, *nshared_key; - #if defined(__APPLE__) && !defined(__Userspace__) sctp_lock_assert(SCTP_INP_SO(inp)); #endif @@ -3858,26 +3902,21 @@ /* mark any iterators on the list or being processed */ sctp_iterator_inp_being_freed(inp); SCTP_ITERATOR_UNLOCK(); - so = inp->sctp_socket; - if (inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_ALLGONE) { - /* been here before.. eeks.. get out of here */ - SCTP_PRINTF("This conflict in free SHOULD not be happening! from %d, imm %d\n", from, immediate); -#ifdef SCTP_LOG_CLOSING - sctp_log_closing(inp, NULL, 1); -#endif - return; - } + SCTP_ASOC_CREATE_LOCK(inp); SCTP_INP_INFO_WLOCK(); - SCTP_INP_WLOCK(inp); + so = inp->sctp_socket; + KASSERT((inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) != 0, + ("%s: inp %p still has socket", __func__, inp)); + KASSERT((inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_ALLGONE) == 0, + ("%s: double free of inp %p", __func__, inp)); if (from == SCTP_CALLED_AFTER_CMPSET_OFCLOSE) { inp->sctp_flags &= ~SCTP_PCB_FLAGS_CLOSE_IP; /* socket is gone, so no more wakeups allowed */ inp->sctp_flags |= SCTP_PCB_FLAGS_DONT_WAKE; inp->sctp_flags &= ~SCTP_PCB_FLAGS_WAKEINPUT; inp->sctp_flags &= ~SCTP_PCB_FLAGS_WAKEOUTPUT; - } /* First time through we have the socket lock, after that no more. */ sctp_timer_stop(SCTP_TIMER_TYPE_NEWCOOKIE, inp, NULL, NULL, @@ -3898,124 +3937,124 @@ int cnt_in_sd; cnt_in_sd = 0; - LIST_FOREACH_SAFE(asoc, &inp->sctp_asoc_list, sctp_tcblist, nasoc) { - SCTP_TCB_LOCK(asoc); - if (asoc->asoc.state & SCTP_STATE_ABOUT_TO_BE_FREED) { + LIST_FOREACH_SAFE(stcb, &inp->sctp_asoc_list, sctp_tcblist, nstcb) { + SCTP_TCB_LOCK(stcb); + /* Disconnect the socket please. */ + stcb->sctp_socket = NULL; + SCTP_ADD_SUBSTATE(stcb, SCTP_STATE_CLOSED_SOCKET); + if (stcb->asoc.state & SCTP_STATE_ABOUT_TO_BE_FREED) { /* Skip guys being freed */ cnt_in_sd++; - if (asoc->asoc.state & SCTP_STATE_IN_ACCEPT_QUEUE) { + if (stcb->asoc.state & SCTP_STATE_IN_ACCEPT_QUEUE) { /* * Special case - we did not start a kill * timer on the asoc due to it was not * closed. So go ahead and start it now. */ - SCTP_CLEAR_SUBSTATE(asoc, SCTP_STATE_IN_ACCEPT_QUEUE); - sctp_timer_start(SCTP_TIMER_TYPE_ASOCKILL, inp, asoc, NULL); + SCTP_CLEAR_SUBSTATE(stcb, SCTP_STATE_IN_ACCEPT_QUEUE); + sctp_timer_start(SCTP_TIMER_TYPE_ASOCKILL, inp, stcb, NULL); } - SCTP_TCB_UNLOCK(asoc); + SCTP_TCB_UNLOCK(stcb); continue; } - if (((SCTP_GET_STATE(asoc) == SCTP_STATE_COOKIE_WAIT) || - (SCTP_GET_STATE(asoc) == SCTP_STATE_COOKIE_ECHOED)) && - (asoc->asoc.total_output_queue_size == 0)) { + if (((SCTP_GET_STATE(stcb) == SCTP_STATE_COOKIE_WAIT) || + (SCTP_GET_STATE(stcb) == SCTP_STATE_COOKIE_ECHOED)) && + (stcb->asoc.total_output_queue_size == 0)) { /* If we have data in queue, we don't want to just * free since the app may have done, send()/close * or connect/send/close. And it wants the data * to get across first. */ /* Just abandon things in the front states */ - if (sctp_free_assoc(inp, asoc, SCTP_PCBFREE_NOFORCE, + if (sctp_free_assoc(inp, stcb, SCTP_PCBFREE_NOFORCE, SCTP_FROM_SCTP_PCB + SCTP_LOC_2) == 0) { cnt_in_sd++; } continue; } - /* Disconnect the socket please */ - asoc->sctp_socket = NULL; - SCTP_ADD_SUBSTATE(asoc, SCTP_STATE_CLOSED_SOCKET); - if ((asoc->asoc.size_on_reasm_queue > 0) || - (asoc->asoc.control_pdapi) || - (asoc->asoc.size_on_all_streams > 0) || - (so && (so->so_rcv.sb_cc > 0))) { + if ((stcb->asoc.size_on_reasm_queue > 0) || + (stcb->asoc.control_pdapi) || + (stcb->asoc.size_on_all_streams > 0) || + ((so != NULL) && (SCTP_SBAVAIL(&so->so_rcv) > 0))) { /* Left with Data unread */ struct mbuf *op_err; op_err = sctp_generate_cause(SCTP_CAUSE_USER_INITIATED_ABT, ""); - asoc->sctp_ep->last_abort_code = SCTP_FROM_SCTP_PCB + SCTP_LOC_3; - sctp_send_abort_tcb(asoc, op_err, SCTP_SO_LOCKED); + stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_PCB + SCTP_LOC_3; + sctp_send_abort_tcb(stcb, op_err, SCTP_SO_LOCKED); SCTP_STAT_INCR_COUNTER32(sctps_aborted); - if ((SCTP_GET_STATE(asoc) == SCTP_STATE_OPEN) || - (SCTP_GET_STATE(asoc) == SCTP_STATE_SHUTDOWN_RECEIVED)) { + if ((SCTP_GET_STATE(stcb) == SCTP_STATE_OPEN) || + (SCTP_GET_STATE(stcb) == SCTP_STATE_SHUTDOWN_RECEIVED)) { SCTP_STAT_DECR_GAUGE32(sctps_currestab); } - if (sctp_free_assoc(inp, asoc, + if (sctp_free_assoc(inp, stcb, SCTP_PCBFREE_NOFORCE, SCTP_FROM_SCTP_PCB + SCTP_LOC_4) == 0) { cnt_in_sd++; } continue; - } else if (TAILQ_EMPTY(&asoc->asoc.send_queue) && - TAILQ_EMPTY(&asoc->asoc.sent_queue) && - (asoc->asoc.stream_queue_cnt == 0)) { - if ((*asoc->asoc.ss_functions.sctp_ss_is_user_msgs_incomplete)(asoc, &asoc->asoc)) { + } else if (TAILQ_EMPTY(&stcb->asoc.send_queue) && + TAILQ_EMPTY(&stcb->asoc.sent_queue) && + (stcb->asoc.stream_queue_cnt == 0)) { + if ((*stcb->asoc.ss_functions.sctp_ss_is_user_msgs_incomplete)(stcb, &stcb->asoc)) { goto abort_anyway; } - if ((SCTP_GET_STATE(asoc) != SCTP_STATE_SHUTDOWN_SENT) && - (SCTP_GET_STATE(asoc) != SCTP_STATE_SHUTDOWN_ACK_SENT)) { + if ((SCTP_GET_STATE(stcb) != SCTP_STATE_SHUTDOWN_SENT) && + (SCTP_GET_STATE(stcb) != SCTP_STATE_SHUTDOWN_ACK_SENT)) { struct sctp_nets *netp; /* * there is nothing queued to send, * so I send shutdown */ - if ((SCTP_GET_STATE(asoc) == SCTP_STATE_OPEN) || - (SCTP_GET_STATE(asoc) == SCTP_STATE_SHUTDOWN_RECEIVED)) { + if ((SCTP_GET_STATE(stcb) == SCTP_STATE_OPEN) || + (SCTP_GET_STATE(stcb) == SCTP_STATE_SHUTDOWN_RECEIVED)) { SCTP_STAT_DECR_GAUGE32(sctps_currestab); } - SCTP_SET_STATE(asoc, SCTP_STATE_SHUTDOWN_SENT); - sctp_stop_timers_for_shutdown(asoc); - if (asoc->asoc.alternate) { - netp = asoc->asoc.alternate; + SCTP_SET_STATE(stcb, SCTP_STATE_SHUTDOWN_SENT); + sctp_stop_timers_for_shutdown(stcb); + if (stcb->asoc.alternate) { + netp = stcb->asoc.alternate; } else { - netp = asoc->asoc.primary_destination; + netp = stcb->asoc.primary_destination; } - sctp_send_shutdown(asoc, netp); - sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWN, asoc->sctp_ep, asoc, + sctp_send_shutdown(stcb, netp); + sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWN, stcb->sctp_ep, stcb, netp); - sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWNGUARD, asoc->sctp_ep, asoc, NULL); - sctp_chunk_output(inp, asoc, SCTP_OUTPUT_FROM_SHUT_TMR, SCTP_SO_LOCKED); + sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWNGUARD, stcb->sctp_ep, stcb, NULL); + sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_SHUT_TMR, SCTP_SO_LOCKED); } } else { /* mark into shutdown pending */ - SCTP_ADD_SUBSTATE(asoc, SCTP_STATE_SHUTDOWN_PENDING); - sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWNGUARD, asoc->sctp_ep, asoc, NULL); - if ((*asoc->asoc.ss_functions.sctp_ss_is_user_msgs_incomplete)(asoc, &asoc->asoc)) { - SCTP_ADD_SUBSTATE(asoc, SCTP_STATE_PARTIAL_MSG_LEFT); - } - if (TAILQ_EMPTY(&asoc->asoc.send_queue) && - TAILQ_EMPTY(&asoc->asoc.sent_queue) && - (asoc->asoc.state & SCTP_STATE_PARTIAL_MSG_LEFT)) { + SCTP_ADD_SUBSTATE(stcb, SCTP_STATE_SHUTDOWN_PENDING); + sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWNGUARD, stcb->sctp_ep, stcb, NULL); + if ((*stcb->asoc.ss_functions.sctp_ss_is_user_msgs_incomplete)(stcb, &stcb->asoc)) { + SCTP_ADD_SUBSTATE(stcb, SCTP_STATE_PARTIAL_MSG_LEFT); + } + if (TAILQ_EMPTY(&stcb->asoc.send_queue) && + TAILQ_EMPTY(&stcb->asoc.sent_queue) && + (stcb->asoc.state & SCTP_STATE_PARTIAL_MSG_LEFT)) { struct mbuf *op_err; abort_anyway: op_err = sctp_generate_cause(SCTP_CAUSE_USER_INITIATED_ABT, ""); - asoc->sctp_ep->last_abort_code = SCTP_FROM_SCTP_PCB + SCTP_LOC_5; - sctp_send_abort_tcb(asoc, op_err, SCTP_SO_LOCKED); + stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_PCB + SCTP_LOC_5; + sctp_send_abort_tcb(stcb, op_err, SCTP_SO_LOCKED); SCTP_STAT_INCR_COUNTER32(sctps_aborted); - if ((SCTP_GET_STATE(asoc) == SCTP_STATE_OPEN) || - (SCTP_GET_STATE(asoc) == SCTP_STATE_SHUTDOWN_RECEIVED)) { + if ((SCTP_GET_STATE(stcb) == SCTP_STATE_OPEN) || + (SCTP_GET_STATE(stcb) == SCTP_STATE_SHUTDOWN_RECEIVED)) { SCTP_STAT_DECR_GAUGE32(sctps_currestab); } - if (sctp_free_assoc(inp, asoc, + if (sctp_free_assoc(inp, stcb, SCTP_PCBFREE_NOFORCE, SCTP_FROM_SCTP_PCB + SCTP_LOC_6) == 0) { cnt_in_sd++; } continue; } else { - sctp_chunk_output(inp, asoc, SCTP_OUTPUT_FROM_CLOSING, SCTP_SO_LOCKED); + sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_CLOSING, SCTP_SO_LOCKED); } } cnt_in_sd++; - SCTP_TCB_UNLOCK(asoc); + SCTP_TCB_UNLOCK(stcb); } /* now is there some left in our SHUTDOWN state? */ if (cnt_in_sd) { @@ -4030,8 +4069,7 @@ } } inp->sctp_socket = NULL; - if ((inp->sctp_flags & SCTP_PCB_FLAGS_UNBOUND) != - SCTP_PCB_FLAGS_UNBOUND) { + if ((inp->sctp_flags & SCTP_PCB_FLAGS_UNBOUND) == 0) { /* * ok, this guy has been bound. It's port is * somewhere in the SCTP_BASE_INFO(hash table). Remove @@ -4047,36 +4085,41 @@ * to die ... */ cnt = 0; - LIST_FOREACH_SAFE(asoc, &inp->sctp_asoc_list, sctp_tcblist, nasoc) { - SCTP_TCB_LOCK(asoc); - if (asoc->asoc.state & SCTP_STATE_ABOUT_TO_BE_FREED) { - if (asoc->asoc.state & SCTP_STATE_IN_ACCEPT_QUEUE) { - SCTP_CLEAR_SUBSTATE(asoc, SCTP_STATE_IN_ACCEPT_QUEUE); - sctp_timer_start(SCTP_TIMER_TYPE_ASOCKILL, inp, asoc, NULL); + LIST_FOREACH_SAFE(stcb, &inp->sctp_asoc_list, sctp_tcblist, nstcb) { + SCTP_TCB_LOCK(stcb); + if (immediate != SCTP_FREE_SHOULD_USE_GRACEFUL_CLOSE) { + /* Disconnect the socket please */ + stcb->sctp_socket = NULL; + SCTP_ADD_SUBSTATE(stcb, SCTP_STATE_CLOSED_SOCKET); + } + if (stcb->asoc.state & SCTP_STATE_ABOUT_TO_BE_FREED) { + if (stcb->asoc.state & SCTP_STATE_IN_ACCEPT_QUEUE) { + SCTP_CLEAR_SUBSTATE(stcb, SCTP_STATE_IN_ACCEPT_QUEUE); + sctp_timer_start(SCTP_TIMER_TYPE_ASOCKILL, inp, stcb, NULL); } cnt++; - SCTP_TCB_UNLOCK(asoc); + SCTP_TCB_UNLOCK(stcb); continue; } /* Free associations that are NOT killing us */ - if ((SCTP_GET_STATE(asoc) != SCTP_STATE_COOKIE_WAIT) && - ((asoc->asoc.state & SCTP_STATE_ABOUT_TO_BE_FREED) == 0)) { + if ((SCTP_GET_STATE(stcb) != SCTP_STATE_COOKIE_WAIT) && + ((stcb->asoc.state & SCTP_STATE_ABOUT_TO_BE_FREED) == 0)) { struct mbuf *op_err; op_err = sctp_generate_cause(SCTP_CAUSE_USER_INITIATED_ABT, ""); - asoc->sctp_ep->last_abort_code = SCTP_FROM_SCTP_PCB + SCTP_LOC_7; - sctp_send_abort_tcb(asoc, op_err, SCTP_SO_LOCKED); + stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_PCB + SCTP_LOC_7; + sctp_send_abort_tcb(stcb, op_err, SCTP_SO_LOCKED); SCTP_STAT_INCR_COUNTER32(sctps_aborted); - } else if (asoc->asoc.state & SCTP_STATE_ABOUT_TO_BE_FREED) { + } else if (stcb->asoc.state & SCTP_STATE_ABOUT_TO_BE_FREED) { cnt++; - SCTP_TCB_UNLOCK(asoc); + SCTP_TCB_UNLOCK(stcb); continue; } - if ((SCTP_GET_STATE(asoc) == SCTP_STATE_OPEN) || - (SCTP_GET_STATE(asoc) == SCTP_STATE_SHUTDOWN_RECEIVED)) { + if ((SCTP_GET_STATE(stcb) == SCTP_STATE_OPEN) || + (SCTP_GET_STATE(stcb) == SCTP_STATE_SHUTDOWN_RECEIVED)) { SCTP_STAT_DECR_GAUGE32(sctps_currestab); } - if (sctp_free_assoc(inp, asoc, SCTP_PCBFREE_FORCE, + if (sctp_free_assoc(inp, stcb, SCTP_PCBFREE_FORCE, SCTP_FROM_SCTP_PCB + SCTP_LOC_8) == 0) { cnt++; } @@ -4097,7 +4140,7 @@ being_refed++; if (SCTP_ASOC_CREATE_LOCK_CONTENDED(inp)) being_refed++; - + /* NOTE: 0 refcount also means no timers are referencing us. */ if ((inp->refcount) || (being_refed) || (inp->sctp_flags & SCTP_PCB_FLAGS_CLOSE_IP)) { @@ -4119,30 +4162,15 @@ SCTP_INP_WUNLOCK(inp); SCTP_ASOC_CREATE_UNLOCK(inp); SCTP_INP_INFO_WUNLOCK(); - /* Now we release all locks. Since this INP - * cannot be found anymore except possibly by the - * kill timer that might be running. We call - * the drain function here. It should hit the case - * were it sees the ACTIVE flag cleared and exit - * out freeing us to proceed and destroy everything. - */ - if (from != SCTP_CALLED_FROM_INPKILL_TIMER) { - (void)SCTP_OS_TIMER_STOP_DRAIN(&inp->sctp_ep.signature_change.timer); - } else { - /* Probably un-needed */ - (void)SCTP_OS_TIMER_STOP(&inp->sctp_ep.signature_change.timer); - } #ifdef SCTP_LOG_CLOSING sctp_log_closing(inp, NULL, 5); #endif - #if !(defined(_WIN32) || defined(__Userspace__)) -#if !(defined(__FreeBSD__) && !defined(__Userspace__)) +#if !(defined(__FreeBSD__) && !defined(__Userspace__)) rt = ip_pcb->inp_route.ro_rt; #endif #endif - if ((inp->sctp_asocidhash) != NULL) { SCTP_HASH_FREE(inp->sctp_asocidhash, inp->hashasocidmark); inp->sctp_asocidhash = NULL; @@ -4177,7 +4205,6 @@ (void)sctp_m_free(ip_pcb->inp_options); ip_pcb->inp_options = 0; } - #if !(defined(_WIN32) || defined(__Userspace__)) #if !defined(__FreeBSD__) if (rt) { @@ -4186,7 +4213,6 @@ } #endif #endif - #ifdef INET6 #if !(defined(_WIN32) || defined(__Userspace__)) #if (defined(__FreeBSD__) || defined(__APPLE__) && !defined(__Userspace__)) @@ -4215,7 +4241,7 @@ inp->ip_inp.inp.inp_state = INPCB_STATE_DEAD; if (in_pcb_checkstate(&inp->ip_inp.inp, WNT_STOPUSING, 1) != WNT_STOPUSING) { #ifdef INVARIANTS - panic("sctp_inpcb_free inp = %p couldn't set to STOPUSING\n", (void *)inp); + panic("sctp_inpcb_free inp = %p couldn't set to STOPUSING", (void *)inp); #else SCTP_PRINTF("sctp_inpcb_free inp = %p couldn't set to STOPUSING\n", (void *)inp); #endif @@ -4233,9 +4259,9 @@ #ifdef SCTP_TRACK_FREED_ASOCS /* TEMP CODE */ - LIST_FOREACH_SAFE(asoc, &inp->sctp_asoc_free_list, sctp_tcblist, nasoc) { - LIST_REMOVE(asoc, sctp_tcblist); - SCTP_ZONE_FREE(SCTP_BASE_INFO(ipi_zone_asoc), asoc); + LIST_FOREACH_SAFE(stcb, &inp->sctp_asoc_free_list, sctp_tcblist, nstcb) { + LIST_REMOVE(stcb, sctp_tcblist); + SCTP_ZONE_FREE(SCTP_BASE_INFO(ipi_zone_asoc), stcb); SCTP_DECR_ASOC_COUNT(); } /* *** END TEMP CODE ****/ @@ -4264,7 +4290,6 @@ #endif } - struct sctp_nets * sctp_findnet(struct sctp_tcb *stcb, struct sockaddr *addr) { @@ -4277,7 +4302,6 @@ return (NULL); } - int sctp_is_address_on_local_host(struct sockaddr *addr, uint32_t vrf_id) { @@ -4599,7 +4623,12 @@ net->src_addr_selected = 1; /* Now get the interface MTU */ if (net->ro._s_addr->ifn_p != NULL) { - imtu = SCTP_GATHER_MTU_FROM_INTFC(net->ro._s_addr->ifn_p); + /* + * XXX: Should we here just use + * net->ro._s_addr->ifn_p->ifn_mtu + */ + imtu = SCTP_GATHER_MTU_FROM_IFN_INFO(net->ro._s_addr->ifn_p->ifn_p, + net->ro._s_addr->ifn_p->ifn_index); } else { imtu = 0; } @@ -4680,7 +4709,7 @@ stcb->asoc.smallest_mtu = net->mtu; } if (stcb->asoc.smallest_mtu > net->mtu) { - sctp_pathmtu_adjustment(stcb, net->mtu); + sctp_pathmtu_adjustment(stcb, net->mtu, true); } #ifdef INET6 #ifdef SCTP_EMBEDDED_V6_SCOPE @@ -4816,7 +4845,6 @@ return (0); } - static uint32_t sctp_aloc_a_assoc_id(struct sctp_inpcb *inp, struct sctp_tcb *stcb) { @@ -4853,21 +4881,21 @@ * careful to add all additional addresses once they are know right away or * else the assoc will be may experience a blackout scenario. */ -struct sctp_tcb * -sctp_aloc_assoc(struct sctp_inpcb *inp, struct sockaddr *firstaddr, - int *error, uint32_t override_tag, uint32_t vrf_id, - uint16_t o_streams, uint16_t port, +static struct sctp_tcb * +sctp_aloc_assoc_locked(struct sctp_inpcb *inp, struct sockaddr *firstaddr, + int *error, uint32_t override_tag, uint32_t initial_tsn, + uint32_t vrf_id, uint16_t o_streams, uint16_t port, #if defined(__FreeBSD__) && !defined(__Userspace__) - struct thread *p, + struct thread *p, #elif defined(_WIN32) && !defined(__Userspace__) - PKTHREAD p, + PKTHREAD p, #else #if defined(__Userspace__) - /* __Userspace__ NULL proc is going to be passed here. See sctp_lower_sosend */ + /* __Userspace__ NULL proc is going to be passed here. See sctp_lower_sosend */ #endif - struct proc *p, + struct proc *p, #endif - int initialize_auth_params) + int initialize_auth_params) { /* note the p argument is only valid in unbound sockets */ @@ -4877,6 +4905,9 @@ uint16_t rport; int err; + SCTP_INP_INFO_WLOCK_ASSERT(); + SCTP_INP_WLOCK_ASSERT(inp); + /* * Assumption made here: Caller has done a * sctp_findassociation_ep_addr(ep, addr's); to make sure the @@ -4893,7 +4924,11 @@ *error = EINVAL; return (NULL); } - SCTP_INP_RLOCK(inp); + if (inp->sctp_flags & (SCTP_PCB_FLAGS_SOCKET_GONE | SCTP_PCB_FLAGS_SOCKET_ALLGONE)) { + SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, EINVAL); + *error = EINVAL; + return (NULL); + } if ((inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) && ((sctp_is_feature_off(inp, SCTP_PCB_FLAGS_PORTREUSE)) || (inp->sctp_flags & SCTP_PCB_FLAGS_CONNECTED))) { @@ -4903,7 +4938,6 @@ * sctp_aloc_assoc.. or the one-2-many socket. If a peeled * off, or connected one does this.. its an error. */ - SCTP_INP_RUNLOCK(inp); SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, EINVAL); *error = EINVAL; return (NULL); @@ -4912,7 +4946,6 @@ (inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE)) { if ((inp->sctp_flags & SCTP_PCB_FLAGS_WAS_CONNECTED) || (inp->sctp_flags & SCTP_PCB_FLAGS_WAS_ABORTED)) { - SCTP_INP_RUNLOCK(inp); SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, EINVAL); *error = EINVAL; return (NULL); @@ -4960,15 +4993,14 @@ (sin->sin_addr.s_addr == INADDR_BROADCAST) || IN_MULTICAST(ntohl(sin->sin_addr.s_addr)) || #if defined(__Userspace__) - (((inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_CONN) != 0) || - (((inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) != 0) && + ((inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_CONN) || + ((inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) && (SCTP_IPV6_V6ONLY(inp) != 0)))) { #else - (((inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) != 0) && + ((inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) && (SCTP_IPV6_V6ONLY(inp) != 0))) { #endif /* Invalid address */ - SCTP_INP_RUNLOCK(inp); SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, EINVAL); *error = EINVAL; return (NULL); @@ -4988,7 +5020,6 @@ IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr) || ((inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) == 0)) { /* Invalid address */ - SCTP_INP_RUNLOCK(inp); SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, EINVAL); *error = EINVAL; return (NULL); @@ -5007,7 +5038,6 @@ (sconn->sconn_addr == NULL) || ((inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_CONN) == 0)) { /* Invalid address */ - SCTP_INP_RUNLOCK(inp); SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, EINVAL); *error = EINVAL; return (NULL); @@ -5018,18 +5048,16 @@ #endif default: /* not supported family type */ - SCTP_INP_RUNLOCK(inp); SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, EINVAL); *error = EINVAL; return (NULL); } - SCTP_INP_RUNLOCK(inp); if (inp->sctp_flags & SCTP_PCB_FLAGS_UNBOUND) { /* * If you have not performed a bind, then we need to do the * ephemeral bind for you. */ - if ((err = sctp_inpcb_bind(inp->sctp_socket, NULL, NULL, p))) { + if ((err = sctp_inpcb_bind_locked(inp, NULL, NULL, p))) { /* bind error, probably perm */ *error = err; return (NULL); @@ -5048,35 +5076,18 @@ asoc = &stcb->asoc; SCTP_TCB_LOCK_INIT(stcb); - SCTP_TCB_SEND_LOCK_INIT(stcb); stcb->rport = rport; /* setup back pointer's */ stcb->sctp_ep = inp; stcb->sctp_socket = inp->sctp_socket; - if ((err = sctp_init_asoc(inp, stcb, override_tag, vrf_id, o_streams))) { + if ((err = sctp_init_asoc(inp, stcb, override_tag, initial_tsn, vrf_id, o_streams))) { /* failed */ SCTP_TCB_LOCK_DESTROY(stcb); - SCTP_TCB_SEND_LOCK_DESTROY(stcb); SCTP_ZONE_FREE(SCTP_BASE_INFO(ipi_zone_asoc), stcb); SCTP_DECR_ASOC_COUNT(); *error = err; return (NULL); } - /* and the port */ - SCTP_INP_INFO_WLOCK(); - SCTP_INP_WLOCK(inp); - if (inp->sctp_flags & (SCTP_PCB_FLAGS_SOCKET_GONE | SCTP_PCB_FLAGS_SOCKET_ALLGONE)) { - /* inpcb freed while alloc going on */ - SCTP_TCB_LOCK_DESTROY(stcb); - SCTP_TCB_SEND_LOCK_DESTROY(stcb); - SCTP_ZONE_FREE(SCTP_BASE_INFO(ipi_zone_asoc), stcb); - SCTP_INP_WUNLOCK(inp); - SCTP_INP_INFO_WUNLOCK(); - SCTP_DECR_ASOC_COUNT(); - SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_PCB, EINVAL); - *error = EINVAL; - return (NULL); - } SCTP_TCB_LOCK(stcb); asoc->assoc_id = sctp_aloc_a_assoc_id(inp, stcb); @@ -5084,9 +5095,8 @@ head = &SCTP_BASE_INFO(sctp_asochash)[SCTP_PCBHASH_ASOC(stcb->asoc.my_vtag, SCTP_BASE_INFO(hashasocmark))]; /* put it in the bucket in the vtag hash of assoc's for the system */ LIST_INSERT_HEAD(head, stcb, sctp_asocs); - SCTP_INP_INFO_WUNLOCK(); - if ((err = sctp_add_remote_addr(stcb, firstaddr, NULL, port, SCTP_DO_SETSCOPE, SCTP_ALLOC_ASOC))) { + if (sctp_add_remote_addr(stcb, firstaddr, NULL, port, SCTP_DO_SETSCOPE, SCTP_ALLOC_ASOC)) { /* failure.. memory error? */ if (asoc->strmout) { SCTP_FREE(asoc->strmout, SCTP_M_STRMO); @@ -5103,7 +5113,7 @@ SCTP_DECR_ASOC_COUNT(); SCTP_TCB_UNLOCK(stcb); SCTP_TCB_LOCK_DESTROY(stcb); - SCTP_TCB_SEND_LOCK_DESTROY(stcb); + LIST_REMOVE(stcb, sctp_asocs); LIST_REMOVE(stcb, sctp_tcbasocidhash); SCTP_ZONE_FREE(SCTP_BASE_INFO(ipi_zone_asoc), stcb); SCTP_INP_WUNLOCK(inp); @@ -5129,11 +5139,68 @@ if (initialize_auth_params == SCTP_INITIALIZE_AUTH_PARAMS) { sctp_initialize_auth_params(inp, stcb); } - SCTP_INP_WUNLOCK(inp); SCTPDBG(SCTP_DEBUG_PCB1, "Association %p now allocated\n", (void *)stcb); return (stcb); } +struct sctp_tcb * +sctp_aloc_assoc(struct sctp_inpcb *inp, struct sockaddr *firstaddr, + int *error, uint32_t override_tag, uint32_t initial_tsn, + uint32_t vrf_id, uint16_t o_streams, uint16_t port, +#if defined(__FreeBSD__) && !defined(__Userspace__) + struct thread *p, +#elif defined(_WIN32) && !defined(__Userspace__) + PKTHREAD p, +#else + struct proc *p, +#endif + int initialize_auth_params) +{ + struct sctp_tcb *stcb; + + SCTP_INP_INFO_WLOCK(); + SCTP_INP_WLOCK(inp); + stcb = sctp_aloc_assoc_locked(inp, firstaddr, error, override_tag, + initial_tsn, vrf_id, o_streams, port, p, initialize_auth_params); + SCTP_INP_INFO_WUNLOCK(); + SCTP_INP_WUNLOCK(inp); + return (stcb); +} + +struct sctp_tcb * +sctp_aloc_assoc_connected(struct sctp_inpcb *inp, struct sockaddr *firstaddr, + int *error, uint32_t override_tag, uint32_t initial_tsn, + uint32_t vrf_id, uint16_t o_streams, uint16_t port, +#if defined(__FreeBSD__) && !defined(__Userspace__) + struct thread *p, +#elif defined(_WIN32) && !defined(__Userspace__) + PKTHREAD p, +#else + struct proc *p, +#endif + int initialize_auth_params) +{ + struct sctp_tcb *stcb; + + SCTP_INP_INFO_WLOCK(); + SCTP_INP_WLOCK(inp); + if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) && + SCTP_IS_LISTENING(inp)) { + SCTP_INP_INFO_WUNLOCK(); + SCTP_INP_WUNLOCK(inp); + *error = EINVAL; + return (NULL); + } + stcb = sctp_aloc_assoc_locked(inp, firstaddr, error, override_tag, + initial_tsn, vrf_id, o_streams, port, p, initialize_auth_params); + SCTP_INP_INFO_WUNLOCK(); + if (stcb != NULL && (inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE)) { + inp->sctp_flags |= SCTP_PCB_FLAGS_CONNECTED; + soisconnecting(inp->sctp_socket); + } + SCTP_INP_WUNLOCK(inp); + return (stcb); +} void sctp_remove_net(struct sctp_tcb *stcb, struct sctp_nets *net) @@ -5185,6 +5252,10 @@ /* Clear net */ asoc->last_control_chunk_from = NULL; } + if (net == asoc->last_net_cmt_send_started) { + /* Clear net */ + asoc->last_net_cmt_send_started = NULL; + } if (net == stcb->asoc.alternate) { sctp_free_remote_addr(stcb->asoc.alternate); stcb->asoc.alternate = NULL; @@ -5237,100 +5308,70 @@ return (-2); } -void -sctp_delete_from_timewait(uint32_t tag, uint16_t lport, uint16_t rport) +static bool +sctp_is_in_timewait(uint32_t tag, uint16_t lport, uint16_t rport, uint32_t now) { struct sctpvtaghead *chain; struct sctp_tagblock *twait_block; - int found = 0; int i; + SCTP_INP_INFO_LOCK_ASSERT(); chain = &SCTP_BASE_INFO(vtag_timewait)[(tag % SCTP_STACK_VTAG_HASH_SIZE)]; LIST_FOREACH(twait_block, chain, sctp_nxt_tagblock) { for (i = 0; i < SCTP_NUMBER_IN_VTAG_BLOCK; i++) { - if ((twait_block->vtag_block[i].v_tag == tag) && - (twait_block->vtag_block[i].lport == lport) && - (twait_block->vtag_block[i].rport == rport)) { - twait_block->vtag_block[i].tv_sec_at_expire = 0; - twait_block->vtag_block[i].v_tag = 0; - twait_block->vtag_block[i].lport = 0; - twait_block->vtag_block[i].rport = 0; - found = 1; - break; + if ((twait_block->vtag_block[i].tv_sec_at_expire >= now) && + (twait_block->vtag_block[i].v_tag == tag) && + (twait_block->vtag_block[i].lport == lport) && + (twait_block->vtag_block[i].rport == rport)) { + return (true); } } - if (found) - break; } + return (false); } -int -sctp_is_in_timewait(uint32_t tag, uint16_t lport, uint16_t rport) +static void +sctp_set_vtag_block(struct sctp_timewait *vtag_block, uint32_t time, + uint32_t tag, uint16_t lport, uint16_t rport) { - struct sctpvtaghead *chain; - struct sctp_tagblock *twait_block; - int found = 0; - int i; - - SCTP_INP_INFO_WLOCK(); - chain = &SCTP_BASE_INFO(vtag_timewait)[(tag % SCTP_STACK_VTAG_HASH_SIZE)]; - LIST_FOREACH(twait_block, chain, sctp_nxt_tagblock) { - for (i = 0; i < SCTP_NUMBER_IN_VTAG_BLOCK; i++) { - if ((twait_block->vtag_block[i].v_tag == tag) && - (twait_block->vtag_block[i].lport == lport) && - (twait_block->vtag_block[i].rport == rport)) { - found = 1; - break; - } - } - if (found) - break; - } - SCTP_INP_INFO_WUNLOCK(); - return (found); + vtag_block->tv_sec_at_expire = time; + vtag_block->v_tag = tag; + vtag_block->lport = lport; + vtag_block->rport = rport; } - -void -sctp_add_vtag_to_timewait(uint32_t tag, uint32_t time, uint16_t lport, uint16_t rport) +static void +sctp_add_vtag_to_timewait(uint32_t tag, uint16_t lport, uint16_t rport) { struct sctpvtaghead *chain; struct sctp_tagblock *twait_block; struct timeval now; - int set, i; + uint32_t time; + int i; + bool set; - if (time == 0) { - /* Its disabled */ - return; - } + SCTP_INP_INFO_WLOCK_ASSERT(); (void)SCTP_GETTIME_TIMEVAL(&now); + time = (uint32_t)now.tv_sec + SCTP_BASE_SYSCTL(sctp_vtag_time_wait); chain = &SCTP_BASE_INFO(vtag_timewait)[(tag % SCTP_STACK_VTAG_HASH_SIZE)]; - set = 0; + set = false; LIST_FOREACH(twait_block, chain, sctp_nxt_tagblock) { /* Block(s) present, lets find space, and expire on the fly */ for (i = 0; i < SCTP_NUMBER_IN_VTAG_BLOCK; i++) { - if ((twait_block->vtag_block[i].v_tag == 0) && - !set) { - twait_block->vtag_block[i].tv_sec_at_expire = - now.tv_sec + time; - twait_block->vtag_block[i].v_tag = tag; - twait_block->vtag_block[i].lport = lport; - twait_block->vtag_block[i].rport = rport; - set = 1; - } else if ((twait_block->vtag_block[i].v_tag) && - ((long)twait_block->vtag_block[i].tv_sec_at_expire < now.tv_sec)) { - /* Audit expires this guy */ - twait_block->vtag_block[i].tv_sec_at_expire = 0; - twait_block->vtag_block[i].v_tag = 0; - twait_block->vtag_block[i].lport = 0; - twait_block->vtag_block[i].rport = 0; - if (set == 0) { - /* Reuse it for my new tag */ - twait_block->vtag_block[i].tv_sec_at_expire = now.tv_sec + time; - twait_block->vtag_block[i].v_tag = tag; - twait_block->vtag_block[i].lport = lport; - twait_block->vtag_block[i].rport = rport; - set = 1; + if ((twait_block->vtag_block[i].v_tag == 0) && !set) { + sctp_set_vtag_block(twait_block->vtag_block + i, time, tag, lport, rport); + set = true; + continue; + } + if ((twait_block->vtag_block[i].v_tag != 0) && + (twait_block->vtag_block[i].tv_sec_at_expire < (uint32_t)now.tv_sec)) { + if (set) { + /* Audit expires this guy */ + sctp_set_vtag_block(twait_block->vtag_block + i, 0, 0, 0, 0); + } else { + /* Reuse it for the new tag */ + sctp_set_vtag_block(twait_block->vtag_block + i, time, tag, lport, rport); + set = true; } } } @@ -5351,10 +5392,7 @@ } memset(twait_block, 0, sizeof(struct sctp_tagblock)); LIST_INSERT_HEAD(chain, twait_block, sctp_nxt_tagblock); - twait_block->vtag_block[0].tv_sec_at_expire = now.tv_sec + time; - twait_block->vtag_block[0].v_tag = tag; - twait_block->vtag_block[0].lport = lport; - twait_block->vtag_block[0].rport = rport; + sctp_set_vtag_block(twait_block->vtag_block, time, tag, lport, rport); } } @@ -5427,6 +5465,7 @@ #if defined(__APPLE__) && !defined(__Userspace__) sctp_lock_assert(SCTP_INP_SO(inp)); #endif + SCTP_TCB_LOCK_ASSERT(stcb); #ifdef SCTP_LOG_CLOSING sctp_log_closing(inp, stcb, 6); @@ -5529,13 +5568,12 @@ if ((stcb->asoc.refcnt) || (stcb->asoc.state & SCTP_STATE_IN_ACCEPT_QUEUE)) { /* Someone holds a reference OR the socket is unaccepted yet. */ - if ((stcb->asoc.refcnt) || + if ((stcb->asoc.refcnt) || (inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_ALLGONE) || (inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE)) { SCTP_CLEAR_SUBSTATE(stcb, SCTP_STATE_IN_ACCEPT_QUEUE); sctp_timer_start(SCTP_TIMER_TYPE_ASOCKILL, inp, stcb, NULL); } - SCTP_TCB_UNLOCK(stcb); if ((inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_ALLGONE) || (inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE)) /* nothing around */ @@ -5545,6 +5583,7 @@ sctp_sorwakeup(inp, so); sctp_sowwakeup(inp, so); } + SCTP_TCB_UNLOCK(stcb); #ifdef SCTP_LOG_CLOSING sctp_log_closing(inp, stcb, 9); @@ -5618,7 +5657,7 @@ */ /* re-increment the lock */ if (from_inpcbfree == SCTP_NORMAL_PROC) { - atomic_add_int(&stcb->asoc.refcnt, -1); + atomic_subtract_int(&stcb->asoc.refcnt, 1); } if (stcb->asoc.refcnt) { SCTP_CLEAR_SUBSTATE(stcb, SCTP_STATE_IN_ACCEPT_QUEUE); @@ -5637,6 +5676,9 @@ if (stcb->asoc.in_asocid_hash) { LIST_REMOVE(stcb, sctp_tcbasocidhash); } + if (inp->sctp_socket == NULL) { + stcb->sctp_socket = NULL; + } /* Now lets remove it from the list of ALL associations in the EP */ LIST_REMOVE(stcb, sctp_tcblist); if (from_inpcbfree == SCTP_NORMAL_PROC) { @@ -5645,8 +5687,7 @@ } /* pull from vtag hash */ LIST_REMOVE(stcb, sctp_asocs); - sctp_add_vtag_to_timewait(asoc->my_vtag, SCTP_BASE_SYSCTL(sctp_vtag_time_wait), - inp->sctp_lport, stcb->rport); + sctp_add_vtag_to_timewait(asoc->my_vtag, inp->sctp_lport, stcb->rport); /* Now restop the timers to be sure * this is paranoia at is finest! @@ -5658,7 +5699,6 @@ * in case. */ /* anything on the wheel needs to be removed */ - SCTP_TCB_SEND_LOCK(stcb); for (i = 0; i < asoc->streamoutcnt; i++) { struct sctp_stream_out *outs; @@ -5667,7 +5707,7 @@ TAILQ_FOREACH_SAFE(sp, &outs->outqueue, next, nsp) { atomic_subtract_int(&asoc->stream_queue_cnt, 1); TAILQ_REMOVE(&outs->outqueue, sp, next); - stcb->asoc.ss_functions.sctp_ss_remove_from_stream(stcb, asoc, outs, sp, 1); + stcb->asoc.ss_functions.sctp_ss_remove_from_stream(stcb, asoc, outs, sp); sctp_free_spbufspace(stcb, asoc, sp); if (sp->data) { if (so) { @@ -5689,7 +5729,6 @@ sctp_free_a_strmoq(stcb, sp, SCTP_SO_LOCKED); } } - SCTP_TCB_SEND_UNLOCK(stcb); /*sa_ignore FREED_MEMORY*/ TAILQ_FOREACH_SAFE(strrst, &asoc->resetHead, next_resp, nstrrst) { TAILQ_REMOVE(&asoc->resetHead, strrst, next_resp); @@ -5893,7 +5932,6 @@ /* Get rid of LOCK */ SCTP_TCB_UNLOCK(stcb); SCTP_TCB_LOCK_DESTROY(stcb); - SCTP_TCB_SEND_LOCK_DESTROY(stcb); if (from_inpcbfree == SCTP_NORMAL_PROC) { SCTP_INP_INFO_WUNLOCK(); SCTP_INP_RLOCK(inp); @@ -5945,8 +5983,6 @@ return (1); } - - /* * determine if a destination is "reachable" based upon the addresses bound * to the current endpoint (e.g. only v4 or v6 currently bound) @@ -6116,7 +6152,6 @@ return; } - /* * select a new (hopefully reachable) destination net (should only be used * when we deleted an ep addr that is the only usable source address to reach @@ -6140,7 +6175,6 @@ /* I can't there from here! ...we're gonna die shortly... */ } - /* * Delete the address from the endpoint local address list. There is nothing * to be done if we are bound to all addresses @@ -6453,7 +6487,7 @@ (void)kproc_create(sctp_mcore_thread, (void *)&sctp_mcore_workers[cpu], &sctp_mcore_workers[cpu].thread_proc, - RFPROC, + 0, SCTP_KTHREAD_PAGES, SCTP_MCORE_NAME); } @@ -6518,6 +6552,7 @@ #if defined(SCTP_PROCESS_LEVEL_LOCKS) #if !defined(_WIN32) pthread_mutexattr_init(&SCTP_BASE_VAR(mtx_attr)); + pthread_rwlockattr_init(&SCTP_BASE_VAR(rwlock_attr)); #ifdef INVARIANTS pthread_mutexattr_settype(&SCTP_BASE_VAR(mtx_attr), PTHREAD_MUTEX_ERRORCHECK); #endif @@ -6580,7 +6615,6 @@ #endif #endif - /* init the hash table of endpoints */ #if defined(__FreeBSD__) && !defined(__Userspace__) TUNABLE_INT_FETCH("net.inet.sctp.tcbhashsize", &SCTP_BASE_SYSCTL(sctp_hashtblsize)); @@ -6594,8 +6628,6 @@ SCTP_BASE_INFO(sctp_tcpephash) = SCTP_HASH_INIT(SCTP_BASE_SYSCTL(sctp_hashtblsize), &SCTP_BASE_INFO(hashtcpmark)); SCTP_BASE_INFO(hashtblsize) = SCTP_BASE_SYSCTL(sctp_hashtblsize); - - SCTP_BASE_INFO(sctp_vrfhash) = SCTP_HASH_INIT(SCTP_SIZE_OF_VRF_HASH, &SCTP_BASE_INFO(hashvrfmark)); @@ -6640,7 +6672,6 @@ sizeof(struct sctp_asconf_ack), (sctp_max_number_of_assoc * SCTP_BASE_SYSCTL(sctp_chunkscale))); - /* Master Lock INIT for info structure */ SCTP_INP_INFO_LOCK_INIT(); SCTP_STATLOG_INIT_LOCK(); @@ -6792,6 +6823,7 @@ #else pthread_cond_destroy(&sctp_it_ctl.iterator_wakeup); pthread_mutexattr_destroy(&SCTP_BASE_VAR(mtx_attr)); + pthread_rwlockattr_destroy(&SCTP_BASE_VAR(rwlock_attr)); #endif #endif /* In FreeBSD the iterator thread never exits @@ -6860,6 +6892,7 @@ * free the vrf/ifn/ifa lists and hashes (be sure address monitor * is destroyed first). */ + SCTP_IPI_ADDR_WLOCK(); vrf_bucket = &SCTP_BASE_INFO(sctp_vrfhash)[(SCTP_DEFAULT_VRFID & SCTP_BASE_INFO(hashvrfmark))]; LIST_FOREACH_SAFE(vrf, vrf_bucket, next_vrf, nvrf) { LIST_FOREACH_SAFE(ifn, &vrf->ifnlist, next_ifn, nifn) { @@ -6879,6 +6912,7 @@ LIST_REMOVE(vrf, next_vrf); SCTP_FREE(vrf, SCTP_M_VRF); } + SCTP_IPI_ADDR_WUNLOCK(); /* free the vrf hashes */ SCTP_HASH_FREE(SCTP_BASE_INFO(sctp_vrfhash), SCTP_BASE_INFO(hashvrfmark)); SCTP_HASH_FREE(SCTP_BASE_INFO(vrf_ifn_hash), SCTP_BASE_INFO(vrf_ifn_hashmark)); @@ -6959,7 +6993,6 @@ #endif } - int sctp_load_addresses_from_init(struct sctp_tcb *stcb, struct mbuf *m, int offset, int limit, @@ -7036,6 +7069,7 @@ peer_supports_prsctp = 0; peer_supports_auth = 0; peer_supports_asconf = 0; + peer_supports_asconf_ack = 0; peer_supports_reconfig = 0; peer_supports_nrsack = 0; peer_supports_pktdrop = 0; @@ -7047,7 +7081,7 @@ inp = stcb->sctp_ep; atomic_add_int(&stcb->asoc.refcnt, 1); stcb_tmp = sctp_findassociation_ep_addr(&inp, sa, &net_tmp, dst, stcb); - atomic_add_int(&stcb->asoc.refcnt, -1); + atomic_subtract_int(&stcb->asoc.refcnt, 1); if ((stcb_tmp == NULL && inp == stcb->sctp_ep) || inp == NULL) { /* we must add the source address */ @@ -7140,7 +7174,7 @@ atomic_add_int(&stcb->asoc.refcnt, 1); stcb_tmp = sctp_findassociation_ep_addr(&inp, sa, &net, dst, stcb); - atomic_add_int(&stcb->asoc.refcnt, -1); + atomic_subtract_int(&stcb->asoc.refcnt, 1); if ((stcb_tmp == NULL && inp == stcb->sctp_ep) || inp == NULL) { @@ -7188,7 +7222,7 @@ op_err = sctp_generate_cause(SCTP_BASE_SYSCTL(sctp_diag_info_code), msg); sctp_abort_an_association(stcb_tmp->sctp_ep, - stcb_tmp, op_err, + stcb_tmp, op_err, false, SCTP_SO_NOT_LOCKED); goto add_it_now; } @@ -7233,7 +7267,7 @@ atomic_add_int(&stcb->asoc.refcnt, 1); stcb_tmp = sctp_findassociation_ep_addr(&inp, sa, &net, dst, stcb); - atomic_add_int(&stcb->asoc.refcnt, -1); + atomic_subtract_int(&stcb->asoc.refcnt, 1); if (stcb_tmp == NULL && (inp == stcb->sctp_ep || inp == NULL)) { /* @@ -7282,7 +7316,7 @@ op_err = sctp_generate_cause(SCTP_BASE_SYSCTL(sctp_diag_info_code), msg); sctp_abort_an_association(stcb_tmp->sctp_ep, - stcb_tmp, op_err, + stcb_tmp, op_err, false, SCTP_SO_NOT_LOCKED); goto add_it_now6; } @@ -7422,7 +7456,6 @@ default: /* one I have not learned yet */ break; - } } } else if (ptype == SCTP_RANDOM) { @@ -7505,7 +7538,6 @@ saw_asconf = 1; if (chunks->chunk_types[i] == SCTP_ASCONF_ACK) saw_asconf_ack = 1; - } got_chklist = 1; } else if ((ptype == SCTP_HEARTBEAT_INFO) || @@ -7517,7 +7549,7 @@ (ptype == SCTP_DEL_IP_ADDRESS) || (ptype == SCTP_ERROR_CAUSE_IND) || (ptype == SCTP_SUCCESS_REPORT)) { - /* don't care */ ; + /* don't care */ } else { if ((ptype & 0x8000) == 0x0000) { /* @@ -7537,7 +7569,7 @@ break; } phdr = sctp_get_next_param(m, offset, ¶m_buf, - sizeof(param_buf)); + sizeof(param_buf)); } /* Now check to see if we need to purge any addresses */ TAILQ_FOREACH_SAFE(net, &stcb->asoc.nets, sctp_next, nnet) { @@ -7547,11 +7579,15 @@ /* remove and free it */ stcb->asoc.numnets--; TAILQ_REMOVE(&stcb->asoc.nets, net, sctp_next); - sctp_free_remote_addr(net); + if (net == stcb->asoc.alternate) { + sctp_free_remote_addr(stcb->asoc.alternate); + stcb->asoc.alternate = NULL; + } if (net == stcb->asoc.primary_destination) { stcb->asoc.primary_destination = NULL; sctp_select_primary_destination(stcb); } + sctp_free_remote_addr(net); } } if ((stcb->asoc.ecn_supported == 1) && @@ -7586,7 +7622,7 @@ stcb->asoc.nrsack_supported = 0; } if ((stcb->asoc.pktdrop_supported == 1) && - (peer_supports_pktdrop == 0)){ + (peer_supports_pktdrop == 0)) { stcb->asoc.pktdrop_supported = 0; } /* validate authentication required parameters */ @@ -7659,7 +7695,8 @@ return (0); } stcb->asoc.primary_destination = net; - if (!(net->dest_state & SCTP_ADDR_PF) && (stcb->asoc.alternate)) { + if (((net->dest_state & SCTP_ADDR_PF) == 0) && + (stcb->asoc.alternate != NULL)) { sctp_free_remote_addr(stcb->asoc.alternate); stcb->asoc.alternate = NULL; } @@ -7677,24 +7714,15 @@ } } -int +bool sctp_is_vtag_good(uint32_t tag, uint16_t lport, uint16_t rport, struct timeval *now) { - /* - * This function serves two purposes. It will see if a TAG can be - * re-used and return 1 for yes it is ok and 0 for don't use that - * tag. A secondary function it will do is purge out old tags that - * can be removed. - */ - struct sctpvtaghead *chain; - struct sctp_tagblock *twait_block; struct sctpasochead *head; struct sctp_tcb *stcb; - int i; - SCTP_INP_INFO_RLOCK(); - head = &SCTP_BASE_INFO(sctp_asochash)[SCTP_PCBHASH_ASOC(tag, - SCTP_BASE_INFO(hashasocmark))]; + SCTP_INP_INFO_LOCK_ASSERT(); + + head = &SCTP_BASE_INFO(sctp_asochash)[SCTP_PCBHASH_ASOC(tag, SCTP_BASE_INFO(hashasocmark))]; LIST_FOREACH(stcb, head, sctp_asocs) { /* We choose not to lock anything here. TCB's can't be * removed since we have the read lock, so they can't @@ -7713,40 +7741,11 @@ if (stcb->sctp_ep->sctp_lport != lport) { continue; } - /* Its a used tag set */ - SCTP_INP_INFO_RUNLOCK(); - return (0); - } - } - chain = &SCTP_BASE_INFO(vtag_timewait)[(tag % SCTP_STACK_VTAG_HASH_SIZE)]; - /* Now what about timed wait ? */ - LIST_FOREACH(twait_block, chain, sctp_nxt_tagblock) { - /* - * Block(s) are present, lets see if we have this tag in the - * list - */ - for (i = 0; i < SCTP_NUMBER_IN_VTAG_BLOCK; i++) { - if (twait_block->vtag_block[i].v_tag == 0) { - /* not used */ - continue; - } else if ((long)twait_block->vtag_block[i].tv_sec_at_expire < - now->tv_sec) { - /* Audit expires this guy */ - twait_block->vtag_block[i].tv_sec_at_expire = 0; - twait_block->vtag_block[i].v_tag = 0; - twait_block->vtag_block[i].lport = 0; - twait_block->vtag_block[i].rport = 0; - } else if ((twait_block->vtag_block[i].v_tag == tag) && - (twait_block->vtag_block[i].lport == lport) && - (twait_block->vtag_block[i].rport == rport)) { - /* Bad tag, sorry :< */ - SCTP_INP_INFO_RUNLOCK(); - return (0); - } + /* The tag is currently used, so don't use it. */ + return (false); } } - SCTP_INP_INFO_RUNLOCK(); - return (1); + return (!sctp_is_in_timewait(tag, lport, rport, (uint32_t)now->tv_sec)); } static void @@ -7778,7 +7777,7 @@ for (strmat = 0; strmat < asoc->streamincnt; strmat++) { TAILQ_FOREACH_SAFE(control, &asoc->strmin[strmat].inqueue, next_instrm, ncontrol) { #ifdef INVARIANTS - if (control->on_strm_q != SCTP_ON_ORDERED ) { + if (control->on_strm_q != SCTP_ON_ORDERED) { panic("Huh control: %p on_q: %d -- not ordered?", control, control->on_strm_q); } @@ -7838,7 +7837,7 @@ } TAILQ_FOREACH_SAFE(control, &asoc->strmin[strmat].uno_inqueue, next_instrm, ncontrol) { #ifdef INVARIANTS - if (control->on_strm_q != SCTP_ON_UNORDERED ) { + if (control->on_strm_q != SCTP_ON_UNORDERED) { panic("Huh control: %p on_q: %d -- not unordered?", control, control->on_strm_q); } @@ -7951,7 +7950,7 @@ } void -sctp_drain() +sctp_drain(void) { /* * We must walk the PCB lists for ALL associations here. The system @@ -8076,7 +8075,6 @@ } SCTP_INP_INFO_RUNLOCK(); it->iterator_flags = SCTP_ITERATOR_DO_ALL_INP; - } SCTP_IPI_ITERATOR_WQ_LOCK(); if (SCTP_BASE_VAR(sctp_pcb_initialized) == 0) { @@ -8094,3 +8092,18 @@ /* sa_ignore MEMLEAK {memory is put on the tailq for the iterator} */ return (0); } + +/* + * Atomically add flags to the sctp_flags of an inp. + * To be used when the write lock of the inp is not held. + */ +void +sctp_pcb_add_flags(struct sctp_inpcb *inp, uint32_t flags) +{ + uint32_t old_flags, new_flags; + + do { + old_flags = inp->sctp_flags; + new_flags = old_flags | flags; + } while (atomic_cmpset_int(&inp->sctp_flags, old_flags, new_flags) == 0); +} diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_pcb.h firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_pcb.h --- firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_pcb.h 2022-12-05 23:00:55.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_pcb.h 2023-01-09 15:01:10.000000000 +0000 @@ -34,7 +34,7 @@ #if defined(__FreeBSD__) && !defined(__Userspace__) #include -__FBSDID("$FreeBSD: head/sys/netinet/sctp_pcb.h 362106 2020-06-12 16:31:13Z tuexen $"); +__FBSDID("$FreeBSD$"); #endif #ifndef _NETINET_SCTP_PCB_H_ @@ -147,7 +147,6 @@ struct sctp_timewait vtag_block[SCTP_NUMBER_IN_VTAG_BLOCK]; }; - struct sctp_epinfo { #if defined(__FreeBSD__) && !defined(__Userspace__) #ifdef INET @@ -211,8 +210,8 @@ struct mtx ipi_pktlog_mtx; struct mtx wq_addr_mtx; #elif defined(SCTP_PROCESS_LEVEL_LOCKS) - userland_mutex_t ipi_ep_mtx; - userland_mutex_t ipi_addr_mtx; + userland_rwlock_t ipi_ep_mtx; + userland_rwlock_t ipi_addr_mtx; userland_mutex_t ipi_count_mtx; userland_mutex_t ipi_pktlog_mtx; userland_mutex_t wq_addr_mtx; @@ -277,7 +276,6 @@ #endif }; - struct sctp_base_info { /* All static structures that * anchor the system must be here. @@ -314,6 +312,7 @@ int timer_thread_started; #if !defined(_WIN32) pthread_mutexattr_t mtx_attr; + pthread_rwlockattr_t rwlock_attr; #if defined(INET) || defined(INET6) int userspace_route; userland_thread_t recvthreadroute; @@ -440,7 +439,6 @@ }; #define SCTP_READ_LOG_SIZE 135 /* we choose the number to make a pcb a page */ - struct sctp_inpcb { /*- * put an inpcb in front of it all, kind of a waste but we need to @@ -451,7 +449,6 @@ char align[(sizeof(struct inpcb) + SCTP_ALIGNM1) & ~SCTP_ALIGNM1]; } ip_inp; - #if defined(__APPLE__) && !defined(__Userspace__) /* leave some space in case i386 inpcb is bigger than ppc */ uint8_t padding[128]; @@ -461,7 +458,7 @@ struct sctp_readhead read_queue; LIST_ENTRY(sctp_inpcb) sctp_list; /* lists all endpoints */ - /* hash of all endpoints for model */ + /* hash of all endpoints for model */ LIST_ENTRY(sctp_inpcb) sctp_hash; /* count of local addresses bound, 0 if bound all */ int laddr_count; @@ -485,7 +482,6 @@ #ifdef SCTP_TRACK_FREED_ASOCS struct sctpasochead sctp_asoc_free_list; #endif - struct sctp_iterator *inp_starting_point_for_iterator; uint32_t sctp_frag_point; uint32_t partial_delivery_point; uint32_t sctp_context; @@ -581,7 +577,7 @@ int (*recv_callback)(struct socket *, union sctp_sockstore, void *, size_t, struct sctp_rcvinfo, int, void *); uint32_t send_sb_threshold; - int (*send_callback)(struct socket *, uint32_t); + int (*send_callback)(struct socket *, uint32_t, void *); #endif }; @@ -589,7 +585,7 @@ int register_recv_cb (struct socket *, int (*)(struct socket *, union sctp_sockstore, void *, size_t, struct sctp_rcvinfo, int, void *)); -int register_send_cb (struct socket *, uint32_t, int (*)(struct socket *, uint32_t)); +int register_send_cb (struct socket *, uint32_t, int (*)(struct socket *, uint32_t, void *)); int register_ulp_info (struct socket *, void *); int retrieve_ulp_info (struct socket *, void **); @@ -621,16 +617,12 @@ uint16_t resv; #if defined(__FreeBSD__) && !defined(__Userspace__) struct mtx tcb_mtx; - struct mtx tcb_send_mtx; #elif defined(SCTP_PROCESS_LEVEL_LOCKS) userland_mutex_t tcb_mtx; - userland_mutex_t tcb_send_mtx; #elif defined(__APPLE__) && !defined(__Userspace__) lck_mtx_t* tcb_mtx; - lck_mtx_t* tcb_send_mtx; #elif defined(_WIN32) && !defined(__Userspace__) struct spinlock tcb_lock; - struct spinlock tcb_send_lock; #elif defined(__Userspace__) #endif #if defined(__APPLE__) && !defined(__Userspace__) @@ -640,11 +632,8 @@ #endif }; - #if defined(__FreeBSD__) && !defined(__Userspace__) - #include - #elif defined(__APPLE__) && !defined(__Userspace__) /* * Apple MacOS X 10.4 "Tiger" @@ -678,7 +667,7 @@ * the real definition. */ #if defined(__FreeBSD__) && !defined(__Userspace__) -VNET_DECLARE(struct sctp_base_info, system_base_info) ; +VNET_DECLARE(struct sctp_base_info, system_base_info); #else extern struct sctp_base_info system_base_info; #endif @@ -720,26 +709,35 @@ void sctp_free_ifn(struct sctp_ifn *sctp_ifnp); void sctp_free_ifa(struct sctp_ifa *sctp_ifap); - void sctp_del_addr_from_vrf(uint32_t vrfid, struct sockaddr *addr, uint32_t ifn_index, const char *if_name); - - struct sctp_nets *sctp_findnet(struct sctp_tcb *, struct sockaddr *); struct sctp_inpcb *sctp_pcb_findep(struct sockaddr *, int, int, uint32_t); #if defined(__FreeBSD__) && !defined(__Userspace__) -int sctp_inpcb_bind(struct socket *, struct sockaddr *, - struct sctp_ifa *,struct thread *); +int +sctp_inpcb_bind(struct socket *, struct sockaddr *, + struct sctp_ifa *, struct thread *); +int +sctp_inpcb_bind_locked(struct sctp_inpcb *, struct sockaddr *, + struct sctp_ifa *, struct thread *); #elif defined(_WIN32) && !defined(__Userspace__) -int sctp_inpcb_bind(struct socket *, struct sockaddr *, - struct sctp_ifa *,PKTHREAD); +int +sctp_inpcb_bind(struct socket *, struct sockaddr *, + struct sctp_ifa *, PKTHREAD); +int +sctp_inpcb_bind_locked(struct sctp_inpcb *, struct sockaddr *, + struct sctp_ifa *, PKTHREAD); #else /* struct proc is a dummy for __Userspace__ */ -int sctp_inpcb_bind(struct socket *, struct sockaddr *, - struct sctp_ifa *, struct proc *); +int +sctp_inpcb_bind(struct socket *, struct sockaddr *, + struct sctp_ifa *, struct proc *); +int +sctp_inpcb_bind_locked(struct sctp_inpcb *, struct sockaddr *, + struct sctp_ifa *, struct proc *); #endif struct sctp_tcb * @@ -790,30 +788,31 @@ #if defined(__FreeBSD__) && !defined(__Userspace__) struct sctp_tcb * sctp_aloc_assoc(struct sctp_inpcb *, struct sockaddr *, - int *, uint32_t, uint32_t, uint16_t, uint16_t, struct thread *, - int); + int *, uint32_t, uint32_t, uint32_t, uint16_t, uint16_t, + struct thread *, int); +struct sctp_tcb * +sctp_aloc_assoc_connected(struct sctp_inpcb *, struct sockaddr *, + int *, uint32_t, uint32_t, uint32_t, uint16_t, uint16_t, + struct thread *, int); #elif defined(_WIN32) && !defined(__Userspace__) struct sctp_tcb * -sctp_aloc_assoc(struct sctp_inpcb *, struct sockaddr *, - int *, uint32_t, uint32_t, uint16_t, uint16_t, PKTHREAD, int); +sctp_aloc_assoc(struct sctp_inpcb *, struct sockaddr *, int *, uint32_t, + uint32_t, uint32_t, uint16_t, uint16_t, PKTHREAD, int); +struct sctp_tcb * +sctp_aloc_assoc_connected(struct sctp_inpcb *, struct sockaddr *, int *, uint32_t, + uint32_t, uint32_t, uint16_t, uint16_t, PKTHREAD, int); #else /* proc will be NULL for __Userspace__ */ struct sctp_tcb * -sctp_aloc_assoc(struct sctp_inpcb *, struct sockaddr *, - int *, uint32_t, uint32_t, uint16_t, uint16_t, struct proc *, - int); +sctp_aloc_assoc(struct sctp_inpcb *, struct sockaddr *, int *, uint32_t, + uint32_t, uint32_t, uint16_t, uint16_t, struct proc *, int); +struct sctp_tcb * +sctp_aloc_assoc_connected(struct sctp_inpcb *, struct sockaddr *, int *, uint32_t, + uint32_t, uint32_t, uint16_t, uint16_t, struct proc *, int); #endif int sctp_free_assoc(struct sctp_inpcb *, struct sctp_tcb *, int, int); - -void sctp_delete_from_timewait(uint32_t, uint16_t, uint16_t); - -int sctp_is_in_timewait(uint32_t tag, uint16_t lport, uint16_t rport); - -void -sctp_add_vtag_to_timewait(uint32_t tag, uint32_t time, uint16_t lport, uint16_t rport); - void sctp_add_local_addr_ep(struct sctp_inpcb *, struct sctp_ifa *, uint32_t); void sctp_del_local_addr_ep(struct sctp_inpcb *, struct sctp_ifa *); @@ -843,7 +842,8 @@ sctp_set_primary_addr(struct sctp_tcb *, struct sockaddr *, struct sctp_nets *); -int sctp_is_vtag_good(uint32_t, uint16_t lport, uint16_t rport, struct timeval *); +bool +sctp_is_vtag_good(uint32_t, uint16_t lport, uint16_t rport, struct timeval *); /* void sctp_drain(void); */ @@ -853,6 +853,9 @@ void sctp_clean_up_stream(struct sctp_tcb *stcb, struct sctp_readhead *rh); +void +sctp_pcb_add_flags(struct sctp_inpcb *, uint32_t); + /*- * Null in last arg inpcb indicate run on ALL ep's. Specific inp in last arg * indicates run on ONLY assoc's of the specified endpoint. diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_peeloff.c firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_peeloff.c --- firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_peeloff.c 2022-12-05 23:01:12.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_peeloff.c 2023-01-09 15:01:10.000000000 +0000 @@ -34,7 +34,7 @@ #if defined(__FreeBSD__) && !defined(__Userspace__) #include -__FBSDID("$FreeBSD: head/sys/netinet/sctp_peeloff.c 362054 2020-06-11 13:34:09Z tuexen $"); +__FBSDID("$FreeBSD$"); #endif #include @@ -134,7 +134,6 @@ n_inp->sctp_context = inp->sctp_context; n_inp->max_cwnd = inp->max_cwnd; n_inp->local_strreset_support = inp->local_strreset_support; - n_inp->inp_starting_point_for_iterator = NULL; /* copy in the authentication parameters from the original endpoint */ if (n_inp->sctp_ep.local_hmacs) sctp_free_hmaclist(n_inp->sctp_ep.local_hmacs); diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_peeloff.h firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_peeloff.h --- firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_peeloff.h 2022-12-05 23:01:07.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_peeloff.h 2023-01-09 15:01:10.000000000 +0000 @@ -34,7 +34,7 @@ #if defined(__FreeBSD__) && !defined(__Userspace__) #include -__FBSDID("$FreeBSD: head/sys/netinet/sctp_peeloff.h 309607 2016-12-06 10:21:25Z tuexen $"); +__FBSDID("$FreeBSD$"); #endif #ifndef _NETINET_SCTP_PEELOFF_H_ diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_process_lock.h firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_process_lock.h --- firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_process_lock.h 2022-12-05 23:00:55.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_process_lock.h 2023-01-09 15:01:10.000000000 +0000 @@ -60,6 +60,9 @@ #define SCTP_INP_INFO_RUNLOCK() #define SCTP_INP_INFO_WLOCK() #define SCTP_INP_INFO_WUNLOCK() +#define SCTP_INP_INFO_LOCK_ASSERT() +#define SCTP_INP_INFO_RLOCK_ASSERT() +#define SCTP_INP_INFO_WLOCK_ASSERT() #define SCTP_INP_INFO_LOCK_DESTROY() #define SCTP_IPI_COUNT_INIT() #define SCTP_IPI_COUNT_DESTROY() @@ -69,16 +72,14 @@ #define SCTP_INP_INFO_RUNLOCK() #define SCTP_INP_INFO_WLOCK() #define SCTP_INP_INFO_WUNLOCK() +#define SCTP_INP_INFO_LOCK_ASSERT() +#define SCTP_INP_INFO_RLOCK_ASSERT() +#define SCTP_INP_INFO_WLOCK_ASSERT() #define SCTP_INP_INFO_LOCK_DESTROY() #define SCTP_IPI_COUNT_INIT() #define SCTP_IPI_COUNT_DESTROY() #endif -#define SCTP_TCB_SEND_LOCK_INIT(_tcb) -#define SCTP_TCB_SEND_LOCK_DESTROY(_tcb) -#define SCTP_TCB_SEND_LOCK(_tcb) -#define SCTP_TCB_SEND_UNLOCK(_tcb) - /* Lock for INP */ #define SCTP_INP_LOCK_INIT(_inp) #define SCTP_INP_LOCK_DESTROY(_inp) @@ -128,6 +129,7 @@ LeaveCriticalSection(&SCTP_BASE_INFO(wq_addr_mtx)) #define SCTP_WQ_ADDR_LOCK_ASSERT() +#if WINVER < 0x0600 #define SCTP_INP_INFO_LOCK_INIT() \ InitializeCriticalSection(&SCTP_BASE_INFO(ipi_ep_mtx)) #define SCTP_INP_INFO_LOCK_DESTROY() \ @@ -142,6 +144,27 @@ LeaveCriticalSection(&SCTP_BASE_INFO(ipi_ep_mtx)) #define SCTP_INP_INFO_WUNLOCK() \ LeaveCriticalSection(&SCTP_BASE_INFO(ipi_ep_mtx)) +#define SCTP_INP_INFO_LOCK_ASSERT() +#define SCTP_INP_INFO_RLOCK_ASSERT() +#define SCTP_INP_INFO_WLOCK_ASSERT() +#else +#define SCTP_INP_INFO_LOCK_INIT() \ + InitializeSRWLock(&SCTP_BASE_INFO(ipi_ep_mtx)) +#define SCTP_INP_INFO_LOCK_DESTROY() +#define SCTP_INP_INFO_RLOCK() \ + AcquireSRWLockShared(&SCTP_BASE_INFO(ipi_ep_mtx)) +#define SCTP_INP_INFO_TRYLOCK() \ + TryAcquireSRWLockShared(&SCTP_BASE_INFO(ipi_ep_mtx)) +#define SCTP_INP_INFO_WLOCK() \ + AcquireSRWLockExclusive(&SCTP_BASE_INFO(ipi_ep_mtx)) +#define SCTP_INP_INFO_RUNLOCK() \ + ReleaseSRWLockShared(&SCTP_BASE_INFO(ipi_ep_mtx)) +#define SCTP_INP_INFO_WUNLOCK() \ + ReleaseSRWLockExclusive(&SCTP_BASE_INFO(ipi_ep_mtx)) +#define SCTP_INP_INFO_LOCK_ASSERT() +#define SCTP_INP_INFO_RLOCK_ASSERT() +#define SCTP_INP_INFO_WLOCK_ASSERT() +#endif #define SCTP_IP_PKTLOG_INIT() \ InitializeCriticalSection(&SCTP_BASE_INFO(ipi_pktlog_mtx)) @@ -190,17 +213,8 @@ #define SCTP_INP_RLOCK_ASSERT(_tcb) #define SCTP_INP_WLOCK_ASSERT(_tcb) -#define SCTP_TCB_SEND_LOCK_INIT(_tcb) \ - InitializeCriticalSection(&(_tcb)->tcb_send_mtx) -#define SCTP_TCB_SEND_LOCK_DESTROY(_tcb) \ - DeleteCriticalSection(&(_tcb)->tcb_send_mtx) -#define SCTP_TCB_SEND_LOCK(_tcb) \ - EnterCriticalSection(&(_tcb)->tcb_send_mtx) -#define SCTP_TCB_SEND_UNLOCK(_tcb) \ - LeaveCriticalSection(&(_tcb)->tcb_send_mtx) - #define SCTP_INP_INCR_REF(_inp) atomic_add_int(&((_inp)->refcount), 1) -#define SCTP_INP_DECR_REF(_inp) atomic_add_int(&((_inp)->refcount), -1) +#define SCTP_INP_DECR_REF(_inp) atomic_subtract_int(&((_inp)->refcount), 1) #define SCTP_ASOC_CREATE_LOCK_INIT(_inp) \ InitializeCriticalSection(&(_inp)->inp_create_mtx) @@ -258,9 +272,9 @@ (void)pthread_mutex_destroy(&SCTP_BASE_INFO(wq_addr_mtx)) #ifdef INVARIANTS #define SCTP_WQ_ADDR_LOCK() \ - KASSERT(pthread_mutex_lock(&SCTP_BASE_INFO(wq_addr_mtx)) == 0, ("%s: wq_addr_mtx already locked", __func__)) + KASSERT(pthread_mutex_lock(&SCTP_BASE_INFO(wq_addr_mtx)) == 0, ("%s:%d: wq_addr_mtx already locked", __FILE__, __LINE__)) #define SCTP_WQ_ADDR_UNLOCK() \ - KASSERT(pthread_mutex_unlock(&SCTP_BASE_INFO(wq_addr_mtx)) == 0, ("%s: wq_addr_mtx not locked", __func__)) + KASSERT(pthread_mutex_unlock(&SCTP_BASE_INFO(wq_addr_mtx)) == 0, ("%s:%d: wq_addr_mtx not locked", __FILE__, __LINE__)) #else #define SCTP_WQ_ADDR_LOCK() \ (void)pthread_mutex_lock(&SCTP_BASE_INFO(wq_addr_mtx)) @@ -268,33 +282,36 @@ (void)pthread_mutex_unlock(&SCTP_BASE_INFO(wq_addr_mtx)) #endif #define SCTP_WQ_ADDR_LOCK_ASSERT() \ - KASSERT(pthread_mutex_trylock(&SCTP_BASE_INFO(wq_addr_mtx)) == EBUSY, ("%s: wq_addr_mtx not locked", __func__)) + KASSERT(pthread_mutex_trylock(&SCTP_BASE_INFO(wq_addr_mtx)) == EBUSY, ("%s:%d: wq_addr_mtx not locked", __FILE__, __LINE__)) #define SCTP_INP_INFO_LOCK_INIT() \ - (void)pthread_mutex_init(&SCTP_BASE_INFO(ipi_ep_mtx), &SCTP_BASE_VAR(mtx_attr)) + (void)pthread_rwlock_init(&SCTP_BASE_INFO(ipi_ep_mtx), &SCTP_BASE_VAR(rwlock_attr)) #define SCTP_INP_INFO_LOCK_DESTROY() \ - (void)pthread_mutex_destroy(&SCTP_BASE_INFO(ipi_ep_mtx)) + (void)pthread_rwlock_destroy(&SCTP_BASE_INFO(ipi_ep_mtx)) #ifdef INVARIANTS #define SCTP_INP_INFO_RLOCK() \ - KASSERT(pthread_mutex_lock(&SCTP_BASE_INFO(ipi_ep_mtx)) == 0, ("%s: ipi_ep_mtx already locked", __func__)) + KASSERT(pthread_rwlock_rdlock(&SCTP_BASE_INFO(ipi_ep_mtx)) == 0, ("%s%d: ipi_ep_mtx already locked", __FILE__, __LINE__)) #define SCTP_INP_INFO_WLOCK() \ - KASSERT(pthread_mutex_lock(&SCTP_BASE_INFO(ipi_ep_mtx)) == 0, ("%s: ipi_ep_mtx already locked", __func__)) + KASSERT(pthread_rwlock_wrlock(&SCTP_BASE_INFO(ipi_ep_mtx)) == 0, ("%s:%d: ipi_ep_mtx already locked", __FILE__, __LINE__)) #define SCTP_INP_INFO_RUNLOCK() \ - KASSERT(pthread_mutex_unlock(&SCTP_BASE_INFO(ipi_ep_mtx)) == 0, ("%s: ipi_ep_mtx not locked", __func__)) + KASSERT(pthread_rwlock_unlock(&SCTP_BASE_INFO(ipi_ep_mtx)) == 0, ("%s:%d: ipi_ep_mtx not locked", __FILE__, __LINE__)) #define SCTP_INP_INFO_WUNLOCK() \ - KASSERT(pthread_mutex_unlock(&SCTP_BASE_INFO(ipi_ep_mtx)) == 0, ("%s: ipi_ep_mtx not locked", __func__)) + KASSERT(pthread_rwlock_unlock(&SCTP_BASE_INFO(ipi_ep_mtx)) == 0, ("%s:%d: ipi_ep_mtx not locked", __FILE__, __LINE__)) #else #define SCTP_INP_INFO_RLOCK() \ - (void)pthread_mutex_lock(&SCTP_BASE_INFO(ipi_ep_mtx)) + (void)pthread_rwlock_rdlock(&SCTP_BASE_INFO(ipi_ep_mtx)) #define SCTP_INP_INFO_WLOCK() \ - (void)pthread_mutex_lock(&SCTP_BASE_INFO(ipi_ep_mtx)) + (void)pthread_rwlock_wrlock(&SCTP_BASE_INFO(ipi_ep_mtx)) #define SCTP_INP_INFO_RUNLOCK() \ - (void)pthread_mutex_unlock(&SCTP_BASE_INFO(ipi_ep_mtx)) + (void)pthread_rwlock_unlock(&SCTP_BASE_INFO(ipi_ep_mtx)) #define SCTP_INP_INFO_WUNLOCK() \ - (void)pthread_mutex_unlock(&SCTP_BASE_INFO(ipi_ep_mtx)) + (void)pthread_rwlock_unlock(&SCTP_BASE_INFO(ipi_ep_mtx)) #endif +#define SCTP_INP_INFO_LOCK_ASSERT() +#define SCTP_INP_INFO_RLOCK_ASSERT() +#define SCTP_INP_INFO_WLOCK_ASSERT() #define SCTP_INP_INFO_TRYLOCK() \ - (!(pthread_mutex_trylock(&SCTP_BASE_INFO(ipi_ep_mtx)))) + (!(pthread_rwlock_tryrdlock(&SCTP_BASE_INFO(ipi_ep_mtx)))) #define SCTP_IP_PKTLOG_INIT() \ (void)pthread_mutex_init(&SCTP_BASE_INFO(ipi_pktlog_mtx), &SCTP_BASE_VAR(mtx_attr)) @@ -302,9 +319,9 @@ (void)pthread_mutex_destroy(&SCTP_BASE_INFO(ipi_pktlog_mtx)) #ifdef INVARIANTS #define SCTP_IP_PKTLOG_LOCK() \ - KASSERT(pthread_mutex_lock(&SCTP_BASE_INFO(ipi_pktlog_mtx)) == 0, ("%s: ipi_pktlog_mtx already locked", __func__)) + KASSERT(pthread_mutex_lock(&SCTP_BASE_INFO(ipi_pktlog_mtx)) == 0, ("%s:%d: ipi_pktlog_mtx already locked", __FILE__, __LINE__)) #define SCTP_IP_PKTLOG_UNLOCK() \ - KASSERT(pthread_mutex_unlock(&SCTP_BASE_INFO(ipi_pktlog_mtx)) == 0, ("%s: ipi_pktlog_mtx not locked", __func__)) + KASSERT(pthread_mutex_unlock(&SCTP_BASE_INFO(ipi_pktlog_mtx)) == 0, ("%s:%d: ipi_pktlog_mtx not locked", __FILE__, __LINE__)) #else #define SCTP_IP_PKTLOG_LOCK() \ (void)pthread_mutex_lock(&SCTP_BASE_INFO(ipi_pktlog_mtx)) @@ -324,9 +341,9 @@ (void)pthread_mutex_destroy(&(_inp)->inp_rdata_mtx) #ifdef INVARIANTS #define SCTP_INP_READ_LOCK(_inp) \ - KASSERT(pthread_mutex_lock(&(_inp)->inp_rdata_mtx) == 0, ("%s: inp_rdata_mtx already locked", __func__)) + KASSERT(pthread_mutex_lock(&(_inp)->inp_rdata_mtx) == 0, ("%s:%d: inp_rdata_mtx already locked", __FILE__, __LINE__)) #define SCTP_INP_READ_UNLOCK(_inp) \ - KASSERT(pthread_mutex_unlock(&(_inp)->inp_rdata_mtx) == 0, ("%s: inp_rdata_mtx not locked", __func__)) + KASSERT(pthread_mutex_unlock(&(_inp)->inp_rdata_mtx) == 0, ("%s:%d: inp_rdata_mtx not locked", __FILE__, __LINE__)) #else #define SCTP_INP_READ_LOCK(_inp) \ (void)pthread_mutex_lock(&(_inp)->inp_rdata_mtx) @@ -340,26 +357,26 @@ (void)pthread_mutex_destroy(&(_inp)->inp_mtx) #ifdef INVARIANTS #ifdef SCTP_LOCK_LOGGING -#define SCTP_INP_RLOCK(_inp) do { \ - if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LOCK_LOGGING_ENABLE) \ - sctp_log_lock(_inp, NULL, SCTP_LOG_LOCK_INP); \ - KASSERT(pthread_mutex_lock(&(_inp)->inp_mtx) == 0, ("%s: inp_mtx already locked", __func__)) \ -} while (0) -#define SCTP_INP_WLOCK(_inp) do { \ - if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LOCK_LOGGING_ENABLE) \ - sctp_log_lock(_inp, NULL, SCTP_LOG_LOCK_INP); \ - KASSERT(pthread_mutex_lock(&(_inp)->inp_mtx) == 0, ("%s: inp_mtx already locked", __func__)) +#define SCTP_INP_RLOCK(_inp) do { \ + if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LOCK_LOGGING_ENABLE) \ + sctp_log_lock(_inp, NULL, SCTP_LOG_LOCK_INP); \ + KASSERT(pthread_mutex_lock(&(_inp)->inp_mtx) == 0, ("%s:%d: inp_mtx already locked", __FILE__, __LINE__)); \ +} while (0) +#define SCTP_INP_WLOCK(_inp) do { \ + if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LOCK_LOGGING_ENABLE) \ + sctp_log_lock(_inp, NULL, SCTP_LOG_LOCK_INP); \ + KASSERT(pthread_mutex_lock(&(_inp)->inp_mtx) == 0, ("%s:%d: inp_mtx already locked", __FILE__, __LINE__)); \ } while (0) #else #define SCTP_INP_RLOCK(_inp) \ - KASSERT(pthread_mutex_lock(&(_inp)->inp_mtx) == 0, ("%s: inp_mtx already locked", __func__)) + KASSERT(pthread_mutex_lock(&(_inp)->inp_mtx) == 0, ("%s:%d: inp_mtx already locked", __FILE__, __LINE__)) #define SCTP_INP_WLOCK(_inp) \ - KASSERT(pthread_mutex_lock(&(_inp)->inp_mtx) == 0, ("%s: inp_mtx already locked", __func__)) + KASSERT(pthread_mutex_lock(&(_inp)->inp_mtx) == 0, ("%s:%d: inp_mtx already locked", __FILE__, __LINE__)) #endif #define SCTP_INP_RUNLOCK(_inp) \ - KASSERT(pthread_mutex_unlock(&(_inp)->inp_mtx) == 0, ("%s: inp_mtx not locked", __func__)) + KASSERT(pthread_mutex_unlock(&(_inp)->inp_mtx) == 0, ("%s:%d: inp_mtx not locked", __FILE__, __LINE__)) #define SCTP_INP_WUNLOCK(_inp) \ - KASSERT(pthread_mutex_unlock(&(_inp)->inp_mtx) == 0, ("%s: inp_mtx not locked", __func__)) + KASSERT(pthread_mutex_unlock(&(_inp)->inp_mtx) == 0, ("%s:%d: inp_mtx not locked", __FILE__, __LINE__)) #else #ifdef SCTP_LOCK_LOGGING #define SCTP_INP_RLOCK(_inp) do { \ @@ -384,27 +401,11 @@ (void)pthread_mutex_unlock(&(_inp)->inp_mtx) #endif #define SCTP_INP_RLOCK_ASSERT(_inp) \ - KASSERT(pthread_mutex_trylock(&(_inp)->inp_mtx) == EBUSY, ("%s: inp_mtx not locked", __func__)) + KASSERT(pthread_mutex_trylock(&(_inp)->inp_mtx) == EBUSY, ("%s:%d: inp_mtx not locked", __FILE__, __LINE__)) #define SCTP_INP_WLOCK_ASSERT(_inp) \ - KASSERT(pthread_mutex_trylock(&(_inp)->inp_mtx) == EBUSY, ("%s: inp_mtx not locked", __func__)) + KASSERT(pthread_mutex_trylock(&(_inp)->inp_mtx) == EBUSY, ("%s:%d: inp_mtx not locked", __FILE__, __LINE__)) #define SCTP_INP_INCR_REF(_inp) atomic_add_int(&((_inp)->refcount), 1) -#define SCTP_INP_DECR_REF(_inp) atomic_add_int(&((_inp)->refcount), -1) - -#define SCTP_TCB_SEND_LOCK_INIT(_tcb) \ - (void)pthread_mutex_init(&(_tcb)->tcb_send_mtx, &SCTP_BASE_VAR(mtx_attr)) -#define SCTP_TCB_SEND_LOCK_DESTROY(_tcb) \ - (void)pthread_mutex_destroy(&(_tcb)->tcb_send_mtx) -#ifdef INVARIANTS -#define SCTP_TCB_SEND_LOCK(_tcb) \ - KASSERT(pthread_mutex_lock(&(_tcb)->tcb_send_mtx) == 0, ("%s: tcb_send_mtx already locked", __func__)) -#define SCTP_TCB_SEND_UNLOCK(_tcb) \ - KASSERT(pthread_mutex_unlock(&(_tcb)->tcb_send_mtx) == 0, ("%s: tcb_send_mtx not locked", __func__)) -#else -#define SCTP_TCB_SEND_LOCK(_tcb) \ - (void)pthread_mutex_lock(&(_tcb)->tcb_send_mtx) -#define SCTP_TCB_SEND_UNLOCK(_tcb) \ - (void)pthread_mutex_unlock(&(_tcb)->tcb_send_mtx) -#endif +#define SCTP_INP_DECR_REF(_inp) atomic_subtract_int(&((_inp)->refcount), 1) #define SCTP_ASOC_CREATE_LOCK_INIT(_inp) \ (void)pthread_mutex_init(&(_inp)->inp_create_mtx, &SCTP_BASE_VAR(mtx_attr)) @@ -412,17 +413,17 @@ (void)pthread_mutex_destroy(&(_inp)->inp_create_mtx) #ifdef INVARIANTS #ifdef SCTP_LOCK_LOGGING -#define SCTP_ASOC_CREATE_LOCK(_inp) do { \ - if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LOCK_LOGGING_ENABLE) \ - sctp_log_lock(_inp, NULL, SCTP_LOG_LOCK_CREATE); \ - KASSERT(pthread_mutex_lock(&(_inp)->inp_create_mtx) == 0, ("%s: inp_create_mtx already locked", __func__)) \ +#define SCTP_ASOC_CREATE_LOCK(_inp) do { \ + if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LOCK_LOGGING_ENABLE) \ + sctp_log_lock(_inp, NULL, SCTP_LOG_LOCK_CREATE); \ + KASSERT(pthread_mutex_lock(&(_inp)->inp_create_mtx) == 0, ("%s:%d: inp_create_mtx already locked", __FILE__, __LINE__)); \ } while (0) #else #define SCTP_ASOC_CREATE_LOCK(_inp) \ - KASSERT(pthread_mutex_lock(&(_inp)->inp_create_mtx) == 0, ("%s: inp_create_mtx already locked", __func__)) + KASSERT(pthread_mutex_lock(&(_inp)->inp_create_mtx) == 0, ("%s:%d: inp_create_mtx already locked", __FILE__, __LINE__)) #endif #define SCTP_ASOC_CREATE_UNLOCK(_inp) \ - KASSERT(pthread_mutex_unlock(&(_inp)->inp_create_mtx) == 0, ("%s: inp_create_mtx not locked", __func__)) + KASSERT(pthread_mutex_unlock(&(_inp)->inp_create_mtx) == 0, ("%s:%d: inp_create_mtx not locked", __FILE__, __LINE__)) #else #ifdef SCTP_LOCK_LOGGING #define SCTP_ASOC_CREATE_LOCK(_inp) do { \ @@ -451,17 +452,17 @@ (void)pthread_mutex_destroy(&(_tcb)->tcb_mtx) #ifdef INVARIANTS #ifdef SCTP_LOCK_LOGGING -#define SCTP_TCB_LOCK(_tcb) do { \ - if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LOCK_LOGGING_ENABLE) \ - sctp_log_lock(_tcb->sctp_ep, _tcb, SCTP_LOG_LOCK_TCB); \ - KASSERT(pthread_mutex_lock(&(_tcb)->tcb_mtx) == 0, ("%s: tcb_mtx already locked", __func__)) \ +#define SCTP_TCB_LOCK(_tcb) do { \ + if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LOCK_LOGGING_ENABLE) \ + sctp_log_lock(_tcb->sctp_ep, _tcb, SCTP_LOG_LOCK_TCB); \ + KASSERT(pthread_mutex_lock(&(_tcb)->tcb_mtx) == 0, ("%s:%d: tcb_mtx already locked", __FILE__, __LINE__)) \ } while (0) #else #define SCTP_TCB_LOCK(_tcb) \ - KASSERT(pthread_mutex_lock(&(_tcb)->tcb_mtx) == 0, ("%s: tcb_mtx already locked", __func__)) + KASSERT(pthread_mutex_lock(&(_tcb)->tcb_mtx) == 0, ("%s:%d: tcb_mtx already locked", __FILE__, __LINE__)) #endif #define SCTP_TCB_UNLOCK(_tcb) \ - KASSERT(pthread_mutex_unlock(&(_tcb)->tcb_mtx) == 0, ("%s: tcb_mtx not locked", __func__)) + KASSERT(pthread_mutex_unlock(&(_tcb)->tcb_mtx) == 0, ("%s:%d: tcb_mtx not locked", __FILE__, __LINE__)) #else #ifdef SCTP_LOCK_LOGGING #define SCTP_TCB_LOCK(_tcb) do { \ @@ -476,7 +477,7 @@ #define SCTP_TCB_UNLOCK(_tcb) (void)pthread_mutex_unlock(&(_tcb)->tcb_mtx) #endif #define SCTP_TCB_LOCK_ASSERT(_tcb) \ - KASSERT(pthread_mutex_trylock(&(_tcb)->tcb_mtx) == EBUSY, ("%s: tcb_mtx not locked", __func__)) + KASSERT(pthread_mutex_trylock(&(_tcb)->tcb_mtx) == EBUSY, ("%s:%d: tcb_mtx not locked", __FILE__, __LINE__)) #define SCTP_TCB_TRYLOCK(_tcb) (!(pthread_mutex_trylock(&(_tcb)->tcb_mtx))) #endif @@ -506,12 +507,12 @@ SOCKBUF_UNLOCK(&(_so)->so_rcv) #else #define SOCKBUF_LOCK_ASSERT(_so_buf) \ - KASSERT(pthread_mutex_trylock(SOCKBUF_MTX(_so_buf)) == EBUSY, ("%s: socket buffer not locked", __func__)) + KASSERT(pthread_mutex_trylock(SOCKBUF_MTX(_so_buf)) == EBUSY, ("%s:%d: socket buffer not locked", __FILE__, __LINE__)) #ifdef INVARIANTS #define SOCKBUF_LOCK(_so_buf) \ - KASSERT(pthread_mutex_lock(SOCKBUF_MTX(_so_buf)) == 0, ("%s: sockbuf_mtx already locked", __func__)) + KASSERT(pthread_mutex_lock(SOCKBUF_MTX(_so_buf)) == 0, ("%s:%d: sockbuf_mtx already locked", __FILE__, __LINE__)) #define SOCKBUF_UNLOCK(_so_buf) \ - KASSERT(pthread_mutex_unlock(SOCKBUF_MTX(_so_buf)) == 0, ("%s: sockbuf_mtx not locked", __func__)) + KASSERT(pthread_mutex_unlock(SOCKBUF_MTX(_so_buf)) == 0, ("%s:%d: sockbuf_mtx not locked", __FILE__, __LINE__)) #else #define SOCKBUF_LOCK(_so_buf) \ pthread_mutex_lock(SOCKBUF_MTX(_so_buf)) @@ -531,6 +532,7 @@ #if defined(_WIN32) /* address list locks */ +#if WINVER < 0x0600 #define SCTP_IPI_ADDR_INIT() \ InitializeCriticalSection(&SCTP_BASE_INFO(ipi_addr_mtx)) #define SCTP_IPI_ADDR_DESTROY() \ @@ -543,7 +545,23 @@ EnterCriticalSection(&SCTP_BASE_INFO(ipi_addr_mtx)) #define SCTP_IPI_ADDR_WUNLOCK() \ LeaveCriticalSection(&SCTP_BASE_INFO(ipi_addr_mtx)) - +#define SCTP_IPI_ADDR_LOCK_ASSERT() +#define SCTP_IPI_ADDR_WLOCK_ASSERT() +#else +#define SCTP_IPI_ADDR_INIT() \ + InitializeSRWLock(&SCTP_BASE_INFO(ipi_addr_mtx)) +#define SCTP_IPI_ADDR_DESTROY() +#define SCTP_IPI_ADDR_RLOCK() \ + AcquireSRWLockShared(&SCTP_BASE_INFO(ipi_addr_mtx)) +#define SCTP_IPI_ADDR_RUNLOCK() \ + ReleaseSRWLockShared(&SCTP_BASE_INFO(ipi_addr_mtx)) +#define SCTP_IPI_ADDR_WLOCK() \ + AcquireSRWLockExclusive(&SCTP_BASE_INFO(ipi_addr_mtx)) +#define SCTP_IPI_ADDR_WUNLOCK() \ + ReleaseSRWLockExclusive(&SCTP_BASE_INFO(ipi_addr_mtx)) +#define SCTP_IPI_ADDR_LOCK_ASSERT() +#define SCTP_IPI_ADDR_WLOCK_ASSERT() +#endif /* iterator locks */ #define SCTP_ITERATOR_LOCK_INIT() \ @@ -567,28 +585,30 @@ #else /* address list locks */ #define SCTP_IPI_ADDR_INIT() \ - (void)pthread_mutex_init(&SCTP_BASE_INFO(ipi_addr_mtx), &SCTP_BASE_VAR(mtx_attr)) + (void)pthread_rwlock_init(&SCTP_BASE_INFO(ipi_addr_mtx), &SCTP_BASE_VAR(rwlock_attr)) #define SCTP_IPI_ADDR_DESTROY() \ - (void)pthread_mutex_destroy(&SCTP_BASE_INFO(ipi_addr_mtx)) + (void)pthread_rwlock_destroy(&SCTP_BASE_INFO(ipi_addr_mtx)) #ifdef INVARIANTS #define SCTP_IPI_ADDR_RLOCK() \ - KASSERT(pthread_mutex_lock(&SCTP_BASE_INFO(ipi_addr_mtx)) == 0, ("%s: ipi_addr_mtx already locked", __func__)) + KASSERT(pthread_rwlock_rdlock(&SCTP_BASE_INFO(ipi_addr_mtx)) == 0, ("%s:%d: ipi_addr_mtx already locked", __FILE__, __LINE__)) #define SCTP_IPI_ADDR_RUNLOCK() \ - KASSERT(pthread_mutex_unlock(&SCTP_BASE_INFO(ipi_addr_mtx)) == 0, ("%s: ipi_addr_mtx not locked", __func__)) + KASSERT(pthread_rwlock_unlock(&SCTP_BASE_INFO(ipi_addr_mtx)) == 0, ("%s:%d: ipi_addr_mtx not locked", __FILE__, __LINE__)) #define SCTP_IPI_ADDR_WLOCK() \ - KASSERT(pthread_mutex_lock(&SCTP_BASE_INFO(ipi_addr_mtx)) == 0, ("%s: ipi_addr_mtx already locked", __func__)) + KASSERT(pthread_rwlock_wrlock(&SCTP_BASE_INFO(ipi_addr_mtx)) == 0, ("%s:%d: ipi_addr_mtx already locked", __FILE__, __LINE__)) #define SCTP_IPI_ADDR_WUNLOCK() \ - KASSERT(pthread_mutex_unlock(&SCTP_BASE_INFO(ipi_addr_mtx)) == 0, ("%s: ipi_addr_mtx not locked", __func__)) + KASSERT(pthread_rwlock_unlock(&SCTP_BASE_INFO(ipi_addr_mtx)) == 0, ("%s:%d: ipi_addr_mtx not locked", __FILE__, __LINE__)) #else #define SCTP_IPI_ADDR_RLOCK() \ - (void)pthread_mutex_lock(&SCTP_BASE_INFO(ipi_addr_mtx)) + (void)pthread_rwlock_rdlock(&SCTP_BASE_INFO(ipi_addr_mtx)) #define SCTP_IPI_ADDR_RUNLOCK() \ - (void)pthread_mutex_unlock(&SCTP_BASE_INFO(ipi_addr_mtx)) + (void)pthread_rwlock_unlock(&SCTP_BASE_INFO(ipi_addr_mtx)) #define SCTP_IPI_ADDR_WLOCK() \ - (void)pthread_mutex_lock(&SCTP_BASE_INFO(ipi_addr_mtx)) + (void)pthread_rwlock_wrlock(&SCTP_BASE_INFO(ipi_addr_mtx)) #define SCTP_IPI_ADDR_WUNLOCK() \ - (void)pthread_mutex_unlock(&SCTP_BASE_INFO(ipi_addr_mtx)) + (void)pthread_rwlock_unlock(&SCTP_BASE_INFO(ipi_addr_mtx)) #endif +#define SCTP_IPI_ADDR_LOCK_ASSERT() +#define SCTP_IPI_ADDR_WLOCK_ASSERT() /* iterator locks */ #define SCTP_ITERATOR_LOCK_INIT() \ @@ -597,9 +617,9 @@ (void)pthread_mutex_destroy(&sctp_it_ctl.it_mtx) #ifdef INVARIANTS #define SCTP_ITERATOR_LOCK() \ - KASSERT(pthread_mutex_lock(&sctp_it_ctl.it_mtx) == 0, ("%s: it_mtx already locked", __func__)) + KASSERT(pthread_mutex_lock(&sctp_it_ctl.it_mtx) == 0, ("%s:%d: it_mtx already locked", __FILE__, __LINE__)) #define SCTP_ITERATOR_UNLOCK() \ - KASSERT(pthread_mutex_unlock(&sctp_it_ctl.it_mtx) == 0, ("%s: it_mtx not locked", __func__)) + KASSERT(pthread_mutex_unlock(&sctp_it_ctl.it_mtx) == 0, ("%s:%d: it_mtx not locked", __FILE__, __LINE__)) #else #define SCTP_ITERATOR_LOCK() \ (void)pthread_mutex_lock(&sctp_it_ctl.it_mtx) @@ -613,9 +633,9 @@ (void)pthread_mutex_destroy(&sctp_it_ctl.ipi_iterator_wq_mtx) #ifdef INVARIANTS #define SCTP_IPI_ITERATOR_WQ_LOCK() \ - KASSERT(pthread_mutex_lock(&sctp_it_ctl.ipi_iterator_wq_mtx) == 0, ("%s: ipi_iterator_wq_mtx already locked", __func__)) + KASSERT(pthread_mutex_lock(&sctp_it_ctl.ipi_iterator_wq_mtx) == 0, ("%s:%d: ipi_iterator_wq_mtx already locked", __FILE__, __LINE__)) #define SCTP_IPI_ITERATOR_WQ_UNLOCK() \ - KASSERT(pthread_mutex_unlock(&sctp_it_ctl.ipi_iterator_wq_mtx) == 0, ("%s: ipi_iterator_wq_mtx not locked", __func__)) + KASSERT(pthread_mutex_unlock(&sctp_it_ctl.ipi_iterator_wq_mtx) == 0, ("%s:%d: ipi_iterator_wq_mtx not locked", __FILE__, __LINE__)) #else #define SCTP_IPI_ITERATOR_WQ_LOCK() \ (void)pthread_mutex_lock(&sctp_it_ctl.ipi_iterator_wq_mtx) diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_sha1.c firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_sha1.c --- firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_sha1.c 2022-12-05 23:01:11.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_sha1.c 2023-01-09 15:01:10.000000000 +0000 @@ -80,7 +80,25 @@ { SHA1_Final(digest, &ctx->sha_ctx); } +#elif defined(SCTP_USE_MBEDTLS_SHA1) +void +sctp_sha1_init(struct sctp_sha1_context *ctx) +{ + mbedtls_sha1_init(&ctx->sha1_ctx); + mbedtls_sha1_starts_ret(&ctx->sha1_ctx); +} +void +sctp_sha1_update(struct sctp_sha1_context *ctx, const unsigned char *ptr, unsigned int siz) +{ + mbedtls_sha1_update_ret(&ctx->sha1_ctx, ptr, siz); +} + +void +sctp_sha1_final(unsigned char *digest, struct sctp_sha1_context *ctx) +{ + mbedtls_sha1_finish_ret(&ctx->sha1_ctx, digest); +} #else #include diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_sha1.h firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_sha1.h --- firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_sha1.h 2022-12-05 23:01:12.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_sha1.h 2023-01-09 15:01:10.000000000 +0000 @@ -46,6 +46,8 @@ #include #elif defined(SCTP_USE_OPENSSL_SHA1) #include +#elif defined(SCTP_USE_MBEDTLS_SHA1) +#include #endif struct sctp_sha1_context { @@ -53,6 +55,8 @@ struct PK11Context *pk11_ctx; #elif defined(SCTP_USE_OPENSSL_SHA1) SHA_CTX sha_ctx; +#elif defined(SCTP_USE_MBEDTLS_SHA1) + mbedtls_sha1_context sha1_ctx; #else unsigned int A; unsigned int B; diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_ss_functions.c firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_ss_functions.c --- firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_ss_functions.c 2022-12-05 23:01:11.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_ss_functions.c 2023-01-09 15:01:10.000000000 +0000 @@ -30,7 +30,7 @@ #if defined(__FreeBSD__) && !defined(__Userspace__) #include -__FBSDID("$FreeBSD: head/sys/netinet/sctp_ss_functions.c 362173 2020-06-14 09:50:00Z tuexen $"); +__FBSDID("$FreeBSD$"); #endif #include @@ -40,28 +40,26 @@ /* * Default simple round-robin algorithm. - * Just interates the streams in the order they appear. + * Just iterates the streams in the order they appear. */ static void sctp_ss_default_add(struct sctp_tcb *, struct sctp_association *, struct sctp_stream_out *, - struct sctp_stream_queue_pending *, int); + struct sctp_stream_queue_pending *); static void sctp_ss_default_remove(struct sctp_tcb *, struct sctp_association *, struct sctp_stream_out *, - struct sctp_stream_queue_pending *, int); + struct sctp_stream_queue_pending *); static void -sctp_ss_default_init(struct sctp_tcb *stcb, struct sctp_association *asoc, - int holds_lock) +sctp_ss_default_init(struct sctp_tcb *stcb, struct sctp_association *asoc) { uint16_t i; - if (holds_lock == 0) { - SCTP_TCB_SEND_LOCK(stcb); - } + SCTP_TCB_LOCK_ASSERT(stcb); + asoc->ss_data.locked_on_sending = NULL; asoc->ss_data.last_out_stream = NULL; TAILQ_INIT(&asoc->ss_data.out.wheel); @@ -71,42 +69,37 @@ * been changed. We need to add all stream queues * to the wheel. */ - for (i = 0; i < stcb->asoc.streamoutcnt; i++) { - stcb->asoc.ss_functions.sctp_ss_add_to_stream(stcb, &stcb->asoc, - &stcb->asoc.strmout[i], - NULL, 1); - } - if (holds_lock == 0) { - SCTP_TCB_SEND_UNLOCK(stcb); + for (i = 0; i < asoc->streamoutcnt; i++) { + stcb->asoc.ss_functions.sctp_ss_add_to_stream(stcb, asoc, + &asoc->strmout[i], + NULL); } return; } static void sctp_ss_default_clear(struct sctp_tcb *stcb, struct sctp_association *asoc, - int clear_values SCTP_UNUSED, int holds_lock) + bool clear_values SCTP_UNUSED) { - if (holds_lock == 0) { - SCTP_TCB_SEND_LOCK(stcb); - } + SCTP_TCB_LOCK_ASSERT(stcb); + while (!TAILQ_EMPTY(&asoc->ss_data.out.wheel)) { struct sctp_stream_out *strq; strq = TAILQ_FIRST(&asoc->ss_data.out.wheel); - TAILQ_REMOVE(&asoc->ss_data.out.wheel, strq, ss_params.rr.next_spoke); - strq->ss_params.rr.next_spoke.tqe_next = NULL; - strq->ss_params.rr.next_spoke.tqe_prev = NULL; + KASSERT(strq->ss_params.scheduled, ("strq %p not scheduled", (void *)strq)); + TAILQ_REMOVE(&asoc->ss_data.out.wheel, strq, ss_params.ss.rr.next_spoke); + strq->ss_params.scheduled = false; } asoc->ss_data.last_out_stream = NULL; - if (holds_lock == 0) { - SCTP_TCB_SEND_UNLOCK(stcb); - } return; } static void sctp_ss_default_init_stream(struct sctp_tcb *stcb, struct sctp_stream_out *strq, struct sctp_stream_out *with_strq) { + SCTP_TCB_LOCK_ASSERT(stcb); + if (with_strq != NULL) { if (stcb->asoc.ss_data.locked_on_sending == with_strq) { stcb->asoc.ss_data.locked_on_sending = strq; @@ -115,97 +108,93 @@ stcb->asoc.ss_data.last_out_stream = strq; } } - strq->ss_params.rr.next_spoke.tqe_next = NULL; - strq->ss_params.rr.next_spoke.tqe_prev = NULL; + strq->ss_params.scheduled = false; return; } static void sctp_ss_default_add(struct sctp_tcb *stcb, struct sctp_association *asoc, struct sctp_stream_out *strq, - struct sctp_stream_queue_pending *sp SCTP_UNUSED, int holds_lock) + struct sctp_stream_queue_pending *sp SCTP_UNUSED) { - if (holds_lock == 0) { - SCTP_TCB_SEND_LOCK(stcb); - } + SCTP_TCB_LOCK_ASSERT(stcb); + /* Add to wheel if not already on it and stream queue not empty */ - if (!TAILQ_EMPTY(&strq->outqueue) && - (strq->ss_params.rr.next_spoke.tqe_next == NULL) && - (strq->ss_params.rr.next_spoke.tqe_prev == NULL)) { + if (!TAILQ_EMPTY(&strq->outqueue) && !strq->ss_params.scheduled) { TAILQ_INSERT_TAIL(&asoc->ss_data.out.wheel, - strq, ss_params.rr.next_spoke); - } - if (holds_lock == 0) { - SCTP_TCB_SEND_UNLOCK(stcb); + strq, ss_params.ss.rr.next_spoke); + strq->ss_params.scheduled = true; } return; } -static int +static bool sctp_ss_default_is_empty(struct sctp_tcb *stcb SCTP_UNUSED, struct sctp_association *asoc) { - if (TAILQ_EMPTY(&asoc->ss_data.out.wheel)) { - return (1); - } else { - return (0); - } + SCTP_TCB_LOCK_ASSERT(stcb); + + return (TAILQ_EMPTY(&asoc->ss_data.out.wheel)); } static void sctp_ss_default_remove(struct sctp_tcb *stcb, struct sctp_association *asoc, struct sctp_stream_out *strq, - struct sctp_stream_queue_pending *sp SCTP_UNUSED, int holds_lock) + struct sctp_stream_queue_pending *sp SCTP_UNUSED) { - if (holds_lock == 0) { - SCTP_TCB_SEND_LOCK(stcb); - } + SCTP_TCB_LOCK_ASSERT(stcb); + /* Remove from wheel if stream queue is empty and actually is on the wheel */ - if (TAILQ_EMPTY(&strq->outqueue) && - (strq->ss_params.rr.next_spoke.tqe_next != NULL || - strq->ss_params.rr.next_spoke.tqe_prev != NULL)) { + if (TAILQ_EMPTY(&strq->outqueue) && strq->ss_params.scheduled) { if (asoc->ss_data.last_out_stream == strq) { asoc->ss_data.last_out_stream = TAILQ_PREV(asoc->ss_data.last_out_stream, - sctpwheel_listhead, - ss_params.rr.next_spoke); + sctpwheel_listhead, + ss_params.ss.rr.next_spoke); if (asoc->ss_data.last_out_stream == NULL) { asoc->ss_data.last_out_stream = TAILQ_LAST(&asoc->ss_data.out.wheel, - sctpwheel_listhead); + sctpwheel_listhead); } if (asoc->ss_data.last_out_stream == strq) { asoc->ss_data.last_out_stream = NULL; } } - TAILQ_REMOVE(&asoc->ss_data.out.wheel, strq, ss_params.rr.next_spoke); - strq->ss_params.rr.next_spoke.tqe_next = NULL; - strq->ss_params.rr.next_spoke.tqe_prev = NULL; - } - if (holds_lock == 0) { - SCTP_TCB_SEND_UNLOCK(stcb); + if (asoc->ss_data.locked_on_sending == strq) { + asoc->ss_data.locked_on_sending = NULL; + } + TAILQ_REMOVE(&asoc->ss_data.out.wheel, strq, ss_params.ss.rr.next_spoke); + strq->ss_params.scheduled = false; } return; } - static struct sctp_stream_out * sctp_ss_default_select(struct sctp_tcb *stcb SCTP_UNUSED, struct sctp_nets *net, struct sctp_association *asoc) { struct sctp_stream_out *strq, *strqt; - if (asoc->ss_data.locked_on_sending) { + SCTP_TCB_LOCK_ASSERT(stcb); + + if (asoc->ss_data.locked_on_sending != NULL) { + KASSERT(asoc->ss_data.locked_on_sending->ss_params.scheduled, + ("locked_on_sending %p not scheduled", + (void *)asoc->ss_data.locked_on_sending)); return (asoc->ss_data.locked_on_sending); } strqt = asoc->ss_data.last_out_stream; + KASSERT(strqt == NULL || strqt->ss_params.scheduled, + ("last_out_stream %p not scheduled", (void *)strqt)); default_again: /* Find the next stream to use */ if (strqt == NULL) { strq = TAILQ_FIRST(&asoc->ss_data.out.wheel); } else { - strq = TAILQ_NEXT(strqt, ss_params.rr.next_spoke); + strq = TAILQ_NEXT(strqt, ss_params.ss.rr.next_spoke); if (strq == NULL) { strq = TAILQ_FIRST(&asoc->ss_data.out.wheel); } } + KASSERT(strq == NULL || strq->ss_params.scheduled, + ("strq %p not scheduled", (void *)strq)); /* If CMT is off, we must validate that * the stream in question has the first @@ -243,16 +232,20 @@ { struct sctp_stream_queue_pending *sp; + KASSERT(strq != NULL, ("strq is NULL")); + KASSERT(strq->ss_params.scheduled, ("strq %p is not scheduled", (void *)strq)); + SCTP_TCB_LOCK_ASSERT(stcb); + asoc->ss_data.last_out_stream = strq; - if (stcb->asoc.idata_supported == 0) { + if (asoc->idata_supported == 0) { sp = TAILQ_FIRST(&strq->outqueue); if ((sp != NULL) && (sp->some_taken == 1)) { - stcb->asoc.ss_data.locked_on_sending = strq; + asoc->ss_data.locked_on_sending = strq; } else { - stcb->asoc.ss_data.locked_on_sending = NULL; + asoc->ss_data.locked_on_sending = NULL; } } else { - stcb->asoc.ss_data.locked_on_sending = NULL; + asoc->ss_data.locked_on_sending = NULL; } return; } @@ -261,6 +254,8 @@ sctp_ss_default_packet_done(struct sctp_tcb *stcb SCTP_UNUSED, struct sctp_nets *net SCTP_UNUSED, struct sctp_association *asoc SCTP_UNUSED) { + SCTP_TCB_LOCK_ASSERT(stcb); + /* Nothing to be done here */ return; } @@ -269,6 +264,8 @@ sctp_ss_default_get_value(struct sctp_tcb *stcb SCTP_UNUSED, struct sctp_association *asoc SCTP_UNUSED, struct sctp_stream_out *strq SCTP_UNUSED, uint16_t *value SCTP_UNUSED) { + SCTP_TCB_LOCK_ASSERT(stcb); + /* Nothing to be done here */ return (-1); } @@ -277,76 +274,77 @@ sctp_ss_default_set_value(struct sctp_tcb *stcb SCTP_UNUSED, struct sctp_association *asoc SCTP_UNUSED, struct sctp_stream_out *strq SCTP_UNUSED, uint16_t value SCTP_UNUSED) { + SCTP_TCB_LOCK_ASSERT(stcb); + /* Nothing to be done here */ return (-1); } -static int +static bool sctp_ss_default_is_user_msgs_incomplete(struct sctp_tcb *stcb SCTP_UNUSED, struct sctp_association *asoc) { struct sctp_stream_out *strq; struct sctp_stream_queue_pending *sp; + SCTP_TCB_LOCK_ASSERT(stcb); + if (asoc->stream_queue_cnt != 1) { - return (0); + return (false); } strq = asoc->ss_data.locked_on_sending; if (strq == NULL) { - return (0); + return (false); } sp = TAILQ_FIRST(&strq->outqueue); if (sp == NULL) { - return (0); + return (false); } - return (!sp->msg_is_complete); + return (sp->msg_is_complete == 0); } /* * Real round-robin algorithm. - * Always interates the streams in ascending order. + * Always iterates the streams in ascending order. */ static void sctp_ss_rr_add(struct sctp_tcb *stcb, struct sctp_association *asoc, struct sctp_stream_out *strq, - struct sctp_stream_queue_pending *sp SCTP_UNUSED, int holds_lock) + struct sctp_stream_queue_pending *sp SCTP_UNUSED) { struct sctp_stream_out *strqt; - if (holds_lock == 0) { - SCTP_TCB_SEND_LOCK(stcb); - } - if (!TAILQ_EMPTY(&strq->outqueue) && - (strq->ss_params.rr.next_spoke.tqe_next == NULL) && - (strq->ss_params.rr.next_spoke.tqe_prev == NULL)) { + SCTP_TCB_LOCK_ASSERT(stcb); + + if (!TAILQ_EMPTY(&strq->outqueue) && !strq->ss_params.scheduled) { if (TAILQ_EMPTY(&asoc->ss_data.out.wheel)) { - TAILQ_INSERT_HEAD(&asoc->ss_data.out.wheel, strq, ss_params.rr.next_spoke); + TAILQ_INSERT_HEAD(&asoc->ss_data.out.wheel, strq, ss_params.ss.rr.next_spoke); } else { strqt = TAILQ_FIRST(&asoc->ss_data.out.wheel); while (strqt != NULL && (strqt->sid < strq->sid)) { - strqt = TAILQ_NEXT(strqt, ss_params.rr.next_spoke); + strqt = TAILQ_NEXT(strqt, ss_params.ss.rr.next_spoke); } if (strqt != NULL) { - TAILQ_INSERT_BEFORE(strqt, strq, ss_params.rr.next_spoke); + TAILQ_INSERT_BEFORE(strqt, strq, ss_params.ss.rr.next_spoke); } else { - TAILQ_INSERT_TAIL(&asoc->ss_data.out.wheel, strq, ss_params.rr.next_spoke); + TAILQ_INSERT_TAIL(&asoc->ss_data.out.wheel, strq, ss_params.ss.rr.next_spoke); } } - } - if (holds_lock == 0) { - SCTP_TCB_SEND_UNLOCK(stcb); + strq->ss_params.scheduled = true; } return; } /* * Real round-robin per packet algorithm. - * Always interates the streams in ascending order and + * Always iterates the streams in ascending order and * only fills messages of the same stream in a packet. */ static struct sctp_stream_out * sctp_ss_rrp_select(struct sctp_tcb *stcb SCTP_UNUSED, struct sctp_nets *net SCTP_UNUSED, struct sctp_association *asoc) { + SCTP_TCB_LOCK_ASSERT(stcb); + return (asoc->ss_data.last_out_stream); } @@ -356,17 +354,23 @@ { struct sctp_stream_out *strq, *strqt; + SCTP_TCB_LOCK_ASSERT(stcb); + strqt = asoc->ss_data.last_out_stream; + KASSERT(strqt == NULL || strqt->ss_params.scheduled, + ("last_out_stream %p not scheduled", (void *)strqt)); rrp_again: /* Find the next stream to use */ if (strqt == NULL) { strq = TAILQ_FIRST(&asoc->ss_data.out.wheel); } else { - strq = TAILQ_NEXT(strqt, ss_params.rr.next_spoke); + strq = TAILQ_NEXT(strqt, ss_params.ss.rr.next_spoke); if (strq == NULL) { strq = TAILQ_FIRST(&asoc->ss_data.out.wheel); } } + KASSERT(strq == NULL || strq->ss_params.scheduled, + ("strq %p not scheduled", (void *)strq)); /* If CMT is off, we must validate that * the stream in question has the first @@ -396,40 +400,36 @@ return; } - /* * Priority algorithm. * Always prefers streams based on their priority id. */ static void sctp_ss_prio_clear(struct sctp_tcb *stcb, struct sctp_association *asoc, - int clear_values, int holds_lock) + bool clear_values) { - if (holds_lock == 0) { - SCTP_TCB_SEND_LOCK(stcb); - } + SCTP_TCB_LOCK_ASSERT(stcb); + while (!TAILQ_EMPTY(&asoc->ss_data.out.wheel)) { struct sctp_stream_out *strq; strq = TAILQ_FIRST(&asoc->ss_data.out.wheel); + KASSERT(strq->ss_params.scheduled, ("strq %p not scheduled", (void *)strq)); if (clear_values) { - strq->ss_params.prio.priority = 0; + strq->ss_params.ss.prio.priority = 0; } - TAILQ_REMOVE(&asoc->ss_data.out.wheel, strq, ss_params.prio.next_spoke); - strq->ss_params.prio.next_spoke.tqe_next = NULL; - strq->ss_params.prio.next_spoke.tqe_prev = NULL; - + TAILQ_REMOVE(&asoc->ss_data.out.wheel, strq, ss_params.ss.prio.next_spoke); + strq->ss_params.scheduled = false; } asoc->ss_data.last_out_stream = NULL; - if (holds_lock == 0) { - SCTP_TCB_SEND_UNLOCK(stcb); - } return; } static void sctp_ss_prio_init_stream(struct sctp_tcb *stcb, struct sctp_stream_out *strq, struct sctp_stream_out *with_strq) { + SCTP_TCB_LOCK_ASSERT(stcb); + if (with_strq != NULL) { if (stcb->asoc.ss_data.locked_on_sending == with_strq) { stcb->asoc.ss_data.locked_on_sending = strq; @@ -438,79 +438,68 @@ stcb->asoc.ss_data.last_out_stream = strq; } } - strq->ss_params.prio.next_spoke.tqe_next = NULL; - strq->ss_params.prio.next_spoke.tqe_prev = NULL; + strq->ss_params.scheduled = false; if (with_strq != NULL) { - strq->ss_params.prio.priority = with_strq->ss_params.prio.priority; + strq->ss_params.ss.prio.priority = with_strq->ss_params.ss.prio.priority; } else { - strq->ss_params.prio.priority = 0; + strq->ss_params.ss.prio.priority = 0; } return; } static void sctp_ss_prio_add(struct sctp_tcb *stcb, struct sctp_association *asoc, - struct sctp_stream_out *strq, struct sctp_stream_queue_pending *sp SCTP_UNUSED, - int holds_lock) + struct sctp_stream_out *strq, struct sctp_stream_queue_pending *sp SCTP_UNUSED) { struct sctp_stream_out *strqt; - if (holds_lock == 0) { - SCTP_TCB_SEND_LOCK(stcb); - } + SCTP_TCB_LOCK_ASSERT(stcb); + /* Add to wheel if not already on it and stream queue not empty */ - if (!TAILQ_EMPTY(&strq->outqueue) && - (strq->ss_params.prio.next_spoke.tqe_next == NULL) && - (strq->ss_params.prio.next_spoke.tqe_prev == NULL)) { + if (!TAILQ_EMPTY(&strq->outqueue) && !strq->ss_params.scheduled) { if (TAILQ_EMPTY(&asoc->ss_data.out.wheel)) { - TAILQ_INSERT_HEAD(&asoc->ss_data.out.wheel, strq, ss_params.prio.next_spoke); + TAILQ_INSERT_HEAD(&asoc->ss_data.out.wheel, strq, ss_params.ss.prio.next_spoke); } else { strqt = TAILQ_FIRST(&asoc->ss_data.out.wheel); - while (strqt != NULL && strqt->ss_params.prio.priority < strq->ss_params.prio.priority) { - strqt = TAILQ_NEXT(strqt, ss_params.prio.next_spoke); + while (strqt != NULL && strqt->ss_params.ss.prio.priority < strq->ss_params.ss.prio.priority) { + strqt = TAILQ_NEXT(strqt, ss_params.ss.prio.next_spoke); } if (strqt != NULL) { - TAILQ_INSERT_BEFORE(strqt, strq, ss_params.prio.next_spoke); + TAILQ_INSERT_BEFORE(strqt, strq, ss_params.ss.prio.next_spoke); } else { - TAILQ_INSERT_TAIL(&asoc->ss_data.out.wheel, strq, ss_params.prio.next_spoke); + TAILQ_INSERT_TAIL(&asoc->ss_data.out.wheel, strq, ss_params.ss.prio.next_spoke); } } - } - if (holds_lock == 0) { - SCTP_TCB_SEND_UNLOCK(stcb); + strq->ss_params.scheduled = true; } return; } static void sctp_ss_prio_remove(struct sctp_tcb *stcb, struct sctp_association *asoc, - struct sctp_stream_out *strq, struct sctp_stream_queue_pending *sp SCTP_UNUSED, - int holds_lock) + struct sctp_stream_out *strq, struct sctp_stream_queue_pending *sp SCTP_UNUSED) { - if (holds_lock == 0) { - SCTP_TCB_SEND_LOCK(stcb); - } + SCTP_TCB_LOCK_ASSERT(stcb); + /* Remove from wheel if stream queue is empty and actually is on the wheel */ - if (TAILQ_EMPTY(&strq->outqueue) && - (strq->ss_params.prio.next_spoke.tqe_next != NULL || - strq->ss_params.prio.next_spoke.tqe_prev != NULL)) { + if (TAILQ_EMPTY(&strq->outqueue) && strq->ss_params.scheduled) { if (asoc->ss_data.last_out_stream == strq) { - asoc->ss_data.last_out_stream = TAILQ_PREV(asoc->ss_data.last_out_stream, sctpwheel_listhead, - ss_params.prio.next_spoke); + asoc->ss_data.last_out_stream = TAILQ_PREV(asoc->ss_data.last_out_stream, + sctpwheel_listhead, + ss_params.ss.prio.next_spoke); if (asoc->ss_data.last_out_stream == NULL) { asoc->ss_data.last_out_stream = TAILQ_LAST(&asoc->ss_data.out.wheel, - sctpwheel_listhead); + sctpwheel_listhead); } if (asoc->ss_data.last_out_stream == strq) { asoc->ss_data.last_out_stream = NULL; } } - TAILQ_REMOVE(&asoc->ss_data.out.wheel, strq, ss_params.prio.next_spoke); - strq->ss_params.prio.next_spoke.tqe_next = NULL; - strq->ss_params.prio.next_spoke.tqe_prev = NULL; - } - if (holds_lock == 0) { - SCTP_TCB_SEND_UNLOCK(stcb); + if (asoc->ss_data.locked_on_sending == strq) { + asoc->ss_data.locked_on_sending = NULL; + } + TAILQ_REMOVE(&asoc->ss_data.out.wheel, strq, ss_params.ss.prio.next_spoke); + strq->ss_params.scheduled = false; } return; } @@ -521,23 +510,32 @@ { struct sctp_stream_out *strq, *strqt, *strqn; - if (asoc->ss_data.locked_on_sending) { + SCTP_TCB_LOCK_ASSERT(stcb); + + if (asoc->ss_data.locked_on_sending != NULL) { + KASSERT(asoc->ss_data.locked_on_sending->ss_params.scheduled, + ("locked_on_sending %p not scheduled", + (void *)asoc->ss_data.locked_on_sending)); return (asoc->ss_data.locked_on_sending); } strqt = asoc->ss_data.last_out_stream; + KASSERT(strqt == NULL || strqt->ss_params.scheduled, + ("last_out_stream %p not scheduled", (void *)strqt)); prio_again: /* Find the next stream to use */ if (strqt == NULL) { strq = TAILQ_FIRST(&asoc->ss_data.out.wheel); } else { - strqn = TAILQ_NEXT(strqt, ss_params.prio.next_spoke); + strqn = TAILQ_NEXT(strqt, ss_params.ss.prio.next_spoke); if (strqn != NULL && - strqn->ss_params.prio.priority == strqt->ss_params.prio.priority) { + strqn->ss_params.ss.prio.priority == strqt->ss_params.ss.prio.priority) { strq = strqn; } else { strq = TAILQ_FIRST(&asoc->ss_data.out.wheel); } } + KASSERT(strq == NULL || strq->ss_params.scheduled, + ("strq %p not scheduled", (void *)strq)); /* If CMT is off, we must validate that * the stream in question has the first @@ -570,10 +568,12 @@ sctp_ss_prio_get_value(struct sctp_tcb *stcb SCTP_UNUSED, struct sctp_association *asoc SCTP_UNUSED, struct sctp_stream_out *strq, uint16_t *value) { + SCTP_TCB_LOCK_ASSERT(stcb); + if (strq == NULL) { return (-1); } - *value = strq->ss_params.prio.priority; + *value = strq->ss_params.ss.prio.priority; return (1); } @@ -581,47 +581,47 @@ sctp_ss_prio_set_value(struct sctp_tcb *stcb, struct sctp_association *asoc, struct sctp_stream_out *strq, uint16_t value) { + SCTP_TCB_LOCK_ASSERT(stcb); + if (strq == NULL) { return (-1); } - strq->ss_params.prio.priority = value; - sctp_ss_prio_remove(stcb, asoc, strq, NULL, 1); - sctp_ss_prio_add(stcb, asoc, strq, NULL, 1); + strq->ss_params.ss.prio.priority = value; + sctp_ss_prio_remove(stcb, asoc, strq, NULL); + sctp_ss_prio_add(stcb, asoc, strq, NULL); return (1); } /* * Fair bandwidth algorithm. - * Maintains an equal troughput per stream. + * Maintains an equal throughput per stream. */ static void sctp_ss_fb_clear(struct sctp_tcb *stcb, struct sctp_association *asoc, - int clear_values, int holds_lock) + bool clear_values) { - if (holds_lock == 0) { - SCTP_TCB_SEND_LOCK(stcb); - } + SCTP_TCB_LOCK_ASSERT(stcb); + while (!TAILQ_EMPTY(&asoc->ss_data.out.wheel)) { struct sctp_stream_out *strq; strq = TAILQ_FIRST(&asoc->ss_data.out.wheel); + KASSERT(strq->ss_params.scheduled, ("strq %p not scheduled", (void *)strq)); if (clear_values) { - strq->ss_params.fb.rounds = -1; + strq->ss_params.ss.fb.rounds = -1; } - TAILQ_REMOVE(&asoc->ss_data.out.wheel, strq, ss_params.fb.next_spoke); - strq->ss_params.fb.next_spoke.tqe_next = NULL; - strq->ss_params.fb.next_spoke.tqe_prev = NULL; + TAILQ_REMOVE(&asoc->ss_data.out.wheel, strq, ss_params.ss.fb.next_spoke); + strq->ss_params.scheduled = false; } asoc->ss_data.last_out_stream = NULL; - if (holds_lock == 0) { - SCTP_TCB_SEND_UNLOCK(stcb); - } return; } static void sctp_ss_fb_init_stream(struct sctp_tcb *stcb, struct sctp_stream_out *strq, struct sctp_stream_out *with_strq) { + SCTP_TCB_LOCK_ASSERT(stcb); + if (with_strq != NULL) { if (stcb->asoc.ss_data.locked_on_sending == with_strq) { stcb->asoc.ss_data.locked_on_sending = strq; @@ -630,66 +630,55 @@ stcb->asoc.ss_data.last_out_stream = strq; } } - strq->ss_params.fb.next_spoke.tqe_next = NULL; - strq->ss_params.fb.next_spoke.tqe_prev = NULL; + strq->ss_params.scheduled = false; if (with_strq != NULL) { - strq->ss_params.fb.rounds = with_strq->ss_params.fb.rounds; + strq->ss_params.ss.fb.rounds = with_strq->ss_params.ss.fb.rounds; } else { - strq->ss_params.fb.rounds = -1; + strq->ss_params.ss.fb.rounds = -1; } return; } static void sctp_ss_fb_add(struct sctp_tcb *stcb, struct sctp_association *asoc, - struct sctp_stream_out *strq, struct sctp_stream_queue_pending *sp SCTP_UNUSED, - int holds_lock) + struct sctp_stream_out *strq, struct sctp_stream_queue_pending *sp SCTP_UNUSED) { - if (holds_lock == 0) { - SCTP_TCB_SEND_LOCK(stcb); - } - if (!TAILQ_EMPTY(&strq->outqueue) && - (strq->ss_params.fb.next_spoke.tqe_next == NULL) && - (strq->ss_params.fb.next_spoke.tqe_prev == NULL)) { - if (strq->ss_params.fb.rounds < 0) - strq->ss_params.fb.rounds = TAILQ_FIRST(&strq->outqueue)->length; - TAILQ_INSERT_TAIL(&asoc->ss_data.out.wheel, strq, ss_params.fb.next_spoke); - } - if (holds_lock == 0) { - SCTP_TCB_SEND_UNLOCK(stcb); + SCTP_TCB_LOCK_ASSERT(stcb); + + if (!TAILQ_EMPTY(&strq->outqueue) && !strq->ss_params.scheduled) { + if (strq->ss_params.ss.fb.rounds < 0) + strq->ss_params.ss.fb.rounds = TAILQ_FIRST(&strq->outqueue)->length; + TAILQ_INSERT_TAIL(&asoc->ss_data.out.wheel, strq, ss_params.ss.fb.next_spoke); + strq->ss_params.scheduled = true; } return; } static void sctp_ss_fb_remove(struct sctp_tcb *stcb, struct sctp_association *asoc, - struct sctp_stream_out *strq, struct sctp_stream_queue_pending *sp SCTP_UNUSED, - int holds_lock) + struct sctp_stream_out *strq, struct sctp_stream_queue_pending *sp SCTP_UNUSED) { - if (holds_lock == 0) { - SCTP_TCB_SEND_LOCK(stcb); - } + SCTP_TCB_LOCK_ASSERT(stcb); + /* Remove from wheel if stream queue is empty and actually is on the wheel */ - if (TAILQ_EMPTY(&strq->outqueue) && - (strq->ss_params.fb.next_spoke.tqe_next != NULL || - strq->ss_params.fb.next_spoke.tqe_prev != NULL)) { + if (TAILQ_EMPTY(&strq->outqueue) && strq->ss_params.scheduled) { if (asoc->ss_data.last_out_stream == strq) { - asoc->ss_data.last_out_stream = TAILQ_PREV(asoc->ss_data.last_out_stream, sctpwheel_listhead, - ss_params.fb.next_spoke); + asoc->ss_data.last_out_stream = TAILQ_PREV(asoc->ss_data.last_out_stream, + sctpwheel_listhead, + ss_params.ss.fb.next_spoke); if (asoc->ss_data.last_out_stream == NULL) { asoc->ss_data.last_out_stream = TAILQ_LAST(&asoc->ss_data.out.wheel, - sctpwheel_listhead); + sctpwheel_listhead); } if (asoc->ss_data.last_out_stream == strq) { asoc->ss_data.last_out_stream = NULL; } } - TAILQ_REMOVE(&asoc->ss_data.out.wheel, strq, ss_params.fb.next_spoke); - strq->ss_params.fb.next_spoke.tqe_next = NULL; - strq->ss_params.fb.next_spoke.tqe_prev = NULL; - } - if (holds_lock == 0) { - SCTP_TCB_SEND_UNLOCK(stcb); + if (asoc->ss_data.locked_on_sending == strq) { + asoc->ss_data.locked_on_sending = NULL; + } + TAILQ_REMOVE(&asoc->ss_data.out.wheel, strq, ss_params.ss.fb.next_spoke); + strq->ss_params.scheduled = false; } return; } @@ -700,14 +689,19 @@ { struct sctp_stream_out *strq = NULL, *strqt; - if (asoc->ss_data.locked_on_sending) { + SCTP_TCB_LOCK_ASSERT(stcb); + + if (asoc->ss_data.locked_on_sending != NULL) { + KASSERT(asoc->ss_data.locked_on_sending->ss_params.scheduled, + ("locked_on_sending %p not scheduled", + (void *)asoc->ss_data.locked_on_sending)); return (asoc->ss_data.locked_on_sending); } if (asoc->ss_data.last_out_stream == NULL || TAILQ_FIRST(&asoc->ss_data.out.wheel) == TAILQ_LAST(&asoc->ss_data.out.wheel, sctpwheel_listhead)) { strqt = TAILQ_FIRST(&asoc->ss_data.out.wheel); } else { - strqt = TAILQ_NEXT(asoc->ss_data.last_out_stream, ss_params.fb.next_spoke); + strqt = TAILQ_NEXT(asoc->ss_data.last_out_stream, ss_params.ss.fb.next_spoke); } do { if ((strqt != NULL) && @@ -716,13 +710,14 @@ (net == NULL || (TAILQ_FIRST(&strqt->outqueue) && TAILQ_FIRST(&strqt->outqueue)->net == NULL) || (net != NULL && TAILQ_FIRST(&strqt->outqueue) && TAILQ_FIRST(&strqt->outqueue)->net != NULL && TAILQ_FIRST(&strqt->outqueue)->net == net))))) { - if ((strqt->ss_params.fb.rounds >= 0) && (strq == NULL || - strqt->ss_params.fb.rounds < strq->ss_params.fb.rounds)) { + if ((strqt->ss_params.ss.fb.rounds >= 0) && + ((strq == NULL) || + (strqt->ss_params.ss.fb.rounds < strq->ss_params.ss.fb.rounds))) { strq = strqt; } } if (strqt != NULL) { - strqt = TAILQ_NEXT(strqt, ss_params.fb.next_spoke); + strqt = TAILQ_NEXT(strqt, ss_params.ss.fb.next_spoke); } else { strqt = TAILQ_FIRST(&asoc->ss_data.out.wheel); } @@ -739,26 +734,28 @@ struct sctp_stream_out *strqt; int subtract; - if (stcb->asoc.idata_supported == 0) { + SCTP_TCB_LOCK_ASSERT(stcb); + + if (asoc->idata_supported == 0) { sp = TAILQ_FIRST(&strq->outqueue); if ((sp != NULL) && (sp->some_taken == 1)) { - stcb->asoc.ss_data.locked_on_sending = strq; + asoc->ss_data.locked_on_sending = strq; } else { - stcb->asoc.ss_data.locked_on_sending = NULL; + asoc->ss_data.locked_on_sending = NULL; } } else { - stcb->asoc.ss_data.locked_on_sending = NULL; + asoc->ss_data.locked_on_sending = NULL; } - subtract = strq->ss_params.fb.rounds; - TAILQ_FOREACH(strqt, &asoc->ss_data.out.wheel, ss_params.fb.next_spoke) { - strqt->ss_params.fb.rounds -= subtract; - if (strqt->ss_params.fb.rounds < 0) - strqt->ss_params.fb.rounds = 0; + subtract = strq->ss_params.ss.fb.rounds; + TAILQ_FOREACH(strqt, &asoc->ss_data.out.wheel, ss_params.ss.fb.next_spoke) { + strqt->ss_params.ss.fb.rounds -= subtract; + if (strqt->ss_params.ss.fb.rounds < 0) + strqt->ss_params.ss.fb.rounds = 0; } if (TAILQ_FIRST(&strq->outqueue)) { - strq->ss_params.fb.rounds = TAILQ_FIRST(&strq->outqueue)->length; + strq->ss_params.ss.fb.rounds = TAILQ_FIRST(&strq->outqueue)->length; } else { - strq->ss_params.fb.rounds = -1; + strq->ss_params.ss.fb.rounds = -1; } asoc->ss_data.last_out_stream = strq; return; @@ -771,19 +768,17 @@ static void sctp_ss_fcfs_add(struct sctp_tcb *stcb, struct sctp_association *asoc, struct sctp_stream_out *strq SCTP_UNUSED, - struct sctp_stream_queue_pending *sp, int holds_lock); + struct sctp_stream_queue_pending *sp); static void -sctp_ss_fcfs_init(struct sctp_tcb *stcb, struct sctp_association *asoc, - int holds_lock) +sctp_ss_fcfs_init(struct sctp_tcb *stcb, struct sctp_association *asoc) { uint32_t x, n = 0, add_more = 1; struct sctp_stream_queue_pending *sp; uint16_t i; - if (holds_lock == 0) { - SCTP_TCB_SEND_LOCK(stcb); - } + SCTP_TCB_LOCK_ASSERT(stcb); + TAILQ_INIT(&asoc->ss_data.out.list); /* * If there is data in the stream queues already, @@ -794,8 +789,8 @@ */ while (add_more) { add_more = 0; - for (i = 0; i < stcb->asoc.streamoutcnt; i++) { - sp = TAILQ_FIRST(&stcb->asoc.strmout[i].outqueue); + for (i = 0; i < asoc->streamoutcnt; i++) { + sp = TAILQ_FIRST(&asoc->strmout[i].outqueue); x = 0; /* Find n. message in current stream queue */ while (sp != NULL && x < n) { @@ -803,44 +798,38 @@ x++; } if (sp != NULL) { - sctp_ss_fcfs_add(stcb, &stcb->asoc, &stcb->asoc.strmout[i], sp, 1); + sctp_ss_fcfs_add(stcb, asoc, &asoc->strmout[i], sp); add_more = 1; } } n++; } - if (holds_lock == 0) { - SCTP_TCB_SEND_UNLOCK(stcb); - } return; } static void sctp_ss_fcfs_clear(struct sctp_tcb *stcb, struct sctp_association *asoc, - int clear_values, int holds_lock) + bool clear_values SCTP_UNUSED) { struct sctp_stream_queue_pending *sp; - if (clear_values) { - if (holds_lock == 0) { - SCTP_TCB_SEND_LOCK(stcb); - } - while (!TAILQ_EMPTY(&asoc->ss_data.out.list)) { - sp = TAILQ_FIRST(&asoc->ss_data.out.list); - TAILQ_REMOVE(&asoc->ss_data.out.list, sp, ss_next); - sp->ss_next.tqe_next = NULL; - sp->ss_next.tqe_prev = NULL; - } - if (holds_lock == 0) { - SCTP_TCB_SEND_UNLOCK(stcb); - } + SCTP_TCB_LOCK_ASSERT(stcb); + + while (!TAILQ_EMPTY(&asoc->ss_data.out.list)) { + sp = TAILQ_FIRST(&asoc->ss_data.out.list); + KASSERT(sp->scheduled, ("sp %p not scheduled", (void *)sp)); + TAILQ_REMOVE(&asoc->ss_data.out.list, sp, ss_next); + sp->scheduled = false; } + asoc->ss_data.last_out_stream = NULL; return; } static void sctp_ss_fcfs_init_stream(struct sctp_tcb *stcb, struct sctp_stream_out *strq, struct sctp_stream_out *with_strq) { + SCTP_TCB_LOCK_ASSERT(stcb); + if (with_strq != NULL) { if (stcb->asoc.ss_data.locked_on_sending == with_strq) { stcb->asoc.ss_data.locked_on_sending = strq; @@ -849,61 +838,44 @@ stcb->asoc.ss_data.last_out_stream = strq; } } - strq->ss_params.fb.next_spoke.tqe_next = NULL; - strq->ss_params.fb.next_spoke.tqe_prev = NULL; + strq->ss_params.scheduled = false; return; } static void sctp_ss_fcfs_add(struct sctp_tcb *stcb, struct sctp_association *asoc, - struct sctp_stream_out *strq SCTP_UNUSED, struct sctp_stream_queue_pending *sp, - int holds_lock) + struct sctp_stream_out *strq SCTP_UNUSED, struct sctp_stream_queue_pending *sp) { - if (holds_lock == 0) { - SCTP_TCB_SEND_LOCK(stcb); - } - if (sp && (sp->ss_next.tqe_next == NULL) && - (sp->ss_next.tqe_prev == NULL)) { + SCTP_TCB_LOCK_ASSERT(stcb); + + if (!sp->scheduled) { TAILQ_INSERT_TAIL(&asoc->ss_data.out.list, sp, ss_next); - } - if (holds_lock == 0) { - SCTP_TCB_SEND_UNLOCK(stcb); + sp->scheduled = true; } return; } -static int +static bool sctp_ss_fcfs_is_empty(struct sctp_tcb *stcb SCTP_UNUSED, struct sctp_association *asoc) { - if (TAILQ_EMPTY(&asoc->ss_data.out.list)) { - return (1); - } else { - return (0); - } + SCTP_TCB_LOCK_ASSERT(stcb); + + return (TAILQ_EMPTY(&asoc->ss_data.out.list)); } static void sctp_ss_fcfs_remove(struct sctp_tcb *stcb, struct sctp_association *asoc, - struct sctp_stream_out *strq SCTP_UNUSED, struct sctp_stream_queue_pending *sp, - int holds_lock) + struct sctp_stream_out *strq SCTP_UNUSED, struct sctp_stream_queue_pending *sp) { - if (holds_lock == 0) { - SCTP_TCB_SEND_LOCK(stcb); - } - if (sp && - ((sp->ss_next.tqe_next != NULL) || - (sp->ss_next.tqe_prev != NULL))) { + SCTP_TCB_LOCK_ASSERT(stcb); + + if (sp->scheduled) { TAILQ_REMOVE(&asoc->ss_data.out.list, sp, ss_next); - sp->ss_next.tqe_next = NULL; - sp->ss_next.tqe_prev = NULL; - } - if (holds_lock == 0) { - SCTP_TCB_SEND_UNLOCK(stcb); + sp->scheduled = false; } return; } - static struct sctp_stream_out * sctp_ss_fcfs_select(struct sctp_tcb *stcb SCTP_UNUSED, struct sctp_nets *net, struct sctp_association *asoc) @@ -911,6 +883,8 @@ struct sctp_stream_out *strq; struct sctp_stream_queue_pending *sp; + SCTP_TCB_LOCK_ASSERT(stcb); + if (asoc->ss_data.locked_on_sending) { return (asoc->ss_data.locked_on_sending); } @@ -946,6 +920,30 @@ return (strq); } +static void +sctp_ss_fcfs_scheduled(struct sctp_tcb *stcb, + struct sctp_nets *net SCTP_UNUSED, + struct sctp_association *asoc, + struct sctp_stream_out *strq, + int moved_how_much SCTP_UNUSED) +{ + struct sctp_stream_queue_pending *sp; + + KASSERT(strq != NULL, ("strq is NULL")); + asoc->ss_data.last_out_stream = strq; + if (asoc->idata_supported == 0) { + sp = TAILQ_FIRST(&strq->outqueue); + if ((sp != NULL) && (sp->some_taken == 1)) { + asoc->ss_data.locked_on_sending = strq; + } else { + asoc->ss_data.locked_on_sending = NULL; + } + } else { + asoc->ss_data.locked_on_sending = NULL; + } + return; +} + const struct sctp_ss_functions sctp_ss_functions[] = { /* SCTP_SS_DEFAULT */ { @@ -1107,7 +1105,7 @@ sctp_ss_fcfs_is_empty, sctp_ss_fcfs_remove, sctp_ss_fcfs_select, - sctp_ss_default_scheduled, + sctp_ss_fcfs_scheduled, sctp_ss_default_packet_done, sctp_ss_default_get_value, sctp_ss_default_set_value, @@ -1120,7 +1118,7 @@ .sctp_ss_is_empty = sctp_ss_fcfs_is_empty, .sctp_ss_remove_from_stream = sctp_ss_fcfs_remove, .sctp_ss_select_stream = sctp_ss_fcfs_select, - .sctp_ss_scheduled = sctp_ss_default_scheduled, + .sctp_ss_scheduled = sctp_ss_fcfs_scheduled, .sctp_ss_packet_done = sctp_ss_default_packet_done, .sctp_ss_get_value = sctp_ss_default_get_value, .sctp_ss_set_value = sctp_ss_default_set_value, diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_structs.h firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_structs.h --- firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_structs.h 2022-12-05 23:01:11.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_structs.h 2023-01-09 15:01:10.000000000 +0000 @@ -34,7 +34,7 @@ #if defined(__FreeBSD__) && !defined(__Userspace__) #include -__FBSDID("$FreeBSD: head/sys/netinet/sctp_structs.h 362106 2020-06-12 16:31:13Z tuexen $"); +__FBSDID("$FreeBSD$"); #endif #ifndef _NETINET_SCTP_STRUCTS_H_ @@ -65,7 +65,6 @@ uint32_t stopped_from; }; - struct sctp_foo_stuff { struct sctp_inpcb *inp; uint32_t lineno; @@ -73,7 +72,6 @@ int updown; }; - /* * This is the information we track on each interface that we know about from * the distant end. @@ -137,6 +135,26 @@ #endif #endif +/* This struct is here to cut out the compatiabilty + * pad that bulks up both the inp and stcb. The non + * pad portion MUST stay in complete sync with + * sctp_sndrcvinfo... i.e. if sinfo_xxxx is added + * this must be done here too. + */ +struct sctp_nonpad_sndrcvinfo { + uint16_t sinfo_stream; + uint16_t sinfo_ssn; + uint16_t sinfo_flags; + uint32_t sinfo_ppid; + uint32_t sinfo_context; + uint32_t sinfo_timetolive; + uint32_t sinfo_tsn; + uint32_t sinfo_cumtsn; + sctp_assoc_t sinfo_assoc_id; + uint16_t sinfo_keynumber; + uint16_t sinfo_keynumber_valid; +}; + struct sctp_iterator { TAILQ_ENTRY(sctp_iterator) sctp_nxt_itr; #if defined(__FreeBSD__) && !defined(__Userspace__) @@ -163,13 +181,12 @@ #define SCTP_ITERATOR_DO_ALL_INP 0x00000001 #define SCTP_ITERATOR_DO_SINGLE_INP 0x00000002 - TAILQ_HEAD(sctpiterators, sctp_iterator); struct sctp_copy_all { struct sctp_inpcb *inp; /* ep */ struct mbuf *m; - struct sctp_sndrcvinfo sndrcv; + struct sctp_nonpad_sndrcvinfo sndrcv; ssize_t sndlen; int cnt_sent; int cnt_failed; @@ -293,7 +310,6 @@ uint8_t last_inst_ind; /* Last saved inst indication */ }; - struct sctp_nets { TAILQ_ENTRY(sctp_nets) sctp_next; /* next link */ @@ -436,7 +452,6 @@ #endif }; - struct sctp_data_chunkrec { uint32_t tsn; /* the TSN of this transmit */ uint32_t mid; /* the message identifier of this transmit */ @@ -475,7 +490,6 @@ uint8_t can_take_data; }; - struct sctp_tmit_chunk { union { struct sctp_data_chunkrec data; @@ -561,6 +575,7 @@ * the user is in the explict MSG_EOR mode * and wrote some data, but has not completed * sending. + * ss_next and scheduled are only used by the FCFS stream scheduler. */ struct sctp_stream_queue_pending { struct mbuf *data; @@ -584,6 +599,8 @@ uint8_t sender_all_done; uint8_t put_last_out; uint8_t discard_rest; + uint8_t processing; + bool scheduled; }; /* @@ -603,6 +620,19 @@ TAILQ_HEAD(sctpwheel_listhead, sctp_stream_out); TAILQ_HEAD(sctplist_listhead, sctp_stream_queue_pending); +/* + * This union holds all data necessary for + * different stream schedulers. + */ +struct scheduling_data { + struct sctp_stream_out *locked_on_sending; + /* circular looking for output selection */ + struct sctp_stream_out *last_out_stream; + union { + struct sctpwheel_listhead wheel; + struct sctplist_listhead list; + } out; +}; /* Round-robin schedulers */ struct ss_rr { @@ -627,27 +657,16 @@ }; /* - * This union holds all data necessary for - * different stream schedulers. - */ -struct scheduling_data { - struct sctp_stream_out *locked_on_sending; - /* circular looking for output selection */ - struct sctp_stream_out *last_out_stream; - union { - struct sctpwheel_listhead wheel; - struct sctplist_listhead list; - } out; -}; - -/* * This union holds all parameters per stream * necessary for different stream schedulers. */ -union scheduling_parameters { - struct ss_rr rr; - struct ss_prio prio; - struct ss_fb fb; +struct scheduling_parameters { + union { + struct ss_rr rr; + struct ss_prio prio; + struct ss_fb fb; + } ss; + bool scheduled; }; /* States for outgoing streams */ @@ -657,12 +676,10 @@ #define SCTP_STREAM_RESET_PENDING 0x03 #define SCTP_STREAM_RESET_IN_FLIGHT 0x04 -#define SCTP_MAX_STREAMS_AT_ONCE_RESET 200 - /* This struct is used to track the traffic on outbound streams */ struct sctp_stream_out { struct sctp_streamhead outqueue; - union scheduling_parameters ss_params; + struct scheduling_parameters ss_params; uint32_t chunks_on_queues; /* send queue and sent queue */ #if defined(SCTP_DETAILED_STR_STATS) uint32_t abandoned_unsent[SCTP_PR_SCTP_MAX + 1]; @@ -682,6 +699,8 @@ uint8_t state; }; +#define SCTP_MAX_STREAMS_AT_ONCE_RESET 200 + /* used to keep track of the addresses yet to try to add/delete */ TAILQ_HEAD(sctp_asconf_addrhead, sctp_asconf_addr); struct sctp_asconf_addr { @@ -728,26 +747,6 @@ uint8_t decr; }; -/* This struct is here to cut out the compatiabilty - * pad that bulks up both the inp and stcb. The non - * pad portion MUST stay in complete sync with - * sctp_sndrcvinfo... i.e. if sinfo_xxxx is added - * this must be done here too. - */ -struct sctp_nonpad_sndrcvinfo { - uint16_t sinfo_stream; - uint16_t sinfo_ssn; - uint16_t sinfo_flags; - uint32_t sinfo_ppid; - uint32_t sinfo_context; - uint32_t sinfo_timetolive; - uint32_t sinfo_tsn; - uint32_t sinfo_cumtsn; - sctp_assoc_t sinfo_assoc_id; - uint16_t sinfo_keynumber; - uint16_t sinfo_keynumber_valid; -}; - /* * JRS - Structure to hold function pointers to the functions responsible * for congestion control. @@ -787,16 +786,15 @@ * for stream scheduling. */ struct sctp_ss_functions { - void (*sctp_ss_init)(struct sctp_tcb *stcb, struct sctp_association *asoc, - int holds_lock); + void (*sctp_ss_init)(struct sctp_tcb *stcb, struct sctp_association *asoc); void (*sctp_ss_clear)(struct sctp_tcb *stcb, struct sctp_association *asoc, - int clear_values, int holds_lock); + bool clear_values); void (*sctp_ss_init_stream)(struct sctp_tcb *stcb, struct sctp_stream_out *strq, struct sctp_stream_out *with_strq); void (*sctp_ss_add_to_stream)(struct sctp_tcb *stcb, struct sctp_association *asoc, - struct sctp_stream_out *strq, struct sctp_stream_queue_pending *sp, int holds_lock); - int (*sctp_ss_is_empty)(struct sctp_tcb *stcb, struct sctp_association *asoc); + struct sctp_stream_out *strq, struct sctp_stream_queue_pending *sp); + bool (*sctp_ss_is_empty)(struct sctp_tcb *stcb, struct sctp_association *asoc); void (*sctp_ss_remove_from_stream)(struct sctp_tcb *stcb, struct sctp_association *asoc, - struct sctp_stream_out *strq, struct sctp_stream_queue_pending *sp, int holds_lock); + struct sctp_stream_out *strq, struct sctp_stream_queue_pending *sp); struct sctp_stream_out* (*sctp_ss_select_stream)(struct sctp_tcb *stcb, struct sctp_nets *net, struct sctp_association *asoc); void (*sctp_ss_scheduled)(struct sctp_tcb *stcb, struct sctp_nets *net, @@ -807,7 +805,7 @@ struct sctp_stream_out *strq, uint16_t *value); int (*sctp_ss_set_value)(struct sctp_tcb *stcb, struct sctp_association *asoc, struct sctp_stream_out *strq, uint16_t value); - int (*sctp_ss_is_user_msgs_incomplete)(struct sctp_tcb *stcb, struct sctp_association *asoc); + bool (*sctp_ss_is_user_msgs_incomplete)(struct sctp_tcb *stcb, struct sctp_association *asoc); }; /* used to save ASCONF chunks for retransmission */ @@ -920,7 +918,6 @@ /* last place I got a control from */ struct sctp_nets *last_control_chunk_from; - /* * wait to the point the cum-ack passes req->send_reset_at_tsn for * any req on the list. @@ -984,7 +981,6 @@ /* Original seq number I used ??questionable to keep?? */ uint32_t init_seq_number; - /* The Advanced Peer Ack Point, as required by the PR-SCTP */ /* (A1 in Section 4.2) */ uint32_t advanced_peer_ack_point; diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_sysctl.c firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_sysctl.c --- firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_sysctl.c 2022-12-05 23:01:11.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_sysctl.c 2023-01-09 15:01:10.000000000 +0000 @@ -34,7 +34,7 @@ #if defined(__FreeBSD__) && !defined(__Userspace__) #include -__FBSDID("$FreeBSD: head/sys/netinet/sctp_sysctl.c 361934 2020-06-08 20:23:20Z tuexen $"); +__FBSDID("$FreeBSD$"); #endif #include @@ -61,7 +61,7 @@ */ void -sctp_init_sysctls() +sctp_init_sysctls(void) { SCTP_BASE_SYSCTL(sctp_sendspace) = SCTPCTL_MAXDGRAM_DEFAULT; SCTP_BASE_SYSCTL(sctp_recvspace) = SCTPCTL_RECVSPACE_DEFAULT; @@ -175,8 +175,8 @@ SCTP_BASE_SYSCTL(sctp_output_unlocked) = SCTPCTL_OUTPUT_UNLOCKED_DEFAULT; #endif } - #if defined(_WIN32) && !defined(__Userspace__) + void sctp_finish_sysctls() { @@ -201,7 +201,7 @@ struct sctp_laddr *laddr; cnt = 0; - /* neither Mac OS X nor FreeBSD support mulitple routing functions */ + /* neither Mac OS X nor FreeBSD support multiple routing functions */ if ((vrf = sctp_find_vrf(inp->def_vrf_id)) == NULL) { return (0); } @@ -246,8 +246,15 @@ { struct sctp_ifn *sctp_ifn; struct sctp_ifa *sctp_ifa; - int loopback_scope, ipv4_local_scope, local_scope, site_scope; - int ipv4_addr_legal, ipv6_addr_legal; + int loopback_scope; +#ifdef INET + int ipv4_local_scope; + int ipv4_addr_legal; +#endif +#ifdef INET6 + int local_scope, site_scope; + int ipv6_addr_legal; +#endif #if defined(__Userspace__) int conn_addr_legal; #endif @@ -257,68 +264,90 @@ int error; /* Turn on all the appropriate scope */ - if (stcb) { + if (stcb != NULL) { /* use association specific values */ loopback_scope = stcb->asoc.scope.loopback_scope; +#ifdef INET ipv4_local_scope = stcb->asoc.scope.ipv4_local_scope; + ipv4_addr_legal = stcb->asoc.scope.ipv4_addr_legal; +#endif +#ifdef INET6 local_scope = stcb->asoc.scope.local_scope; site_scope = stcb->asoc.scope.site_scope; - ipv4_addr_legal = stcb->asoc.scope.ipv4_addr_legal; ipv6_addr_legal = stcb->asoc.scope.ipv6_addr_legal; +#endif #if defined(__Userspace__) conn_addr_legal = stcb->asoc.scope.conn_addr_legal; #endif } else { /* Use generic values for endpoints. */ loopback_scope = 1; +#ifdef INET ipv4_local_scope = 1; +#endif +#ifdef INET6 local_scope = 1; site_scope = 1; +#endif if (inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) { +#ifdef INET6 ipv6_addr_legal = 1; +#endif +#ifdef INET if (SCTP_IPV6_V6ONLY(inp)) { ipv4_addr_legal = 0; } else { ipv4_addr_legal = 1; } +#endif #if defined(__Userspace__) conn_addr_legal = 0; #endif } else { +#ifdef INET6 ipv6_addr_legal = 0; +#endif #if defined(__Userspace__) if (inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_CONN) { conn_addr_legal = 1; +#ifdef INET ipv4_addr_legal = 0; +#endif } else { conn_addr_legal = 0; +#ifdef INET ipv4_addr_legal = 1; +#endif } #else +#ifdef INET ipv4_addr_legal = 1; #endif +#endif } } - /* neither Mac OS X nor FreeBSD support mulitple routing functions */ + /* Neither Mac OS X nor FreeBSD support multiple routing functions. */ if ((vrf = sctp_find_vrf(inp->def_vrf_id)) == NULL) { SCTP_INP_RUNLOCK(inp); SCTP_INP_INFO_RUNLOCK(); - return (-1); + return (ENOENT); } if (inp->sctp_flags & SCTP_PCB_FLAGS_BOUNDALL) { LIST_FOREACH(sctp_ifn, &vrf->ifnlist, next_ifn) { - if ((loopback_scope == 0) && SCTP_IFN_IS_IFT_LOOP(sctp_ifn)) - /* Skip loopback if loopback_scope not set */ + if ((loopback_scope == 0) && SCTP_IFN_IS_IFT_LOOP(sctp_ifn)) { + /* Skip loopback if loopback_scope not set. */ continue; + } LIST_FOREACH(sctp_ifa, &sctp_ifn->ifalist, next_ifa) { - if (stcb) { + if (stcb != NULL) { /* - * ignore if blacklisted at - * association level + * Ignore if blacklisted at + * association level. */ - if (sctp_is_addr_restricted(stcb, sctp_ifa)) + if (sctp_is_addr_restricted(stcb, sctp_ifa)) { continue; + } } switch (sctp_ifa->address.sa.sa_family) { #ifdef INET @@ -327,16 +356,18 @@ struct sockaddr_in *sin; sin = &sctp_ifa->address.sin; - if (sin->sin_addr.s_addr == 0) + if (sin->sin_addr.s_addr == 0) { continue; + } #if defined(__FreeBSD__) && !defined(__Userspace__) if (prison_check_ip4(inp->ip_inp.inp.inp_cred, &sin->sin_addr) != 0) { continue; } #endif - if ((ipv4_local_scope == 0) && (IN4_ISPRIVATE_ADDRESS(&sin->sin_addr))) + if ((ipv4_local_scope == 0) && (IN4_ISPRIVATE_ADDRESS(&sin->sin_addr))) { continue; + } } else { continue; } @@ -348,8 +379,9 @@ struct sockaddr_in6 *sin6; sin6 = &sctp_ifa->address.sin6; - if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) + if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) { continue; + } #if defined(__FreeBSD__) && !defined(__Userspace__) if (prison_check_ip6(inp->ip_inp.inp.inp_cred, &sin6->sin6_addr) != 0) { @@ -357,11 +389,13 @@ } #endif if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr)) { - if (local_scope == 0) + if (local_scope == 0) { continue; + } } - if ((site_scope == 0) && (IN6_IS_ADDR_SITELOCAL(&sin6->sin6_addr))) + if ((site_scope == 0) && (IN6_IS_ADDR_SITELOCAL(&sin6->sin6_addr))) { continue; + } } else { continue; } @@ -382,7 +416,7 @@ SCTP_INP_RUNLOCK(inp); SCTP_INP_INFO_RUNLOCK(); error = SYSCTL_OUT(req, &xladdr, sizeof(struct xsctp_laddr)); - if (error) { + if (error != 0) { return (error); } else { SCTP_INP_INFO_RLOCK(); @@ -393,7 +427,7 @@ } else { LIST_FOREACH(laddr, &inp->sctp_addr_list, sctp_nxt_addr) { /* ignore if blacklisted at association level */ - if (stcb && sctp_is_addr_restricted(stcb, laddr->ifa)) + if (stcb != NULL && sctp_is_addr_restricted(stcb, laddr->ifa)) continue; memset((void *)&xladdr, 0, sizeof(struct xsctp_laddr)); memcpy((void *)&xladdr.address, (const void *)&laddr->ifa->address, sizeof(union sctp_sockstore)); @@ -402,7 +436,7 @@ SCTP_INP_RUNLOCK(inp); SCTP_INP_INFO_RUNLOCK(); error = SYSCTL_OUT(req, &xladdr, sizeof(struct xsctp_laddr)); - if (error) { + if (error != 0) { return (error); } else { SCTP_INP_INFO_RLOCK(); @@ -416,7 +450,7 @@ SCTP_INP_INFO_RUNLOCK(); error = SYSCTL_OUT(req, &xladdr, sizeof(struct xsctp_laddr)); - if (error) { + if (error != 0) { return (error); } else { SCTP_INP_INFO_RLOCK(); @@ -727,8 +761,8 @@ } return (error); } - #if defined(__APPLE__) && !defined(__Userspace__) + int sctp_is_vmware_interface(struct ifnet *); static int diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_sysctl.h firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_sysctl.h --- firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_sysctl.h 2022-12-05 23:00:38.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_sysctl.h 2023-01-09 15:01:10.000000000 +0000 @@ -34,7 +34,7 @@ #if defined(__FreeBSD__) && !defined(__Userspace__) #include -__FBSDID("$FreeBSD: head/sys/netinet/sctp_sysctl.h 361895 2020-06-07 14:39:20Z tuexen $"); +__FBSDID("$FreeBSD$"); #endif #ifndef _NETINET_SCTP_SYSCTL_H_ @@ -56,7 +56,7 @@ uint32_t sctp_nrsack_enable; uint32_t sctp_pktdrop_enable; uint32_t sctp_fr_max_burst_default; -#if !(defined(__FreeBSD__) && !defined(__Userspace__)) +#if !(defined(__FreeBSD__) && !defined(__Userspace__)) uint32_t sctp_no_csum_on_loopback; #endif uint32_t sctp_peer_chunk_oh; @@ -170,7 +170,7 @@ #define SCTPCTL_AUTOASCONF_DEFAULT 1 /* autoasconf: Enable SCTP Auto-ASCONF */ -#define SCTPCTL_MULTIPLEASCONFS_DESC "Enable SCTP Muliple-ASCONFs" +#define SCTPCTL_MULTIPLEASCONFS_DESC "Enable SCTP Multiple-ASCONFs" #define SCTPCTL_MULTIPLEASCONFS_MIN 0 #define SCTPCTL_MULTIPLEASCONFS_MAX 1 #define SCTPCTL_MULTIPLEASCONFS_DEFAULT SCTP_DEFAULT_MULTIPLE_ASCONFS @@ -241,7 +241,6 @@ #define SCTPCTL_FRMAXBURST_MAX 0xFFFFFFFF #define SCTPCTL_FRMAXBURST_DEFAULT SCTP_DEF_FRMAX_BURST - /* maxchunks: Default max chunks on queue per asoc */ #define SCTPCTL_MAXCHUNKS_DESC "Default max chunks on queue per asoc" #define SCTPCTL_MAXCHUNKS_MIN 0 @@ -344,10 +343,10 @@ #define SCTPCTL_INIT_RTO_MAX_MAX 0xFFFFFFFF #define SCTPCTL_INIT_RTO_MAX_DEFAULT SCTP_RTO_UPPER_BOUND -/* valid_cookie_life: Default cookie lifetime in sec */ -#define SCTPCTL_VALID_COOKIE_LIFE_DESC "Default cookie lifetime in seconds" -#define SCTPCTL_VALID_COOKIE_LIFE_MIN 0 -#define SCTPCTL_VALID_COOKIE_LIFE_MAX 0xFFFFFFFF +/* valid_cookie_life: Default cookie lifetime in ms */ +#define SCTPCTL_VALID_COOKIE_LIFE_DESC "Default cookie lifetime in ms" +#define SCTPCTL_VALID_COOKIE_LIFE_MIN SCTP_MIN_COOKIE_LIFE +#define SCTPCTL_VALID_COOKIE_LIFE_MAX SCTP_MAX_COOKIE_LIFE #define SCTPCTL_VALID_COOKIE_LIFE_DEFAULT SCTP_DEFAULT_COOKIE_LIFE /* init_rtx_max: Default maximum number of retransmission for INIT chunks */ @@ -595,16 +594,12 @@ #define SCTPCTL_IGNORE_VMWARE_INTERFACES_MIN 0 #define SCTPCTL_IGNORE_VMWARE_INTERFACES_MAX 1 #define SCTPCTL_IGNORE_VMWARE_INTERFACES_DEFAULT SCTPCTL_IGNORE_VMWARE_INTERFACES_MAX -#endif -#if defined(__APPLE__) && !defined(__Userspace__) #define SCTPCTL_OUTPUT_UNLOCKED_DESC "Unlock socket when sending packets down to IP" #define SCTPCTL_OUTPUT_UNLOCKED_MIN 0 #define SCTPCTL_OUTPUT_UNLOCKED_MAX 1 #define SCTPCTL_OUTPUT_UNLOCKED_DEFAULT SCTPCTL_OUTPUT_UNLOCKED_MIN -#endif -#if defined(__APPLE__) && !defined(__Userspace__) #define SCTPCTL_ADDR_WATCHDOG_LIMIT_DESC "Address watchdog limit" #define SCTPCTL_ADDR_WATCHDOG_LIMIT_MIN 0 #define SCTPCTL_ADDR_WATCHDOG_LIMIT_MAX 0xFFFFFFFF @@ -614,8 +609,8 @@ #define SCTPCTL_VTAG_WATCHDOG_LIMIT_MIN 0 #define SCTPCTL_VTAG_WATCHDOG_LIMIT_MAX 0xFFFFFFFF #define SCTPCTL_VTAG_WATCHDOG_LIMIT_DEFAULT SCTPCTL_VTAG_WATCHDOG_LIMIT_MIN -#endif +#endif #if defined(_KERNEL) || defined(__Userspace__) #if defined(__FreeBSD__) || defined(__APPLE__) || defined(__Userspace__) #if defined(SYSCTL_DECL) diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_timer.c firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_timer.c --- firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_timer.c 2022-12-05 23:00:38.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_timer.c 2023-01-09 15:01:10.000000000 +0000 @@ -34,7 +34,7 @@ #if defined(__FreeBSD__) && !defined(__Userspace__) #include -__FBSDID("$FreeBSD: head/sys/netinet/sctp_timer.c 362054 2020-06-11 13:34:09Z tuexen $"); +__FBSDID("$FreeBSD$"); #endif #define _IP_VHL @@ -114,7 +114,7 @@ } } else if ((net->pf_threshold < net->failure_threshold) && (net->error_count > net->pf_threshold)) { - if (!(net->dest_state & SCTP_ADDR_PF)) { + if ((net->dest_state & SCTP_ADDR_PF) == 0) { net->dest_state |= SCTP_ADDR_PF; net->last_active = sctp_get_tick_count(); sctp_send_hb(stcb, net, SCTP_SO_NOT_LOCKED); @@ -132,20 +132,20 @@ if ((net->dest_state & SCTP_ADDR_UNCONFIRMED) == 0) { if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_THRESHOLD_LOGGING) { sctp_misc_ints(SCTP_THRESHOLD_INCR, - stcb->asoc.overall_error_count, - (stcb->asoc.overall_error_count+1), - SCTP_FROM_SCTP_TIMER, - __LINE__); + stcb->asoc.overall_error_count, + (stcb->asoc.overall_error_count+1), + SCTP_FROM_SCTP_TIMER, + __LINE__); } stcb->asoc.overall_error_count++; } } else { if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_THRESHOLD_LOGGING) { sctp_misc_ints(SCTP_THRESHOLD_INCR, - stcb->asoc.overall_error_count, - (stcb->asoc.overall_error_count+1), - SCTP_FROM_SCTP_TIMER, - __LINE__); + stcb->asoc.overall_error_count, + (stcb->asoc.overall_error_count+1), + SCTP_FROM_SCTP_TIMER, + __LINE__); } stcb->asoc.overall_error_count++; } @@ -164,15 +164,15 @@ op_err = sctp_generate_cause(SCTP_BASE_SYSCTL(sctp_diag_info_code), "Association error counter exceeded"); inp->last_abort_code = SCTP_FROM_SCTP_TIMER + SCTP_LOC_2; - sctp_abort_an_association(inp, stcb, op_err, SCTP_SO_NOT_LOCKED); + sctp_abort_an_association(inp, stcb, op_err, true, SCTP_SO_NOT_LOCKED); return (1); } return (0); } /* - * sctp_find_alternate_net() returns a non-NULL pointer as long - * the argument net is non-NULL. + * sctp_find_alternate_net() returns a non-NULL pointer as long as there + * exists nets, which are not being deleted. */ struct sctp_nets * sctp_find_alternate_net(struct sctp_tcb *stcb, @@ -181,20 +181,20 @@ { /* Find and return an alternate network if possible */ struct sctp_nets *alt, *mnet, *min_errors_net = NULL , *max_cwnd_net = NULL; - int once; + bool looped; /* JRS 5/14/07 - Initialize min_errors to an impossible value. */ int min_errors = -1; uint32_t max_cwnd = 0; if (stcb->asoc.numnets == 1) { - /* No others but net */ + /* No selection can be made. */ return (TAILQ_FIRST(&stcb->asoc.nets)); } /* * JRS 5/14/07 - If mode is set to 2, use the CMT PF find alternate net algorithm. * This algorithm chooses the active destination (not in PF state) with the largest * cwnd value. If all destinations are in PF state, unreachable, or unconfirmed, choose - * the desination that is in PF state with the lowest error count. In case of a tie, + * the destination that is in PF state with the lowest error count. In case of a tie, * choose the destination that was most recently active. */ if (mode == 2) { @@ -323,25 +323,22 @@ return (max_cwnd_net); } } - mnet = net; - once = 0; - - if (mnet == NULL) { - mnet = TAILQ_FIRST(&stcb->asoc.nets); - if (mnet == NULL) { - return (NULL); - } + /* Look for an alternate net, which is active. */ + if ((net != NULL) && ((net->dest_state & SCTP_ADDR_BEING_DELETED) == 0)) { + alt = TAILQ_NEXT(net, sctp_next); + } else { + alt = TAILQ_FIRST(&stcb->asoc.nets); } + looped = false; for (;;) { - alt = TAILQ_NEXT(mnet, sctp_next); if (alt == NULL) { - once++; - if (once > 1) { - break; + if (!looped) { + alt = TAILQ_FIRST(&stcb->asoc.nets); + looped = true; } - alt = TAILQ_FIRST(&stcb->asoc.nets); + /* Definitely out of candidates. */ if (alt == NULL) { - return (NULL); + break; } } #if defined(__FreeBSD__) && !defined(__Userspace__) @@ -361,43 +358,56 @@ #else (alt->ro.ro_rt != NULL) && #endif - (!(alt->dest_state & SCTP_ADDR_UNCONFIRMED))) { - /* Found a reachable address */ + ((alt->dest_state & SCTP_ADDR_UNCONFIRMED) == 0) && + (alt != net)) { + /* Found an alternate net, which is reachable. */ break; } - mnet = alt; + alt = TAILQ_NEXT(alt, sctp_next); } if (alt == NULL) { - /* Case where NO insv network exists (dormant state) */ - /* we rotate destinations */ - once = 0; - mnet = net; + /* + * In case no active alternate net has been found, look for + * an alternate net, which is confirmed. + */ + if ((net != NULL) && ((net->dest_state & SCTP_ADDR_BEING_DELETED) == 0)) { + alt = TAILQ_NEXT(net, sctp_next); + } else { + alt = TAILQ_FIRST(&stcb->asoc.nets); + } + looped = false; for (;;) { - if (mnet == NULL) { - return (TAILQ_FIRST(&stcb->asoc.nets)); - } - alt = TAILQ_NEXT(mnet, sctp_next); if (alt == NULL) { - once++; - if (once > 1) { - break; + if (!looped) { + alt = TAILQ_FIRST(&stcb->asoc.nets); + looped = true; } - alt = TAILQ_FIRST(&stcb->asoc.nets); + /* Definitely out of candidates. */ if (alt == NULL) { break; } } - if ((!(alt->dest_state & SCTP_ADDR_UNCONFIRMED)) && + if (((alt->dest_state & SCTP_ADDR_UNCONFIRMED) == 0) && (alt != net)) { - /* Found an alternate address */ + /* Found an alternate net, which is confirmed. */ break; } - mnet = alt; + alt = TAILQ_NEXT(alt, sctp_next); } } if (alt == NULL) { - return (net); + /* + * In case no confirmed alternate net has been found, just + * return net, if it is not being deleted. In the other case + * just return the first net. + */ + if ((net != NULL) && ((net->dest_state & SCTP_ADDR_BEING_DELETED) == 0)) { + alt = net; + } + if (alt == NULL) { + alt = TAILQ_FIRST(&stcb->asoc.nets); + } } return (alt); } @@ -497,8 +507,9 @@ unsigned int cnt_mk; uint32_t orig_flight, orig_tf; uint32_t tsnlast, tsnfirst; +#ifndef INVARIANTS int recovery_cnt = 0; - +#endif /* none in flight now */ audit_tf = 0; @@ -537,8 +548,8 @@ min_wait.tv_sec = min_wait.tv_usec = 0; } if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_FR_LOGGING_ENABLE) { - sctp_log_fr(cur_rto, now.tv_sec, now.tv_usec, SCTP_FR_T3_MARK_TIME); - sctp_log_fr(0, min_wait.tv_sec, min_wait.tv_usec, SCTP_FR_T3_MARK_TIME); + sctp_log_fr(cur_rto, (uint32_t)now.tv_sec, now.tv_usec, SCTP_FR_T3_MARK_TIME); + sctp_log_fr(0, (uint32_t)min_wait.tv_sec, min_wait.tv_usec, SCTP_FR_T3_MARK_TIME); } /* * Our rwnd will be incorrect here since we are not adding back the @@ -560,10 +571,10 @@ /* Strange case our list got out of order? */ SCTP_PRINTF("Our list is out of order? last_acked:%x chk:%x\n", (unsigned int)stcb->asoc.last_acked_seq, (unsigned int)chk->rec.data.tsn); - recovery_cnt++; #ifdef INVARIANTS panic("last acked >= chk on sent-Q"); #else + recovery_cnt++; SCTP_PRINTF("Recover attempts a restart cnt:%d\n", recovery_cnt); sctp_recover_sent_list(stcb); if (recovery_cnt < 10) { @@ -585,7 +596,7 @@ /* validate its been outstanding long enough */ if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_FR_LOGGING_ENABLE) { sctp_log_fr(chk->rec.data.tsn, - chk->sent_rcv_time.tv_sec, + (uint32_t)chk->sent_rcv_time.tv_sec, chk->sent_rcv_time.tv_usec, SCTP_FR_T3_MARK_TIME); } @@ -597,7 +608,7 @@ */ if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_FR_LOGGING_ENABLE) { sctp_log_fr(0, - chk->sent_rcv_time.tv_sec, + (uint32_t)chk->sent_rcv_time.tv_sec, chk->sent_rcv_time.tv_usec, SCTP_FR_T3_STOPPED); } @@ -810,7 +821,6 @@ return (0); } - int sctp_t3rxt_timer(struct sctp_inpcb *inp, struct sctp_tcb *stcb, @@ -852,11 +862,11 @@ if (net != stcb->asoc.primary_destination) { /* send a immediate HB if our RTO is stale */ struct timeval now; - unsigned int ms_goneby; + uint32_t ms_goneby; (void)SCTP_GETTIME_TIMEVAL(&now); if (net->last_sent_time.tv_sec) { - ms_goneby = (now.tv_sec - net->last_sent_time.tv_sec) * 1000; + ms_goneby = (uint32_t)(now.tv_sec - net->last_sent_time.tv_sec) * 1000; } else { ms_goneby = 0; } @@ -911,7 +921,7 @@ num_mk = 0; num_abandoned = 0; (void)sctp_mark_all_for_resend(stcb, net, alt, win_probe, - &num_mk, &num_abandoned); + &num_mk, &num_abandoned); /* FR Loss recovery just ended with the T3. */ stcb->asoc.fast_retran_loss_recovery = 0; @@ -930,16 +940,16 @@ /* Backoff the timer and cwnd */ sctp_backoff_on_timeout(stcb, net, win_probe, num_mk, num_abandoned); - if ((!(net->dest_state & SCTP_ADDR_REACHABLE)) || + if (((net->dest_state & SCTP_ADDR_REACHABLE) == 0) || (net->dest_state & SCTP_ADDR_PF)) { /* Move all pending over too */ sctp_move_chunks_from_net(stcb, net); /* Get the address that failed, to - * force a new src address selecton and + * force a new src address selection and * a route allocation. */ - if (net->ro._s_addr) { + if (net->ro._s_addr != NULL) { sctp_free_ifa(net->ro._s_addr); net->ro._s_addr = NULL; } @@ -949,7 +959,7 @@ #if defined(__FreeBSD__) && !defined(__Userspace__) RO_NHFREE(&net->ro); #else - if (net->ro.ro_rt) { + if (net->ro.ro_rt != NULL) { RTFREE(net->ro.ro_rt); net->ro.ro_rt = NULL; } @@ -964,7 +974,7 @@ * change-primary then this flag must be cleared * from any net structures. */ - if (stcb->asoc.alternate) { + if (stcb->asoc.alternate != NULL) { sctp_free_remote_addr(stcb->asoc.alternate); } stcb->asoc.alternate = alt; @@ -1077,7 +1087,7 @@ op_err = sctp_generate_cause(SCTP_BASE_SYSCTL(sctp_diag_info_code), "Cookie timer expired, but no cookie"); inp->last_abort_code = SCTP_FROM_SCTP_TIMER + SCTP_LOC_3; - sctp_abort_an_association(inp, stcb, op_err, SCTP_SO_NOT_LOCKED); + sctp_abort_an_association(inp, stcb, op_err, false, SCTP_SO_NOT_LOCKED); } else { #ifdef INVARIANTS panic("Cookie timer expires in wrong state?"); @@ -1163,7 +1173,7 @@ atomic_add_int(&alt->ref_count, 1); } } - if (!(net->dest_state & SCTP_ADDR_REACHABLE)) { + if ((net->dest_state & SCTP_ADDR_REACHABLE) == 0) { /* * If the address went un-reachable, we need to move to * alternates for ALL chk's in queue @@ -1258,7 +1268,7 @@ chk->sent = SCTP_DATAGRAM_RESEND; chk->flags |= CHUNK_FLAGS_FRAGMENT_OK; } - if (!(net->dest_state & SCTP_ADDR_REACHABLE)) { + if ((net->dest_state & SCTP_ADDR_REACHABLE) == 0) { /* * If the address went un-reachable, we need to move * to the alternate for ALL chunks in queue @@ -1349,17 +1359,17 @@ } static void -sctp_audit_stream_queues_for_size(struct sctp_inpcb *inp, - struct sctp_tcb *stcb) +sctp_audit_stream_queues_for_size(struct sctp_inpcb *inp, struct sctp_tcb *stcb) { struct sctp_stream_queue_pending *sp; unsigned int i, chks_in_queue = 0; int being_filled = 0; - /* - * This function is ONLY called when the send/sent queues are empty. - */ - if ((stcb == NULL) || (inp == NULL)) - return; + + KASSERT(inp != NULL, ("inp is NULL")); + KASSERT(stcb != NULL, ("stcb is NULL")); + SCTP_TCB_LOCK_ASSERT(stcb); + KASSERT(TAILQ_EMPTY(&stcb->asoc.send_queue), ("send_queue not empty")); + KASSERT(TAILQ_EMPTY(&stcb->asoc.sent_queue), ("sent_queue not empty")); if (stcb->asoc.sent_queue_retran_cnt) { SCTP_PRINTF("Hmm, sent_queue_retran_cnt is non-zero %d\n", @@ -1368,7 +1378,7 @@ } if (stcb->asoc.ss_functions.sctp_ss_is_empty(stcb, &stcb->asoc)) { /* No stream scheduler information, initialize scheduler */ - stcb->asoc.ss_functions.sctp_ss_init(stcb, &stcb->asoc, 0); + stcb->asoc.ss_functions.sctp_ss_init(stcb, &stcb->asoc); if (!stcb->asoc.ss_functions.sctp_ss_is_empty(stcb, &stcb->asoc)) { /* yep, we lost a stream or two */ SCTP_PRINTF("Found additional streams NOT managed by scheduler, corrected\n"); @@ -1416,15 +1426,11 @@ sctp_heartbeat_timer(struct sctp_inpcb *inp, struct sctp_tcb *stcb, struct sctp_nets *net) { - uint8_t net_was_pf; + bool net_was_pf; - if (net->dest_state & SCTP_ADDR_PF) { - net_was_pf = 1; - } else { - net_was_pf = 0; - } + net_was_pf = (net->dest_state & SCTP_ADDR_PF) != 0; if (net->hb_responded == 0) { - if (net->ro._s_addr) { + if (net->ro._s_addr != NULL) { /* Invalidate the src address if we did not get * a response last time. */ @@ -1439,7 +1445,7 @@ } } /* Zero PBA, if it needs it */ - if (net->partial_bytes_acked) { + if (net->partial_bytes_acked > 0) { net->partial_bytes_acked = 0; } if ((stcb->asoc.total_output_queue_size > 0) && @@ -1447,10 +1453,11 @@ (TAILQ_EMPTY(&stcb->asoc.sent_queue))) { sctp_audit_stream_queues_for_size(inp, stcb); } - if (!(net->dest_state & SCTP_ADDR_NOHB) && - !((net_was_pf == 0) && (net->dest_state & SCTP_ADDR_PF))) { - /* when move to PF during threshold mangement, a HB has been - queued in that routine */ + if ((((net->dest_state & SCTP_ADDR_NOHB) == 0) || + (net->dest_state & SCTP_ADDR_UNCONFIRMED)) && + (net_was_pf || ((net->dest_state & SCTP_ADDR_PF) == 0))) { + /* When moving to PF during threshold management, a HB has been + queued in that routine. */ uint32_t ms_gone_by; if ((net->last_sent_time.tv_sec > 0) || @@ -1472,6 +1479,7 @@ ms_gone_by = 0xffffffff; } if ((ms_gone_by >= net->heart_beat_delay) || + (net->dest_state & SCTP_ADDR_UNCONFIRMED) || (net->dest_state & SCTP_ADDR_PF)) { sctp_send_hb(stcb, net, SCTP_SO_NOT_LOCKED); } diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_timer.h firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_timer.h --- firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_timer.h 2022-12-05 23:00:39.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_timer.h 2023-01-09 15:01:10.000000000 +0000 @@ -34,7 +34,7 @@ #if defined(__FreeBSD__) && !defined(__Userspace__) #include -__FBSDID("$FreeBSD: head/sys/netinet/sctp_timer.h 359195 2020-03-21 16:12:19Z tuexen $"); +__FBSDID("$FreeBSD$"); #endif #ifndef _NETINET_SCTP_TIMER_H_ @@ -99,6 +99,5 @@ void sctp_gc(struct inpcbinfo *); #endif #endif - #endif #endif diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_uio.h firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_uio.h --- firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_uio.h 2022-12-05 23:00:50.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_uio.h 2023-01-09 15:01:10.000000000 +0000 @@ -34,7 +34,7 @@ #if defined(__FreeBSD__) && !defined(__Userspace__) #include -__FBSDID("$FreeBSD: head/sys/netinet/sctp_uio.h 362473 2020-06-21 23:12:56Z tuexen $"); +__FBSDID("$FreeBSD$"); #endif #ifndef _NETINET_SCTP_UIO_H_ @@ -45,7 +45,6 @@ #define _KERNEL #endif #endif - #if !defined(_WIN32) #if !defined(_KERNEL) #include @@ -129,7 +128,6 @@ * all sendrcvinfo's need a verfid for SENDING only. */ - #define SCTP_ALIGN_RESV_PAD 92 #define SCTP_ALIGN_RESV_PAD_SHORT 76 @@ -441,7 +439,6 @@ uint32_t ssb_adaption_ind; }; - /* * Partial Delivery API event */ @@ -458,7 +455,6 @@ /* indication values */ #define SCTP_PARTIAL_DELIVERY_ABORTED 0x0001 - /* * authentication key event */ @@ -478,7 +474,6 @@ #define SCTP_AUTH_NO_AUTH 0x0002 #define SCTP_AUTH_FREE_KEY 0x0003 - struct sctp_sender_dry_event { uint16_t sender_dry_type; uint16_t sender_dry_flags; @@ -486,7 +481,6 @@ sctp_assoc_t sender_dry_assoc_id; }; - /* * Stream reset event - subscribe to SCTP_STREAM_RESET_EVENT */ @@ -534,7 +528,6 @@ #define SCTP_STREAM_CHANGE_DENIED 0x0004 #define SCTP_STREAM_CHANGE_FAILED 0x0008 - /* SCTP notification event */ struct sctp_tlv { uint16_t sn_type; @@ -1137,7 +1130,6 @@ #define SCTP_STAT_DECR_COUNTER64(_x) SCTP_STAT_DECR(_x) #define SCTP_STAT_DECR_GAUGE32(_x) SCTP_STAT_DECR(_x) - /***********************************/ /* And something for us old timers */ /***********************************/ @@ -1171,7 +1163,6 @@ #endif /***********************************/ - struct xsctp_inpcb { uint32_t last; uint32_t flags; @@ -1286,7 +1277,7 @@ sctp_lower_sosend(struct socket *so, struct sockaddr *addr, struct uio *uio, - struct mbuf *i_pak, + struct mbuf *top, struct mbuf *control, int flags, struct sctp_sndrcvinfo *srcv diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_userspace.c firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_userspace.c --- firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_userspace.c 2022-12-05 23:01:06.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_userspace.c 2023-01-09 15:01:10.000000000 +0000 @@ -32,7 +32,7 @@ #include #include #if !defined(__MINGW32__) -#pragma comment(lib, "IPHLPAPI.lib") +#pragma comment(lib, "iphlpapi.lib") #endif #endif #include @@ -96,7 +96,7 @@ #if !defined(_WIN32) && !defined(__native_client__) int -sctp_userspace_get_mtu_from_ifn(uint32_t if_index, int af) +sctp_userspace_get_mtu_from_ifn(uint32_t if_index) { #if defined(INET) || defined(INET6) struct ifreq ifr; @@ -104,34 +104,26 @@ #endif int mtu; - switch (af) { -#if defined(INET) - case AF_INET: -#endif -#if defined(INET6) - case AF_INET6: -#endif + if (if_index == 0xffffffff) { + mtu = 1280; + } else { + mtu = 0; #if defined(INET) || defined(INET6) memset(&ifr, 0, sizeof(struct ifreq)); - mtu = 0; if (if_indextoname(if_index, ifr.ifr_name) != NULL) { /* TODO can I use the raw socket here and not have to open a new one with each query? */ - if ((fd = socket(af, SOCK_DGRAM, 0)) < 0) { - break; - } - if (ioctl(fd, SIOCGIFMTU, &ifr) >= 0) { - mtu = ifr.ifr_mtu; +#if defined(INET) + if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) >= 0) { +#else + if ((fd = socket(AF_INET6, SOCK_DGRAM, 0)) >= 0) { +#endif + if (ioctl(fd, SIOCGIFMTU, &ifr) >= 0) { + mtu = ifr.ifr_mtu; + } + close(fd); } - close(fd); } - break; #endif - case AF_CONN: - mtu = 1280; - break; - default: - mtu = 0; - break; } return (mtu); } @@ -139,13 +131,13 @@ #if defined(__native_client__) int -sctp_userspace_get_mtu_from_ifn(uint32_t if_index, int af) +sctp_userspace_get_mtu_from_ifn(uint32_t if_index) { return 1280; } #endif -#if defined(__APPLE__) || defined(__DragonFly__) || defined(__linux__) || defined(__native_client__) || defined(__NetBSD__) || defined(_WIN32) || defined(__Fuchsia__) +#if defined(__APPLE__) || defined(__DragonFly__) || defined(__linux__) || defined(__native_client__) || defined(__NetBSD__) || defined(__QNX__) || defined(_WIN32) || defined(__Fuchsia__) || defined(__EMSCRIPTEN__) int timingsafe_bcmp(const void *b1, const void *b2, size_t n) { @@ -160,7 +152,7 @@ #ifdef _WIN32 int -sctp_userspace_get_mtu_from_ifn(uint32_t if_index, int af) +sctp_userspace_get_mtu_from_ifn(uint32_t if_index) { #if defined(INET) || defined(INET6) PIP_ADAPTER_ADDRESSES pAdapterAddrs, pAdapt; @@ -168,15 +160,11 @@ #endif int mtu; - switch (af) { -#if defined(INET) - case AF_INET: -#endif -#if defined(INET6) - case AF_INET6: -#endif -#if defined(INET) || defined(INET6) + if (if_index == 0xffffffff) { + mtu = 1280; + } else { mtu = 0; +#if defined(INET) || defined(INET6) AdapterAddrsSize = 0; pAdapterAddrs = NULL; if ((Err = GetAdaptersAddresses(AF_UNSPEC, 0, NULL, NULL, &AdapterAddrsSize)) != 0) { @@ -206,14 +194,7 @@ if (pAdapterAddrs != NULL) { GlobalFree(pAdapterAddrs); } - break; #endif - case AF_CONN: - mtu = 1280; - break; - default: - mtu = 0; - break; } return (mtu); } diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_usrreq.c firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_usrreq.c --- firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_usrreq.c 2022-12-05 23:01:12.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_usrreq.c 2023-01-09 15:01:10.000000000 +0000 @@ -34,7 +34,7 @@ #if defined(__FreeBSD__) && !defined(__Userspace__) #include -__FBSDID("$FreeBSD: head/sys/netinet/sctp_usrreq.c 362563 2020-06-23 23:05:05Z tuexen $"); +__FBSDID("$FreeBSD$"); #endif #include @@ -64,7 +64,6 @@ #if defined(__FreeBSD__) && !defined(__Userspace__) #include #endif - #if defined(HAVE_SCTP_PEELOFF_SOCKOPT) #include #endif /* HAVE_SCTP_PEELOFF_SOCKOPT */ @@ -72,14 +71,19 @@ extern const struct sctp_cc_functions sctp_cc_functions[]; extern const struct sctp_ss_functions sctp_ss_functions[]; -void #if defined(__Userspace__) +void sctp_init(uint16_t port, int (*conn_output)(void *addr, void *buffer, size_t length, uint8_t tos, uint8_t set_df), void (*debug_printf)(const char *format, ...), int start_threads) #elif defined(__APPLE__) && (!defined(APPLE_LEOPARD) && !defined(APPLE_SNOWLEOPARD) &&!defined(APPLE_LION) && !defined(APPLE_MOUNTAINLION)) +void sctp_init(struct protosw *pp SCTP_UNUSED, struct domain *dp SCTP_UNUSED) +#elif defined(__FreeBSD__) +static void +sctp_init(void *arg SCTP_UNUSED) #else +void sctp_init(void) #endif { @@ -106,7 +110,7 @@ */ sb_max_adj = (u_long)((u_quad_t) (SB_MAX) * MCLBYTES / (MSIZE + MCLBYTES)); SCTP_BASE_SYSCTL(sctp_sendspace) = min(sb_max_adj, - (((uint32_t)nmbclusters / 2) * SCTP_DEFAULT_MAXSEGMENT)); + (((uint32_t)nmbclusters / 2) * MCLBYTES)); #endif /* * Now for the recv window, should we take the same amount? or @@ -161,12 +165,14 @@ sctp_addr_change_event_handler, NULL, EVENTHANDLER_PRI_FIRST); #endif } - #if defined(__FreeBSD__) && !defined(__Userspace__) +VNET_SYSINIT(sctp_init, SI_SUB_PROTO_DOMAIN, SI_ORDER_THIRD, sctp_init, NULL); + #ifdef VIMAGE static void sctp_finish(void *unused __unused) { + EVENTHANDLER_DEREGISTER(rt_addrmsg, SCTP_BASE_VAR(eh_tag)); sctp_pcb_finish(); } VNET_SYSUNINIT(sctp, SI_SUB_PROTO_DOMAIN, SI_ORDER_FOURTH, sctp_finish, NULL); @@ -191,48 +197,74 @@ #if defined(_WIN32) && !defined(__Userspace__) sctp_finish_sysctls(); #endif +#if defined(__Userspace__) + finish_random(); +#endif } #endif void -sctp_pathmtu_adjustment(struct sctp_tcb *stcb, uint16_t nxtsz) +sctp_pathmtu_adjustment(struct sctp_tcb *stcb, uint32_t mtu, bool resend) { + struct sctp_association *asoc; struct sctp_tmit_chunk *chk; - uint16_t overhead; + uint32_t overhead; - /* Adjust that too */ - stcb->asoc.smallest_mtu = nxtsz; - /* now off to subtract IP_DF flag if needed */ - overhead = IP_HDR_SIZE + sizeof(struct sctphdr); - if (sctp_auth_is_required_chunk(SCTP_DATA, stcb->asoc.peer_auth_chunks)) { - overhead += sctp_get_auth_chunk_len(stcb->asoc.peer_hmac_id); + asoc = &stcb->asoc; + KASSERT(mtu < asoc->smallest_mtu, + ("Currently only reducing association MTU %u supported (MTU %u)", + asoc->smallest_mtu, mtu)); + asoc->smallest_mtu = mtu; + if (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) { + overhead = SCTP_MIN_OVERHEAD; + } else { +#if defined(__Userspace__) + if (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_BOUND_CONN) { + overhead = sizeof(struct sctphdr); + } else { + overhead = SCTP_MIN_V4_OVERHEAD; + } +#else + overhead = SCTP_MIN_V4_OVERHEAD; +#endif + } + if (asoc->idata_supported) { + if (sctp_auth_is_required_chunk(SCTP_IDATA, asoc->peer_auth_chunks)) { + overhead += sctp_get_auth_chunk_len(asoc->peer_hmac_id); + } + } else { + if (sctp_auth_is_required_chunk(SCTP_DATA, asoc->peer_auth_chunks)) { + overhead += sctp_get_auth_chunk_len(asoc->peer_hmac_id); + } } - TAILQ_FOREACH(chk, &stcb->asoc.send_queue, sctp_next) { - if ((chk->send_size + overhead) > nxtsz) { + KASSERT(overhead % 4 == 0, + ("overhead (%u) not a multiple of 4", overhead)); + TAILQ_FOREACH(chk, &asoc->send_queue, sctp_next) { + if (((uint32_t)chk->send_size + overhead) > mtu) { chk->flags |= CHUNK_FLAGS_FRAGMENT_OK; } } - TAILQ_FOREACH(chk, &stcb->asoc.sent_queue, sctp_next) { - if ((chk->send_size + overhead) > nxtsz) { - /* - * For this guy we also mark for immediate resend - * since we sent to big of chunk - */ + TAILQ_FOREACH(chk, &asoc->sent_queue, sctp_next) { + if (((uint32_t)chk->send_size + overhead) > mtu) { chk->flags |= CHUNK_FLAGS_FRAGMENT_OK; - if (chk->sent < SCTP_DATAGRAM_RESEND) { + if (resend && chk->sent < SCTP_DATAGRAM_RESEND) { + /* + * If requested, mark the chunk for immediate + * resend, since we sent it being too big. + */ sctp_flight_size_decrease(chk); sctp_total_flight_decrease(stcb, chk); chk->sent = SCTP_DATAGRAM_RESEND; - sctp_ucount_incr(stcb->asoc.sent_queue_retran_cnt); + sctp_ucount_incr(asoc->sent_queue_retran_cnt); chk->rec.data.doing_fast_retransmit = 0; if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_FLIGHT_LOGGING_ENABLE) { sctp_misc_ints(SCTP_FLIGHT_LOG_DOWN_PMTU, - chk->whoTo->flight_size, - chk->book_size, - (uint32_t)(uintptr_t)chk->whoTo, - chk->rec.data.tsn); + chk->whoTo->flight_size, + chk->book_size, + (uint32_t)(uintptr_t)chk->whoTo, + chk->rec.data.tsn); } - /* Clear any time so NO RTT is being done */ + /* Clear any time, so NO RTT is being done. */ if (chk->do_rtt == 1) { chk->do_rtt = 0; chk->whoTo->rto_needed = 1; @@ -288,7 +320,7 @@ } else if ((icmp_code == ICMP_UNREACH_PROTOCOL) || (icmp_code == ICMP_UNREACH_PORT)) { /* Treat it like an ABORT. */ - sctp_abort_notification(stcb, 1, 0, NULL, SCTP_SO_NOT_LOCKED); + sctp_abort_notification(stcb, true, false, 0, NULL, SCTP_SO_NOT_LOCKED); #if defined(__APPLE__) && !defined(__Userspace__) so = SCTP_INP_SO(inp); atomic_add_int(&stcb->asoc.refcnt, 1); @@ -343,7 +375,7 @@ } /* Update the association MTU */ if (stcb->asoc.smallest_mtu > next_mtu) { - sctp_pathmtu_adjustment(stcb, next_mtu); + sctp_pathmtu_adjustment(stcb, next_mtu, true); } /* Finally, start the PMTU timer if it was running before. */ if (timer_stopped) { @@ -469,7 +501,7 @@ #endif (uint32_t)ntohs(icmp->icmp_nextmtu)); #if defined(__Userspace__) - if (!(stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) && + if (((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) == 0) && (stcb->sctp_socket != NULL)) { struct socket *upcall_socket; @@ -570,7 +602,6 @@ "Get the ucred of a SCTP connection"); #endif - #ifdef INET #if defined(_WIN32) || defined(__Userspace__) int @@ -585,7 +616,6 @@ struct epoch_tracker et; #endif struct sctp_inpcb *inp; - uint32_t flags; inp = (struct sctp_inpcb *)so->so_pcb; if (inp == NULL) { @@ -597,28 +627,28 @@ #endif } + SCTP_INP_WLOCK(inp); #if defined(__FreeBSD__) && !defined(__Userspace__) NET_EPOCH_ENTER(et); #endif - sctp_must_try_again: - flags = inp->sctp_flags; #ifdef SCTP_LOG_CLOSING sctp_log_closing(inp, NULL, 17); #endif - if (((flags & SCTP_PCB_FLAGS_SOCKET_GONE) == 0) && - (atomic_cmpset_int(&inp->sctp_flags, flags, (flags | SCTP_PCB_FLAGS_SOCKET_GONE | SCTP_PCB_FLAGS_CLOSE_IP)))) { + if (((inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) == 0)) { + inp->sctp_flags |= SCTP_PCB_FLAGS_SOCKET_GONE | SCTP_PCB_FLAGS_CLOSE_IP; #ifdef SCTP_LOG_CLOSING sctp_log_closing(inp, NULL, 16); #endif + SCTP_INP_WUNLOCK(inp); sctp_inpcb_free(inp, SCTP_FREE_SHOULD_USE_ABORT, - SCTP_CALLED_AFTER_CMPSET_OFCLOSE); + SCTP_CALLED_AFTER_CMPSET_OFCLOSE); SOCK_LOCK(so); +#if defined(__FreeBSD__) && !defined(__Userspace__) + KASSERT(!SOLISTENING(so), + ("sctp_abort: called on listening socket %p", so)); +#endif SCTP_SB_CLEAR(so->so_snd); - /* same for the rcv ones, they are only - * here for the accounting/select. - */ SCTP_SB_CLEAR(so->so_rcv); - #if defined(__APPLE__) && !defined(__Userspace__) so->so_usecount--; #else @@ -627,14 +657,10 @@ #endif SOCK_UNLOCK(so); } else { - flags = inp->sctp_flags; - if ((flags & SCTP_PCB_FLAGS_SOCKET_GONE) == 0) { - goto sctp_must_try_again; - } + SCTP_INP_WUNLOCK(inp); } #if defined(__FreeBSD__) && !defined(__Userspace__) NET_EPOCH_EXIT(et); - return; #else return (0); #endif @@ -798,7 +824,6 @@ struct epoch_tracker et; #endif struct sctp_inpcb *inp; - uint32_t flags; inp = (struct sctp_inpcb *)so->so_pcb; if (inp == NULL) @@ -807,32 +832,33 @@ /* Inform all the lower layer assoc that we * are done. */ + SCTP_INP_WLOCK(inp); #if defined(__FreeBSD__) && !defined(__Userspace__) NET_EPOCH_ENTER(et); #endif - sctp_must_try_again: - flags = inp->sctp_flags; #ifdef SCTP_LOG_CLOSING sctp_log_closing(inp, NULL, 17); #endif - if (((flags & SCTP_PCB_FLAGS_SOCKET_GONE) == 0) && - (atomic_cmpset_int(&inp->sctp_flags, flags, (flags | SCTP_PCB_FLAGS_SOCKET_GONE | SCTP_PCB_FLAGS_CLOSE_IP)))) { + if ((inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) == 0) { + inp->sctp_flags |= SCTP_PCB_FLAGS_SOCKET_GONE | SCTP_PCB_FLAGS_CLOSE_IP; #if defined(__Userspace__) if (((so->so_options & SCTP_SO_LINGER) && (so->so_linger == 0)) || - (so->so_rcv.sb_cc > 0)) { + (SCTP_SBAVAIL(&so->so_rcv) > 0)) { #else if (((so->so_options & SO_LINGER) && (so->so_linger == 0)) || - (so->so_rcv.sb_cc > 0)) { + (SCTP_SBAVAIL(&so->so_rcv) > 0)) { #endif #ifdef SCTP_LOG_CLOSING sctp_log_closing(inp, NULL, 13); #endif + SCTP_INP_WUNLOCK(inp); sctp_inpcb_free(inp, SCTP_FREE_SHOULD_USE_ABORT, SCTP_CALLED_AFTER_CMPSET_OFCLOSE); } else { #ifdef SCTP_LOG_CLOSING sctp_log_closing(inp, NULL, 14); #endif + SCTP_INP_WUNLOCK(inp); sctp_inpcb_free(inp, SCTP_FREE_SHOULD_USE_GRACEFUL_CLOSE, SCTP_CALLED_AFTER_CMPSET_OFCLOSE); } @@ -840,32 +866,28 @@ * the state of the SCTP association. */ SOCK_LOCK(so); +#if defined(__FreeBSD__) && !defined(__Userspace__) + if (!SOLISTENING(so)) { + SCTP_SB_CLEAR(so->so_snd); + SCTP_SB_CLEAR(so->so_rcv); + } +#else SCTP_SB_CLEAR(so->so_snd); - /* same for the rcv ones, they are only - * here for the accounting/select. - */ SCTP_SB_CLEAR(so->so_rcv); - +#endif #if !(defined(__APPLE__) && !defined(__Userspace__)) /* Now null out the reference, we are completely detached. */ so->so_pcb = NULL; #endif SOCK_UNLOCK(so); } else { - flags = inp->sctp_flags; - if ((flags & SCTP_PCB_FLAGS_SOCKET_GONE) == 0) { - goto sctp_must_try_again; - } + SCTP_INP_WUNLOCK(inp); } #if defined(__FreeBSD__) && !defined(__Userspace__) NET_EPOCH_EXIT(et); #endif - return; } - #else - - int sctp_detach(struct socket *so) { @@ -890,10 +912,10 @@ (atomic_cmpset_int(&inp->sctp_flags, flags, (flags | SCTP_PCB_FLAGS_SOCKET_GONE | SCTP_PCB_FLAGS_CLOSE_IP)))) { #if defined(__Userspace__) if (((so->so_options & SCTP_SO_LINGER) && (so->so_linger == 0)) || - (so->so_rcv.sb_cc > 0)) { + (SCTP_SBAVAIL(&so->so_rcv) > 0)) { #else if (((so->so_options & SO_LINGER) && (so->so_linger == 0)) || - (so->so_rcv.sb_cc > 0)) { + (SCTP_SBAVAIL(&so->so_rcv) > 0)) { #endif #ifdef SCTP_LOG_CLOSING sctp_log_closing(inp, NULL, 13); @@ -947,7 +969,6 @@ struct mbuf *control, struct proc *p); #endif - int #if defined(__FreeBSD__) && !defined(__Userspace__) sctp_sendm(struct socket *so, int flags, struct mbuf *m, struct sockaddr *addr, @@ -976,29 +997,29 @@ ((inp->sctp_flags & SCTP_PCB_FLAGS_CONNECTED) || (inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE))) { goto connected_type; - } else if (addr == NULL) { + } + + error = 0; + if (addr == NULL) { SCTP_LTRACE_ERR_RET_PKT(m, inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EDESTADDRREQ); error = EDESTADDRREQ; - sctp_m_freem(m); - if (control) { - sctp_m_freem(control); - control = NULL; - } - return (error); + } else if (addr->sa_family != AF_INET) { + SCTP_LTRACE_ERR_RET_PKT(m, inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EAFNOSUPPORT); + error = EAFNOSUPPORT; +#if defined(HAVE_SA_LEN) + } else if (addr->sa_len != sizeof(struct sockaddr_in)) { + SCTP_LTRACE_ERR_RET_PKT(m, inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL); + error = EINVAL; +#endif } -#ifdef INET6 - if (addr->sa_family != AF_INET) { - /* must be a v4 address! */ - SCTP_LTRACE_ERR_RET_PKT(m, inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EDESTADDRREQ); + if (error != 0) { sctp_m_freem(m); if (control) { sctp_m_freem(control); control = NULL; } - error = EDESTADDRREQ; return (error); } -#endif /* INET6 */ connected_type: /* now what about control */ if (control) { @@ -1095,13 +1116,11 @@ NET_EPOCH_ENTER(et); #endif #if defined(__Userspace__) - if (((so->so_options & SCTP_SO_LINGER) && - (so->so_linger == 0)) || - (so->so_rcv.sb_cc > 0)) { -#else - if (((so->so_options & SO_LINGER) && - (so->so_linger == 0)) || - (so->so_rcv.sb_cc > 0)) { + if (((so->so_options & SCTP_SO_LINGER) && (so->so_linger == 0)) || + (SCTP_SBAVAIL(&so->so_rcv) > 0)) { +#else + if (((so->so_options & SO_LINGER) && (so->so_linger == 0)) || + (SCTP_SBAVAIL(&so->so_rcv) > 0)) { #endif if (SCTP_GET_STATE(stcb) != SCTP_STATE_COOKIE_WAIT) { /* Left with Data unread */ @@ -1245,18 +1264,25 @@ inp->sctp_flags |= SCTP_PCB_FLAGS_SOCKET_CANT_READ; SCTP_INP_READ_UNLOCK(inp); SCTP_INP_WUNLOCK(inp); - so->so_rcv.sb_cc = 0; - so->so_rcv.sb_mbcnt = 0; - so->so_rcv.sb_mb = NULL; + SOCK_LOCK(so); +#if defined(__FreeBSD__) && !defined(__Userspace__) + KASSERT(!SOLISTENING(so), + ("sctp_flush: called on listening socket %p", so)); +#endif + SCTP_SB_CLEAR(so->so_rcv); + SOCK_UNLOCK(so); } if ((how == PRU_FLUSH_WR) || (how == PRU_FLUSH_RDWR)) { /* First make sure the sb will be happy, we don't * use these except maybe the count */ - so->so_snd.sb_cc = 0; - so->so_snd.sb_mbcnt = 0; - so->so_snd.sb_mb = NULL; - + SOCK_LOCK(so); +#if defined(__FreeBSD__) && !defined(__Userspace__) + KASSERT(!SOLISTENING(so), + ("sctp_flush: called on listening socket %p", so)); +#endif + SCTP_SB_CLEAR(so->so_snd); + SOCK_UNLOCK(so); } return (0); } @@ -1377,7 +1403,7 @@ stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_USRREQ + SCTP_LOC_6; SCTP_INP_RUNLOCK(inp); sctp_abort_an_association(stcb->sctp_ep, stcb, - op_err, SCTP_SO_LOCKED); + op_err, false, SCTP_SO_LOCKED); #if defined(__FreeBSD__) && !defined(__Userspace__) NET_EPOCH_EXIT(et); #endif @@ -1438,11 +1464,6 @@ return (0); } - - -/* - * NOTE: assumes addr lock is held - */ static size_t sctp_fill_up_addresses_vrf(struct sctp_inpcb *inp, struct sctp_tcb *stcb, @@ -1465,6 +1486,7 @@ #endif struct sctp_vrf *vrf; + SCTP_IPI_ADDR_LOCK_ASSERT(); actual = 0; if (limit == 0) return (actual); @@ -1566,7 +1588,7 @@ sin = &sctp_ifa->address.sin; if (sin->sin_addr.s_addr == 0) { /* - * we skip unspecifed + * we skip unspecified * addresses */ continue; @@ -1586,7 +1608,7 @@ if (actual + sizeof(struct sockaddr_in6) > limit) { return (actual); } - in6_sin_2_v4mapsin6(sin, (struct sockaddr_in6 *)&addr); + in6_sin_2_v4mapsin6(sin, (struct sockaddr_in6 *)addr); ((struct sockaddr_in6 *)addr)->sin6_port = inp->sctp_lport; addr = (struct sockaddr *)((caddr_t)addr + sizeof(struct sockaddr_in6)); actual += sizeof(struct sockaddr_in6); @@ -1618,7 +1640,7 @@ sin6 = &sctp_ifa->address.sin6; if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) { /* - * we skip unspecifed + * we skip unspecified * addresses */ continue; @@ -1767,7 +1789,7 @@ size_t limit, struct sockaddr *addr) { - size_t size = 0; + size_t size; #ifdef SCTP_MVRF uint32_t id; #endif @@ -1779,6 +1801,7 @@ * in more than one VRF. */ /* fill up addresses for all VRFs on the endpoint */ + size = 0; for (id = 0; (id < inp->num_vrfs) && (size < limit); id++) { size += sctp_fill_up_addresses_vrf(inp, stcb, limit, addr, inp->m_vrf_ids[id]); @@ -1793,26 +1816,25 @@ return (size); } -/* - * NOTE: assumes addr lock is held - */ -static int -sctp_count_max_addresses_vrf(struct sctp_inpcb *inp, uint32_t vrf_id) +static size_t +sctp_max_size_addresses_vrf(struct sctp_inpcb *inp, uint32_t vrf_id) { - int cnt = 0; - struct sctp_vrf *vrf = NULL; + struct sctp_vrf *vrf; + size_t size; /* - * In both sub-set bound an bound_all cases we return the MAXIMUM - * number of addresses that you COULD get. In reality the sub-set - * bound may have an exclusion list for a given TCB OR in the - * bound-all case a TCB may NOT include the loopback or other + * In both sub-set bound an bound_all cases we return the size of + * the maximum number of addresses that you could get. In reality + * the sub-set bound may have an exclusion list for a given TCB or + * in the bound-all case a TCB may NOT include the loopback or other * addresses as well. */ + SCTP_IPI_ADDR_LOCK_ASSERT(); vrf = sctp_find_vrf(vrf_id); if (vrf == NULL) { return (0); } + size = 0; if (inp->sctp_flags & SCTP_PCB_FLAGS_BOUNDALL) { struct sctp_ifn *sctp_ifn; struct sctp_ifa *sctp_ifa; @@ -1825,22 +1847,22 @@ case AF_INET: #ifdef INET6 if (sctp_is_feature_on(inp, SCTP_PCB_FLAGS_NEEDS_MAPPED_V4)) - cnt += sizeof(struct sockaddr_in6); + size += sizeof(struct sockaddr_in6); else - cnt += sizeof(struct sockaddr_in); + size += sizeof(struct sockaddr_in); #else - cnt += sizeof(struct sockaddr_in); + size += sizeof(struct sockaddr_in); #endif break; #endif #ifdef INET6 case AF_INET6: - cnt += sizeof(struct sockaddr_in6); + size += sizeof(struct sockaddr_in6); break; #endif #if defined(__Userspace__) case AF_CONN: - cnt += sizeof(struct sockaddr_conn); + size += sizeof(struct sockaddr_conn); break; #endif default: @@ -1857,22 +1879,22 @@ case AF_INET: #ifdef INET6 if (sctp_is_feature_on(inp, SCTP_PCB_FLAGS_NEEDS_MAPPED_V4)) - cnt += sizeof(struct sockaddr_in6); + size += sizeof(struct sockaddr_in6); else - cnt += sizeof(struct sockaddr_in); + size += sizeof(struct sockaddr_in); #else - cnt += sizeof(struct sockaddr_in); + size += sizeof(struct sockaddr_in); #endif break; #endif #ifdef INET6 case AF_INET6: - cnt += sizeof(struct sockaddr_in6); + size += sizeof(struct sockaddr_in6); break; #endif #if defined(__Userspace__) case AF_CONN: - cnt += sizeof(struct sockaddr_conn); + size += sizeof(struct sockaddr_conn); break; #endif default: @@ -1880,13 +1902,13 @@ } } } - return (cnt); + return (size); } -static int -sctp_count_max_addresses(struct sctp_inpcb *inp) +static size_t +sctp_max_size_addresses(struct sctp_inpcb *inp) { - int cnt = 0; + size_t size; #ifdef SCTP_MVRF int id; #endif @@ -1897,16 +1919,17 @@ * FIX ME: ?? this WILL count duplicate addresses if they appear * in more than one VRF. */ - /* count addresses for all VRFs on the endpoint */ + /* Maximum size of all addresses for all VRFs on the endpoint */ + size = 0; for (id = 0; id < inp->num_vrfs; id++) { - cnt += sctp_count_max_addresses_vrf(inp, inp->m_vrf_ids[id]); + size += sctp_max_size_addresses_vrf(inp, inp->m_vrf_ids[id]); } #else - /* count addresses for the endpoint's default VRF */ - cnt = sctp_count_max_addresses_vrf(inp, inp->def_vrf_id); + /* Maximum size of all addresses for the endpoint's default VRF */ + size = sctp_max_size_addresses_vrf(inp, inp->def_vrf_id); #endif SCTP_IPI_ADDR_RUNLOCK(); - return (cnt); + return (size); } static int @@ -1984,8 +2007,7 @@ } } #endif /* INET6 */ - if ((inp->sctp_flags & SCTP_PCB_FLAGS_UNBOUND) == - SCTP_PCB_FLAGS_UNBOUND) { + if (inp->sctp_flags & SCTP_PCB_FLAGS_UNBOUND) { /* Bind a ephemeral port */ error = sctp_inpcb_bind(so, NULL, NULL, p); if (error) { @@ -1996,28 +2018,22 @@ /* FIX ME: do we want to pass in a vrf on the connect call? */ vrf_id = inp->def_vrf_id; - /* We are GOOD to go */ - stcb = sctp_aloc_assoc(inp, sa, &error, 0, vrf_id, - inp->sctp_ep.pre_open_stream_count, - inp->sctp_ep.port, + stcb = sctp_aloc_assoc_connected(inp, sa, &error, 0, 0, vrf_id, + inp->sctp_ep.pre_open_stream_count, + inp->sctp_ep.port, #if defined(__FreeBSD__) && !defined(__Userspace__) - (struct thread *)p, + (struct thread *)p, #elif defined(_WIN32) && !defined(__Userspace__) - (PKTHREAD)p, + (PKTHREAD)p, #else - (struct proc *)p, + (struct proc *)p, #endif - SCTP_INITIALIZE_AUTH_PARAMS); + SCTP_INITIALIZE_AUTH_PARAMS); if (stcb == NULL) { /* Gak! no memory */ goto out_now; } - if (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) { - stcb->sctp_ep->sctp_flags |= SCTP_PCB_FLAGS_CONNECTED; - /* Set the connected flag so we can queue data */ - soisconnecting(so); - } SCTP_SET_STATE(stcb, SCTP_STATE_COOKIE_WAIT); /* move to second address */ switch (sa->sa_family) { @@ -2082,7 +2098,6 @@ } \ } - #define SCTP_CHECK_AND_CAST(destp, srcp, type, size) {\ if (size < sizeof(type)) { \ SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL); \ @@ -2646,13 +2661,12 @@ case SCTP_MAXSEG: { struct sctp_assoc_value *av; - int ovh; SCTP_CHECK_AND_CAST(av, optval, struct sctp_assoc_value, *optsize); SCTP_FIND_STCB(inp, stcb, av->assoc_id); if (stcb) { - av->assoc_value = sctp_get_frag_point(stcb, &stcb->asoc); + av->assoc_value = stcb->asoc.sctp_frag_point; SCTP_TCB_UNLOCK(stcb); } else { if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || @@ -2660,15 +2674,7 @@ ((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) && (av->assoc_id == SCTP_FUTURE_ASSOC))) { SCTP_INP_RLOCK(inp); - if (inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) { - ovh = SCTP_MED_OVERHEAD; - } else { - ovh = SCTP_MED_V4_OVERHEAD; - } - if (inp->sctp_frag_point >= SCTP_DEFAULT_MAXSEGMENT) - av->assoc_value = 0; - else - av->assoc_value = inp->sctp_frag_point - ovh; + av->assoc_value = inp->sctp_frag_point; SCTP_INP_RUNLOCK(inp); } else { SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL); @@ -2755,7 +2761,7 @@ SCTP_CHECK_AND_CAST(value, optval, uint32_t, *optsize); SCTP_INP_RLOCK(inp); - *value = sctp_count_max_addresses(inp); + *value = (uint32_t)sctp_max_size_addresses(inp); SCTP_INP_RUNLOCK(inp); *optsize = sizeof(uint32_t); break; @@ -2763,14 +2769,14 @@ case SCTP_GET_REMOTE_ADDR_SIZE: { uint32_t *value; - size_t size; struct sctp_nets *net; + size_t size; SCTP_CHECK_AND_CAST(value, optval, uint32_t, *optsize); /* FIXME MT: change to sctp_assoc_value? */ - SCTP_FIND_STCB(inp, stcb, (sctp_assoc_t) *value); + SCTP_FIND_STCB(inp, stcb, (sctp_assoc_t)*value); - if (stcb) { + if (stcb != NULL) { size = 0; /* Count the sizes */ TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) { @@ -2803,11 +2809,16 @@ } } SCTP_TCB_UNLOCK(stcb); - *value = (uint32_t) size; + *value = (uint32_t)size; *optsize = sizeof(uint32_t); } else { - SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, ENOTCONN); - error = ENOTCONN; + if ((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) && + ((sctp_assoc_t)*value <= SCTP_ALL_ASSOC)) { + error = EINVAL; + } else { + error = ENOENT; + } + SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, error); } break; } @@ -2825,7 +2836,7 @@ SCTP_CHECK_AND_CAST(saddr, optval, struct sctp_getaddresses, *optsize); SCTP_FIND_STCB(inp, stcb, saddr->sget_assoc_id); - if (stcb) { + if (stcb != NULL) { left = *optsize - offsetof(struct sctp_getaddresses, addr); *optsize = offsetof(struct sctp_getaddresses, addr); addr = &saddr->addr[0].sa; @@ -2871,7 +2882,7 @@ (net->ro._l_addr.sa.sa_family == AF_INET)) { /* Must map the address */ in6_sin_2_v4mapsin6(&net->ro._l_addr.sin, - (struct sockaddr_in6 *)&addr); + (struct sockaddr_in6 *)addr); } else { memcpy(addr, &net->ro._l_addr, cpsz); } @@ -2886,8 +2897,13 @@ } SCTP_TCB_UNLOCK(stcb); } else { - SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, ENOENT); - error = ENOENT; + if ((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) && + (saddr->sget_assoc_id <= SCTP_ALL_ASSOC)) { + error = EINVAL; + } else { + error = ENOENT; + } + SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, error); } break; } @@ -2899,12 +2915,18 @@ SCTP_CHECK_AND_CAST(saddr, optval, struct sctp_getaddresses, *optsize); SCTP_FIND_STCB(inp, stcb, saddr->sget_assoc_id); - limit = *optsize - offsetof(struct sctp_getaddresses, addr); - actual = sctp_fill_up_addresses(inp, stcb, limit, &saddr->addr[0].sa); - if (stcb) { + if ((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) && + ((saddr->sget_assoc_id == SCTP_CURRENT_ASSOC) || + (saddr->sget_assoc_id == SCTP_ALL_ASSOC))) { + error = EINVAL; + } else { + limit = *optsize - offsetof(struct sctp_getaddresses, addr); + actual = sctp_fill_up_addresses(inp, stcb, limit, &saddr->addr[0].sa); + *optsize = offsetof(struct sctp_getaddresses, addr) + actual; + } + if (stcb != NULL) { SCTP_TCB_UNLOCK(stcb); } - *optsize = offsetof(struct sctp_getaddresses, addr) + actual; break; } case SCTP_PEER_ADDR_PARAMS: @@ -3246,11 +3268,9 @@ */ sstat->sstat_penddata = (stcb->asoc.cnt_on_reasm_queue + stcb->asoc.cnt_on_all_streams); - - sstat->sstat_instrms = stcb->asoc.streamincnt; sstat->sstat_outstrms = stcb->asoc.streamoutcnt; - sstat->sstat_fragmentation_point = sctp_get_frag_point(stcb, &stcb->asoc); + sstat->sstat_fragmentation_point = sctp_get_frag_point(stcb); net = stcb->asoc.primary_destination; if (net != NULL) { #ifdef HAVE_SA_LEN @@ -3409,7 +3429,7 @@ sasoc->sasoc_asocmaxrxt = inp->sctp_ep.max_send_times; sasoc->sasoc_number_peer_destinations = 0; sasoc->sasoc_peer_rwnd = 0; - sasoc->sasoc_local_rwnd = sbspace(&inp->sctp_socket->so_rcv); + sasoc->sasoc_local_rwnd = (uint32_t)sbspace(&inp->sctp_socket->so_rcv); SCTP_INP_RUNLOCK(inp); } else { SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL); @@ -3515,7 +3535,7 @@ { struct sctp_hmacalgo *shmac; sctp_hmaclist_t *hmaclist; - uint32_t size; + size_t size; int i; SCTP_CHECK_AND_CAST(shmac, optval, struct sctp_hmacalgo, *optsize); @@ -3530,8 +3550,8 @@ } /* is there room for all of the hmac ids? */ size = sizeof(*shmac) + (hmaclist->num_algo * - sizeof(shmac->shmac_idents[0])); - if ((size_t)(*optsize) < size) { + sizeof(shmac->shmac_idents[0])); + if (*optsize < size) { SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL); error = EINVAL; SCTP_INP_RUNLOCK(inp); @@ -3756,43 +3776,27 @@ break; } case SCTP_RECVRCVINFO: - { - int onoff; - if (*optsize < sizeof(int)) { SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL); error = EINVAL; } else { SCTP_INP_RLOCK(inp); - onoff = sctp_is_feature_on(inp, SCTP_PCB_FLAGS_RECVRCVINFO); + *(int *)optval = sctp_is_feature_on(inp, SCTP_PCB_FLAGS_RECVRCVINFO); SCTP_INP_RUNLOCK(inp); - } - if (error == 0) { - /* return the option value */ - *(int *)optval = onoff; *optsize = sizeof(int); } break; - } case SCTP_RECVNXTINFO: - { - int onoff; - if (*optsize < sizeof(int)) { SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL); error = EINVAL; } else { SCTP_INP_RLOCK(inp); - onoff = sctp_is_feature_on(inp, SCTP_PCB_FLAGS_RECVNXTINFO); + *(int *)optval = sctp_is_feature_on(inp, SCTP_PCB_FLAGS_RECVNXTINFO); SCTP_INP_RUNLOCK(inp); - } - if (error == 0) { - /* return the option value */ - *(int *)optval = onoff; *optsize = sizeof(int); } break; - } case SCTP_DEFAULT_SNDINFO: { struct sctp_sndinfo *info; @@ -4540,7 +4544,7 @@ case SCTP_REUSE_PORT: { SCTP_CHECK_AND_CAST(mopt, optval, uint32_t, optsize); - if ((inp->sctp_flags & SCTP_PCB_FLAGS_UNBOUND) == 0) { + if ((inp->sctp_flags & SCTP_PCB_FLAGS_UNBOUND) == 0) { /* Can't set it after we are bound */ error = EINVAL; break; @@ -4611,7 +4615,7 @@ if (av->assoc_value == 0) { inp->idata_supported = 0; } else { - if ((sctp_is_feature_on(inp, SCTP_PCB_FLAGS_FRAG_INTERLEAVE)) && + if ((sctp_is_feature_on(inp, SCTP_PCB_FLAGS_FRAG_INTERLEAVE)) && (sctp_is_feature_on(inp, SCTP_PCB_FLAGS_INTERLEAVE_STRMS))) { inp->idata_supported = 1; } else { @@ -4772,12 +4776,10 @@ } SCTP_FIND_STCB(inp, stcb, av->assoc_id); if (stcb) { - SCTP_TCB_SEND_LOCK(stcb); - stcb->asoc.ss_functions.sctp_ss_clear(stcb, &stcb->asoc, 1, 1); + stcb->asoc.ss_functions.sctp_ss_clear(stcb, &stcb->asoc, true); stcb->asoc.ss_functions = sctp_ss_functions[av->assoc_value]; stcb->asoc.stream_scheduling_module = av->assoc_value; - stcb->asoc.ss_functions.sctp_ss_init(stcb, &stcb->asoc, 1); - SCTP_TCB_SEND_UNLOCK(stcb); + stcb->asoc.ss_functions.sctp_ss_init(stcb, &stcb->asoc); SCTP_TCB_UNLOCK(stcb); } else { if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || @@ -4795,12 +4797,10 @@ SCTP_INP_RLOCK(inp); LIST_FOREACH(stcb, &inp->sctp_asoc_list, sctp_tcblist) { SCTP_TCB_LOCK(stcb); - SCTP_TCB_SEND_LOCK(stcb); - stcb->asoc.ss_functions.sctp_ss_clear(stcb, &stcb->asoc, 1, 1); + stcb->asoc.ss_functions.sctp_ss_clear(stcb, &stcb->asoc, true); stcb->asoc.ss_functions = sctp_ss_functions[av->assoc_value]; stcb->asoc.stream_scheduling_module = av->assoc_value; - stcb->asoc.ss_functions.sctp_ss_init(stcb, &stcb->asoc, 1); - SCTP_TCB_SEND_UNLOCK(stcb); + stcb->asoc.ss_functions.sctp_ss_init(stcb, &stcb->asoc); SCTP_TCB_UNLOCK(stcb); } SCTP_INP_RUNLOCK(inp); @@ -5435,7 +5435,6 @@ } SCTP_INP_RUNLOCK(inp); } - } break; } @@ -5674,7 +5673,7 @@ break; } /* Do any streams have data queued? */ - for ( i = 0; i< stcb->asoc.streamoutcnt; i++) { + for (i = 0; i < stcb->asoc.streamoutcnt; i++) { if (!TAILQ_EMPTY(&stcb->asoc.strmout[i].outqueue)) { goto busy_out; } @@ -5787,22 +5786,12 @@ case SCTP_MAXSEG: { struct sctp_assoc_value *av; - int ovh; SCTP_CHECK_AND_CAST(av, optval, struct sctp_assoc_value, optsize); SCTP_FIND_STCB(inp, stcb, av->assoc_id); - if (inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) { - ovh = SCTP_MED_OVERHEAD; - } else { - ovh = SCTP_MED_V4_OVERHEAD; - } if (stcb) { - if (av->assoc_value) { - stcb->asoc.sctp_frag_point = (av->assoc_value + ovh); - } else { - stcb->asoc.sctp_frag_point = SCTP_DEFAULT_MAXSEGMENT; - } + stcb->asoc.sctp_frag_point = av->assoc_value; SCTP_TCB_UNLOCK(stcb); } else { if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || @@ -5810,12 +5799,7 @@ ((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) && (av->assoc_id == SCTP_FUTURE_ASSOC))) { SCTP_INP_WLOCK(inp); - /* FIXME MT: I think this is not in tune with the API ID */ - if (av->assoc_value) { - inp->sctp_frag_point = (av->assoc_value + ovh); - } else { - inp->sctp_frag_point = SCTP_DEFAULT_MAXSEGMENT; - } + inp->sctp_frag_point = av->assoc_value; SCTP_INP_WUNLOCK(inp); } else { SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL); @@ -5896,9 +5880,7 @@ } else { sctp_feature_off(inp, SCTP_PCB_FLAGS_STREAM_RESETEVNT); } - SCTP_INP_WUNLOCK(inp); - SCTP_INP_RLOCK(inp); LIST_FOREACH(stcb, &inp->sctp_asoc_list, sctp_tcblist) { SCTP_TCB_LOCK(stcb); if (events->sctp_association_event) { @@ -5955,21 +5937,21 @@ } /* Send up the sender dry event only for 1-to-1 style sockets. */ if (events->sctp_sender_dry_event) { - if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || - (inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL)) { + if (((inp->sctp_flags & (SCTP_PCB_FLAGS_TCPTYPE | SCTP_PCB_FLAGS_IN_TCPPOOL)) != 0) && + !SCTP_IS_LISTENING(inp)) { stcb = LIST_FIRST(&inp->sctp_asoc_list); - if (stcb) { + if (stcb != NULL) { SCTP_TCB_LOCK(stcb); if (TAILQ_EMPTY(&stcb->asoc.send_queue) && TAILQ_EMPTY(&stcb->asoc.sent_queue) && (stcb->asoc.stream_queue_cnt == 0)) { - sctp_ulp_notify(SCTP_NOTIFY_SENDER_DRY, stcb, 0, NULL, SCTP_SO_LOCKED); + sctp_ulp_notify(SCTP_NOTIFY_SENDER_DRY, stcb, 0, NULL, SCTP_SO_LOCKED); } SCTP_TCB_UNLOCK(stcb); } } } - SCTP_INP_RUNLOCK(inp); + SCTP_INP_WUNLOCK(inp); break; } case SCTP_ADAPTATION_LAYER: @@ -6083,8 +6065,8 @@ if ((stcb != NULL) && (net == NULL)) { #ifdef INET if (addr->sa_family == AF_INET) { - struct sockaddr_in *sin; + sin = (struct sockaddr_in *)addr; if (sin->sin_addr.s_addr != INADDR_ANY) { SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL); @@ -6142,6 +6124,7 @@ return (EINVAL); } if ((paddrp->spp_flags & SPP_PMTUD_DISABLE) && + (paddrp->spp_pathmtu > 0) && ((paddrp->spp_pathmtu < SCTP_SMALLEST_PMTU) || (paddrp->spp_pathmtu > SCTP_LARGEST_PMTU))) { if (stcb) @@ -6155,10 +6138,10 @@ if (net != NULL) { /************************NET SPECIFIC SET ******************/ if (paddrp->spp_flags & SPP_HB_DISABLE) { - if (!(net->dest_state & SCTP_ADDR_UNCONFIRMED) && - !(net->dest_state & SCTP_ADDR_NOHB)) { + if (((net->dest_state & SCTP_ADDR_UNCONFIRMED) == 0) && + ((net->dest_state & SCTP_ADDR_NOHB) == 0)) { sctp_timer_stop(SCTP_TIMER_TYPE_HEARTBEAT, inp, stcb, net, - SCTP_FROM_SCTP_USRREQ + SCTP_LOC_9); + SCTP_FROM_SCTP_USRREQ + SCTP_LOC_9); } net->dest_state |= SCTP_ADDR_NOHB; } @@ -6183,31 +6166,33 @@ if (paddrp->spp_flags & SPP_PMTUD_DISABLE) { if (SCTP_OS_TIMER_PENDING(&net->pmtu_timer.timer)) { sctp_timer_stop(SCTP_TIMER_TYPE_PATHMTURAISE, inp, stcb, net, - SCTP_FROM_SCTP_USRREQ + SCTP_LOC_11); + SCTP_FROM_SCTP_USRREQ + SCTP_LOC_11); } net->dest_state |= SCTP_ADDR_NO_PMTUD; - net->mtu = paddrp->spp_pathmtu; - switch (net->ro._l_addr.sa.sa_family) { + if (paddrp->spp_pathmtu > 0) { + net->mtu = paddrp->spp_pathmtu; + switch (net->ro._l_addr.sa.sa_family) { #ifdef INET - case AF_INET: - net->mtu += SCTP_MIN_V4_OVERHEAD; - break; + case AF_INET: + net->mtu += SCTP_MIN_V4_OVERHEAD; + break; #endif #ifdef INET6 - case AF_INET6: - net->mtu += SCTP_MIN_OVERHEAD; - break; + case AF_INET6: + net->mtu += SCTP_MIN_OVERHEAD; + break; #endif #if defined(__Userspace__) - case AF_CONN: - net->mtu += sizeof(struct sctphdr); - break; + case AF_CONN: + net->mtu += sizeof(struct sctphdr); + break; #endif - default: - break; - } - if (net->mtu < stcb->asoc.smallest_mtu) { - sctp_pathmtu_adjustment(stcb, net->mtu); + default: + break; + } + if (net->mtu < stcb->asoc.smallest_mtu) { + sctp_pathmtu_adjustment(stcb, net->mtu, true); + } } } if (paddrp->spp_flags & SPP_PMTUD_ENABLE) { @@ -6216,7 +6201,7 @@ } net->dest_state &= ~SCTP_ADDR_NO_PMTUD; } - if (paddrp->spp_pathmaxrxt) { + if (paddrp->spp_pathmaxrxt > 0) { if (net->dest_state & SCTP_ADDR_PF) { if (net->error_count > paddrp->spp_pathmaxrxt) { net->dest_state &= ~SCTP_ADDR_PF; @@ -6259,7 +6244,7 @@ #endif } else { /************************ASSOC ONLY -- NO NET SPECIFIC SET ******************/ - if (paddrp->spp_pathmaxrxt != 0) { + if (paddrp->spp_pathmaxrxt > 0) { stcb->asoc.def_net_failure = paddrp->spp_pathmaxrxt; TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) { if (net->dest_state & SCTP_ADDR_PF) { @@ -6291,7 +6276,6 @@ net->failure_threshold = paddrp->spp_pathmaxrxt; } } - if (paddrp->spp_flags & SPP_HB_ENABLE) { if (paddrp->spp_hbinterval != 0) { stcb->asoc.heart_beat_delay = paddrp->spp_hbinterval; @@ -6316,9 +6300,9 @@ } if (paddrp->spp_flags & SPP_HB_DISABLE) { TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) { - if (!(net->dest_state & SCTP_ADDR_NOHB)) { + if ((net->dest_state & SCTP_ADDR_NOHB) == 0) { net->dest_state |= SCTP_ADDR_NOHB; - if (!(net->dest_state & SCTP_ADDR_UNCONFIRMED)) { + if ((net->dest_state & SCTP_ADDR_UNCONFIRMED) == 0) { sctp_timer_stop(SCTP_TIMER_TYPE_HEARTBEAT, inp, stcb, net, SCTP_FROM_SCTP_USRREQ + SCTP_LOC_15); @@ -6331,34 +6315,38 @@ TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) { if (SCTP_OS_TIMER_PENDING(&net->pmtu_timer.timer)) { sctp_timer_stop(SCTP_TIMER_TYPE_PATHMTURAISE, inp, stcb, net, - SCTP_FROM_SCTP_USRREQ + SCTP_LOC_16); + SCTP_FROM_SCTP_USRREQ + SCTP_LOC_16); } net->dest_state |= SCTP_ADDR_NO_PMTUD; - net->mtu = paddrp->spp_pathmtu; - switch (net->ro._l_addr.sa.sa_family) { + if (paddrp->spp_pathmtu > 0) { + net->mtu = paddrp->spp_pathmtu; + switch (net->ro._l_addr.sa.sa_family) { #ifdef INET - case AF_INET: - net->mtu += SCTP_MIN_V4_OVERHEAD; - break; + case AF_INET: + net->mtu += SCTP_MIN_V4_OVERHEAD; + break; #endif #ifdef INET6 - case AF_INET6: - net->mtu += SCTP_MIN_OVERHEAD; - break; + case AF_INET6: + net->mtu += SCTP_MIN_OVERHEAD; + break; #endif #if defined(__Userspace__) - case AF_CONN: - net->mtu += sizeof(struct sctphdr); - break; + case AF_CONN: + net->mtu += sizeof(struct sctphdr); + break; #endif - default: - break; - } - if (net->mtu < stcb->asoc.smallest_mtu) { - sctp_pathmtu_adjustment(stcb, net->mtu); + default: + break; + } + if (net->mtu < stcb->asoc.smallest_mtu) { + sctp_pathmtu_adjustment(stcb, net->mtu, true); + } } } - stcb->asoc.default_mtu = paddrp->spp_pathmtu; + if (paddrp->spp_pathmtu > 0) { + stcb->asoc.default_mtu = paddrp->spp_pathmtu; + } sctp_stcb_feature_on(inp, stcb, SCTP_PCB_FLAGS_DO_NOT_PMTUD); } if (paddrp->spp_flags & SPP_PMTUD_ENABLE) { @@ -6404,7 +6392,7 @@ * For the TOS/FLOWLABEL stuff you set it * with the options on the socket */ - if (paddrp->spp_pathmaxrxt != 0) { + if (paddrp->spp_pathmaxrxt > 0) { inp->sctp_ep.def_net_failure = paddrp->spp_pathmaxrxt; } @@ -6430,7 +6418,9 @@ inp->sctp_ep.default_mtu = 0; sctp_feature_off(inp, SCTP_PCB_FLAGS_DO_NOT_PMTUD); } else if (paddrp->spp_flags & SPP_PMTUD_DISABLE) { - inp->sctp_ep.default_mtu = paddrp->spp_pathmtu; + if (paddrp->spp_pathmtu > 0) { + inp->sctp_ep.default_mtu = paddrp->spp_pathmtu; + } sctp_feature_on(inp, SCTP_PCB_FLAGS_DO_NOT_PMTUD); } if (paddrp->spp_flags & SPP_DSCP) { @@ -6523,18 +6513,20 @@ SCTP_CHECK_AND_CAST(sasoc, optval, struct sctp_assocparams, optsize); SCTP_FIND_STCB(inp, stcb, sasoc->sasoc_assoc_id); - if (sasoc->sasoc_cookie_life) { + if (sasoc->sasoc_cookie_life > 0) { /* boundary check the cookie life */ - if (sasoc->sasoc_cookie_life < 1000) - sasoc->sasoc_cookie_life = 1000; + if (sasoc->sasoc_cookie_life < SCTP_MIN_COOKIE_LIFE) { + sasoc->sasoc_cookie_life = SCTP_MIN_COOKIE_LIFE; + } if (sasoc->sasoc_cookie_life > SCTP_MAX_COOKIE_LIFE) { sasoc->sasoc_cookie_life = SCTP_MAX_COOKIE_LIFE; } } if (stcb) { - if (sasoc->sasoc_asocmaxrxt) + if (sasoc->sasoc_asocmaxrxt > 0) { stcb->asoc.max_send_times = sasoc->sasoc_asocmaxrxt; - if (sasoc->sasoc_cookie_life) { + } + if (sasoc->sasoc_cookie_life > 0) { stcb->asoc.cookie_life = sctp_msecs_to_ticks(sasoc->sasoc_cookie_life); } SCTP_TCB_UNLOCK(stcb); @@ -6544,9 +6536,10 @@ ((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) && (sasoc->sasoc_assoc_id == SCTP_FUTURE_ASSOC))) { SCTP_INP_WLOCK(inp); - if (sasoc->sasoc_asocmaxrxt) + if (sasoc->sasoc_asocmaxrxt > 0) { inp->sctp_ep.max_send_times = sasoc->sasoc_asocmaxrxt; - if (sasoc->sasoc_cookie_life) { + } + if (sasoc->sasoc_cookie_life > 0) { inp->sctp_ep.def_cookie_life = sctp_msecs_to_ticks(sasoc->sasoc_cookie_life); } SCTP_INP_WUNLOCK(inp); @@ -6624,11 +6617,11 @@ if ((stcb != NULL) && (net != NULL)) { if (net != stcb->asoc.primary_destination) { - if (!(net->dest_state & SCTP_ADDR_UNCONFIRMED)) { + if ((net->dest_state & SCTP_ADDR_UNCONFIRMED) == 0) { /* Ok we need to set it */ if (sctp_set_primary_addr(stcb, (struct sockaddr *)NULL, net) == 0) { if ((stcb->asoc.alternate) && - (!(net->dest_state & SCTP_ADDR_PF)) && + ((net->dest_state & SCTP_ADDR_PF) == 0) && (net->dest_state & SCTP_ADDR_REACHABLE)) { sctp_free_remote_addr(stcb->asoc.alternate); stcb->asoc.alternate = NULL; @@ -7226,8 +7219,8 @@ if ((stcb != NULL) && (net == NULL)) { #ifdef INET if (addr->sa_family == AF_INET) { - struct sockaddr_in *sin; + sin = (struct sockaddr_in *)addr; if (sin->sin_addr.s_addr != INADDR_ANY) { SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL); @@ -7407,8 +7400,8 @@ if ((stcb != NULL) && (net == NULL)) { #ifdef INET if (addr->sa_family == AF_INET) { - struct sockaddr_in *sin; + sin = (struct sockaddr_in *)addr; if (sin->sin_addr.s_addr != INADDR_ANY) { SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL); @@ -7890,7 +7883,7 @@ #if defined(__Userspace__) /* TODO __Userspace__ falls into this code for IPv6 stuff at the moment... */ #endif -#if !defined(_WIN32) && !defined(__linux__) +#if !defined(_WIN32) && !defined(__linux__) && !defined(__EMSCRIPTEN__) switch (addr->sa_family) { #ifdef INET6 case AF_INET6: @@ -7971,8 +7964,7 @@ goto out_now; } #endif - if ((inp->sctp_flags & SCTP_PCB_FLAGS_UNBOUND) == - SCTP_PCB_FLAGS_UNBOUND) { + if (inp->sctp_flags & SCTP_PCB_FLAGS_UNBOUND) { /* Bind a ephemeral port */ error = sctp_inpcb_bind(so, NULL, NULL, p); if (error) { @@ -8032,19 +8024,14 @@ } #endif /* We are GOOD to go */ - stcb = sctp_aloc_assoc(inp, addr, &error, 0, vrf_id, - inp->sctp_ep.pre_open_stream_count, - inp->sctp_ep.port, p, - SCTP_INITIALIZE_AUTH_PARAMS); + stcb = sctp_aloc_assoc_connected(inp, addr, &error, 0, 0, vrf_id, + inp->sctp_ep.pre_open_stream_count, + inp->sctp_ep.port, p, + SCTP_INITIALIZE_AUTH_PARAMS); if (stcb == NULL) { /* Gak! no memory */ goto out_now; } - if (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) { - stcb->sctp_ep->sctp_flags |= SCTP_PCB_FLAGS_CONNECTED; - /* Set the connected flag so we can queue data */ - soisconnecting(so); - } SCTP_SET_STATE(stcb, SCTP_STATE_COOKIE_WAIT); (void)SCTP_GETTIME_TIMEVAL(&stcb->asoc.time_entered); @@ -8139,7 +8126,7 @@ goto out_now; } #endif - if ((inp->sctp_flags & SCTP_PCB_FLAGS_UNBOUND) == SCTP_PCB_FLAGS_UNBOUND) { + if (inp->sctp_flags & SCTP_PCB_FLAGS_UNBOUND) { /* Bind a ephemeral port */ error = sctp_inpcb_bind(so, NULL, NULL, p); if (error) { @@ -8199,19 +8186,14 @@ } #endif /* We are GOOD to go */ - stcb = sctp_aloc_assoc(inp, addr, &error, 0, vrf_id, - inp->sctp_ep.pre_open_stream_count, - inp->sctp_ep.port, p, - SCTP_INITIALIZE_AUTH_PARAMS); + stcb = sctp_aloc_assoc_connected(inp, addr, &error, 0, 0, vrf_id, + inp->sctp_ep.pre_open_stream_count, + inp->sctp_ep.port, p, + SCTP_INITIALIZE_AUTH_PARAMS); if (stcb == NULL) { /* Gak! no memory */ goto out_now; } - if (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) { - stcb->sctp_ep->sctp_flags |= SCTP_PCB_FLAGS_CONNECTED; - /* Set the connected flag so we can queue data */ - soisconnecting(so); - } SCTP_SET_STATE(stcb, SCTP_STATE_COOKIE_WAIT); (void)SCTP_GETTIME_TIMEVAL(&stcb->asoc.time_entered); @@ -8361,21 +8343,13 @@ } } } - SCTP_INP_RLOCK(inp); + SCTP_INP_INFO_WLOCK(); + SCTP_INP_WLOCK(inp); #ifdef SCTP_LOCK_LOGGING if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LOCK_LOGGING_ENABLE) { sctp_log_lock(inp, (struct sctp_tcb *)NULL, SCTP_LOG_LOCK_SOCK); } #endif -#if defined(__FreeBSD__) || defined(__Userspace__) - SOCK_LOCK(so); - error = solisten_proto_check(so); - SOCK_UNLOCK(so); - if (error) { - SCTP_INP_RUNLOCK(inp); - return (error); - } -#endif if ((sctp_is_feature_on(inp, SCTP_PCB_FLAGS_PORTREUSE)) && (inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL)) { /* The unlucky case @@ -8385,36 +8359,65 @@ * - We must then move the guy that was listener to the TCP Pool. */ if (sctp_swap_inpcb_for_listen(inp)) { - SCTP_INP_RUNLOCK(inp); - SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EADDRINUSE); - return (EADDRINUSE); + error = EADDRINUSE; + SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, error); + goto out; } } - +#if defined(__FreeBSD__) || defined(__Userspace__) + SOCK_LOCK(so); + error = solisten_proto_check(so); + if (error) { + SOCK_UNLOCK(so); + goto out; + } +#endif if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) && (inp->sctp_flags & SCTP_PCB_FLAGS_CONNECTED)) { - /* We are already connected AND the TCP model */ - SCTP_INP_RUNLOCK(inp); - SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EADDRINUSE); - return (EADDRINUSE); + SOCK_UNLOCK(so); +#if defined(__FreeBSD__) && !defined(__Userspace__) + solisten_proto_abort(so); +#endif + error = EADDRINUSE; + SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, error); + goto out; + } + if ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) && + ((inp->sctp_flags & SCTP_PCB_FLAGS_WAS_CONNECTED) || + (inp->sctp_flags & SCTP_PCB_FLAGS_WAS_ABORTED))) { + SOCK_UNLOCK(so); +#if defined(__FreeBSD__) && !defined(__Userspace__) + solisten_proto_abort(so); +#endif + error = EINVAL; + SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, error); + goto out; } - SCTP_INP_RUNLOCK(inp); if (inp->sctp_flags & SCTP_PCB_FLAGS_UNBOUND) { - /* We must do a bind. */ - if ((error = sctp_inpcb_bind(so, NULL, NULL, p))) { + if ((error = sctp_inpcb_bind_locked(inp, NULL, NULL, p))) { + SOCK_UNLOCK(so); +#if defined(__FreeBSD__) && !defined(__Userspace__) + solisten_proto_abort(so); +#endif /* bind error, probably perm */ - return (error); + goto out; } } - SCTP_INP_WLOCK(inp); #if defined(__FreeBSD__) && !defined(__Userspace__) if ((inp->sctp_flags & SCTP_PCB_FLAGS_UDPTYPE) == 0) { - SOCK_LOCK(so); solisten_proto(so, backlog); SOCK_UNLOCK(so); + inp->sctp_flags |= SCTP_PCB_FLAGS_ACCEPTING; + } else { + solisten_proto_abort(so); + SOCK_UNLOCK(so); + if (backlog > 0) { + inp->sctp_flags |= SCTP_PCB_FLAGS_ACCEPTING; + } else { + inp->sctp_flags &= ~SCTP_PCB_FLAGS_ACCEPTING; + } } #elif defined(_WIN32) || defined(__Userspace__) - SOCK_LOCK(so); solisten_proto(so, backlog); #endif #if !(defined(__FreeBSD__) && !defined(__Userspace__)) @@ -8427,17 +8430,15 @@ #endif } SOCK_UNLOCK(so); -#endif -#if defined(__FreeBSD__) || defined(_WIN32) || defined(__Userspace__) if (backlog > 0) { inp->sctp_flags |= SCTP_PCB_FLAGS_ACCEPTING; } else { inp->sctp_flags &= ~SCTP_PCB_FLAGS_ACCEPTING; } -#else - inp->sctp_flags |= SCTP_PCB_FLAGS_ACCEPTING; #endif +out: SCTP_INP_WUNLOCK(inp); + SCTP_INP_INFO_WUNLOCK(); return (error); } @@ -9018,7 +9019,7 @@ } int -register_send_cb(struct socket *so, uint32_t sb_threshold, int (*send_cb)(struct socket *sock, uint32_t sb_free)) +register_send_cb(struct socket *so, uint32_t sb_threshold, int (*send_cb)(struct socket *sock, uint32_t sb_free, void *ulp_info)) { struct sctp_inpcb *inp; diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_var.h firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_var.h --- firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctp_var.h 2022-12-05 23:01:11.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctp_var.h 2023-01-09 15:01:10.000000000 +0000 @@ -34,7 +34,7 @@ #if defined(__FreeBSD__) && !defined(__Userspace__) #include -__FBSDID("$FreeBSD: head/sys/netinet/sctp_var.h 360292 2020-04-25 09:06:11Z melifaro $"); +__FBSDID("$FreeBSD$"); #endif #ifndef _NETINET_SCTP_VAR_H_ @@ -48,7 +48,6 @@ extern struct pr_usrreqs sctp_usrreqs; #endif - #define sctp_feature_on(inp, feature) (inp->sctp_features |= feature) #define sctp_feature_off(inp, feature) (inp->sctp_features &= ~feature) #define sctp_is_feature_on(inp, feature) ((inp->sctp_features & feature) == feature) @@ -90,7 +89,7 @@ #define sctp_sbspace(asoc, sb) ((long) ((sctp_maxspace(sb) > (asoc)->sb_cc) ? (sctp_maxspace(sb) - (asoc)->sb_cc) : 0)) -#define sctp_sbspace_failedmsgs(sb) ((long) ((sctp_maxspace(sb) > (sb)->sb_cc) ? (sctp_maxspace(sb) - (sb)->sb_cc) : 0)) +#define sctp_sbspace_failedmsgs(sb) ((long) ((sctp_maxspace(sb) > SCTP_SBAVAIL(sb)) ? (sctp_maxspace(sb) - SCTP_SBAVAIL(sb)) : 0)) #define sctp_sbspace_sub(a,b) (((a) > (b)) ? ((a) - (b)) : 0) @@ -187,11 +186,9 @@ } #if defined(__FreeBSD__) && !defined(__Userspace__) - #define sctp_free_remote_addr(__net) { \ if ((__net)) { \ if (SCTP_DECREMENT_AND_CHECK_REFCOUNT(&(__net)->ref_count)) { \ - (void)SCTP_OS_TIMER_STOP(&(__net)->rxt_timer.timer); \ RO_NHFREE(&(__net)->ro); \ if ((__net)->src_addr_selected) { \ sctp_free_ifa((__net)->ro._s_addr); \ @@ -228,13 +225,10 @@ SCTP_BUF_TYPE(m) != MT_OOBDATA) \ atomic_add_int(&(sb)->sb_ctl,SCTP_BUF_LEN((m))); \ } - #else /* FreeBSD Version <= 500000 or non-FreeBSD */ - #define sctp_free_remote_addr(__net) { \ if ((__net)) { \ if (SCTP_DECREMENT_AND_CHECK_REFCOUNT(&(__net)->ref_count)) { \ - (void)SCTP_OS_TIMER_STOP(&(__net)->rxt_timer.timer); \ if ((__net)->ro.ro_rt) { \ RTFREE((__net)->ro.ro_rt); \ (__net)->ro.ro_rt = NULL; \ @@ -369,7 +363,6 @@ struct sctp_tcb; struct sctphdr; - #if defined(__FreeBSD__) || defined(_WIN32) || defined(__Userspace__) void sctp_close(struct socket *so); #else @@ -391,10 +384,10 @@ void sctp_input(struct mbuf *, int); #endif #endif -void sctp_pathmtu_adjustment(struct sctp_tcb *, uint16_t); +void sctp_pathmtu_adjustment(struct sctp_tcb *, uint32_t, bool); #else #if defined(__Userspace__) -void sctp_pathmtu_adjustment(struct sctp_tcb *, uint16_t); +void sctp_pathmtu_adjustment(struct sctp_tcb *, uint32_t, bool); #else void sctp_input(struct mbuf *,...); #endif @@ -409,7 +402,9 @@ #elif defined(__APPLE__) && (!defined(APPLE_LEOPARD) && !defined(APPLE_SNOWLEOPARD) &&!defined(APPLE_LION) && !defined(APPLE_MOUNTAINLION)) void sctp_init(struct protosw *pp, struct domain *dp); #else +#if !defined(__FreeBSD__) void sctp_init(void); +#endif void sctp_notify(struct sctp_inpcb *, struct sctp_tcb *, struct sctp_nets *, uint8_t, uint8_t, uint16_t, uint32_t); #endif diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctputil.c firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctputil.c --- firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctputil.c 2022-12-05 23:00:55.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctputil.c 2023-01-09 15:01:10.000000000 +0000 @@ -34,7 +34,7 @@ #if defined(__FreeBSD__) && !defined(__Userspace__) #include -__FBSDID("$FreeBSD: head/sys/netinet/sctputil.c 362462 2020-06-21 09:56:09Z tuexen $"); +__FBSDID("$FreeBSD$"); #endif #include @@ -92,7 +92,7 @@ struct sctp_cwnd_log sctp_clog; sctp_clog.x.sb.stcb = stcb; - sctp_clog.x.sb.so_sbcc = sb->sb_cc; + sctp_clog.x.sb.so_sbcc = SCTP_SBAVAIL(sb); if (stcb) sctp_clog.x.sb.stcb_sbcc = stcb->asoc.sb_cc; else @@ -398,9 +398,9 @@ } sctp_clog.x.lock.info_lock = rw_wowned(&SCTP_BASE_INFO(ipi_ep_mtx)); if (inp && (inp->sctp_socket)) { - sctp_clog.x.lock.sock_lock = mtx_owned(&(inp->sctp_socket->so_rcv.sb_mtx)); - sctp_clog.x.lock.sockrcvbuf_lock = mtx_owned(&(inp->sctp_socket->so_rcv.sb_mtx)); - sctp_clog.x.lock.socksndbuf_lock = mtx_owned(&(inp->sctp_socket->so_snd.sb_mtx)); + sctp_clog.x.lock.sock_lock = mtx_owned(SOCK_MTX(inp->sctp_socket)); + sctp_clog.x.lock.sockrcvbuf_lock = mtx_owned(SOCKBUF_MTX(&inp->sctp_socket->so_rcv)); + sctp_clog.x.lock.socksndbuf_lock = mtx_owned(SOCKBUF_MTX(&inp->sctp_socket->so_snd)); } else { sctp_clog.x.lock.sock_lock = SCTP_LOCK_UNKNOWN; sctp_clog.x.lock.sockrcvbuf_lock = SCTP_LOCK_UNKNOWN; @@ -760,7 +760,6 @@ stcb->asoc.total_flight, tot_out); /* now corrective action */ TAILQ_FOREACH(lnet, &stcb->asoc.nets, sctp_next) { - tot_out = 0; TAILQ_FOREACH(chk, &stcb->asoc.sent_queue, sctp_next) { if ((chk->whoTo == lnet) && @@ -1143,7 +1142,8 @@ int sctp_init_asoc(struct sctp_inpcb *inp, struct sctp_tcb *stcb, - uint32_t override_tag, uint32_t vrf_id, uint16_t o_strms) + uint32_t override_tag, uint32_t initial_tsn, uint32_t vrf_id, + uint16_t o_strms) { struct sctp_association *asoc; /* @@ -1220,23 +1220,28 @@ #endif asoc->refcnt = 0; asoc->assoc_up_sent = 0; - asoc->asconf_seq_out = asoc->str_reset_seq_out = asoc->init_seq_number = asoc->sending_seq = - sctp_select_initial_TSN(&inp->sctp_ep); - asoc->asconf_seq_out_acked = asoc->asconf_seq_out - 1; - /* we are optimisitic here */ + if (override_tag) { + asoc->init_seq_number = initial_tsn; + } else { + asoc->init_seq_number = sctp_select_initial_TSN(&inp->sctp_ep); + } + asoc->asconf_seq_out = asoc->init_seq_number; + asoc->str_reset_seq_out = asoc->init_seq_number; + asoc->sending_seq = asoc->init_seq_number; + asoc->asconf_seq_out_acked = asoc->init_seq_number - 1; + /* we are optimistic here */ asoc->peer_supports_nat = 0; asoc->sent_queue_retran_cnt = 0; /* for CMT */ - asoc->last_net_cmt_send_started = NULL; + asoc->last_net_cmt_send_started = NULL; - /* This will need to be adjusted */ asoc->last_acked_seq = asoc->init_seq_number - 1; - asoc->advanced_peer_ack_point = asoc->last_acked_seq; - asoc->asconf_seq_in = asoc->last_acked_seq; + asoc->advanced_peer_ack_point = asoc->init_seq_number - 1; + asoc->asconf_seq_in = asoc->init_seq_number - 1; /* here we are different, we hold the next one we expect */ - asoc->str_reset_seq_in = asoc->last_acked_seq + 1; + asoc->str_reset_seq_in = asoc->init_seq_number; asoc->initial_init_rto_max = inp->sctp_ep.initial_init_rto_max; asoc->initial_rto = inp->sctp_ep.initial_rto; @@ -1285,7 +1290,7 @@ asoc->my_rwnd = max(SCTP_SB_LIMIT_RCV(inp->sctp_socket), SCTP_MINIMAL_RWND); asoc->peers_rwnd = SCTP_SB_LIMIT_RCV(inp->sctp_socket); - asoc->smallest_mtu = inp->sctp_frag_point; + asoc->smallest_mtu = 0; asoc->minrto = inp->sctp_ep.sctp_minrto; asoc->maxrto = inp->sctp_ep.sctp_maxrto; @@ -1325,6 +1330,7 @@ SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTPUTIL, ENOMEM); return (ENOMEM); } + SCTP_TCB_LOCK(stcb); for (i = 0; i < asoc->streamoutcnt; i++) { /* * inbound side must be set to 0xffff, also NOTE when we get @@ -1334,9 +1340,8 @@ * that were dropped must be notified to the upper layer as * failed to send. */ - asoc->strmout[i].next_mid_ordered = 0; - asoc->strmout[i].next_mid_unordered = 0; TAILQ_INIT(&asoc->strmout[i].outqueue); + asoc->ss_functions.sctp_ss_init_stream(stcb, &asoc->strmout[i], NULL); asoc->strmout[i].chunks_on_queues = 0; #if defined(SCTP_DETAILED_STR_STATS) for (j = 0; j < SCTP_PR_SCTP_MAX + 1; j++) { @@ -1347,12 +1352,14 @@ asoc->strmout[i].abandoned_sent[0] = 0; asoc->strmout[i].abandoned_unsent[0] = 0; #endif + asoc->strmout[i].next_mid_ordered = 0; + asoc->strmout[i].next_mid_unordered = 0; asoc->strmout[i].sid = i; asoc->strmout[i].last_msg_incomplete = 0; asoc->strmout[i].state = SCTP_STREAM_OPENING; - asoc->ss_functions.sctp_ss_init_stream(stcb, &asoc->strmout[i], NULL); } - asoc->ss_functions.sctp_ss_init(stcb, asoc, 0); + asoc->ss_functions.sctp_ss_init(stcb, asoc); + SCTP_TCB_UNLOCK(stcb); /* Now the mapping array */ asoc->mapping_array_size = SCTP_INITIAL_MAPPING_ARRAY; @@ -1480,7 +1487,6 @@ return (0); } - static void sctp_iterator_work(struct sctp_iterator *it) { @@ -1560,7 +1566,7 @@ SCTP_INP_RUNLOCK(it->inp); goto no_stcb; } - while (it->stcb) { + while (it->stcb != NULL) { SCTP_TCB_LOCK(it->stcb); if (it->asoc_state && ((it->stcb->asoc.state & it->asoc_state) != it->asoc_state)) { /* not in the right state... keep looking */ @@ -1582,7 +1588,7 @@ if (sctp_it_ctl.iterator_flags) { /* We won't be staying here */ SCTP_INP_DECR_REF(it->inp); - atomic_add_int(&it->stcb->asoc.refcnt, -1); + atomic_subtract_int(&it->stcb->asoc.refcnt, 1); #if !(defined(__FreeBSD__) && !defined(__Userspace__)) if (sctp_it_ctl.iterator_flags & SCTP_ITERATOR_MUST_EXIT) { @@ -1607,22 +1613,29 @@ SCTP_INP_RLOCK(it->inp); SCTP_INP_DECR_REF(it->inp); SCTP_TCB_LOCK(it->stcb); - atomic_add_int(&it->stcb->asoc.refcnt, -1); + atomic_subtract_int(&it->stcb->asoc.refcnt, 1); iteration_count = 0; } KASSERT(it->inp == it->stcb->sctp_ep, ("%s: stcb %p does not belong to inp %p, but inp %p", __func__, it->stcb, it->inp, it->stcb->sctp_ep)); + SCTP_INP_RLOCK_ASSERT(it->inp); + SCTP_TCB_LOCK_ASSERT(it->stcb); /* run function on this one */ (*it->function_assoc)(it->inp, it->stcb, it->pointer, it->val); + SCTP_INP_RLOCK_ASSERT(it->inp); + SCTP_TCB_LOCK_ASSERT(it->stcb); /* * we lie here, it really needs to have its own type but * first I must verify that this won't effect things :-0 */ - if (it->no_chunk_output == 0) + if (it->no_chunk_output == 0) { sctp_chunk_output(it->inp, it->stcb, SCTP_OUTPUT_FROM_T3, SCTP_SO_NOT_LOCKED); + SCTP_INP_RLOCK_ASSERT(it->inp); + SCTP_TCB_LOCK_ASSERT(it->stcb); + } SCTP_TCB_UNLOCK(it->stcb); next_assoc: @@ -1682,7 +1695,6 @@ return; } - static void sctp_handle_addr_wq(void) { @@ -1780,18 +1792,24 @@ #if defined(__Userspace__) struct socket *upcall_socket = NULL; #endif - int did_output; int type; int i, secret; + bool did_output, released_asoc_reference; + /* + * If inp, stcb or net are not NULL, then references to these were + * added when the timer was started, and must be released before this + * function returns. + */ tmr = (struct sctp_timer *)t; inp = (struct sctp_inpcb *)tmr->ep; stcb = (struct sctp_tcb *)tmr->tcb; net = (struct sctp_nets *)tmr->net; #if defined(__FreeBSD__) && !defined(__Userspace__) CURVNET_SET((struct vnet *)tmr->vnet); + NET_EPOCH_ENTER(et); #endif - did_output = 1; + released_asoc_reference = false; #ifdef SCTP_AUDITING_ENABLED sctp_audit_log(0xF0, (uint8_t) tmr->type); @@ -1807,62 +1825,39 @@ KASSERT(stcb == NULL || stcb->sctp_ep == inp, ("sctp_timeout_handler of type %d: inp = %p, stcb->sctp_ep %p", type, stcb, stcb->sctp_ep)); - if (inp) { - SCTP_INP_INCR_REF(inp); - } tmr->stopped_from = 0xa001; - if (stcb) { - atomic_add_int(&stcb->asoc.refcnt, 1); - if (stcb->asoc.state == 0) { - atomic_add_int(&stcb->asoc.refcnt, -1); - if (inp) { - SCTP_INP_DECR_REF(inp); - } - SCTPDBG(SCTP_DEBUG_TIMER2, - "Timer type %d handler exiting due to CLOSED association.\n", - type); -#if defined(__FreeBSD__) && !defined(__Userspace__) - CURVNET_RESTORE(); -#endif - return; - } + if ((stcb != NULL) && (stcb->asoc.state == SCTP_STATE_EMPTY)) { + SCTPDBG(SCTP_DEBUG_TIMER2, + "Timer type %d handler exiting due to CLOSED association.\n", + type); + goto out_decr; } tmr->stopped_from = 0xa002; SCTPDBG(SCTP_DEBUG_TIMER2, "Timer type %d goes off.\n", type); if (!SCTP_OS_TIMER_ACTIVE(&tmr->timer)) { - if (inp) { - SCTP_INP_DECR_REF(inp); - } - if (stcb) { - atomic_add_int(&stcb->asoc.refcnt, -1); - } SCTPDBG(SCTP_DEBUG_TIMER2, "Timer type %d handler exiting due to not being active.\n", type); -#if defined(__FreeBSD__) && !defined(__Userspace__) - CURVNET_RESTORE(); -#endif - return; + goto out_decr; } tmr->stopped_from = 0xa003; if (stcb) { SCTP_TCB_LOCK(stcb); - atomic_add_int(&stcb->asoc.refcnt, -1); + /* + * Release reference so that association can be freed if + * necessary below. + * This is safe now that we have acquired the lock. + */ + atomic_subtract_int(&stcb->asoc.refcnt, 1); + released_asoc_reference = true; if ((type != SCTP_TIMER_TYPE_ASOCKILL) && - ((stcb->asoc.state == 0) || + ((stcb->asoc.state == SCTP_STATE_EMPTY) || (stcb->asoc.state & SCTP_STATE_ABOUT_TO_BE_FREED))) { - SCTP_TCB_UNLOCK(stcb); - if (inp) { - SCTP_INP_DECR_REF(inp); - } SCTPDBG(SCTP_DEBUG_TIMER2, "Timer type %d handler exiting due to CLOSED association.\n", type); -#if defined(__FreeBSD__) && !defined(__Userspace__) - CURVNET_RESTORE(); -#endif - return; + goto out; } } else if (inp != NULL) { SCTP_INP_WLOCK(inp); @@ -1872,27 +1867,24 @@ /* Record in stopped_from which timeout occurred. */ tmr->stopped_from = type; -#if defined(__FreeBSD__) && !defined(__Userspace__) - NET_EPOCH_ENTER(et); -#endif /* mark as being serviced now */ if (SCTP_OS_TIMER_PENDING(&tmr->timer)) { /* * Callout has been rescheduled. */ - goto get_out; + goto out; } if (!SCTP_OS_TIMER_ACTIVE(&tmr->timer)) { /* * Not active, so no action. */ - goto get_out; + goto out; } SCTP_OS_TIMER_DEACTIVATE(&tmr->timer); #if defined(__Userspace__) if ((stcb != NULL) && - !(stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) && + ((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) == 0) && (stcb->sctp_socket != NULL)) { upcall_socket = stcb->sctp_socket; SOCK_LOCK(upcall_socket); @@ -1923,6 +1915,7 @@ sctp_auditing(4, inp, stcb, net); #endif sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_T3, SCTP_SO_NOT_LOCKED); + did_output = true; if ((stcb->asoc.num_send_timers_up == 0) && (stcb->asoc.sent_queue_cnt > 0)) { struct sctp_tmit_chunk *chk; @@ -1953,8 +1946,7 @@ /* no need to unlock on tcb its gone */ goto out_decr; } - /* We do output but not here */ - did_output = 0; + did_output = false; break; case SCTP_TIMER_TYPE_RECV: KASSERT(inp != NULL && stcb != NULL && net == NULL, @@ -1967,6 +1959,7 @@ sctp_auditing(4, inp, stcb, NULL); #endif sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_SACK_TMR, SCTP_SO_NOT_LOCKED); + did_output = true; break; case SCTP_TIMER_TYPE_SHUTDOWN: KASSERT(inp != NULL && stcb != NULL && net != NULL, @@ -1982,6 +1975,7 @@ sctp_auditing(4, inp, stcb, net); #endif sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_SHUT_TMR, SCTP_SO_NOT_LOCKED); + did_output = true; break; case SCTP_TIMER_TYPE_HEARTBEAT: KASSERT(inp != NULL && stcb != NULL && net != NULL, @@ -1996,9 +1990,12 @@ #ifdef SCTP_AUDITING_ENABLED sctp_auditing(4, inp, stcb, net); #endif - if (!(net->dest_state & SCTP_ADDR_NOHB)) { + if ((net->dest_state & SCTP_ADDR_NOHB) == 0) { sctp_timer_start(SCTP_TIMER_TYPE_HEARTBEAT, inp, stcb, net); sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_HB_TMR, SCTP_SO_NOT_LOCKED); + did_output = true; + } else { + did_output = false; } break; case SCTP_TIMER_TYPE_COOKIE: @@ -2019,6 +2016,7 @@ * respect to where from in chunk_output. */ sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_T3, SCTP_SO_NOT_LOCKED); + did_output = true; break; case SCTP_TIMER_TYPE_NEWCOOKIE: KASSERT(inp != NULL && stcb == NULL && net == NULL, @@ -2026,7 +2024,7 @@ type, inp, stcb, net)); SCTP_STAT_INCR(sctps_timosecret); (void)SCTP_GETTIME_TIMEVAL(&tv); - inp->sctp_ep.time_of_secret_change = tv.tv_sec; + inp->sctp_ep.time_of_secret_change = (unsigned int)tv.tv_sec; inp->sctp_ep.last_secret_number = inp->sctp_ep.current_secret_number; inp->sctp_ep.current_secret_number++; @@ -2040,7 +2038,7 @@ sctp_select_initial_TSN(&inp->sctp_ep); } sctp_timer_start(SCTP_TIMER_TYPE_NEWCOOKIE, inp, NULL, NULL); - did_output = 0; + did_output = false; break; case SCTP_TIMER_TYPE_PATHMTURAISE: KASSERT(inp != NULL && stcb != NULL && net != NULL, @@ -2048,7 +2046,7 @@ type, inp, stcb, net)); SCTP_STAT_INCR(sctps_timopathmtu); sctp_pathmtu_timer(inp, stcb, net); - did_output = 0; + did_output = false; break; case SCTP_TIMER_TYPE_SHUTDOWNACK: KASSERT(inp != NULL && stcb != NULL && net != NULL, @@ -2064,6 +2062,7 @@ sctp_auditing(4, inp, stcb, net); #endif sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_SHUT_ACK_TMR, SCTP_SO_NOT_LOCKED); + did_output = true; break; case SCTP_TIMER_TYPE_ASCONF: KASSERT(inp != NULL && stcb != NULL && net != NULL, @@ -2078,6 +2077,7 @@ sctp_auditing(4, inp, stcb, net); #endif sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_ASCONF_TMR, SCTP_SO_NOT_LOCKED); + did_output = true; break; case SCTP_TIMER_TYPE_SHUTDOWNGUARD: KASSERT(inp != NULL && stcb != NULL && net == NULL, @@ -2086,7 +2086,7 @@ SCTP_STAT_INCR(sctps_timoshutdownguard); op_err = sctp_generate_cause(SCTP_BASE_SYSCTL(sctp_diag_info_code), "Shutdown guard timer expired"); - sctp_abort_an_association(inp, stcb, op_err, SCTP_SO_NOT_LOCKED); + sctp_abort_an_association(inp, stcb, op_err, true, SCTP_SO_NOT_LOCKED); /* no need to unlock on tcb its gone */ goto out_decr; case SCTP_TIMER_TYPE_AUTOCLOSE: @@ -2096,7 +2096,7 @@ SCTP_STAT_INCR(sctps_timoautoclose); sctp_autoclose_timer(inp, stcb); sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_AUTOCLOSE_TMR, SCTP_SO_NOT_LOCKED); - did_output = 0; + did_output = true; break; case SCTP_TIMER_TYPE_STRRESET: KASSERT(inp != NULL && stcb != NULL && net == NULL, @@ -2108,6 +2108,7 @@ goto out_decr; } sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_STRRST_TMR, SCTP_SO_NOT_LOCKED); + did_output = true; break; case SCTP_TIMER_TYPE_INPKILL: KASSERT(inp != NULL && stcb == NULL && net == NULL, @@ -2126,19 +2127,18 @@ SCTP_INP_DECR_REF(inp); SCTP_INP_WUNLOCK(inp); sctp_inpcb_free(inp, SCTP_FREE_SHOULD_USE_ABORT, - SCTP_CALLED_FROM_INPKILL_TIMER); + SCTP_CALLED_FROM_INPKILL_TIMER); #if defined(__APPLE__) && !defined(__Userspace__) SCTP_SOCKET_UNLOCK(SCTP_INP_SO(inp), 1); #endif inp = NULL; - goto out_no_decr; + goto out_decr; case SCTP_TIMER_TYPE_ASOCKILL: KASSERT(inp != NULL && stcb != NULL && net == NULL, ("timeout of type %d: inp = %p, stcb = %p, net = %p", type, inp, stcb, net)); SCTP_STAT_INCR(sctps_timoassockill); /* Can we free it yet? */ - SCTP_INP_DECR_REF(inp); sctp_timer_stop(SCTP_TIMER_TYPE_ASOCKILL, inp, stcb, NULL, SCTP_FROM_SCTPUTIL + SCTP_LOC_1); #if defined(__APPLE__) && !defined(__Userspace__) @@ -2159,12 +2159,13 @@ * duplicate unlock or unlock of a free mtx :-0 */ stcb = NULL; - goto out_no_decr; + goto out_decr; case SCTP_TIMER_TYPE_ADDR_WQ: KASSERT(inp == NULL && stcb == NULL && net == NULL, ("timeout of type %d: inp = %p, stcb = %p, net = %p", type, inp, stcb, net)); sctp_handle_addr_wq(); + did_output = true; break; case SCTP_TIMER_TYPE_PRIM_DELETED: KASSERT(inp != NULL && stcb != NULL && net == NULL, @@ -2172,20 +2173,21 @@ type, inp, stcb, net)); SCTP_STAT_INCR(sctps_timodelprim); sctp_delete_prim_timer(inp, stcb); + did_output = false; break; default: #ifdef INVARIANTS panic("Unknown timer type %d", type); #else - goto get_out; + goto out; #endif } #ifdef SCTP_AUDITING_ENABLED sctp_audit_log(0xF1, (uint8_t) type); - if (inp) + if (inp != NULL) sctp_auditing(5, inp, stcb, net); #endif - if ((did_output) && stcb) { + if (did_output && (stcb != NULL)) { /* * Now we need to clean up the control chunk chain if an * ECNE is on it. It must be marked as UNSENT again so next @@ -2195,8 +2197,8 @@ */ sctp_fix_ecn_echo(&stcb->asoc); } -get_out: - if (stcb) { +out: + if (stcb != NULL) { SCTP_TCB_UNLOCK(stcb); } else if (inp != NULL) { SCTP_INP_WUNLOCK(inp); @@ -2216,11 +2218,16 @@ sorele(upcall_socket); } #endif - if (inp) { + /* These reference counts were incremented in sctp_timer_start(). */ + if (inp != NULL) { SCTP_INP_DECR_REF(inp); } - -out_no_decr: + if ((stcb != NULL) && !released_asoc_reference) { + atomic_subtract_int(&stcb->asoc.refcnt, 1); + } + if (net != NULL) { + sctp_free_remote_addr(net); + } SCTPDBG(SCTP_DEBUG_TIMER2, "Timer type %d handler finished.\n", type); #if defined(__FreeBSD__) && !defined(__Userspace__) CURVNET_RESTORE(); @@ -2267,7 +2274,6 @@ ("sctp_timer_start of type %d: inp = %p, stcb->sctp_ep %p", t_type, stcb, stcb->sctp_ep)); tmr = NULL; - to_ticks = 0; if (stcb != NULL) { SCTP_TCB_LOCK_ASSERT(stcb); } else if (inp != NULL) { @@ -2333,7 +2339,7 @@ case SCTP_TIMER_TYPE_RECV: /* * Here we use the Delayed-Ack timer value from the inp, - * ususually about 200ms. + * usually about 200ms. */ if ((inp == NULL) || (stcb == NULL) || (net != NULL)) { #ifdef INVARIANTS @@ -2378,7 +2384,7 @@ #endif } if ((net->dest_state & SCTP_ADDR_NOHB) && - !(net->dest_state & SCTP_ADDR_UNCONFIRMED)) { + ((net->dest_state & SCTP_ADDR_UNCONFIRMED) == 0)) { SCTPDBG(SCTP_DEBUG_TIMER2, "Timer type %d not started: inp=%p, stcb=%p, net=%p.\n", t_type, inp, stcb, net); @@ -2392,14 +2398,22 @@ } rndval = sctp_select_initial_TSN(&inp->sctp_ep); jitter = rndval % to_ticks; - if (jitter >= (to_ticks >> 1)) { - to_ticks = to_ticks + (jitter - (to_ticks >> 1)); + if (to_ticks > 1) { + to_ticks >>= 1; + } + if (jitter < (UINT32_MAX - to_ticks)) { + to_ticks += jitter; } else { - to_ticks = to_ticks - jitter; + to_ticks = UINT32_MAX; } - if (!(net->dest_state & SCTP_ADDR_UNCONFIRMED) && - !(net->dest_state & SCTP_ADDR_PF)) { - to_ticks += net->heart_beat_delay; + if (!((net->dest_state & SCTP_ADDR_UNCONFIRMED) && + (net->dest_state & SCTP_ADDR_REACHABLE)) && + ((net->dest_state & SCTP_ADDR_PF) == 0)) { + if (net->heart_beat_delay < (UINT32_MAX - to_ticks)) { + to_ticks += net->heart_beat_delay; + } else { + to_ticks = UINT32_MAX; + } } /* * Now we must convert the to_ticks that are now in @@ -2430,7 +2444,7 @@ break; case SCTP_TIMER_TYPE_NEWCOOKIE: /* - * Nothing needed but the endpoint here ususually about 60 + * Nothing needed but the endpoint here usually about 60 * minutes. */ if ((inp == NULL) || (stcb != NULL) || (net != NULL)) { @@ -2446,7 +2460,7 @@ break; case SCTP_TIMER_TYPE_PATHMTURAISE: /* - * Here we use the value found in the EP for PMTUD, ususually + * Here we use the value found in the EP for PMTUD, usually * about 10 minutes. */ if ((inp == NULL) || (stcb == NULL) || (net == NULL)) { @@ -2561,7 +2575,7 @@ break; case SCTP_TIMER_TYPE_INPKILL: /* - * The inp is setup to die. We re-use the signature_chage + * The inp is setup to die. We re-use the signature_change * timer since that has stopped and we are in the GONE * state. */ @@ -2654,6 +2668,19 @@ SCTPDBG(SCTP_DEBUG_TIMER2, "Timer type %d started: ticks=%u, inp=%p, stcb=%p, net=%p.\n", t_type, to_ticks, inp, stcb, net); + /* + * If this is a newly scheduled callout, as opposed to a + * rescheduled one, increment relevant reference counts. + */ + if (tmr->ep != NULL) { + SCTP_INP_INCR_REF(inp); + } + if (tmr->tcb != NULL) { + atomic_add_int(&stcb->asoc.refcnt, 1); + } + if (tmr->net != NULL) { + atomic_add_int(&net->ref_count, 1); + } } else { /* * This should not happen, since we checked for pending @@ -2856,7 +2883,7 @@ break; case SCTP_TIMER_TYPE_INPKILL: /* - * The inp is setup to die. We re-use the signature_chage + * The inp is setup to die. We re-use the signature_change * timer since that has stopped and we are in the GONE * state. */ @@ -2946,9 +2973,29 @@ SCTPDBG(SCTP_DEBUG_TIMER2, "Timer type %d stopped: inp=%p, stcb=%p, net=%p.\n", t_type, inp, stcb, net); - tmr->ep = NULL; - tmr->tcb = NULL; - tmr->net = NULL; + /* + * If the timer was actually stopped, decrement reference counts + * that were incremented in sctp_timer_start(). + */ + if (tmr->ep != NULL) { + tmr->ep = NULL; + SCTP_INP_DECR_REF(inp); + } + if (tmr->tcb != NULL) { + tmr->tcb = NULL; + atomic_subtract_int(&stcb->asoc.refcnt, 1); + } + if (tmr->net != NULL) { + struct sctp_nets *tmr_net; + + /* + * Can't use net, since it doesn't work for + * SCTP_TIMER_TYPE_ASCONF. + */ + tmr_net = tmr->net; + tmr->net = NULL; + sctp_free_remote_addr(tmr_net); + } } else { SCTPDBG(SCTP_DEBUG_TIMER2, "Timer type %d not stopped: inp=%p, stcb=%p, net=%p.\n", @@ -2960,49 +3007,16 @@ uint32_t sctp_calculate_len(struct mbuf *m) { - uint32_t tlen = 0; struct mbuf *at; + uint32_t tlen; - at = m; - while (at) { + tlen = 0; + for (at = m; at != NULL; at = SCTP_BUF_NEXT(at)) { tlen += SCTP_BUF_LEN(at); - at = SCTP_BUF_NEXT(at); } return (tlen); } -void -sctp_mtu_size_reset(struct sctp_inpcb *inp, - struct sctp_association *asoc, uint32_t mtu) -{ - /* - * Reset the P-MTU size on this association, this involves changing - * the asoc MTU, going through ANY chunk+overhead larger than mtu to - * allow the DF flag to be cleared. - */ - struct sctp_tmit_chunk *chk; - unsigned int eff_mtu, ovh; - - asoc->smallest_mtu = mtu; - if (inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) { - ovh = SCTP_MIN_OVERHEAD; - } else { - ovh = SCTP_MIN_V4_OVERHEAD; - } - eff_mtu = mtu - ovh; - TAILQ_FOREACH(chk, &asoc->send_queue, sctp_next) { - if (chk->send_size > eff_mtu) { - chk->flags |= CHUNK_FLAGS_FRAGMENT_OK; - } - } - TAILQ_FOREACH(chk, &asoc->sent_queue, sctp_next) { - if (chk->send_size > eff_mtu) { - chk->flags |= CHUNK_FLAGS_FRAGMENT_OK; - } - } -} - - /* * Given an association and starting time of the current RTT period, update * RTO in number of msecs. net should point to the current network. @@ -3087,7 +3101,7 @@ rto_logging(net, SCTP_LOG_RTTVAR); } } else { - /* First RTO measurment */ + /* First RTO measurement */ net->RTO_measured = 1; first_measure = 1; net->lastsa = rtt << SCTP_RTT_SHIFT; @@ -3164,8 +3178,6 @@ } } - - struct sctp_paramhdr * sctp_get_next_param(struct mbuf *m, int offset, @@ -3177,7 +3189,6 @@ (uint8_t *) pull)); } - struct mbuf * sctp_add_pad_tombuf(struct mbuf *m, int padlen) { @@ -3229,7 +3240,8 @@ static void sctp_notify_assoc_change(uint16_t state, struct sctp_tcb *stcb, - uint16_t error, struct sctp_abort_chunk *abort, uint8_t from_peer, int so_locked) + uint16_t error, struct sctp_abort_chunk *abort, + bool from_peer, bool timedout, int so_locked) { struct mbuf *m_notify; struct sctp_assoc_change *sac; @@ -3241,6 +3253,10 @@ struct socket *so; #endif + KASSERT(abort == NULL || from_peer, + ("sctp_notify_assoc_change: ABORT chunk provided for local termination")); + KASSERT(!from_peer || !timedout, + ("sctp_notify_assoc_change: timeouts can only be local")); if (stcb == NULL) { return; } @@ -3280,9 +3296,13 @@ sac->sac_length = sizeof(struct sctp_assoc_change); sac->sac_state = state; sac->sac_error = error; - /* XXX verify these stream counts */ - sac->sac_outbound_streams = stcb->asoc.streamoutcnt; - sac->sac_inbound_streams = stcb->asoc.streamincnt; + if (state == SCTP_CANT_STR_ASSOC) { + sac->sac_outbound_streams = 0; + sac->sac_inbound_streams = 0; + } else { + sac->sac_outbound_streams = stcb->asoc.streamoutcnt; + sac->sac_inbound_streams = stcb->asoc.streamincnt; + } sac->sac_assoc_id = sctp_get_associd(stcb); if (notif_len > sizeof(struct sctp_assoc_change)) { if ((state == SCTP_COMM_UP) || (state == SCTP_RESTART)) { @@ -3344,8 +3364,7 @@ stcb->sctp_socket->so_error = ECONNRESET; } } else { - if ((SCTP_GET_STATE(stcb) == SCTP_STATE_COOKIE_WAIT) || - (SCTP_GET_STATE(stcb) == SCTP_STATE_COOKIE_ECHOED)) { + if (timedout) { SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTPUTIL, ETIMEDOUT); stcb->sctp_socket->so_error = ETIMEDOUT; } else { @@ -3485,7 +3504,6 @@ so_locked); } - static void sctp_notify_send_failed(struct sctp_tcb *stcb, uint8_t sent, uint32_t error, struct sctp_tmit_chunk *chk, int so_locked) @@ -3617,7 +3635,6 @@ so_locked); } - static void sctp_notify_send_failed2(struct sctp_tcb *stcb, uint32_t error, struct sctp_stream_queue_pending *sp, int so_locked) @@ -3714,8 +3731,6 @@ &stcb->sctp_socket->so_rcv, 1, SCTP_READ_LOCK_NOT_HELD, so_locked); } - - static void sctp_notify_adaptation_layer(struct sctp_tcb *stcb) { @@ -3970,7 +3985,6 @@ &stcb->sctp_socket->so_rcv, 1, SCTP_READ_LOCK_NOT_HELD, so_locked); } - void sctp_notify_stream_reset_add(struct sctp_tcb *stcb, uint16_t numberin, uint16_t numberout, int flag) { @@ -4077,8 +4091,6 @@ &stcb->sctp_socket->so_rcv, 1, SCTP_READ_LOCK_NOT_HELD, SCTP_SO_NOT_LOCKED); } - - static void sctp_notify_stream_reset(struct sctp_tcb *stcb, int number_entries, uint16_t * list, int flag) @@ -4143,7 +4155,6 @@ &stcb->sctp_socket->so_rcv, 1, SCTP_READ_LOCK_NOT_HELD, SCTP_SO_NOT_LOCKED); } - static void sctp_notify_remote_error(struct sctp_tcb *stcb, uint16_t error, struct sctp_error_chunk *chunk) { @@ -4203,13 +4214,12 @@ sctp_add_to_readq(stcb->sctp_ep, stcb, control, &stcb->sctp_socket->so_rcv, 1, - SCTP_READ_LOCK_NOT_HELD, SCTP_SO_NOT_LOCKED); + SCTP_READ_LOCK_NOT_HELD, SCTP_SO_NOT_LOCKED); } else { sctp_m_freem(m_notify); } } - void sctp_ulp_notify(uint32_t notification, struct sctp_tcb *stcb, uint32_t error, void *data, int so_locked) @@ -4247,7 +4257,7 @@ switch (notification) { case SCTP_NOTIFY_ASSOC_UP: if (stcb->asoc.assoc_up_sent == 0) { - sctp_notify_assoc_change(SCTP_COMM_UP, stcb, error, NULL, 0, so_locked); + sctp_notify_assoc_change(SCTP_COMM_UP, stcb, error, NULL, false, false, so_locked); stcb->asoc.assoc_up_sent = 1; } if (stcb->asoc.adaptation_needed && (stcb->asoc.adaptation_sent == 0)) { @@ -4259,7 +4269,7 @@ } break; case SCTP_NOTIFY_ASSOC_DOWN: - sctp_notify_assoc_change(SCTP_SHUTDOWN_COMP, stcb, error, NULL, 0, so_locked); + sctp_notify_assoc_change(SCTP_SHUTDOWN_COMP, stcb, error, NULL, false, false, so_locked); #if defined(__Userspace__) if (stcb->sctp_ep->recv_callback) { if (stcb->sctp_socket) { @@ -4327,21 +4337,29 @@ case SCTP_NOTIFY_ASSOC_LOC_ABORTED: if ((SCTP_GET_STATE(stcb) == SCTP_STATE_COOKIE_WAIT) || (SCTP_GET_STATE(stcb) == SCTP_STATE_COOKIE_ECHOED)) { - sctp_notify_assoc_change(SCTP_CANT_STR_ASSOC, stcb, error, data, 0, so_locked); + sctp_notify_assoc_change(SCTP_CANT_STR_ASSOC, stcb, error, data, false, false, so_locked); } else { - sctp_notify_assoc_change(SCTP_COMM_LOST, stcb, error, data, 0, so_locked); + sctp_notify_assoc_change(SCTP_COMM_LOST, stcb, error, data, false, false, so_locked); } break; case SCTP_NOTIFY_ASSOC_REM_ABORTED: if ((SCTP_GET_STATE(stcb) == SCTP_STATE_COOKIE_WAIT) || (SCTP_GET_STATE(stcb) == SCTP_STATE_COOKIE_ECHOED)) { - sctp_notify_assoc_change(SCTP_CANT_STR_ASSOC, stcb, error, data, 1, so_locked); + sctp_notify_assoc_change(SCTP_CANT_STR_ASSOC, stcb, error, data, true, false, so_locked); + } else { + sctp_notify_assoc_change(SCTP_COMM_LOST, stcb, error, data, true, false, so_locked); + } + break; + case SCTP_NOTIFY_ASSOC_TIMEDOUT: + if ((SCTP_GET_STATE(stcb) == SCTP_STATE_COOKIE_WAIT) || + (SCTP_GET_STATE(stcb) == SCTP_STATE_COOKIE_ECHOED)) { + sctp_notify_assoc_change(SCTP_CANT_STR_ASSOC, stcb, error, data, false, true, so_locked); } else { - sctp_notify_assoc_change(SCTP_COMM_LOST, stcb, error, data, 1, so_locked); + sctp_notify_assoc_change(SCTP_COMM_LOST, stcb, error, data, false, true, so_locked); } break; case SCTP_NOTIFY_ASSOC_RESTART: - sctp_notify_assoc_change(SCTP_RESTART, stcb, error, NULL, 0, so_locked); + sctp_notify_assoc_change(SCTP_RESTART, stcb, error, NULL, false, false, so_locked); if (stcb->asoc.auth_supported == 0) { sctp_ulp_notify(SCTP_NOTIFY_NO_PEER_AUTH, stcb, 0, NULL, so_locked); @@ -4413,7 +4431,7 @@ } void -sctp_report_all_outbound(struct sctp_tcb *stcb, uint16_t error, int holds_lock, int so_locked) +sctp_report_all_outbound(struct sctp_tcb *stcb, uint16_t error, int so_locked) { struct sctp_association *asoc; struct sctp_stream_out *outs; @@ -4442,9 +4460,6 @@ return; } /* now through all the gunk freeing chunks */ - if (holds_lock == 0) { - SCTP_TCB_SEND_LOCK(stcb); - } /* sent queue SHOULD be empty */ TAILQ_FOREACH_SAFE(chk, &asoc->sent_queue, sctp_next, nchk) { TAILQ_REMOVE(&asoc->sent_queue, chk, sctp_next); @@ -4500,7 +4515,7 @@ TAILQ_FOREACH_SAFE(sp, &outs->outqueue, next, nsp) { atomic_subtract_int(&asoc->stream_queue_cnt, 1); TAILQ_REMOVE(&outs->outqueue, sp, next); - stcb->asoc.ss_functions.sctp_ss_remove_from_stream(stcb, asoc, outs, sp, 1); + stcb->asoc.ss_functions.sctp_ss_remove_from_stream(stcb, asoc, outs, sp); sctp_free_spbufspace(stcb, asoc, sp); if (sp->data) { sctp_ulp_notify(SCTP_NOTIFY_SPECIAL_SP_FAIL, stcb, @@ -4521,15 +4536,12 @@ /*sa_ignore FREED_MEMORY*/ } } - - if (holds_lock == 0) { - SCTP_TCB_SEND_UNLOCK(stcb); - } } void -sctp_abort_notification(struct sctp_tcb *stcb, uint8_t from_peer, uint16_t error, - struct sctp_abort_chunk *abort, int so_locked) +sctp_abort_notification(struct sctp_tcb *stcb, bool from_peer, bool timeout, + uint16_t error, struct sctp_abort_chunk *abort, + int so_locked) { if (stcb == NULL) { return; @@ -4541,22 +4553,29 @@ sctp_unlock_assert(SCTP_INP_SO(stcb->sctp_ep)); } #endif + SCTP_TCB_LOCK_ASSERT(stcb); + if ((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) || ((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) && (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_CONNECTED))) { - stcb->sctp_ep->sctp_flags |= SCTP_PCB_FLAGS_WAS_ABORTED; + sctp_pcb_add_flags(stcb->sctp_ep, SCTP_PCB_FLAGS_WAS_ABORTED); } if ((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) || (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_ALLGONE) || (stcb->asoc.state & SCTP_STATE_CLOSED_SOCKET)) { return; } + SCTP_ADD_SUBSTATE(stcb, SCTP_STATE_WAS_ABORTED); /* Tell them we lost the asoc */ - sctp_report_all_outbound(stcb, error, 0, so_locked); + sctp_report_all_outbound(stcb, error, so_locked); if (from_peer) { sctp_ulp_notify(SCTP_NOTIFY_ASSOC_REM_ABORTED, stcb, error, abort, so_locked); } else { - sctp_ulp_notify(SCTP_NOTIFY_ASSOC_LOC_ABORTED, stcb, error, abort, so_locked); + if (timeout) { + sctp_ulp_notify(SCTP_NOTIFY_ASSOC_TIMEDOUT, stcb, error, abort, so_locked); + } else { + sctp_ulp_notify(SCTP_NOTIFY_ASSOC_LOC_ABORTED, stcb, error, abort, so_locked); + } } } @@ -4570,15 +4589,25 @@ #endif uint32_t vrf_id, uint16_t port) { - uint32_t vtag; #if defined(__APPLE__) && !defined(__Userspace__) struct socket *so; #endif + struct sctp_gen_error_cause* cause; + uint32_t vtag; + uint16_t cause_code; - vtag = 0; if (stcb != NULL) { vtag = stcb->asoc.peer_vtag; vrf_id = stcb->asoc.vrf_id; + if (op_err != NULL) { + /* Read the cause code from the error cause. */ + cause = mtod(op_err, struct sctp_gen_error_cause *); + cause_code = ntohs(cause->code); + } else { + cause_code = 0; + } + } else { + vtag = 0; } sctp_send_abort(m, iphlen, src, dst, sh, vtag, op_err, #if defined(__FreeBSD__) && !defined(__Userspace__) @@ -4587,8 +4616,7 @@ vrf_id, port); if (stcb != NULL) { /* We have a TCB to abort, send notification too */ - sctp_abort_notification(stcb, 0, 0, NULL, SCTP_SO_NOT_LOCKED); - SCTP_ADD_SUBSTATE(stcb, SCTP_STATE_WAS_ABORTED); + sctp_abort_notification(stcb, false, false, cause_code, NULL, SCTP_SO_NOT_LOCKED); /* Ok, now lets free it */ #if defined(__APPLE__) && !defined(__Userspace__) so = SCTP_INP_SO(inp); @@ -4674,12 +4702,13 @@ void sctp_abort_an_association(struct sctp_inpcb *inp, struct sctp_tcb *stcb, - struct mbuf *op_err, - int so_locked) + struct mbuf *op_err, bool timedout, int so_locked) { #if defined(__APPLE__) && !defined(__Userspace__) struct socket *so; #endif + struct sctp_gen_error_cause* cause; + uint16_t cause_code; #if defined(__APPLE__) && !defined(__Userspace__) so = SCTP_INP_SO(inp); @@ -4710,8 +4739,13 @@ } } return; + } + if (op_err != NULL) { + /* Read the cause code from the error cause. */ + cause = mtod(op_err, struct sctp_gen_error_cause *); + cause_code = ntohs(cause->code); } else { - SCTP_ADD_SUBSTATE(stcb, SCTP_STATE_WAS_ABORTED); + cause_code = 0; } /* notify the peer */ sctp_send_abort_tcb(stcb, op_err, so_locked); @@ -4722,7 +4756,7 @@ } /* notify the ulp */ if ((inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) == 0) { - sctp_abort_notification(stcb, 0, 0, NULL, so_locked); + sctp_abort_notification(stcb, false, timedout, cause_code, NULL, so_locked); } /* now free the asoc */ #ifdef SCTP_ASOCLOG_OF_TSNS @@ -4829,7 +4863,7 @@ * if there is return 1, else return 0. */ int -sctp_is_there_an_abort_here(struct mbuf *m, int iphlen, uint32_t * vtagfill) +sctp_is_there_an_abort_here(struct mbuf *m, int iphlen, uint32_t *vtag) { struct sctp_chunkhdr *ch; struct sctp_init_chunk *init_chk, chunk_buf; @@ -4850,12 +4884,13 @@ /* yep, tell them */ return (1); } - if (ch->chunk_type == SCTP_INITIATION) { + if ((ch->chunk_type == SCTP_INITIATION) || + (ch->chunk_type == SCTP_INITIATION_ACK)) { /* need to update the Vtag */ init_chk = (struct sctp_init_chunk *)sctp_m_getptr(m, - offset, sizeof(*init_chk), (uint8_t *) & chunk_buf); + offset, sizeof(struct sctp_init_chunk), (uint8_t *) & chunk_buf); if (init_chk != NULL) { - *vtagfill = ntohl(init_chk->init.initiate_tag); + *vtag = ntohl(init_chk->init.initiate_tag); } } /* Nope, move to the next chunk */ @@ -5095,9 +5130,13 @@ new_so = new_inp->sctp_socket; TAILQ_INIT(&tmp_queue); #if (defined(__FreeBSD__) || defined(__APPLE__)) && !defined(__Userspace__) +#if defined(__FreeBSD__) + error = SOCK_IO_RECV_LOCK(old_so, waitflags); +#else error = sblock(&old_so->so_rcv, waitflags); +#endif if (error) { - /* Gak, can't get sblock, we have a problem. + /* Gak, can't get I/O lock, we have a problem. * data will be left stranded.. and we * don't dare look at it since the * other thread may be reading something. @@ -5132,13 +5171,12 @@ } } SCTP_INP_READ_UNLOCK(old_inp); - /* Remove the sb-lock on the old socket */ + /* Remove the recv-lock on the old socket */ #if defined(__APPLE__) && !defined(__Userspace__) sbunlock(&old_so->so_rcv, 1); #endif - #if defined(__FreeBSD__) && !defined(__Userspace__) - sbunlock(&old_so->so_rcv); + SOCK_IO_RECV_UNLOCK(old_so); #endif /* Now we move them over to the new socket buffer */ SCTP_INP_READ_LOCK(new_inp); @@ -5168,7 +5206,10 @@ #endif ) { - if ((inp != NULL) && (inp->sctp_socket != NULL)) { + if ((inp != NULL) && + (inp->sctp_socket != NULL) && + (((inp->sctp_flags & (SCTP_PCB_FLAGS_TCPTYPE | SCTP_PCB_FLAGS_IN_TCPPOOL)) == 0) || + !SCTP_IS_LISTENING(inp))) { #if defined(__APPLE__) && !defined(__Userspace__) struct socket *so; @@ -5327,8 +5368,9 @@ sctp_unlock_assert(SCTP_INP_SO(inp)); } #endif - if (inp_read_lock_held == 0) + if (inp_read_lock_held == SCTP_READ_LOCK_NOT_HELD) { SCTP_INP_READ_LOCK(inp); + } if (inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_CANT_READ) { if (!control->on_strm_q) { sctp_free_remote_addr(control->whoFrom); @@ -5338,11 +5380,12 @@ } sctp_free_a_readq(stcb, control); } - if (inp_read_lock_held == 0) + if (inp_read_lock_held == SCTP_READ_LOCK_NOT_HELD) { SCTP_INP_READ_UNLOCK(inp); + } return; } - if (!(control->spec_flags & M_NOTIFICATION)) { + if ((control->spec_flags & M_NOTIFICATION) == 0) { atomic_add_int(&inp->total_recvs, 1); if (!control->do_not_ref_stcb) { atomic_add_int(&stcb->total_recvs, 1); @@ -5351,7 +5394,7 @@ m = control->data; control->held_length = 0; control->length = 0; - while (m) { + while (m != NULL) { if (SCTP_BUF_LEN(m) == 0) { /* Skip mbufs with NO length */ if (prev == NULL) { @@ -5395,14 +5438,15 @@ } TAILQ_INSERT_TAIL(&inp->read_queue, control, next); control->on_read_q = 1; - if (inp_read_lock_held == 0) - SCTP_INP_READ_UNLOCK(inp); #if defined(__Userspace__) - sctp_invoke_recv_callback(inp, stcb, control, inp_read_lock_held); + sctp_invoke_recv_callback(inp, stcb, control, SCTP_READ_LOCK_HELD); #endif - if (inp && inp->sctp_socket) { + if ((inp != NULL) && (inp->sctp_socket != NULL)) { sctp_wakeup_the_read_socket(inp, stcb, so_locked); } + if (inp_read_lock_held == SCTP_READ_LOCK_NOT_HELD) { + SCTP_INP_READ_UNLOCK(inp); + } } /*************HOLD THIS COMMENT FOR PATCH FILE OF @@ -5459,7 +5503,6 @@ return (m); } -#ifdef SCTP_MBCNT_LOGGING void sctp_free_bufspace(struct sctp_tcb *stcb, struct sctp_association *asoc, struct sctp_tmit_chunk *tp1, int chk_cnt) @@ -5467,36 +5510,35 @@ if (tp1->data == NULL) { return; } - asoc->chunks_on_out_queue -= chk_cnt; + atomic_subtract_int(&asoc->chunks_on_out_queue, chk_cnt); +#ifdef SCTP_MBCNT_LOGGING if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_MBCNT_LOGGING_ENABLE) { sctp_log_mbcnt(SCTP_LOG_MBCNT_DECREASE, - asoc->total_output_queue_size, - tp1->book_size, - 0, - tp1->mbcnt); + asoc->total_output_queue_size, + tp1->book_size, + 0, + tp1->mbcnt); } +#endif if (asoc->total_output_queue_size >= tp1->book_size) { - atomic_add_int(&asoc->total_output_queue_size, -tp1->book_size); + atomic_subtract_int(&asoc->total_output_queue_size, tp1->book_size); } else { asoc->total_output_queue_size = 0; } - - if (stcb->sctp_socket && (((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL)) || - ((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE)))) { + if ((stcb->sctp_socket != NULL) && + (((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL)) || + ((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE)))) { if (stcb->sctp_socket->so_snd.sb_cc >= tp1->book_size) { - stcb->sctp_socket->so_snd.sb_cc -= tp1->book_size; + atomic_subtract_int(&((stcb)->sctp_socket->so_snd.sb_cc), tp1->book_size); } else { stcb->sctp_socket->so_snd.sb_cc = 0; - } } } -#endif - int sctp_release_pr_sctp_chunk(struct sctp_tcb *stcb, struct sctp_tmit_chunk *tp1, - uint8_t sent, int so_locked) + uint8_t sent, int so_locked) { struct sctp_stream_out *strq; struct sctp_tmit_chunk *chk = NULL, *tp2; @@ -5515,9 +5557,11 @@ sctp_unlock_assert(SCTP_INP_SO(stcb->sctp_ep)); } #endif + SCTP_TCB_LOCK_ASSERT(stcb); + sid = tp1->rec.data.sid; mid = tp1->rec.data.mid; - if (sent || !(tp1->rec.data.rcv_flags & SCTP_DATA_FIRST_FRAG)) { + if (sent || ((tp1->rec.data.rcv_flags & SCTP_DATA_FIRST_FRAG) == 0)) { stcb->asoc.abandoned_sent[0]++; stcb->asoc.abandoned_sent[PR_SCTP_POLICY(tp1->flags)]++; stcb->asoc.strmout[sid].abandoned_sent[0]++; @@ -5621,7 +5665,6 @@ * Still no eom found. That means there * is stuff left on the stream out queue.. yuck. */ - SCTP_TCB_SEND_LOCK(stcb); strq = &stcb->asoc.strmout[sid]; sp = TAILQ_FIRST(&strq->outqueue); if (sp != NULL) { @@ -5706,7 +5749,6 @@ sp->length = 0; } } - SCTP_TCB_SEND_UNLOCK(stcb); } if (do_wakeup_routine) { #if defined(__APPLE__) && !defined(__Userspace__) @@ -5787,7 +5829,11 @@ if (holds_lock == 0) { SCTP_INP_RUNLOCK(inp); } - return (laddr->ifa); + if (laddr != NULL) { + return (laddr->ifa); + } else { + return (NULL); + } } uint32_t @@ -5850,8 +5896,11 @@ struct sctp_ifalist *hash_head; uint32_t hash_of_addr; - if (holds_lock == 0) + if (holds_lock == 0) { SCTP_IPI_ADDR_RLOCK(); + } else { + SCTP_IPI_ADDR_LOCK_ASSERT(); + } vrf = sctp_find_vrf(vrf_id); if (vrf == NULL) { @@ -5997,7 +6046,7 @@ SCTP_INP_DECR_REF(stcb->sctp_ep); no_lock: - atomic_add_int(&stcb->asoc.refcnt, -1); + atomic_subtract_int(&stcb->asoc.refcnt, 1); return; } @@ -6097,14 +6146,14 @@ #if defined(__APPLE__) && !defined(__Userspace__) #if defined(APPLE_LEOPARD) sctp_misc_ints(SCTP_SORECV_ENTER, - rwnd_req, in_eeor_mode, so->so_rcv.sb_cc, uio->uio_resid); + rwnd_req, in_eeor_mode, SCTP_SBAVAIL(&so->so_rcv), uio->uio_resid); #else sctp_misc_ints(SCTP_SORECV_ENTER, - rwnd_req, in_eeor_mode, so->so_rcv.sb_cc, uio_resid(uio)); + rwnd_req, in_eeor_mode, SCTP_SBAVAIL(&so->so_rcv), uio_resid(uio)); #endif #else sctp_misc_ints(SCTP_SORECV_ENTER, - rwnd_req, in_eeor_mode, so->so_rcv.sb_cc, (uint32_t)uio->uio_resid); + rwnd_req, in_eeor_mode, SCTP_SBAVAIL(&so->so_rcv), (uint32_t)uio->uio_resid); #endif } #if defined(__Userspace__) @@ -6115,23 +6164,22 @@ #if defined(__APPLE__) && !defined(__Userspace__) #if defined(APPLE_LEOPARD) sctp_misc_ints(SCTP_SORECV_ENTERPL, - rwnd_req, block_allowed, so->so_rcv.sb_cc, uio->uio_resid); + rwnd_req, block_allowed, SCTP_SBAVAIL(&so->so_rcv), uio->uio_resid); #else sctp_misc_ints(SCTP_SORECV_ENTERPL, - rwnd_req, block_allowed, so->so_rcv.sb_cc, uio_resid(uio)); + rwnd_req, block_allowed, SCTP_SBAVAIL(&so->so_rcv), uio_resid(uio)); #endif #else sctp_misc_ints(SCTP_SORECV_ENTERPL, - rwnd_req, block_allowed, so->so_rcv.sb_cc, (uint32_t)uio->uio_resid); + rwnd_req, block_allowed, SCTP_SBAVAIL(&so->so_rcv), (uint32_t)uio->uio_resid); #endif } #if defined(__APPLE__) && !defined(__Userspace__) error = sblock(&so->so_rcv, SBLOCKWAIT(in_flags)); #endif - #if defined(__FreeBSD__) && !defined(__Userspace__) - error = sblock(&so->so_rcv, (block_allowed ? SBL_WAIT : 0)); + error = SOCK_IO_RECV_LOCK(so, SBLOCKWAIT(in_flags)); #endif if (error) { goto release_unlocked; @@ -6160,9 +6208,9 @@ goto out; } #if (defined(__FreeBSD__) || defined(_WIN32)) && !defined(__Userspace__) - if ((so->so_rcv.sb_state & SBS_CANTRCVMORE) && (so->so_rcv.sb_cc == 0)) { + if ((so->so_rcv.sb_state & SBS_CANTRCVMORE) && SCTP_SBAVAIL(&so->so_rcv) == 0) { #else - if ((so->so_state & SS_CANTRCVMORE) && (so->so_rcv.sb_cc == 0)) { + if ((so->so_state & SS_CANTRCVMORE) && SCTP_SBAVAIL(&so->so_rcv) == 0) { #endif if (so->so_error) { error = so->so_error; @@ -6170,14 +6218,14 @@ so->so_error = 0; goto out; } else { - if (so->so_rcv.sb_cc == 0) { + if (SCTP_SBAVAIL(&so->so_rcv) == 0) { /* indicate EOF */ error = 0; goto out; } } } - if (so->so_rcv.sb_cc <= held_length) { + if (SCTP_SBAVAIL(&so->so_rcv) <= held_length) { if (so->so_error) { error = so->so_error; if ((in_flags & MSG_PEEK) == 0) { @@ -6185,7 +6233,7 @@ } goto out; } - if ((so->so_rcv.sb_cc == 0) && + if ((SCTP_SBAVAIL(&so->so_rcv) == 0) && ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || (inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL))) { if ((inp->sctp_flags & SCTP_PCB_FLAGS_CONNECTED) == 0) { @@ -6211,7 +6259,11 @@ } } if (block_allowed) { +#if defined(__FreeBSD__) && !defined(__Userspace__) + error = sbwait(so, SO_RCV); +#else error = sbwait(&so->so_rcv); +#endif if (error) { goto out; } @@ -6242,11 +6294,11 @@ SCTP_INP_READ_LOCK(inp); } control = TAILQ_FIRST(&inp->read_queue); - if ((control == NULL) && (so->so_rcv.sb_cc != 0)) { + if ((control == NULL) && (SCTP_SBAVAIL(&so->so_rcv) > 0)) { #ifdef INVARIANTS panic("Huh, its non zero and nothing on control?"); #endif - so->so_rcv.sb_cc = 0; + SCTP_SB_CLEAR(so->so_rcv); } SCTP_INP_READ_UNLOCK(inp); hold_rlock = 0; @@ -6281,7 +6333,7 @@ } else { /* remove it */ TAILQ_REMOVE(&inp->read_queue, control, next); - /* Add back any hiddend data */ + /* Add back any hidden data */ sctp_free_remote_addr(control->whoFrom); sctp_free_a_readq(stcb, control); } @@ -6358,7 +6410,7 @@ * have the strm interleave feature present. Then if we have * taken some (pdapi) or we can refer to tht tcb AND we have * not started a delivery for this stream, we can take it. - * Note we do NOT allow a notificaiton on the same assoc to + * Note we do NOT allow a notification on the same assoc to * be delivered. */ control = ctl; @@ -6372,8 +6424,8 @@ * fragment interleave is NOT on. So stuff the sb_cc * into the our held count, and its time to sleep again. */ - held_length = so->so_rcv.sb_cc; - control->held_length = so->so_rcv.sb_cc; + held_length = SCTP_SBAVAIL(&so->so_rcv); + control->held_length = SCTP_SBAVAIL(&so->so_rcv); goto restart; } /* Clear the held length since there is something to read */ @@ -6626,7 +6678,7 @@ if ((SCTP_BUF_NEXT(m)== NULL) && (control->end_added)) { out_flags |= MSG_EOR; - if ((control->do_not_ref_stcb == 0) && + if ((control->do_not_ref_stcb == 0) && (control->stcb != NULL) && ((control->spec_flags & M_NOTIFICATION) == 0)) control->stcb->asoc.strmin[control->sinfo_stream].delivery_started = 0; @@ -6653,7 +6705,7 @@ copied_so_far += cp_len; freed_so_far += (uint32_t)cp_len; freed_so_far += MSIZE; - atomic_subtract_int(&control->length, cp_len); + atomic_subtract_int(&control->length, (int)cp_len); control->data = sctp_m_free(m); m = control->data; /* been through it all, must hold sb lock ok to null tail */ @@ -6690,10 +6742,10 @@ if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SB_LOGGING_ENABLE) { sctp_sblog(&so->so_rcv, control->do_not_ref_stcb?NULL:stcb, SCTP_LOG_SBFREE, (int)cp_len); } - atomic_subtract_int(&so->so_rcv.sb_cc, cp_len); + atomic_subtract_int(&so->so_rcv.sb_cc, (int)cp_len); if ((control->do_not_ref_stcb == 0) && stcb) { - atomic_subtract_int(&stcb->asoc.sb_cc, cp_len); + atomic_subtract_int(&stcb->asoc.sb_cc, (int)cp_len); } copied_so_far += cp_len; freed_so_far += (uint32_t)cp_len; @@ -6702,7 +6754,7 @@ sctp_sblog(&so->so_rcv, control->do_not_ref_stcb?NULL:stcb, SCTP_LOG_SBRESULT, 0); } - atomic_subtract_int(&control->length, cp_len); + atomic_subtract_int(&control->length, (int)cp_len); } else { copied_so_far += cp_len; } @@ -6736,7 +6788,7 @@ #ifdef INVARIANTS panic("control->data not null at read eor?"); #else - SCTP_PRINTF("Strange, data left in the control buffer .. invarients would panic?\n"); + SCTP_PRINTF("Strange, data left in the control buffer .. invariants would panic?\n"); sctp_m_freem(control->data); control->data = NULL; #endif @@ -6747,7 +6799,7 @@ hold_rlock = 1; } TAILQ_REMOVE(&inp->read_queue, control, next); - /* Add back any hiddend data */ + /* Add back any hidden data */ if (control->held_length) { held_length = 0; control->held_length = 0; @@ -6815,10 +6867,11 @@ goto release; } /* - * We need to wait for more data a few things: - We don't - * sbunlock() so we don't get someone else reading. - We - * must be sure to account for the case where what is added - * is NOT to our control when we wakeup. + * We need to wait for more data a few things: + * - We don't release the I/O lock so we don't get someone else + * reading. + * - We must be sure to account for the case where what is added + * is NOT to our control when we wakeup. */ /* Do we need to tell the transport a rwnd update might be @@ -6859,13 +6912,17 @@ #if defined(__APPLE__) && !defined(__Userspace__) sbunlock(&so->so_rcv, 1); #endif - if (so->so_rcv.sb_cc <= control->held_length) { - error = sbwait(&so->so_rcv); - if (error) { + if (SCTP_SBAVAIL(&so->so_rcv) <= control->held_length) { #if defined(__FreeBSD__) && !defined(__Userspace__) - goto release; + error = sbwait(so, SO_RCV); #else + error = sbwait(&so->so_rcv); +#endif + if (error) { +#if defined(__APPLE__) && !defined(__Userspace__) goto release_unlocked; +#else + goto release; #endif } control->held_length = 0; @@ -6893,8 +6950,8 @@ } goto done_with_control; } - if (so->so_rcv.sb_cc > held_length) { - control->held_length = so->so_rcv.sb_cc; + if (SCTP_SBAVAIL(&so->so_rcv) > held_length) { + control->held_length = SCTP_SBAVAIL(&so->so_rcv); held_length = 0; } goto wait_some_more; @@ -6995,7 +7052,7 @@ #endif #if defined(__FreeBSD__) && !defined(__Userspace__) - sbunlock(&so->so_rcv); + SOCK_IO_RECV_UNLOCK(so); sockbuf_lock = 0; #endif @@ -7031,7 +7088,7 @@ } #if defined(__FreeBSD__) && !defined(__Userspace__) if (sockbuf_lock) { - sbunlock(&so->so_rcv); + SOCK_IO_RECV_UNLOCK(so); } #endif @@ -7052,37 +7109,37 @@ } /* Save the value back for next time */ stcb->freed_by_sorcv_sincelast = freed_so_far; - atomic_add_int(&stcb->asoc.refcnt, -1); + atomic_subtract_int(&stcb->asoc.refcnt, 1); } if (SCTP_BASE_SYSCTL(sctp_logging_level) &SCTP_RECV_RWND_LOGGING_ENABLE) { if (stcb) { sctp_misc_ints(SCTP_SORECV_DONE, - freed_so_far, + freed_so_far, #if defined(__APPLE__) && !defined(__Userspace__) #if defined(APPLE_LEOPARD) - ((uio) ? (slen - uio->uio_resid) : slen), + ((uio) ? (slen - uio->uio_resid) : slen), #else - ((uio) ? (slen - uio_resid(uio)) : slen), + ((uio) ? (slen - uio_resid(uio)) : slen), #endif #else - (uint32_t)((uio) ? (slen - uio->uio_resid) : slen), + (uint32_t)((uio) ? (slen - uio->uio_resid) : slen), #endif - stcb->asoc.my_rwnd, - so->so_rcv.sb_cc); + stcb->asoc.my_rwnd, + SCTP_SBAVAIL(&so->so_rcv)); } else { sctp_misc_ints(SCTP_SORECV_DONE, - freed_so_far, + freed_so_far, #if defined(__APPLE__) && !defined(__Userspace__) #if defined(APPLE_LEOPARD) - ((uio) ? (slen - uio->uio_resid) : slen), + ((uio) ? (slen - uio->uio_resid) : slen), #else - ((uio) ? (slen - uio_resid(uio)) : slen), + ((uio) ? (slen - uio_resid(uio)) : slen), #endif #else - (uint32_t)((uio) ? (slen - uio->uio_resid) : slen), + (uint32_t)((uio) ? (slen - uio->uio_resid) : slen), #endif - 0, - so->so_rcv.sb_cc); + 0, + SCTP_SBAVAIL(&so->so_rcv)); } } stage_left: @@ -7092,7 +7149,6 @@ return (error); } - #ifdef SCTP_MBUF_LOGGING struct mbuf * sctp_m_free(struct mbuf *m) @@ -7121,7 +7177,7 @@ struct sctp_ifa *ifa; struct sctp_laddr *wi; - ifa = sctp_find_ifa_by_addr(sa, vrf_id, 0); + ifa = sctp_find_ifa_by_addr(sa, vrf_id, SCTP_ADDR_NOT_LOCKED); if (ifa == NULL) { SCTP_LTRACE_ERR_RET(NULL, NULL, NULL, SCTP_FROM_SCTPUTIL, EADDRNOTAVAIL); return (EADDRNOTAVAIL); @@ -7160,7 +7216,6 @@ #if defined(__Userspace__) /* no sctp_soreceive for __Userspace__ now */ #endif - #if !defined(__Userspace__) int sctp_soreceive( struct socket *so, @@ -7249,7 +7304,6 @@ return (error); } - #if defined(_WIN32) && !defined(__Userspace__) /* * General routine to allocate a hash table with control of memory flags. @@ -7297,7 +7351,6 @@ return (hashtbl); } #endif - #else /* __Userspace__ ifdef above sctp_soreceive */ /* * __Userspace__ Defining sctp_hashinit_flags() and sctp_hashdestroy() for userland. @@ -7348,7 +7401,6 @@ return (hashtbl); } - void sctp_hashdestroy(void *vhashtbl, struct malloc_type *type, u_long hashmask) { @@ -7363,7 +7415,6 @@ FREE(hashtbl, type); } - void sctp_hashfreedestroy(void *vhashtbl, struct malloc_type *type, u_long hashmask) { @@ -7388,10 +7439,7 @@ FREE(hashtbl, type); } - #endif - - int sctp_connectx_helper_add(struct sctp_tcb *stcb, struct sockaddr *addr, int totaddr, int *error) @@ -7527,17 +7575,17 @@ { struct sockaddr_in6 *sin6; - sin6 = (struct sockaddr_in6 *)sa; - if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) { - /* Must be non-mapped for connectx */ - return (EINVAL); - } incr = (unsigned int)sizeof(struct sockaddr_in6); #ifdef HAVE_SA_LEN if (sa->sa_len != incr) { return (EINVAL); } #endif + sin6 = (struct sockaddr_in6 *)sa; + if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) { + /* Must be non-mapped for connectx */ + return (EINVAL); + } (*num_v6) += 1; break; } @@ -8027,7 +8075,7 @@ #endif #if defined(__FreeBSD__) && !defined(__Userspace__) -static void +static bool sctp_recv_udp_tunneled_packet(struct mbuf *m, int off, struct inpcb *inp, const struct sockaddr *sa SCTP_UNUSED, void *ctx SCTP_UNUSED) { @@ -8105,9 +8153,11 @@ goto out; break; } - return; + return (true); out: m_freem(m); + + return (true); } #ifdef INET @@ -8211,7 +8261,7 @@ ntohs(inner_ip->ip_len), (uint32_t)ntohs(icmp->icmp_nextmtu)); #if defined(__Userspace__) - if (!(stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) && + if (((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) == 0) && (stcb->sctp_socket != NULL)) { struct socket *upcall_socket; @@ -8384,7 +8434,7 @@ sctp6_notify(inp, stcb, net, type, code, ntohl(ip6cp->ip6c_icmp6->icmp6_mtu)); #if defined(__Userspace__) - if (!(stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) && + if (((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) == 0) && (stcb->sctp_socket != NULL)) { struct socket *upcall_socket; @@ -8419,7 +8469,7 @@ sctp_over_udp_stop(void) { /* - * This function assumes sysctl caller holds sctp_sysctl_info_lock() for writting! + * This function assumes sysctl caller holds sctp_sysctl_info_lock() for writing! */ #ifdef INET if (SCTP_BASE_INFO(udp4_tun_socket) != NULL) { @@ -8447,7 +8497,7 @@ struct sockaddr_in6 sin6; #endif /* - * This function assumes sysctl caller holds sctp_sysctl_info_lock() for writting! + * This function assumes sysctl caller holds sctp_sysctl_info_lock() for writing! */ port = SCTP_BASE_SYSCTL(sctp_udp_tunneling_port); if (ntohs(port) == 0) { diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctputil.h firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctputil.h --- firefox-esr-102.6.0esr/netwerk/sctp/src/netinet/sctputil.h 2022-12-05 23:01:12.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/netinet/sctputil.h 2023-01-09 15:01:10.000000000 +0000 @@ -34,7 +34,7 @@ #if defined(__FreeBSD__) && !defined(__Userspace__) #include -__FBSDID("$FreeBSD: head/sys/netinet/sctputil.h 362448 2020-06-20 20:20:16Z tuexen $"); +__FBSDID("$FreeBSD$"); #endif #ifndef _NETINET_SCTP_UTIL_H_ @@ -64,7 +64,6 @@ #define sctp_get_associd(stcb) ((sctp_assoc_t)stcb->asoc.assoc_id) - /* * Function prototypes */ @@ -84,7 +83,7 @@ uint32_t sctp_select_a_tag(struct sctp_inpcb *, uint16_t lport, uint16_t rport, int); -int sctp_init_asoc(struct sctp_inpcb *, struct sctp_tcb *, uint32_t, uint32_t, uint16_t); +int sctp_init_asoc(struct sctp_inpcb *, struct sctp_tcb *, uint32_t, uint32_t, uint32_t, uint16_t); void sctp_fill_random_store(struct sctp_pcb *); @@ -94,6 +93,14 @@ void sctp_notify_stream_reset_tsn(struct sctp_tcb *stcb, uint32_t sending_tsn, uint32_t recv_tsn, int flag); +/* + * NOTE: sctp_timer_start() will increment the reference count of any relevant + * structure the timer is referencing, in order to prevent a race condition + * between the timer executing and the structure being freed. + * + * When the timer fires or sctp_timer_stop() is called, these references are + * removed. + */ void sctp_timer_start(int, struct sctp_inpcb *, struct sctp_tcb *, struct sctp_nets *); @@ -106,9 +113,6 @@ sctp_dynamic_set_primary(struct sockaddr *sa, uint32_t vrf_id); void -sctp_mtu_size_reset(struct sctp_inpcb *, struct sctp_association *, uint32_t); - -void sctp_wakeup_the_read_socket(struct sctp_inpcb *inp, struct sctp_tcb *stcb, int so_locked #if !(defined(__APPLE__) && !defined(__Userspace__)) @@ -165,18 +169,17 @@ struct sctp_inpcb *new_inp, struct sctp_tcb *stcb, int waitflags); - void sctp_stop_timers_for_shutdown(struct sctp_tcb *); /* Stop all timers for association and remote addresses. */ void sctp_stop_association_timers(struct sctp_tcb *, bool); -void sctp_report_all_outbound(struct sctp_tcb *, uint16_t, int, int); +void sctp_report_all_outbound(struct sctp_tcb *, uint16_t, int); int sctp_expand_mapping_array(struct sctp_association *, uint32_t); -void sctp_abort_notification(struct sctp_tcb *, uint8_t, uint16_t, - struct sctp_abort_chunk *, int); +void sctp_abort_notification(struct sctp_tcb *, bool, bool, uint16_t, + struct sctp_abort_chunk *, int); /* We abort responding to an IP packet for some reason */ void @@ -188,11 +191,10 @@ #endif uint32_t, uint16_t); - /* We choose to abort via user input */ void sctp_abort_an_association(struct sctp_inpcb *, struct sctp_tcb *, - struct mbuf *, int); + struct mbuf *, bool, int); void sctp_handle_ootb(struct mbuf *, int, int, struct sockaddr *, struct sockaddr *, @@ -272,34 +274,10 @@ int sctp_local_addr_count(struct sctp_tcb *stcb); -#ifdef SCTP_MBCNT_LOGGING void sctp_free_bufspace(struct sctp_tcb *, struct sctp_association *, struct sctp_tmit_chunk *, int); -#else -#define sctp_free_bufspace(stcb, asoc, tp1, chk_cnt) \ -do { \ - if (tp1->data != NULL) { \ - atomic_subtract_int(&((asoc)->chunks_on_out_queue), chk_cnt); \ - if ((asoc)->total_output_queue_size >= tp1->book_size) { \ - atomic_subtract_int(&((asoc)->total_output_queue_size), tp1->book_size); \ - } else { \ - (asoc)->total_output_queue_size = 0; \ - } \ - if (stcb->sctp_socket && ((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || \ - (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL))) { \ - if (stcb->sctp_socket->so_snd.sb_cc >= tp1->book_size) { \ - atomic_subtract_int(&((stcb)->sctp_socket->so_snd.sb_cc), tp1->book_size); \ - } else { \ - stcb->sctp_socket->so_snd.sb_cc = 0; \ - } \ - } \ - } \ -} while (0) - -#endif - #define sctp_free_spbufspace(stcb, asoc, sp) \ do { \ if (sp->data != NULL) { \ @@ -356,7 +334,6 @@ void sctp_log_nagle_event(struct sctp_tcb *stcb, int action); - #ifdef SCTP_MBUF_LOGGING void sctp_log_mb(struct mbuf *m, int from); @@ -390,7 +367,6 @@ void sctp_print_mapping_array(struct sctp_association *asoc); void sctp_clr_stat_log(void); - #ifdef SCTP_AUDITING_ENABLED void sctp_auditing(int, struct sctp_inpcb *, struct sctp_tcb *, diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/netinet6/sctp6_usrreq.c firefox-esr-102.7.0esr/netwerk/sctp/src/netinet6/sctp6_usrreq.c --- firefox-esr-102.6.0esr/netwerk/sctp/src/netinet6/sctp6_usrreq.c 2022-12-05 23:01:07.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/netinet6/sctp6_usrreq.c 2023-01-09 15:01:10.000000000 +0000 @@ -34,7 +34,7 @@ #if defined(__FreeBSD__) && !defined(__Userspace__) #include -__FBSDID("$FreeBSD: head/sys/netinet6/sctp6_usrreq.c 361895 2020-06-07 14:39:20Z tuexen $"); +__FBSDID("$FreeBSD$"); #endif #include @@ -105,7 +105,7 @@ in6_sin_2_v4mapsin6(const struct sockaddr_in *sin, struct sockaddr_in6 *sin6) { memset(sin6, 0, sizeof(struct sockaddr_in6)); - sin6->sin6_family = AF_INET6; + sin6->sin6_family = AF_INET6; #ifdef HAVE_SIN6_LEN sin6->sin6_len = sizeof(struct sockaddr_in6); #endif @@ -116,9 +116,9 @@ ((uint32_t *)&sin6->sin6_addr)[2] = htonl(0xffff); ((uint32_t *)&sin6->sin6_addr)[3] = sin->sin_addr.s_addr; #else - sin6->sin6_addr.s6_addr32[0] = 0; + sin6->sin6_addr.s6_addr32[0] = 0; sin6->sin6_addr.s6_addr32[1] = 0; - sin6->sin6_addr.s6_addr32[2] = htonl(0xffff); + sin6->sin6_addr.s6_addr32[2] = htonl(0xffff); sin6->sin6_addr.s6_addr32[3] = sin->sin_addr.s_addr; #endif } @@ -259,13 +259,14 @@ if (IN6_IS_ADDR_MULTICAST(&ip6->ip6_dst)) { goto out; } - ecn_bits = ((ntohl(ip6->ip6_flow) >> 20) & 0x000000ff); #if defined(__FreeBSD__) + ecn_bits = IPV6_TRAFFIC_CLASS(ip6); if (m->m_pkthdr.csum_flags & CSUM_SCTP_VALID) { SCTP_STAT_INCR(sctps_recvhwcrc); compute_crc = 0; } else { #else + ecn_bits = ((ntohl(ip6->ip6_flow) >> 20) & 0x000000ff); if (SCTP_BASE_SYSCTL(sctp_no_csum_on_loopback) && (IN6_ARE_ADDR_EQUAL(&src.sin6_addr, &dst.sin6_addr))) { SCTP_STAT_INCR(sctps_recvhwcrc); @@ -299,7 +300,6 @@ return (sctp6_input_with_port(i_pak, offp, 0)); } #endif - #if defined(__FreeBSD__) int sctp6_input(struct mbuf **i_pak, int *offp, int proto SCTP_UNUSED) @@ -341,7 +341,7 @@ case ICMP6_PARAM_PROB: /* Treat it like an ABORT. */ if (icmp6_code == ICMP6_PARAMPROB_NEXTHEADER) { - sctp_abort_notification(stcb, 1, 0, NULL, SCTP_SO_NOT_LOCKED); + sctp_abort_notification(stcb, true, false, 0, NULL, SCTP_SO_NOT_LOCKED); #if defined(__APPLE__) so = SCTP_INP_SO(inp); atomic_add_int(&stcb->asoc.refcnt, 1); @@ -387,7 +387,7 @@ } /* Update the association MTU */ if (stcb->asoc.smallest_mtu > next_mtu) { - sctp_pathmtu_adjustment(stcb, next_mtu); + sctp_pathmtu_adjustment(stcb, next_mtu, true); } /* Finally, start the PMTU timer if it was running before. */ if (timer_stopped) { @@ -549,8 +549,8 @@ ip6cp->ip6c_icmp6->icmp6_code, ntohl(ip6cp->ip6c_icmp6->icmp6_mtu)); #if defined(__Userspace__) - if (!(stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) && - (stcb->sctp_socket != NULL) { + if (((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) == 0) && + (stcb->sctp_socket != NULL)) { struct socket *upcall_socket; upcall_socket = stcb->sctp_socket; @@ -655,10 +655,10 @@ return (error); } -SYSCTL_PROC(_net_inet6_sctp6, OID_AUTO, getcred, CTLTYPE_OPAQUE | CTLFLAG_RW, - 0, 0, - sctp6_getcred, "S,ucred", "Get the ucred of a SCTP6 connection"); - +SYSCTL_PROC(_net_inet6_sctp6, OID_AUTO, getcred, + CTLTYPE_OPAQUE | CTLFLAG_RW | CTLFLAG_NEEDGIANT, + 0, 0, sctp6_getcred, "S,ucred", + "Get the ucred of a SCTP6 connection"); #endif /* This is the same as the sctp_abort() could be made common */ @@ -911,7 +911,6 @@ return (error); } - #if defined(__FreeBSD__) || defined(_WIN32) || defined(__Userspace__) #if !defined(__Userspace__) static void @@ -949,16 +948,13 @@ return (sctp_disconnect(so)); } - int #if defined(__FreeBSD__) && !defined(__Userspace__) sctp_sendm(struct socket *so, int flags, struct mbuf *m, struct sockaddr *addr, struct mbuf *control, struct thread *p); - #else sctp_sendm(struct socket *so, int flags, struct mbuf *m, struct sockaddr *addr, struct mbuf *control, struct proc *p); - #endif #if !defined(_WIN32) && !defined(__Userspace__) @@ -1013,6 +1009,46 @@ SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP6_USRREQ, EDESTADDRREQ); return (EDESTADDRREQ); } + switch (addr->sa_family) { +#ifdef INET + case AF_INET: +#if defined(HAVE_SA_LEN) + if (addr->sa_len != sizeof(struct sockaddr_in)) { + if (control) { + SCTP_RELEASE_PKT(control); + control = NULL; + } + SCTP_RELEASE_PKT(m); + SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP6_USRREQ, EINVAL); + return (EINVAL); + } +#endif + break; +#endif +#ifdef INET6 + case AF_INET6: +#if defined(HAVE_SA_LEN) + if (addr->sa_len != sizeof(struct sockaddr_in6)) { + if (control) { + SCTP_RELEASE_PKT(control); + control = NULL; + } + SCTP_RELEASE_PKT(m); + SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP6_USRREQ, EINVAL); + return (EINVAL); + } +#endif + break; +#endif + default: + if (control) { + SCTP_RELEASE_PKT(control); + control = NULL; + } + SCTP_RELEASE_PKT(m); + SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP6_USRREQ, EINVAL); + return (EINVAL); + } #ifdef INET sin6 = (struct sockaddr_in6 *)addr; if (SCTP_IPV6_V6ONLY(inp)) { @@ -1021,15 +1057,26 @@ * v4 addr or v4-mapped addr */ if (addr->sa_family == AF_INET) { + if (control) { + SCTP_RELEASE_PKT(control); + control = NULL; + } + SCTP_RELEASE_PKT(m); SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP6_USRREQ, EINVAL); return (EINVAL); } if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) { + if (control) { + SCTP_RELEASE_PKT(control); + control = NULL; + } + SCTP_RELEASE_PKT(m); SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP6_USRREQ, EINVAL); return (EINVAL); } } - if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) { + if ((addr->sa_family == AF_INET6) && + IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) { struct sockaddr_in sin; /* convert v4-mapped into v4 addr and send */ @@ -1207,7 +1254,8 @@ return (EINVAL); } } - if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) { + if ((addr->sa_family == AF_INET6) && + IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) { /* convert v4-mapped into v4 addr */ in6_sin6_2_sin(&store.sin, sin6); addr = &store.sa; @@ -1241,20 +1289,15 @@ return (EALREADY); } /* We are GOOD to go */ - stcb = sctp_aloc_assoc(inp, addr, &error, 0, vrf_id, - inp->sctp_ep.pre_open_stream_count, - inp->sctp_ep.port, p, - SCTP_INITIALIZE_AUTH_PARAMS); + stcb = sctp_aloc_assoc_connected(inp, addr, &error, 0, 0, vrf_id, + inp->sctp_ep.pre_open_stream_count, + inp->sctp_ep.port, p, + SCTP_INITIALIZE_AUTH_PARAMS); SCTP_ASOC_CREATE_UNLOCK(inp); if (stcb == NULL) { /* Gak! no memory */ return (error); } - if (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) { - stcb->sctp_ep->sctp_flags |= SCTP_PCB_FLAGS_CONNECTED; - /* Set the connected flag so we can queue data */ - soisconnecting(so); - } SCTP_SET_STATE(stcb, SCTP_STATE_COOKIE_WAIT); (void)SCTP_GETTIME_TIMEVAL(&stcb->asoc.time_entered); #if defined(__FreeBSD__) && !defined(__Userspace__) @@ -1560,7 +1603,6 @@ return (error); } - #if !defined(__Userspace__) static int sctp6_getpeeraddr(struct socket *so, struct sockaddr **nam) @@ -1710,7 +1752,7 @@ switch (family) { case PF_INET: error = in_control(so, (long)m, (caddr_t)nam, - (struct ifnet *)control ); + (struct ifnet *)control); break; #ifdef INET6 case PF_INET6: diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/netinet6/sctp6_var.h firefox-esr-102.7.0esr/netwerk/sctp/src/netinet6/sctp6_var.h --- firefox-esr-102.6.0esr/netwerk/sctp/src/netinet6/sctp6_var.h 2022-12-05 23:00:55.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/netinet6/sctp6_var.h 2023-01-09 15:01:10.000000000 +0000 @@ -34,7 +34,7 @@ #if defined(__FreeBSD__) && !defined(__Userspace__) #include -__FBSDID("$FreeBSD: head/sys/netinet6/sctp6_var.h 317457 2017-04-26 19:26:40Z tuexen $"); +__FBSDID("$FreeBSD$"); #endif #ifndef _NETINET6_SCTP6_VAR_H_ @@ -70,7 +70,7 @@ #else void sctp6_ctlinput(int, struct sockaddr *, void *); #endif -#if !((defined(__FreeBSD__) || defined(__APPLE__)) && !defined(__Userspace__)) +#if !((defined(__FreeBSD__) || defined(__APPLE__)) && !defined(__Userspace__)) extern void in6_sin_2_v4mapsin6(struct sockaddr_in *, struct sockaddr_in6 *); extern void in6_sin6_2_sin(struct sockaddr_in *, struct sockaddr_in6 *); extern void in6_sin6_2_sin_in_sock(struct sockaddr *); diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/user_environment.c firefox-esr-102.7.0esr/netwerk/sctp/src/user_environment.c --- firefox-esr-102.6.0esr/netwerk/sctp/src/user_environment.c 2022-12-05 23:01:12.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/user_environment.c 2023-01-09 15:01:10.000000000 +0000 @@ -30,18 +30,23 @@ /* __Userspace__ */ -#include -#if !defined(_WIN32) +#if defined(_WIN32) +#if !defined(_CRT_RAND_S) && !defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) +#define _CRT_RAND_S +#endif +#else #include #include #endif +#ifdef INVARIANTS +#include +#endif #include #include /* #include defines MIN */ #if !defined(MIN) #define MIN(arg1,arg2) ((arg1) < (arg2) ? (arg1) : (arg2)) #endif -#include #define uHZ 1000 @@ -64,69 +69,316 @@ * provide _some_ kind of randomness. This should only be used * inside other RNG's, like arc4random(9). */ -#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION +#if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) +#include + +void +init_random(void) +{ + return; +} + +void +read_random(void *buf, size_t size) +{ + memset(buf, 'A', size); + return; +} + +void +finish_random(void) +{ + return; +} +/* This define can be used to optionally use OpenSSL's random number utility, + * which is capable of bypassing the chromium sandbox which normally would + * prevent opening files, including /dev/urandom. + */ +#elif defined(SCTP_USE_OPENSSL_RAND) +#include + +/* Requiring BoringSSL because it guarantees that RAND_bytes will succeed. */ +#ifndef OPENSSL_IS_BORINGSSL +#error Only BoringSSL is supported with SCTP_USE_OPENSSL_RAND. +#endif + +void +init_random(void) +{ + return; +} + +void +read_random(void *buf, size_t size) +{ + RAND_bytes((uint8_t *)buf, size); + return; +} + +void +finish_random(void) +{ + return; +} +#elif defined(__FreeBSD__) || defined(__DragonFly__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__APPLE__) || defined(__Bitrig__) +#include + void init_random(void) { return; } -int -read_random(void *buf, int count) +void +read_random(void *buf, size_t size) { - memset(buf, 'A', count); - return (count); + arc4random_buf(buf, size); + return; } -#elif defined(__FreeBSD__) || defined(__DragonFly__) || defined(__OpenBSD__) || defined(__OpenBSD__) || defined(__APPLE__) + +void +finish_random(void) +{ + return; +} +#elif defined(_WIN32) +#include + void init_random(void) { return; } -int -read_random(void *buf, int count) +void +read_random(void *buf, size_t size) { - if (count >= 0) { - arc4random_buf(buf, count); + unsigned int randval; + size_t position, remaining; + + position = 0; + while (position < size) { + if (rand_s(&randval) == 0) { + remaining = MIN(size - position, sizeof(unsigned int)); + memcpy((char *)buf + position, &randval, remaining); + position += sizeof(unsigned int); + } } - return (count); + return; } -#else + +void +finish_random(void) +{ + return; +} +#elif (defined(__ANDROID__) && (__ANDROID_API__ < 28)) || defined(__QNX__) || defined(__EMSCRIPTEN__) +#include + +static int fd = -1; + void init_random(void) { - struct timeval now; - unsigned int seed; + fd = open("/dev/urandom", O_RDONLY); + return; +} - (void)SCTP_GETTIME_TIMEVAL(&now); - seed = 0; - seed |= (unsigned int)now.tv_sec; - seed |= (unsigned int)now.tv_usec; -#if !defined(_WIN32) &&! defined(__native_client__) - seed |= getpid(); +void +read_random(void *buf, size_t size) +{ + size_t position; + ssize_t n; + + position = 0; + while (position < size) { + n = read(fd, (char *)buf + position, size - position); + if (n > 0) { + position += n; + } + } + return; +} + +void +finish_random(void) +{ + close(fd); + return; +} +#elif defined(__ANDROID__) && (__ANDROID_API__ >= 28) +#include + +void +init_random(void) +{ + return; +} + +void +read_random(void *buf, size_t size) +{ + size_t position; + ssize_t n; + + position = 0; + while (position < size) { + n = getrandom((char *)buf + position, size - position, 0); + if (n > 0) { + position += n; + } + } + return; +} + +void +finish_random(void) +{ + return; +} +#elif defined(__linux__) +#include +#include +#include + +#if defined(__has_feature) +#if __has_feature(memory_sanitizer) +void __msan_unpoison(void *, size_t); #endif -#if defined(_WIN32) || defined(__native_client__) - srand(seed); -#else - srandom(seed); +#endif + +#ifdef __NR_getrandom +#if !defined(GRND_NONBLOCK) +#define GRND_NONBLOCK 1 +#endif +static int getrandom_available = 0; +#endif +static int fd = -1; + +void +init_random(void) +{ +#ifdef __NR_getrandom + char dummy; + ssize_t n = syscall(__NR_getrandom, &dummy, sizeof(dummy), GRND_NONBLOCK); + if (n > 0 || errno == EINTR || errno == EAGAIN) { + /* Either getrandom succeeded, was interrupted or is waiting for entropy; + * all of which mean the syscall is available. + */ + getrandom_available = 1; + } else { +#ifdef INVARIANTS + if (errno != ENOSYS) { + panic("getrandom syscall returned unexpected error: %d", errno); + } +#endif + /* If the syscall isn't available, fall back to /dev/urandom. */ +#endif + fd = open("/dev/urandom", O_RDONLY); +#ifdef __NR_getrandom + } #endif return; } -int -read_random(void *buf, int count) +void +read_random(void *buf, size_t size) { - uint32_t randval; - int size, i; + size_t position; + ssize_t n; - /* Fill buf[] with random(9) output */ - for (i = 0; i < count; i+= (int)sizeof(uint32_t)) { - randval = random(); - size = MIN(count - i, (int)sizeof(uint32_t)); - memcpy(&((char *)buf)[i], &randval, (size_t)size); + position = 0; + while (position < size) { +#ifdef __NR_getrandom + if (getrandom_available) { + /* Using syscall directly because getrandom isn't present in glibc < 2.25. + */ + n = syscall(__NR_getrandom, (char *)buf + position, size - position, 0); + if (n > 0) { +#if defined(__has_feature) +#if __has_feature(memory_sanitizer) + /* Need to do this because MSan doesn't realize that syscall has + * initialized the output buffer. + */ + __msan_unpoison(buf + position, n); +#endif +#endif + position += n; + } else if (errno != EINTR && errno != EAGAIN) { +#ifdef INVARIANTS + panic("getrandom syscall returned unexpected error: %d", errno); +#endif + } + } else +#endif /* __NR_getrandom */ + { + n = read(fd, (char *)buf + position, size - position); + if (n > 0) { + position += n; + } + } } + return; +} - return (count); +void +finish_random(void) +{ + if (fd != -1) { + close(fd); + } + return; +} +#elif defined(__Fuchsia__) +#include + +void +init_random(void) +{ + return; } + +void +read_random(void *buf, size_t size) +{ + zx_cprng_draw(buf, size); + return; +} + +void +finish_random(void) +{ + return; +} +#elif defined(__native_client__) +#include + +void +init_random(void) +{ + return; +} + +void +read_random(void *buf, size_t size) +{ + size_t position; + size_t n; + + position = 0; + while (position < size) { + if (nacl_secure_random((char *)buf + position, size - position, &n) == 0) + position += n; + } + } + return; +} + +void +finish_random(void) +{ + return; +} +#else +#error "Unknown platform. Please provide platform specific RNG." #endif diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/user_environment.h firefox-esr-102.7.0esr/netwerk/sctp/src/user_environment.h --- firefox-esr-102.6.0esr/netwerk/sctp/src/user_environment.h 2022-12-05 23:01:11.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/user_environment.h 2023-01-09 15:01:10.000000000 +0000 @@ -68,7 +68,8 @@ #endif void init_random(void); -int read_random(void *, int); +void read_random(void *, size_t); +void finish_random(void); /* errno's may differ per OS. errno.h now included in sctp_os_userspace.h */ /* Source: /usr/src/sys/sys/errno.h */ @@ -90,7 +91,11 @@ #if defined(INVARIANTS) #include -static inline void +#if defined(_WIN32) +static inline void __declspec(noreturn) +#else +static inline void __attribute__((__noreturn__)) +#endif terminate_non_graceful(void) { abort(); } diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/user_inpcb.h firefox-esr-102.7.0esr/netwerk/sctp/src/user_inpcb.h --- firefox-esr-102.6.0esr/netwerk/sctp/src/user_inpcb.h 2022-12-05 23:01:11.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/user_inpcb.h 2023-01-09 15:01:10.000000000 +0000 @@ -10,7 +10,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 4. Neither the name of the University nor the names of its contributors + * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/user_ip6_var.h firefox-esr-102.7.0esr/netwerk/sctp/src/user_ip6_var.h --- firefox-esr-102.6.0esr/netwerk/sctp/src/user_ip6_var.h 2022-12-05 23:01:11.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/user_ip6_var.h 2023-01-09 15:01:10.000000000 +0000 @@ -39,7 +39,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 4. Neither the name of the University nor the names of its contributors + * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * @@ -87,13 +87,11 @@ #if defined(_WIN32) #define s6_addr16 u.Word #endif -#if !defined(_WIN32) -#if !defined(__linux__) +#if !defined(_WIN32) && !defined(__linux__) && !defined(__EMSCRIPTEN__) #define s6_addr8 __u6_addr.__u6_addr8 #define s6_addr16 __u6_addr.__u6_addr16 #define s6_addr32 __u6_addr.__u6_addr32 #endif -#endif #if !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__DragonFly__) struct route_in6 { diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/user_ip_icmp.h firefox-esr-102.7.0esr/netwerk/sctp/src/user_ip_icmp.h --- firefox-esr-102.6.0esr/netwerk/sctp/src/user_ip_icmp.h 2022-12-05 23:00:38.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/user_ip_icmp.h 2023-01-09 15:01:10.000000000 +0000 @@ -10,7 +10,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 4. Neither the name of the University nor the names of its contributors + * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/user_malloc.h firefox-esr-102.7.0esr/netwerk/sctp/src/user_malloc.h --- firefox-esr-102.6.0esr/netwerk/sctp/src/user_malloc.h 2022-12-05 23:00:38.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/user_malloc.h 2023-01-09 15:01:10.000000000 +0000 @@ -12,7 +12,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 4. Neither the name of the University nor the names of its contributors + * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/user_mbuf.c firefox-esr-102.7.0esr/netwerk/sctp/src/user_mbuf.c --- firefox-esr-102.6.0esr/netwerk/sctp/src/user_mbuf.c 2022-12-05 23:00:39.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/user_mbuf.c 2023-01-09 15:01:10.000000000 +0000 @@ -80,8 +80,6 @@ static int mbuf_constructor_dup(struct mbuf *m, int pkthdr, short type) { int flags = pkthdr; - if (type == MT_NOINIT) - return (0); m->m_next = NULL; m->m_nextpkt = NULL; @@ -506,7 +504,7 @@ #else zone_mbuf = umem_cache_create(MBUF_MEM_NAME, MSIZE, 0, mb_ctor_mbuf, mb_dtor_mbuf, NULL, - NUULL, + NULL, NULL, 0); #endif /*zone_ext_refcnt = umem_cache_create(MBUF_EXTREFCNT_MEM_NAME, sizeof(u_int), 0, @@ -577,13 +575,6 @@ flags = args->flags; type = args->type; - /* - * The mbuf is initialized later. - * - */ - if (type == MT_NOINIT) - return (0); - m->m_next = NULL; m->m_nextpkt = NULL; m->m_len = 0; @@ -1310,6 +1301,38 @@ m->m_pkthdr.len = totlen; } +/* + * Apply function f to the data in an mbuf chain starting "off" bytes from + * the beginning, continuing for "len" bytes. + */ +int +m_apply(struct mbuf *m, int off, int len, + int (*f)(void *, void *, u_int), void *arg) +{ + u_int count; + int rval; + + KASSERT(off >= 0, ("m_apply, negative off %d", off)); + KASSERT(len >= 0, ("m_apply, negative len %d", len)); + while (off > 0) { + KASSERT(m != NULL, ("m_apply, offset > size of mbuf chain")); + if (off < m->m_len) + break; + off -= m->m_len; + m = m->m_next; + } + while (len > 0) { + KASSERT(m != NULL, ("m_apply, offset > size of mbuf chain")); + count = min(m->m_len - off, len); + rval = (*f)(arg, mtod(m, caddr_t) + off, count); + if (rval) + return (rval); + len -= count; + off = 0; + m = m->m_next; + } + return (0); +} /* * Lesser-used path for M_PREPEND: diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/user_mbuf.h firefox-esr-102.7.0esr/netwerk/sctp/src/user_mbuf.h --- firefox-esr-102.6.0esr/netwerk/sctp/src/user_mbuf.h 2022-12-05 23:00:50.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/user_mbuf.h 2023-01-09 15:01:10.000000000 +0000 @@ -113,6 +113,7 @@ struct m_tag *m_tag_alloc(uint32_t, int, int, int); struct mbuf *m_copym(struct mbuf *, int, int, int); void m_copyback(struct mbuf *, int, int, caddr_t); +int m_apply(struct mbuf *, int, int, int (*)(void *, void *, u_int), void *arg); struct mbuf *m_pullup(struct mbuf *, int); struct mbuf *m_pulldown(struct mbuf *, int off, int len, int *offp); int m_dup_pkthdr(struct mbuf *, struct mbuf *, int); @@ -125,9 +126,6 @@ #define MBUF_CLUSTER_MEM_NAME "mbuf_cluster" #define MBUF_EXTREFCNT_MEM_NAME "mbuf_ext_refcnt" -#define MT_NOINIT 255 /* Not a type but a flag to allocate - a non-initialized mbuf */ - /* * Mbufs are of a single size, MSIZE (sys/param.h), which includes overhead. * An mbuf may add a single "mbuf cluster" of size MCLBYTES (also in @@ -293,9 +291,6 @@ #define MT_OOBDATA 15 /* expedited data */ #define MT_NTYPES 16 /* number of mbuf types for mbtypes[] */ -#define MT_NOINIT 255 /* Not a type but a flag to allocate - a non-initialized mbuf */ - /* * __Userspace__ flags like M_NOWAIT are defined in malloc.h * Flags like these are used in functions like uma_zalloc() @@ -332,6 +327,10 @@ (!(((m)->m_flags & M_EXT)) || \ (*((m)->m_ext.ref_cnt) == 1)) ) \ +/* Check if the supplied mbuf has a packet header, or else panic. */ +#define M_ASSERTPKTHDR(m) \ + KASSERT((m) != NULL && (m)->m_flags & M_PKTHDR, \ + ("%s: no mbuf packet header!", __func__)) /* * Compute the amount of space available before the current start of data in diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/user_queue.h firefox-esr-102.7.0esr/netwerk/sctp/src/user_queue.h --- firefox-esr-102.6.0esr/netwerk/sctp/src/user_queue.h 2022-12-05 23:01:06.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/user_queue.h 2023-01-09 15:01:10.000000000 +0000 @@ -10,7 +10,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 4. Neither the name of the University nor the names of its contributors + * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/user_recv_thread.c firefox-esr-102.7.0esr/netwerk/sctp/src/user_recv_thread.c --- firefox-esr-102.6.0esr/netwerk/sctp/src/user_recv_thread.c 2022-12-05 23:01:12.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/user_recv_thread.c 2023-01-09 15:01:10.000000000 +0000 @@ -56,11 +56,17 @@ #endif #endif #endif -#if defined(__APPLE__) || defined(__DragonFly__) || defined(__FreeBSD__) -#include +#if defined(HAVE_NET_ROUTE_H) +# include +#elif defined(__APPLE__) +/* Apple SDKs for iOS, tvOS, watchOS, etc. don't ship this header */ +# define RTM_NEWADDR 0xc +# define RTM_DELADDR 0xd +# define RTAX_IFA 5 +# define RTAX_MAX 8 #endif /* local macros and datatypes used to get IP addresses system independently */ -#if !defined(IP_PKTINFO ) && !defined(IP_RECVDSTADDR) +#if !defined(IP_PKTINFO) && !defined(IP_RECVDSTADDR) # error "Can't determine socket option to use to get UDP IP" #endif @@ -274,6 +280,7 @@ struct sctp_chunkhdr *ch; struct sockaddr_in src, dst; #if !defined(_WIN32) + ssize_t res; unsigned int ncounter; struct msghdr msg; struct iovec recv_iovec[MAXLEN_MBUF_CHAIN]; @@ -340,14 +347,16 @@ msg.msg_iovlen = MAXLEN_MBUF_CHAIN; msg.msg_control = NULL; msg.msg_controllen = 0; - ncounter = n = recvmsg(SCTP_BASE_VAR(userspace_rawsctp), &msg, 0); - if (n < 0) { + res = recvmsg(SCTP_BASE_VAR(userspace_rawsctp), &msg, 0); + if (res < 0) { if (errno == EAGAIN || errno == EINTR) { continue; } else { break; } } + ncounter = (unsigned int)res; + n = (int)res; #endif SCTP_HEADER_LEN(recvmbuf[0]) = n; /* length of total packet */ SCTP_STAT_INCR(sctps_recvpackets); @@ -371,13 +380,20 @@ } while (ncounter > 0); } + offset = sizeof(struct ip) + sizeof(struct sctphdr) + sizeof(struct sctp_chunkhdr); + if (SCTP_BUF_LEN(recvmbuf[0]) < offset) { + if ((recvmbuf[0] = m_pullup(recvmbuf[0], offset)) == NULL) { + SCTP_STAT_INCR(sctps_hdrops); + continue; + } + } iphdr = mtod(recvmbuf[0], struct ip *); sh = (struct sctphdr *)((caddr_t)iphdr + sizeof(struct ip)); ch = (struct sctp_chunkhdr *)((caddr_t)sh + sizeof(struct sctphdr)); - offset = sizeof(struct ip) + sizeof(struct sctphdr); + offset -= sizeof(struct sctp_chunkhdr); if (iphdr->ip_tos != 0) { - ecn = iphdr->ip_tos & 0x02; + ecn = iphdr->ip_tos & 0x03; } dst.sin_family = AF_INET; @@ -444,7 +460,8 @@ { struct mbuf **recvmbuf6; #if !defined(_WIN32) - unsigned int ncounter = 0; + ssize_t res; + unsigned int ncounter; struct iovec recv_iovec[MAXLEN_MBUF_CHAIN]; struct msghdr msg; struct cmsghdr *cmsgptr; @@ -531,15 +548,16 @@ msg.msg_control = (void *)cmsgbuf; msg.msg_controllen = (socklen_t)CMSG_SPACE(sizeof (struct in6_pktinfo)); msg.msg_flags = 0; - - ncounter = n = recvmsg(SCTP_BASE_VAR(userspace_rawsctp6), &msg, 0); - if (n < 0) { + res = recvmsg(SCTP_BASE_VAR(userspace_rawsctp6), &msg, 0); + if (res < 0) { if (errno == EAGAIN || errno == EINTR) { continue; } else { break; } } + ncounter = (unsigned int)res; + n = (int)res; #endif SCTP_HEADER_LEN(recvmbuf6[0]) = n; /* length of total packet */ SCTP_STAT_INCR(sctps_recvpackets); @@ -579,9 +597,16 @@ continue; } + offset = sizeof(struct sctphdr) + sizeof(struct sctp_chunkhdr); + if (SCTP_BUF_LEN(recvmbuf6[0]) < offset) { + if ((recvmbuf6[0] = m_pullup(recvmbuf6[0], offset)) == NULL) { + SCTP_STAT_INCR(sctps_hdrops); + continue; + } + } sh = mtod(recvmbuf6[0], struct sctphdr *); ch = (struct sctp_chunkhdr *)((caddr_t)sh + sizeof(struct sctphdr)); - offset = sizeof(struct sctphdr); + offset -= sizeof(struct sctp_chunkhdr); dst.sin6_family = AF_INET6; #ifdef HAVE_SIN6_LEN @@ -648,6 +673,7 @@ #endif int compute_crc = 1; #if !defined(_WIN32) + ssize_t res; unsigned int ncounter; struct iovec iov[MAXLEN_MBUF_CHAIN]; struct msghdr msg; @@ -701,14 +727,16 @@ msg.msg_controllen = sizeof(cmsgbuf); msg.msg_flags = 0; - ncounter = n = recvmsg(SCTP_BASE_VAR(userspace_udpsctp), &msg, 0); - if (n < 0) { + res = recvmsg(SCTP_BASE_VAR(userspace_udpsctp), &msg, 0); + if (res < 0) { if (errno == EAGAIN || errno == EINTR) { continue; } else { break; } } + ncounter = (unsigned int)res; + n = (int)res; #else nResult = WSAIoctl(SCTP_BASE_VAR(userspace_udpsctp), SIO_GET_EXTENSION_FUNCTION_POINTER, &WSARecvMsg_GUID, sizeof WSARecvMsg_GUID, @@ -793,10 +821,17 @@ continue; } - /*offset = sizeof(struct sctphdr) + sizeof(struct sctp_chunkhdr);*/ + offset = sizeof(struct sctphdr) + sizeof(struct sctp_chunkhdr); + if (SCTP_BUF_LEN(udprecvmbuf[0]) < offset) { + if ((udprecvmbuf[0] = m_pullup(udprecvmbuf[0], offset)) == NULL) { + SCTP_STAT_INCR(sctps_hdrops); + continue; + } + } sh = mtod(udprecvmbuf[0], struct sctphdr *); ch = (struct sctp_chunkhdr *)((caddr_t)sh + sizeof(struct sctphdr)); - offset = sizeof(struct sctphdr); + offset -= sizeof(struct sctp_chunkhdr); + port = src.sin_port; src.sin_port = sh->src_port; dst.sin_port = sh->dest_port; @@ -853,6 +888,7 @@ struct iovec iov[MAXLEN_MBUF_CHAIN]; struct msghdr msg; struct cmsghdr *cmsgptr; + ssize_t res; unsigned int ncounter; #else GUID WSARecvMsg_GUID = WSAID_WSARECVMSG; @@ -903,14 +939,16 @@ msg.msg_controllen = (socklen_t)CMSG_SPACE(sizeof (struct in6_pktinfo)); msg.msg_flags = 0; - ncounter = n = recvmsg(SCTP_BASE_VAR(userspace_udpsctp6), &msg, 0); - if (n < 0) { + res = recvmsg(SCTP_BASE_VAR(userspace_udpsctp6), &msg, 0); + if (res < 0) { if (errno == EAGAIN || errno == EINTR) { continue; } else { break; } } + ncounter = (unsigned int)res; + n = (int)res; #else nResult = WSAIoctl(SCTP_BASE_VAR(userspace_udpsctp6), SIO_GET_EXTENSION_FUNCTION_POINTER, &WSARecvMsg_GUID, sizeof WSARecvMsg_GUID, @@ -981,9 +1019,16 @@ continue; } + offset = sizeof(struct sctphdr) + sizeof(struct sctp_chunkhdr); + if (SCTP_BUF_LEN(udprecvmbuf6[0]) < offset) { + if ((udprecvmbuf6[0] = m_pullup(udprecvmbuf6[0], offset)) == NULL) { + SCTP_STAT_INCR(sctps_hdrops); + continue; + } + } sh = mtod(udprecvmbuf6[0], struct sctphdr *); ch = (struct sctp_chunkhdr *)((caddr_t)sh + sizeof(struct sctphdr)); - offset = sizeof(struct sctphdr); + offset -= sizeof(struct sctp_chunkhdr); port = src.sin6_port; src.sin6_port = sh->src_port; @@ -1172,7 +1217,7 @@ } } } - if (SCTP_BASE_VAR(userspace_udpsctp) == -1) { + if ((SCTP_BASE_VAR(userspace_udpsctp) == -1) && (SCTP_BASE_SYSCTL(sctp_udp_tunneling_port) != 0)) { if ((SCTP_BASE_VAR(userspace_udpsctp) = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) { #if defined(_WIN32) SCTPDBG(SCTP_DEBUG_USR, "Can't create socket for SCTP/UDP/IPv4 (errno = %d).\n", WSAGetLastError()); @@ -1309,7 +1354,7 @@ } } } - if (SCTP_BASE_VAR(userspace_udpsctp6) == -1) { + if ((SCTP_BASE_VAR(userspace_udpsctp6) == -1) && (SCTP_BASE_SYSCTL(sctp_udp_tunneling_port) != 0)) { if ((SCTP_BASE_VAR(userspace_udpsctp6) = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP)) == -1) { #if defined(_WIN32) SCTPDBG(SCTP_DEBUG_USR, "Can't create socket for SCTP/UDP/IPv6 (errno = %d).\n", WSAGetLastError()); diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/user_route.h firefox-esr-102.7.0esr/netwerk/sctp/src/user_route.h --- firefox-esr-102.6.0esr/netwerk/sctp/src/user_route.h 2022-12-05 23:00:55.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/user_route.h 2023-01-09 15:01:10.000000000 +0000 @@ -10,7 +10,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 4. Neither the name of the University nor the names of its contributors + * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/user_socket.c firefox-esr-102.7.0esr/netwerk/sctp/src/user_socket.c --- firefox-esr-102.6.0esr/netwerk/sctp/src/user_socket.c 2022-12-05 23:01:12.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/user_socket.c 2023-01-09 15:01:10.000000000 +0000 @@ -115,8 +115,8 @@ void usrsctp_init_nothreads(uint16_t port, - int (*conn_output)(void *addr, void *buffer, size_t length, uint8_t tos, uint8_t set_df), - void (*debug_printf)(const char *format, ...)) + int (*conn_output)(void *addr, void *buffer, size_t length, uint8_t tos, uint8_t set_df), + void (*debug_printf)(const char *format, ...)) { init_sync(); sctp_init(port, conn_output, debug_printf, 0); @@ -251,7 +251,7 @@ ACCEPT_LOCK_ASSERT(); SOCK_LOCK_ASSERT(so); - /* SS_NOFDREF unset in accept call. this condition seems irrelevent + /* SS_NOFDREF unset in accept call. this condition seems irrelevant * for __Userspace__... */ if (so->so_count != 0 || @@ -296,7 +296,7 @@ * necessary from sorflush(). * * Notice that the socket buffer and kqueue state are torn down - * before calling pru_detach. This means that protocols shold not + * before calling pru_detach. This means that protocols should not * assume they can perform socket wakeups, etc, in their detach code. */ sodealloc(so); @@ -1324,11 +1324,11 @@ usrsctp_socket(int domain, int type, int protocol, int (*receive_cb)(struct socket *sock, union sctp_sockstore addr, void *data, size_t datalen, struct sctp_rcvinfo, int flags, void *ulp_info), - int (*send_cb)(struct socket *sock, uint32_t sb_free), + int (*send_cb)(struct socket *sock, uint32_t sb_free, void *ulp_info), uint32_t sb_threshold, void *ulp_info) { - struct socket *so; + struct socket *so = NULL; if ((protocol == IPPROTO_SCTP) && (SCTP_BASE_VAR(sctp_pcb_initialized) == 0)) { errno = EPROTONOSUPPORT; @@ -1878,7 +1878,7 @@ * Otherwise, if connected, try to disconnect first. This allows * user to disconnect by connecting to, e.g., a null address. */ - if (so->so_state & (SS_ISCONNECTED|SS_ISCONNECTING) && (error = sodisconnect(so))) { + if (so->so_state & (SS_ISCONNECTED|SS_ISCONNECTING) && (sodisconnect(so) != 0)) { error = EISCONN; } else { /* @@ -2210,7 +2210,7 @@ int *buf_size; buf_size = (int *)option_value; - *buf_size = so->so_rcv.sb_hiwat;; + *buf_size = so->so_rcv.sb_hiwat; *option_len = (socklen_t)sizeof(int); return (0); } @@ -2695,22 +2695,26 @@ { struct sctp_getaddresses *addrs; struct sockaddr *sa; - sctp_assoc_t asoc; caddr_t lim; socklen_t opt_len; + uint32_t size_of_addresses; int cnt; if (raddrs == NULL) { errno = EFAULT; return (-1); } - asoc = id; - opt_len = (socklen_t)sizeof(sctp_assoc_t); - if (usrsctp_getsockopt(so, IPPROTO_SCTP, SCTP_GET_REMOTE_ADDR_SIZE, &asoc, &opt_len) != 0) { - return (-1); + /* When calling getsockopt(), the value contains the assoc_id. */ + size_of_addresses = (uint32_t)id; + opt_len = (socklen_t)sizeof(uint32_t); + if (usrsctp_getsockopt(so, IPPROTO_SCTP, SCTP_GET_REMOTE_ADDR_SIZE, &size_of_addresses, &opt_len) != 0) { + if (errno == ENOENT) { + return (0); + } else { + return (-1); + } } - /* size required is returned in 'asoc' */ - opt_len = (socklen_t)((size_t)asoc + sizeof(struct sctp_getaddresses)); + opt_len = (socklen_t)((size_t)size_of_addresses + sizeof(struct sctp_getaddresses)); addrs = calloc(1, (size_t)opt_len); if (addrs == NULL) { errno = ENOMEM; @@ -2770,10 +2774,10 @@ usrsctp_getladdrs(struct socket *so, sctp_assoc_t id, struct sockaddr **raddrs) { struct sctp_getaddresses *addrs; - caddr_t lim; struct sockaddr *sa; - size_t size_of_addresses; + caddr_t lim; socklen_t opt_len; + uint32_t size_of_addresses; int cnt; if (raddrs == NULL) { @@ -2781,13 +2785,8 @@ return (-1); } size_of_addresses = 0; - opt_len = (socklen_t)sizeof(int); + opt_len = (socklen_t)sizeof(uint32_t); if (usrsctp_getsockopt(so, IPPROTO_SCTP, SCTP_GET_LOCAL_ADDR_SIZE, &size_of_addresses, &opt_len) != 0) { - errno = ENOMEM; - return (-1); - } - if (size_of_addresses == 0) { - errno = ENOTCONN; return (-1); } opt_len = (socklen_t)(size_of_addresses + sizeof(struct sctp_getaddresses)); @@ -2800,9 +2799,12 @@ /* Now lets get the array of addresses */ if (usrsctp_getsockopt(so, IPPROTO_SCTP, SCTP_GET_LOCAL_ADDRESSES, addrs, &opt_len) != 0) { free(addrs); - errno = ENOMEM; return (-1); } + if (size_of_addresses == 0) { + free(addrs); + return (0); + } *raddrs = &addrs->addr[0].sa; cnt = 0; sa = &addrs->addr[0].sa; @@ -2850,14 +2852,13 @@ #ifdef INET void sctp_userspace_ip_output(int *result, struct mbuf *o_pak, - sctp_route_t *ro, void *stcb, + sctp_route_t *ro, void *inp, uint32_t vrf_id) { struct mbuf *m; struct mbuf *m_orig; int iovcnt; int len; - int send_count; struct ip *ip; struct udphdr *udp; struct sockaddr_in dst; @@ -2930,16 +2931,13 @@ m_adj(m, sizeof(struct ip) + sizeof(struct udphdr)); } - send_count = 0; for (iovcnt = 0; m != NULL && iovcnt < MAXLEN_MBUF_CHAIN; m = m->m_next, iovcnt++) { #if !defined(_WIN32) send_iovec[iovcnt].iov_base = (caddr_t)m->m_data; send_iovec[iovcnt].iov_len = SCTP_BUF_LEN(m); - send_count += send_iovec[iovcnt].iov_len; #else send_iovec[iovcnt].buf = (caddr_t)m->m_data; send_iovec[iovcnt].len = SCTP_BUF_LEN(m); - send_count += send_iovec[iovcnt].len; #endif } @@ -2995,14 +2993,13 @@ #if defined(INET6) void sctp_userspace_ip6_output(int *result, struct mbuf *o_pak, - struct route_in6 *ro, void *stcb, + struct route_in6 *ro, void *inp, uint32_t vrf_id) { struct mbuf *m; struct mbuf *m_orig; int iovcnt; int len; - int send_count; struct ip6_hdr *ip6; struct udphdr *udp; struct sockaddr_in6 dst; @@ -3073,19 +3070,16 @@ if (use_udp_tunneling) { m_adj(m, sizeof(struct ip6_hdr) + sizeof(struct udphdr)); } else { - m_adj(m, sizeof(struct ip6_hdr)); + m_adj(m, sizeof(struct ip6_hdr)); } - send_count = 0; for (iovcnt = 0; m != NULL && iovcnt < MAXLEN_MBUF_CHAIN; m = m->m_next, iovcnt++) { #if !defined(_WIN32) send_iovec[iovcnt].iov_base = (caddr_t)m->m_data; send_iovec[iovcnt].iov_len = SCTP_BUF_LEN(m); - send_count += send_iovec[iovcnt].iov_len; #else send_iovec[iovcnt].buf = (caddr_t)m->m_data; send_iovec[iovcnt].len = SCTP_BUF_LEN(m); - send_count += send_iovec[iovcnt].len; #endif } if (m != NULL) { @@ -3297,7 +3291,7 @@ struct mbuf *m, *mm; struct sctphdr *sh; struct sctp_chunkhdr *ch; - int remaining; + int remaining, offset; SCTP_STAT_INCR(sctps_recvpackets); SCTP_STAT_INCR_COUNTER64(sctps_inpackets); @@ -3327,17 +3321,19 @@ } KASSERT(remaining == 0, ("usrsctp_conninput: %zu bytes left", remaining)); m_copyback(m, 0, (int)length, (caddr_t)buffer); - if (SCTP_BUF_LEN(m) < (int)(sizeof(struct sctphdr) + sizeof(struct sctp_chunkhdr))) { - if ((m = m_pullup(m, sizeof(struct sctphdr) + sizeof(struct sctp_chunkhdr))) == NULL) { + offset = sizeof(struct sctphdr) + sizeof(struct sctp_chunkhdr); + if (SCTP_BUF_LEN(m) < offset) { + if ((m = m_pullup(m, offset)) == NULL) { SCTP_STAT_INCR(sctps_hdrops); return; } } - sh = mtod(m, struct sctphdr *);; + sh = mtod(m, struct sctphdr *); ch = (struct sctp_chunkhdr *)((caddr_t)sh + sizeof(struct sctphdr)); + offset -= sizeof(struct sctp_chunkhdr); src.sconn_port = sh->src_port; dst.sconn_port = sh->dest_port; - sctp_common_input_processing(&m, 0, sizeof(struct sctphdr), (int)length, + sctp_common_input_processing(&m, 0, offset, (int)length, (struct sockaddr *)&src, (struct sockaddr *)&dst, sh, ch, diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/user_socketvar.h firefox-esr-102.7.0esr/netwerk/sctp/src/user_socketvar.h --- firefox-esr-102.6.0esr/netwerk/sctp/src/user_socketvar.h 2022-12-05 23:01:07.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/user_socketvar.h 2023-01-09 15:01:10.000000000 +0000 @@ -10,7 +10,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 4. Neither the name of the University nor the names of its contributors + * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * diff -Nru firefox-esr-102.6.0esr/netwerk/sctp/src/usrsctp.h firefox-esr-102.7.0esr/netwerk/sctp/src/usrsctp.h --- firefox-esr-102.6.0esr/netwerk/sctp/src/usrsctp.h 2022-12-05 23:01:11.000000000 +0000 +++ firefox-esr-102.7.0esr/netwerk/sctp/src/usrsctp.h 2023-01-09 15:01:10.000000000 +0000 @@ -64,19 +64,19 @@ #elif defined(SCTP_STDINT_INCLUDE) #include SCTP_STDINT_INCLUDE #else -#define uint8_t unsigned __int8 -#define uint16_t unsigned __int16 -#define uint32_t unsigned __int32 -#define uint64_t unsigned __int64 -#define int16_t __int16 -#define int32_t __int32 +typedef unsigned __int8 uint8_t; +typedef unsigned __int16 uint16_t; +typedef unsigned __int32 uint32_t; +typedef unsigned __int64 uint64_t; +typedef __int16 int16_t; +typedef __int32 int32_t; #endif #ifndef ssize_t #ifdef _WIN64 -#define ssize_t __int64 +typedef __int64 ssize_t; #elif defined _WIN32 -#define ssize_t int +typedef int ssize_t; #else #error "Unknown platform!" #endif @@ -904,7 +904,7 @@ usrsctp_socket(int domain, int type, int protocol, int (*receive_cb)(struct socket *sock, union sctp_sockstore addr, void *data, size_t datalen, struct sctp_rcvinfo, int flags, void *ulp_info), - int (*send_cb)(struct socket *sock, uint32_t sb_free), + int (*send_cb)(struct socket *sock, uint32_t sb_free, void *ulp_info), uint32_t sb_threshold, void *ulp_info); diff -Nru firefox-esr-102.6.0esr/security/manager/ssl/StaticHPKPins.h firefox-esr-102.7.0esr/security/manager/ssl/StaticHPKPins.h --- firefox-esr-102.6.0esr/security/manager/ssl/StaticHPKPins.h 2022-12-05 23:00:39.000000000 +0000 +++ firefox-esr-102.7.0esr/security/manager/ssl/StaticHPKPins.h 2023-01-09 17:27:37.000000000 +0000 @@ -675,8 +675,8 @@ { "download.mozilla.org", false, false, true, 14, &kPinset_mozilla_services }, { "drive.google.com", true, false, false, -1, &kPinset_google_root_pems }, { "dropbox.com", true, false, false, -1, &kPinset_dropbox }, - { "dropboxstatic.com", false, true, false, -1, &kPinset_dropbox }, - { "dropboxusercontent.com", false, true, false, -1, &kPinset_dropbox }, + { "dropboxstatic.com", true, true, false, -1, &kPinset_dropbox }, + { "dropboxusercontent.com", true, true, false, -1, &kPinset_dropbox }, { "edit.yahoo.com", true, true, false, -1, &kPinset_yahoo }, { "en-maktoob.search.yahoo.com", false, true, false, -1, &kPinset_yahoo }, { "encrypted.google.com", true, false, false, -1, &kPinset_google_root_pems }, @@ -684,7 +684,7 @@ { "espanol.search.yahoo.com", false, true, false, -1, &kPinset_yahoo }, { "example.test", true, true, false, -1, &kPinset_test }, { "exclude-subdomains.pinning.example.com", false, false, false, -1, &kPinset_mozilla_test }, - { "facebook.com", false, false, false, -1, &kPinset_facebook }, + { "facebook.com", true, false, false, -1, &kPinset_facebook }, { "fi.google.com", true, false, false, -1, &kPinset_google_root_pems }, { "fi.search.yahoo.com", false, true, false, -1, &kPinset_yahoo }, { "firebaseio.com", true, false, false, -1, &kPinset_google_root_pems }, @@ -972,7 +972,7 @@ { "market.android.com", true, false, false, -1, &kPinset_google_root_pems }, { "mbasic.facebook.com", true, false, false, -1, &kPinset_facebook }, { "meet.google.com", true, false, false, -1, &kPinset_google_root_pems }, - { "messenger.com", false, false, false, -1, &kPinset_facebook }, + { "messenger.com", true, false, false, -1, &kPinset_facebook }, { "mobile.twitter.com", true, false, false, -1, &kPinset_twitterCom }, { "mt.search.yahoo.com", false, true, false, -1, &kPinset_yahoo }, { "mtouch.facebook.com", true, false, false, -1, &kPinset_facebook }, @@ -1095,4 +1095,4 @@ static const int32_t kUnknownId = -1; -static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1678706560657000); +static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1681730734033000); diff -Nru firefox-esr-102.6.0esr/security/manager/ssl/nsSTSPreloadList.inc firefox-esr-102.7.0esr/security/manager/ssl/nsSTSPreloadList.inc --- firefox-esr-102.6.0esr/security/manager/ssl/nsSTSPreloadList.inc 2022-12-05 23:01:16.000000000 +0000 +++ firefox-esr-102.7.0esr/security/manager/ssl/nsSTSPreloadList.inc 2023-01-09 17:27:37.000000000 +0000 @@ -8,11 +8,10 @@ /*****************************************************************************/ #include -const PRTime gPreloadListExpirationTime = INT64_C(1681125756540000); +const PRTime gPreloadListExpirationTime = INT64_C(1684149930398000); %% 0--1.de, 1 0-0.io, 1 -0-0.lt, 1 0-1.party, 1 0-24.com, 1 0-24.net, 1 @@ -46,7 +45,6 @@ 002.ro, 1 00220022.net, 1 00228.am, 0 -00228.org, 1 00228555.com, 1 00228999.com, 1 00228vip5.com, 1 @@ -96,7 +94,6 @@ 01.org, 1 01011970.xyz, 1 010203.ru, 1 -010ks.net, 1 01100010011001010111001101110100.com, 1 01101000.xyz, 1 01110000011100110111001001100111.ca, 1 @@ -112,7 +109,6 @@ 0137552.com, 1 0138365.com, 0 0139365.com, 0 -013zl.com, 1 015kb.com, 1 016298.com, 0 018663.com, 1 @@ -285,6 +281,7 @@ 09kanagawa.jp, 1 0akarma.me, 1 0au.de, 0 +0c.gay, 1 0c3.de, 1 0carbon.com, 1 0cdn.ga, 1 @@ -308,6 +305,7 @@ 0n.com, 1 0n3b1t.com, 1 0nestudio.com, 1 +0nnn.top, 1 0o0.edu.pl, 1 0o0.ooo, 1 0o0o.biz, 1 @@ -328,6 +326,7 @@ 0wx.cat, 1 0wx.es, 1 0wx.eu, 1 +0wx.net, 1 0wx.org, 1 0x.cx, 1 0x.sk, 1 @@ -369,12 +368,14 @@ 0xfc.de, 1 0xff.se, 1 0xn.de, 1 +0xnotes.me, 1 0xspa.de, 1 0xword.com, 1 0yen.org, 1 1-123hp.com, 1 1-2-3bounce.co.uk, 1 1-800-bakery.com, 1 +1-800-mattress.com, 1 1-ae.com, 1 1-inv.com, 1 1-news.net, 1 @@ -394,6 +395,7 @@ 10000rub.gq, 1 10000spoons.tk, 1 10001000.xyz, 1 +100048.com, 1 1000cp5.cc, 1 1000inf.ru, 1 1000ps.at, 1 @@ -409,6 +411,7 @@ 1001n.com, 1 1001oyun.com, 1 1001reasonstolearnspanish.com, 1 +1001telecommandes.com, 1 1007337.com, 1 10086.id, 1 10086.ru, 1 @@ -459,6 +462,7 @@ 1020318.com, 1 1020319.com, 1 1020320.com, 1 +1024.ee, 1 1024.kr, 1 1025.ga, 1 1031ex.com, 1 @@ -477,11 +481,12 @@ 10453.net, 1 10495.net, 1 105318.com, 1 +1057thehog.com, 1 106.hi.cn, 1 10628.com, 1 1068511.com, 1 10705.ml, 1 -10774.net, 1 +10774.net, 0 107996.com, 1 1079fm.ga, 1 10840.net, 1 @@ -499,6 +504,7 @@ 10must.com, 1 10news.com, 1 10og.de, 1 +10pearls.com, 1 10ppm.com, 1 10seos.com, 1 10site.ru, 1 @@ -512,7 +518,7 @@ 1100110.xyz, 1 11018vip.com, 1 11018xpj.com, 1 -110692.com, 1 +11046.com, 1 11082.com, 1 110cl.com, 1 110na.com, 1 @@ -599,6 +605,7 @@ 117766.xyz, 1 1177z6.com, 1 11792.com, 1 +118118money.com, 1 1190america.tk, 1 1199bet.vip, 1 11aaee.com, 1 @@ -614,7 +621,6 @@ 11bbjj.com, 1 11bbpp.com, 1 11bbqq.com, 1 -11bbrr.com, 1 11bbss.com, 1 11bbzz.com, 1 11bet86.com, 1 @@ -782,9 +788,11 @@ 123freevectors.com, 1 123gostovanje.si, 1 123greeting.tk, 1 +123host.com.au, 1 123hpcom.co.uk, 1 123mac.com, 1 123midterm.com, 1 +123moviesonline.org, 1 123noticias.com.br, 1 123nutricion.es, 1 123pay.ir, 1 @@ -801,7 +809,6 @@ 1244.tk, 1 1244546066.rsc.cdn77.org, 1 124633.com, 1 -1248.ink, 1 125-rue.com, 1 12517.com, 1 12554.com, 1 @@ -819,6 +826,7 @@ 1288366.com, 1 129.co, 1 12ag8.com, 1 +12apostleshotel.com, 1 12go.asia, 1 12go.co, 1 12gramu.cz, 1 @@ -876,6 +884,7 @@ 13u15.com, 1 14000.cz, 1 141-94-142-218.xyz, 1 +141-95-156-101.xyz, 1 141145.com, 0 14159.gb.net, 1 142552.com, 0 @@ -884,6 +893,7 @@ 143633.com, 1 143733.com, 1 143933.com, 1 +144-217-180-114.xyz, 1 144chan.ml, 1 1453914078.rsc.cdn77.org, 1 145433.com, 1 @@ -976,6 +986,8 @@ 159ks.com, 1 159ks.net, 1 159z6.com, 1 +15k.me, 1 +15october.net, 1 15u15.com, 1 16-qw.tk, 1 1600esplanade.com, 1 @@ -1161,6 +1173,9 @@ 17xile.com, 1 1800baskets.com, 1 1800flowers.com, 1 +1800matress.net, 1 +1800mattress.co, 1 +1800mattress.net, 1 1800petmeds.com, 1 1800shutters.com, 1 180btt.com, 1 @@ -1249,6 +1264,7 @@ 18pee.com, 1 18pioners.tk, 1 18porn.cc, 1 +18teensporn.pro, 1 18upchat.com, 1 18vr.com, 1 1901.cz, 1 @@ -1402,6 +1418,7 @@ 1on1on1.de, 1 1on1on1.tv, 1 1onehouse.com, 1 +1onestrong.com, 1 1p.cl, 1 1p.ro, 0 1pair.com, 1 @@ -1441,7 +1458,6 @@ 1stforfun.co.uk, 1 1stpeninsulabouncers.co.uk, 1 1strecipes.com, 1 -1stsource.com, 1 1ststop.co.uk, 1 1sttix.org, 1 1ticks.com, 1 @@ -1449,6 +1465,7 @@ 1to4.net, 1 1u0m.com, 1 1up.it, 1 +1uptick.com, 1 1v1.xyz, 1 1v9.im, 1 1volcano.ru, 1 @@ -1470,17 +1487,22 @@ 1x-bet93432.world, 1 1x-betua.com, 1 1x-bit.mobi, 1 +1x-kor.com, 1 1x-korbet.com, 1 1x-krbet.com, 1 1x-mirrors.com, 1 +1x-th.com, 1 1x1.re, 1 1x2020.xyz, 1 1x2betwinner.com, 1 1x2magazine.eu, 1 +1x88.net, 1 1xaja.com, 1 +1xb88.net, 1 1xbenar.com, 1 1xbet-015.com, 1 1xbet-66669.top, 1 +1xbet-china.com, 1 1xbet-ro.com, 1 1xbet-s.com, 1 1xbet-se.com, 1 @@ -1504,6 +1526,7 @@ 1xbet.com, 1 1xbet.com.gh, 1 1xbet.com.mx, 1 +1xbet.com.na, 1 1xbet.com.tw, 1 1xbet.com.zm, 1 1xbet.cr, 1 @@ -1521,6 +1544,7 @@ 1xbet.gt, 1 1xbet.gw, 1 1xbet.hk, 1 +1xbet.hn, 1 1xbet.ht, 1 1xbet.in, 1 1xbet.ke, 1 @@ -1537,6 +1561,7 @@ 1xbet.org.mw, 1 1xbet.org.na, 1 1xbet.pe, 1 +1xbet.ph, 1 1xbet.pk, 1 1xbet.pn, 1 1xbet.ps, 1 @@ -1546,6 +1571,7 @@ 1xbet.sc.ug, 1 1xbet.sh, 1 1xbet.sl, 1 +1xbet.sn, 1 1xbet.sr, 1 1xbet.tc, 1 1xbet.td, 1 @@ -1558,6 +1584,7 @@ 1xbet1.com, 1 1xbet101.com, 1 1xbet102.com, 1 +1xbet105.com, 1 1xbet12.com, 1 1xbet13.com, 1 1xbet14.com, 1 @@ -1566,8 +1593,11 @@ 1xbet2.com, 1 1xbet26.com, 1 1xbet27.com, 1 +1xbet3.com, 1 1xbet352575.top, 1 1xbet359348.top, 1 +1xbet36.com, 1 +1xbet4.com, 1 1xbet50.com, 1 1xbet6.com, 1 1xbet657113.top, 1 @@ -1575,6 +1605,8 @@ 1xbet733390.top, 1 1xbet8.com, 1 1xbet82.com, 1 +1xbet84.com, 1 +1xbet88.net, 1 1xbet9.com, 1 1xbet928606.top, 1 1xbetapk.com, 1 @@ -1610,21 +1642,29 @@ 1xbk.mobi, 1 1xbkbet3.com, 1 1xbkbet4.com, 1 +1xcinta.com, 1 1xdatok.com, 1 1xde.com, 1 1xfast.com, 1 +1xfifa.com, 1 1xgames.online, 1 1xgokil.com, 1 1xir-red.com, 1 +1xir.mobi, 1 1xjago.com, 1 +1xjkt.com, 1 +1xjuara.com, 1 1xmakati.com, 1 1xmalaysia.com, 1 1xmaubix.com, 1 1xmenang.com, 1 1xmob1pl.top, 1 +1xmobi.com, 1 1xmyanmar.net, 1 1xpartners.com, 1 1xraja.com, 1 +1xraya.com, 1 +1xrindu.com, 1 1xsinga.com, 1 1xslot-ua.com, 1 1xslot.casino, 1 @@ -1640,6 +1680,7 @@ 1xspport.mobi, 1 1xstavka.ru, 1 1xsukan.com, 1 +1xsultan.com, 1 1xsultanah.com, 1 1xtranslate.com, 1 1xvhy.xyz, 1 @@ -1654,7 +1695,7 @@ 200.network, 1 2000.is, 1 2000feet.tk, 1 -2000meter.no, 0 +2000meter.no, 1 2001y.me, 0 2002000.xyz, 1 200201.xyz, 1 @@ -1706,6 +1747,7 @@ 208wns.com, 1 20at.com, 1 20denier.com, 1 +20four7va.com, 1 20gg.de, 1 20plus.com, 1 20sights.tk, 1 @@ -1733,13 +1775,13 @@ 21god.com, 1 21gou.com, 1 21green.com, 1 -21hours.com, 1 21isp.com, 1 21jobs.com, 1 21kampus.com, 1 21lab.co, 1 21love.com, 1 21new.com, 1 +21nurse.com, 1 21ol.com, 1 21pet.com, 1 21photo.com, 1 @@ -1771,7 +1813,6 @@ 2264707.ru, 1 2277bet.com, 1 228668.com, 1 -22884.org, 1 2288422.com, 1 2288499.com, 1 22884a.com, 0 @@ -1868,6 +1909,8 @@ 236560.com, 1 236570.com, 1 238212.com, 1 +23andme.com, 1 +23andme.io, 1 23ks.app, 1 24-7.fi, 1 24-7.jp, 1 @@ -1889,6 +1932,7 @@ 247cumshots.com, 1 247dns.net, 1 247healthshop.com, 1 +247maturesex.com, 1 247medplan.com, 1 247megamart.com.au, 1 247naijabuzz.com, 1 @@ -1936,7 +1980,6 @@ 24hod.com, 1 24hour-locksmithsanantonio.com, 1 24hourcyclist.co.uk, 1 -24hourelectricalservices.co.uk, 1 24hourlocksmithdallastx.com, 1 24hourlocksmithhoustontx.com, 1 24hourlocksmithspring.com, 1 @@ -1996,6 +2039,7 @@ 27000.best, 1 2718282.net, 1 272live.com, 1 +276112.com, 0 27728522.com, 1 277z6.com, 1 27lx.me, 1 @@ -2014,7 +2058,6 @@ 288cn-563.com, 1 288game.net, 1 288k8.com, 1 -2890.ltd, 1 28spots.net, 1 291167.xyz, 1 2912.nl, 1 @@ -2031,7 +2074,6 @@ 2b2b.pro, 1 2b2t.fi, 1 2ba.cc, 1 -2badvintage.tk, 1 2bas.nl, 1 2bcompany.ch, 0 2bet86.com, 1 @@ -2061,12 +2103,15 @@ 2cv-fahrer.de, 1 2cvclubdepicardie.tk, 1 2date4love.com, 1 +2daysmood.asia, 1 +2daysmood.eu, 1 +2daysmood.nl, 1 +2daysmood.us, 1 2dk.info, 1 2dns.com, 1 2driver-ok.ml, 1 2earn-online.com, 0 2fa.directory, 1 -2feel.sk, 1 2finish.com, 1 2fm.ie, 1 2fm.radio, 1 @@ -2081,6 +2126,7 @@ 2gisparser.tk, 1 2h-nagoya.org, 1 2habc.com, 1 +2handcar.com, 1 2head.com, 1 2heartsbookings.co.uk, 1 2hypeenterprises.com, 1 @@ -2117,6 +2163,7 @@ 2nerds1bit.com, 1 2nimpresores.es, 1 2of.me, 1 +2one.one, 1 2or3.tk, 1 2pi.finance, 1 2pi.network, 1 @@ -2131,9 +2178,10 @@ 2tausend19.de, 1 2th.me, 1 2think.org, 1 +2tinteractive.com, 0 2todrive.nl, 1 2travel8.world, 1 -2tuu.com, 1 +2tuu.com, 0 2ulcceria.nl, 1 2url.link, 1 2ustyle.com, 1 @@ -2174,7 +2222,6 @@ 30minut.com, 1 30nama1.tk, 1 30region.tk, 1 -31-elagage.fr, 1 310422.com, 1 311186.com, 1 311191.com, 1 @@ -2320,39 +2367,24 @@ 343622.com, 1 34365t.com, 1 343722.com, 1 -343922.com, 1 34536565.com, 0 3455bet.com, 1 345666365.com, 0 3456666365.com, 0 345678365.com, 1 3456789365.com, 1 -346122.com, 1 -346233.com, 1 -346322.com, 1 -346422.com, 1 -346522.com, 1 -346533.com, 1 3466bet.com, 1 -346722.com, 1 -346922.com, 1 3473-wiki.de, 1 347552.com, 1 3477bet.com, 1 -348233.com, 1 348663.com, 1 -349022.com, 1 -349033.com, 1 -349433.com, 1 -349533.com, 1 34bg.com, 1 34ja.com, 1 34jw.com, 1 -34metiza.ru, 1 +34metiza.ru, 0 34nh.com, 1 34nj.com, 1 350.org, 1 -350422.com, 1 35089y.com, 1 351079.com, 1 351113.com, 1 @@ -2496,6 +2528,7 @@ 365air.com, 1 365beautyworld.com, 1 365blog.com, 1 +365canvas.com, 1 365check.com, 1 365cn-288.com, 1 365coupon.com, 1 @@ -2700,9 +2733,10 @@ 3countiescastlehire.co.uk, 1 3creation.com, 1 3cs.ch, 0 +3cup90.com, 1 3d-animator.net, 1 3d-glow.de, 1 -3d-station.fr, 0 +3d-station.fr, 1 3d47.com, 1 3dagentur.com, 1 3danimation.tk, 1 @@ -2731,6 +2765,7 @@ 3dm.audio, 1 3dmedium.de, 1 3dmetalprinting.tk, 1 +3dmili.com, 1 3dmusiclab.nl, 1 3dn-modell.hu, 1 3dnchu.com, 1 @@ -2781,6 +2816,7 @@ 3lmnyblogger.ga, 1 3logic.ru, 1 3lot.ru, 1 +3lstoriestv.com, 1 3marilynthemedia.cf, 1 3mbo.de, 1 3mbuilders.co.uk, 1 @@ -2883,6 +2919,7 @@ 3sddns.de, 1 3sdns.de, 1 3shosting.de, 1 +3sisecurity.com, 1 3sixtydutyfree.com, 1 3smail.de, 1 3speak.tv, 1 @@ -2903,7 +2940,6 @@ 3zm-hacks.de, 1 3zm.de, 1 3zzbet.com, 1 -4-0-4.ga, 1 4-ae.com, 1 4-it.de, 1 4.com.ms, 1 @@ -2915,6 +2951,7 @@ 4005365.com, 1 400china.com, 1 400yaahc.gov, 1 +401ksite.com, 1 4025360.com, 1 4025361.com, 1 4025362.com, 1 @@ -2941,7 +2978,6 @@ 40daysnutrition.com, 1 40percentpapermache.com, 1 41199.com, 1 -411movie.com, 1 4144bet.com, 1 414553.com, 1 415.ai, 1 @@ -3001,6 +3037,7 @@ 444321365.com, 0 4447552.com, 1 444bet86.com, 1 +444manualtherapy.com, 1 444takip.com, 1 44ada.pl, 1 44bet86.com, 1 @@ -3035,6 +3072,7 @@ 47essays.com, 1 47tech.com, 1 47yr.com, 1 +480ptvseries.com, 1 48365365cn.com, 1 48365cn-365.com, 1 486773.com, 1 @@ -3060,10 +3098,13 @@ 4ae86.com, 1 4allpromos.com, 1 4am.click, 1 +4armed.com, 1 +4b.gg, 1 4baby.com.br, 1 4beats.ml, 1 4best.tk, 1 4bet86.com, 1 +4bmt-vld.xyz, 1 4budget.ga, 1 4car.site, 1 4cavaleiros.com.br, 1 @@ -3086,6 +3127,7 @@ 4everproxy.com, 1 4exchange.ru, 1 4filtre.com, 1 +4filtre.com.tr, 1 4fit.ro, 1 4flex.info, 1 4freepress.com, 1 @@ -3104,6 +3146,7 @@ 4iners.com, 0 4investors.de, 1 4iplatform.com, 1 +4iq.lt, 1 4just.com, 1 4k3dyptt.com, 1 4kpi.eu, 1 @@ -3134,6 +3177,7 @@ 4screens.net, 1 4season-flowers.com, 1 4seo.ml, 1 +4server.ch, 1 4share.tv, 1 4sics.se, 1 4sjnc.org, 1 @@ -3144,6 +3188,7 @@ 4tgw34.tk, 1 4th-ave-studio.com, 1 4thfebruary.tk, 1 +4thjdcar.gov, 1 4true.com, 1 4u.services, 0 4u2cmedia.com, 1 @@ -3161,7 +3206,6 @@ 4x4coatingen.nl, 1 4x4tt.com, 1 4xiaomi.ru, 1 -4xlabs.co, 1 4y4.me, 1 4y4a-arts.space, 1 4yowipes10yo.gq, 1 @@ -3204,6 +3248,7 @@ 506422.com, 1 508kb.com, 1 50balles.com, 1 +50firstavenue.com.au, 1 50fss.marketing, 1 50hertz.tk, 1 50lakeshore.com, 1 @@ -3215,8 +3260,10 @@ 50plusnet.nl, 1 50refer.tk, 1 50ten40.com, 1 +51-83-136-132.xyz, 1 511.org, 1 511in.org, 1 +512pixels.net, 1 5132vip.com, 1 513651.com, 1 51365a.com, 1 @@ -3315,6 +3362,7 @@ 51photos.com, 1 51pic.com, 1 51pig.com, 1 +51pinpai.com, 1 51power.com, 1 51resume.com, 1 51rose.com, 1 @@ -3325,6 +3373,7 @@ 51talk.ph, 1 51tiaojiu.com, 1 51train.com, 1 +51wear.com, 1 51xiongmao.cn, 1 52002a.com, 1 52002b.com, 1 @@ -3358,6 +3407,7 @@ 52062z.com, 1 5206365.com, 0 5209365.com, 0 +520dt.cc, 1 520xpjxpj.com, 0 521.dog, 1 5219.ml, 1 @@ -3441,6 +3491,7 @@ 55bet86.com, 1 55club.com, 1 55fss.net, 1 +55goal.com, 1 55jam.com, 1 55k66.vip, 1 55opt.org, 1 @@ -3567,6 +3618,7 @@ 5francs.com, 1 5g.co.uk, 1 5gb.space, 1 +5gigs.com, 1 5goglobal.com, 1 5h0r7.com, 1 5i.gs, 0 @@ -3636,7 +3688,6 @@ 616f88.com, 1 61730123.com, 1 618034.xyz, 1 -618btt.com, 1 618media.com, 1 61ag8.com, 1 61d88.com, 1 @@ -3655,7 +3706,7 @@ 625kb.com, 1 630422.com, 1 631422.com, 1 -632017.com, 1 +632017.com, 0 632025.com, 1 632026.com, 1 632027.com, 1 @@ -3757,7 +3808,6 @@ 645722.com, 1 645ds.cn, 0 645ds.com, 0 -646.io, 0 646322.com, 1 646722.com, 1 649022.com, 1 @@ -3822,27 +3872,9 @@ 663365f.vip, 1 663365g.vip, 1 663365h.vip, 1 -663365i.com, 0 663365i.vip, 1 -663365j.com, 0 663365j.vip, 1 -663365k.com, 0 663365k.vip, 1 -663365l.com, 0 -663365m.com, 0 -663365n.com, 0 -663365o.com, 0 -663365p.com, 0 -663365q.com, 0 -663365r.com, 0 -663365s.com, 0 -663365t.com, 0 -663365u.com, 0 -663365v.com, 0 -663365w.com, 0 -663365x.com, 0 -663365y.com, 0 -663365z.com, 0 663651.com, 0 664048.com, 1 6652566.com, 1 @@ -4016,7 +4048,6 @@ 67877777.com, 1 6789666365.com, 0 679422.com, 1 -679660.com, 0 67y7.com, 0 680422.com, 1 68277.me, 1 @@ -4109,6 +4140,7 @@ 69level.com, 1 69mentor.com, 1 69wasted.net, 1 +6a.nz, 1 6b.com.au, 1 6b9t.org, 1 6bet86.com, 1 @@ -4121,7 +4153,6 @@ 6meter.tk, 1 6play.fr, 1 6t-montjoye.org, 1 -6thmarch.com, 1 6v.vc, 1 6wbz.com, 1 6x6project.com, 1 @@ -4237,12 +4268,13 @@ 77321365.com, 0 7733445.com, 1 773buy.com, 1 -775018.com, 1 +775018.com, 0 777365t.com, 1 7776321.com, 0 7776365.com, 1 777bet86.com, 1 777coin.com, 1 +777mage.com, 1 777tv.tv, 1 7788bet.vip, 1 77b58.com, 1 @@ -4278,6 +4310,7 @@ 799ks.com, 1 799z6.com, 1 79ch.com, 1 +7across.com, 1 7aga7.mk, 1 7akawyna.tk, 1 7bandarqq.com, 1 @@ -4294,14 +4327,18 @@ 7graus.pt, 1 7hills.us, 1 7hq.ru, 1 +7im.co.uk, 1 7in0.me, 1 7ki.photography, 1 7kicks.com, 1 7kovrikov.ru, 1 +7kvadratov.by, 1 7l00p.com, 1 7links.com.br, 1 7milesglobal.com, 1 7money.co, 1 +7net.uk, 1 +7networking.com, 1 7pets.net, 1 7plus.com.au, 1 7press.com, 1 @@ -4329,6 +4366,7 @@ 800email.com, 1 800ink.com, 1 800live.com, 1 +800mattress.com, 1 800ok.com, 1 800perkins.com, 1 800sports.com, 1 @@ -4359,7 +4397,6 @@ 804322.com, 1 8050d.com, 1 8059d88.com, 1 -805hao.com, 0 8060d88.com, 1 80630.com, 1 8069d88.com, 1 @@ -4378,10 +4415,8 @@ 809422.com, 1 8097d.com, 1 80993.net, 1 -809hao.com, 0 80bin.com, 1 80daysofsummer.be, 1 -80grados.net, 1 80kittens.net, 1 80motorsclub.tk, 1 81.cz, 1 @@ -4597,6 +4632,7 @@ 84zb.com, 1 84zu.com, 1 850226.com, 1 +8521.co, 0 8521.me, 1 8522hk.com, 1 8522ph.com, 1 @@ -4662,7 +4698,7 @@ 8835365.com, 0 88365.net, 1 88365t.com, 1 -88518.com, 0 +88518.com, 1 88522am.com, 1 885287.com, 1 88566.xyz, 1 @@ -4732,6 +4768,8 @@ 888casino-canada.com, 1 888dhw.com, 1 888starz-5b.bet, 1 +888starz.bet, 1 +888starz22.bet, 1 888xpjxpj.com, 0 8890d.com, 1 8891d.com, 1 @@ -4772,7 +4810,6 @@ 88yule13.com, 1 88yule15.com, 1 88yule16.com, 1 -88yule3.com, 1 88yule7.com, 1 88yule9.com, 1 8900d.com, 1 @@ -4789,7 +4826,6 @@ 8927d88.com, 1 8929d88.com, 1 893067.com, 1 -89365t.com, 1 89386.com, 1 89386b.com, 0 89386d.com, 0 @@ -4810,6 +4846,7 @@ 8ballbombom.uk, 1 8balls.nl, 1 8bet86.com, 1 +8bit.ltd, 1 8bitpickle.com, 1 8bitsafe.com, 1 8cent.com, 1 @@ -4828,6 +4865,7 @@ 8maerz.at, 1 8me.nl, 1 8o8wave.com, 1 +8points9seconds.com, 1 8shequapp.com, 1 8show.com, 1 8t8.eu, 1 @@ -4869,6 +4907,7 @@ 9118.hk, 0 9118inc.com, 0 911commission.gov, 1 +911pestpatrol.com, 1 912422.com, 1 9132365.com, 1 913422.com, 1 @@ -4906,6 +4945,7 @@ 91d81.com, 1 91d83.com, 1 91d85.com, 0 +91dh.cc, 0 91fashion.com, 1 91fldz.com, 1 91imh.com, 1 @@ -4992,6 +5032,7 @@ 93644y.com, 0 93644z.com, 0 939394.org, 1 +939394.xyz, 1 9397a.com, 1 9397b.com, 1 9397bb.com, 0 @@ -5042,6 +5083,8 @@ 93ag8.com, 1 93cq.com, 1 93jc.cn, 1 +9417k.cf, 1 +9417k.com, 1 941988.cn, 1 943022.com, 1 9449-27a1-22a1-e0d9-4237-dd99-e75e-ac85-2f47-9d34.de, 1 @@ -5096,6 +5139,7 @@ 9499yl.com, 1 94imk.com, 1 95-the-mix.com, 1 +95.ar, 1 95105.com, 1 95107.com, 1 95108.com, 1 @@ -5118,6 +5162,7 @@ 9588.com.cn, 1 95996.com, 1 96002.com, 0 +960303.xyz, 1 960server.net.co, 1 9617818.com, 1 9617818.net, 1 @@ -5292,8 +5337,8 @@ 99365t.com, 1 99456j.com, 0 99511.fi, 1 -99599.fi, 1 -99599.net, 1 +99599.fi, 0 +99599.net, 0 995ccc.com, 1 9968101.com, 0 9968110.com, 0 @@ -5489,7 +5534,6 @@ 9yw.me, 1 9zlatan9.tk, 1 a-1waterproofing.com, 1 -a-actor.com, 1 a-allard.be, 1 a-better-planet.com, 1 a-busty.com, 1 @@ -5578,6 +5622,7 @@ a3m.gmbh, 1 a3mobile.com, 1 a3sys-elodie.fr, 1 +a4.com, 1 a4sound.com, 1 a5197.co, 1 a567.top, 1 @@ -5666,8 +5711,9 @@ aaltocapital.de, 1 aaltocapital.fi, 1 aalvarezs.cl, 1 -aalvarezs.com, 0 +aalvarezs.com, 1 aama.tk, 1 +aamlive.com, 1 aamt.es, 1 aamva.org, 1 aan-shop.co.il, 1 @@ -5703,7 +5749,6 @@ aaronmaar.de, 1 aaronosmani.com, 1 aaronr.digital, 1 -aaronroyle.com, 1 aarons.law, 1 aaronsilber.me, 1 aaronspain.tk, 1 @@ -5732,6 +5777,7 @@ ab-design.tk, 1 ab-pflege.de, 1 ab-solutepilates.com, 1 +ab-uk.com, 1 ab-west.tk, 1 ab288.com, 1 ab2888.cn, 1 @@ -5789,7 +5835,6 @@ abazola.cl, 1 abbadabbabouncycastles.co.uk, 1 abbas.ch, 1 -abbccoin.com, 1 abbevillecountysc.gov, 1 abbeycarefoundation.com, 1 abbeyvetspets.co.uk, 1 @@ -5868,6 +5913,7 @@ abeilles-idapi.fr, 0 abelbarretto.tk, 1 abella.ro, 1 +abelladangerpornstar.com, 1 abellagranitecountertops.com, 1 abellao.com, 1 abelles.cf, 1 @@ -5924,7 +5970,7 @@ abilympics.org.au, 1 abimelec.com, 0 abinferis.com, 1 -abinferis.net, 1 +abinferis.net, 0 abinyah.com, 1 abitaspringsla.gov, 1 abitech.tk, 1 @@ -5948,7 +5994,6 @@ ablmultiservice.nl, 1 abloop.com, 1 ablx.de, 1 -abmackenzie.com, 1 abmahnhelfer.de, 1 abmc.gov, 1 abminiplex.in, 1 @@ -5971,6 +6016,7 @@ abogadosdeaccidentesdeauto.gratis, 1 abogadosescobarysanchez.es, 1 abogehad.tk, 1 +abol.us, 1 abolicionistas.com, 1 abolition.net, 1 abolitionism.ca, 1 @@ -6011,9 +6057,11 @@ about-sects-and-cults.tk, 1 about.gq, 1 about.photos, 1 +aboutadhd.com, 1 aboutajax.tk, 1 aboutamit.com, 1 aboutandroid.tk, 1 +aboutasseminiandmore.it, 1 aboutchromebooks.com, 1 aboutconstruction.ga, 1 aboutconstruction.gq, 1 @@ -6077,7 +6125,7 @@ aboveaverageplumbing.com, 1 abovethefirehouse.com, 1 abox-kb.com, 1 -aboyle.ca, 1 +abpages.com, 1 abpis.hr, 1 abplive.com, 1 abplusz.hu, 1 @@ -6108,17 +6156,16 @@ abristolgeek.co.uk, 1 abritek.ca, 1 abroferlendo.tk, 1 +abrolhosoctopus.com, 1 abrupt.co, 1 absat.tk, 1 absb.ca, 1 abschleppdienst-hilfe.de, 1 abschleppdienst-in-recklinghausen.de, 1 -absconse.com, 1 abseher-technology.com, 1 abseits.org, 0 absentia.cf, 1 absinsurance.com, 1 -absintheaura.com, 1 absolab.xyz, 1 absolem.cc, 1 absoluav.com, 1 @@ -6129,6 +6176,7 @@ absolute.com, 1 absoluteautobody.com, 1 absolutebritney.com, 1 +absolutechristmas.com, 1 absolutedouble.co.uk, 1 absolutegames.ga, 1 absolutelybaching.com, 1 @@ -6158,7 +6206,6 @@ abuahmed.ga, 1 abulanov.com, 1 abun-motorsport.tk, 1 -abundanteconomy.com, 1 abundent.com, 1 abusamraphotography.tk, 1 abuse.cat, 1 @@ -6166,6 +6213,8 @@ abuse.fi, 1 abuse.io, 1 abusive-host.tk, 1 +abuzihipnoterapi.com, 1 +abuzitraining.com, 1 abuziyadhsds.com, 1 abvent.net, 0 abvlbasketviganello.ch, 0 @@ -6195,6 +6244,7 @@ academiadelmolino.com.uy, 1 academiadeufologia.com.br, 1 academiaeureka.tk, 1 +academiaparamodelos.com, 1 academiasdemodelos.com, 1 academic-master.com, 1 academica.nl, 1 @@ -6206,8 +6256,6 @@ academika.tk, 1 academkin.com, 1 academy-awards.ml, 1 -academy.city, 1 -academyof.com, 1 academyonlinetoyou.tk, 1 academytv.com.au, 1 acadiate.com, 1 @@ -6268,7 +6316,6 @@ accessacab.co.uk, 1 accessauto-occasions.be, 1 accesseap.com.au, 1 -accessgaragedoors.com, 1 accesshq.com, 1 accessibility.gov, 1 accessibilityguidelines.com, 1 @@ -6280,9 +6327,11 @@ accessnetworks.com, 1 accessoh.gov, 1 accessoirescheveuxchic.com, 1 +accessoklahoma.gov, 1 accessories-for-women.tk, 1 accessoriesautoparts.tk, 1 accessoripersmartphone.it, 1 +accesspress.org, 1 accesstosystem.cf, 1 acchan-fun.com, 1 accionesyreacciones.com, 1 @@ -6301,6 +6350,8 @@ account.gov.mo, 1 account.gov.uk, 1 accountancymanager.co.uk, 1 +accountant.nl, 1 +accountingedu.org, 1 accountmanager.tips, 1 accountmover.io, 1 accounts.firefox.com, 1 @@ -6316,6 +6367,7 @@ acculex.co.uk, 1 acculongrange.com, 1 accurateinfosolutions.in, 1 +accuritconsulting.com, 1 accurx.nhs.uk, 1 accurxinc.com, 1 accustandard.com, 1 @@ -6332,11 +6384,11 @@ ace-wiki.com, 1 ace.one, 1 ace0328.com, 1 -ace360.org, 1 aceai.com, 1 acealters.com, 0 aceanswering.com, 1 acebeam.com, 1 +aceboard.fr, 1 acebovirtual.tk, 1 acecardiologyclinic.com, 1 acecerts.co.uk, 1 @@ -6355,6 +6407,7 @@ acemobileforce.com, 1 acemsa.ga, 1 acemypaper.com, 1 +acen.edu.au, 1 acendealuz.com.br, 1 aceofdiamondspainting.com, 1 aceparking.com, 1 @@ -6372,6 +6425,7 @@ aceycity.ml, 1 acftienda.tk, 1 acfun.eu.org, 1 +acg.ac, 1 acg.codes, 1 acg.mn, 1 acg.sb, 0 @@ -6392,7 +6446,6 @@ achicrip.org, 1 achievenewsfrance.tk, 1 achiever.ga, 1 -achievers.com, 1 achievingheightsacademy.com, 1 achiksongs.tk, 1 achildshome.org, 1 @@ -6401,6 +6454,7 @@ achintyaesbee.tk, 1 achkandiro.ml, 1 achkandiro.tk, 1 +achl.fr, 1 achlochan.tk, 1 achmadfamily.com, 1 achmazstore.ir, 1 @@ -6411,6 +6465,7 @@ achtzehn.de, 1 achtzehn.eu, 1 achtzig20.de, 0 +achwo.de, 1 aciclovir.ga, 1 acidchrist.tk, 1 acidoascorbico.com, 1 @@ -6418,6 +6473,7 @@ aciksite.com, 1 acilicraft.cn, 1 acina.fr, 1 +acingov.pt, 1 acinq.co, 1 ackermann.ch, 1 acklandstainless.com.au, 1 @@ -6441,6 +6497,7 @@ acolicy.com, 1 acomerygozar.cam, 1 acompanhantes.com.pt, 1 +acompio.us, 1 acomplia20mg.cf, 1 acopatableware.com, 1 acordes.online, 1 @@ -6452,7 +6509,6 @@ acotadecalle.tk, 1 acourse.io, 1 acousticalsolutions.com, 1 -acousticbiotech.com, 1 acoustics.network, 1 acoustics.tech, 1 acousticsoundrecords.com, 1 @@ -6470,6 +6526,7 @@ acquari.roma.it, 1 acquasuisse.tk, 1 acquire.co.nz, 1 +acquirebpo.com, 1 acquireit.com.au, 1 acquisition.gov, 1 acquistorealestate.com, 1 @@ -6555,7 +6612,6 @@ actionsack.com, 1 actionsandreactions.com, 1 actionverb.com, 1 -actionviewphotography.com, 1 actiumhealth.com, 1 activat3rs.com, 1 activatenow.com, 1 @@ -6581,8 +6637,8 @@ activespacetech.com, 1 activetk.cf, 1 activetk.jp, 1 +activexperts.com, 1 activeyogi.tk, 1 -actividadesempresa.com, 1 activism.cf, 1 activiteithardenberg.nl, 1 activitesaintnicaise.org, 1 @@ -6613,8 +6669,10 @@ actserv.co.ke, 1 actu-itech.cf, 1 actualadmins.com, 1 +actualidad-rt.com, 1 actualite-videos.com, 1 actualizarapp.com, 0 +actualpost.com, 1 actualprogressivevotersguide.com, 1 actualsizemusic.tk, 1 actualsolutions.am, 1 @@ -6624,6 +6682,7 @@ acuarismo-iquique.tk, 1 acuarius.tk, 1 acuica.co.uk, 0 +acuityfinishing.com, 1 acul.me, 1 aculocity.com, 1 acupofsalt.tv, 1 @@ -6709,6 +6768,7 @@ adamh.us, 1 adamj.eu, 1 adamjoycegames.co.uk, 1 +adamkissee.com, 1 adamkostecki.de, 1 adamlevine.ga, 1 adamliu.net, 0 @@ -6730,7 +6790,6 @@ adamscountypa.gov, 1 adamstas.com, 1 adamsweb.tk, 1 -adamtulis.cz, 1 adamwallington.co.uk, 1 adaoconde.art, 1 adappt.co.uk, 1 @@ -6752,17 +6811,17 @@ adaptyourlifeacademy.com, 1 adarixconsultores.com, 1 adarshcloud.in, 1 -adarshthapa.in, 1 -adarshthapa.net, 1 adarshthapa.org, 1 adarsvidler.me, 1 adasbench.com, 1 adata.kz, 1 adatitleiii.com, 1 adativos.com.br, 1 +adauge.com, 1 adawolfa.cz, 1 adbanker.com, 1 adbexcavation.ca, 1 +adbglobal.com, 1 adblock.ee, 1 adblockextreme.com, 1 adblockextreme.net, 1 @@ -6770,9 +6829,11 @@ adbpub.com, 1 adc64.com, 1 adceuta.tk, 1 +adclickmedia.com, 1 adcnvs.com, 1 add-image.tk, 1 add-ons.co.uk, 1 +add.pics, 1 adda.io, 1 addag.de, 1 addall.com, 1 @@ -6785,6 +6846,7 @@ addict.tk, 1 addictedtolength.co.uk, 1 addictedtotravel.pl, 1 +addictioncounsellors.co.nz, 1 addictiongroup.org, 1 addictionresource.com, 1 addictionsolutionsllc.com, 1 @@ -6813,6 +6875,7 @@ adducation.info, 1 adduono.com, 1 addurls.tk, 1 +addviseo.com, 1 addydari.us, 1 addymail.com, 1 addyourlink.tk, 1 @@ -6823,9 +6886,12 @@ adeex.co.uk, 1 adeex.in, 1 adeex.us, 1 +adeexaustralia.com, 1 adel.lol, 0 +adelaidamountainresidences.ph, 1 adelaidecc.com.au, 0 adelaidecoldlaser.com.au, 1 +adelaidefestivalsquare.com.au, 1 adelaideheritage.net.au, 1 adelapereira.com, 1 adeldz-foot.cf, 1 @@ -6862,7 +6928,9 @@ adf-safetytools.com, 1 adf.gov, 1 adfconsumer.gov.au, 1 +adfinternational.org, 1 adfisicateca.org, 1 +adflegal.org, 1 adfs.pro, 1 adftrasporti.it, 1 adfyl.tk, 1 @@ -6884,6 +6952,7 @@ adhocracy.plus, 1 adi.com.au, 1 adi.net.au, 1 +adiamo.pl, 1 adib.family, 1 adictosdominantescdls.tk, 1 adidas-2020-spring.com, 1 @@ -6892,7 +6961,10 @@ adiehard.party, 0 adiesyndrome.tk, 1 adigolifestyle.com, 1 +adihomes.com, 1 adilsabri.tk, 1 +adimaja.com, 1 +adimo.com.pl, 1 adimplere.com.br, 1 adinaporter.com, 1 adinfinitum.gq, 1 @@ -6901,13 +6973,13 @@ adiraku.co.id, 1 adista.fr, 1 adit.com, 1 -aditro.com, 1 adityatelange.in, 1 adiyamanarackiralama.com, 1 adiyamandanal.com, 1 adiyamanhaberleri.tk, 1 adje-fansite.tk, 1 adjudicating.tk, 1 +adjustablebeds.ca, 1 adjusterpro.com, 1 adjustingoursails.com, 1 adjutor.xyz, 1 @@ -6948,6 +7020,7 @@ adminlinux.pl, 1 admino.cz, 1 adminova.tk, 1 +adminplus.bg, 1 adminresurs.tk, 1 adminrezo.fr, 0 adminton.eu, 1 @@ -6975,6 +7048,7 @@ adonizer.science, 1 adonnante.com, 0 adontenchambers.com, 1 +adoperator.com, 1 adopt.tk, 1 adoptabeehive.co.uk, 1 adoptabeehive.com, 1 @@ -6991,7 +7065,6 @@ adoran.ga, 1 adorecricket.com, 1 adores.gq, 1 -adorewe.com, 1 adorez.tk, 1 adoric.com, 1 adorned.ga, 1 @@ -7002,6 +7075,7 @@ adpesp.org.br, 1 adplist.org, 1 adpost.com, 1 +adpot.xyz, 0 adprofit-plus.com, 1 adquisitio.co.uk, 1 adquisitio.es, 1 @@ -7022,6 +7096,7 @@ adrian-riemer.tk, 1 adrian.web.id, 1 adrian2023.com, 1 +adrianachechikpornstar.com, 1 adrianadelrossi.com, 1 adrianagonzalez.tk, 1 adrianajewelry.my, 1 @@ -7068,6 +7143,7 @@ adsmobilefor.win, 1 adsmodels.com, 1 adsnn.com, 1 +adsolutionsmarket.com, 1 adson.at, 1 adson.cz, 1 adson.de, 1 @@ -7114,6 +7190,7 @@ advaitghaisas.in, 1 advaith.fun, 1 advaith.io, 1 +advaith.link, 1 advaithbot.xyz, 1 advaithnikhi.ml, 1 advaithnikhi.tk, 1 @@ -7122,6 +7199,7 @@ advanced-scribes.com, 0 advancedboilers.com, 1 advancedbotoxclinic.com, 1 +advancedbuildings.com.au, 1 advanceddermmohssurgery.com, 1 advanceddermtribeca.com, 1 advanceddieselspokane.com, 0 @@ -7213,7 +7291,6 @@ advertisment.ga, 1 advertizz.es, 1 advery.tk, 1 -adveszker.hu, 1 advice24.tk, 1 adviceprime.tk, 1 adviesfactuur.nl, 1 @@ -7229,6 +7306,7 @@ advocatburo.tk, 1 advocatealliancegroup.com, 1 advocateanakha.com, 1 +advocatechannel.com, 1 advocatize.com, 1 advocator.ca, 1 advoervice.ga, 1 @@ -7338,15 +7416,14 @@ aegisalarm.com, 1 aegisalarms.co.uk, 1 aegisalarms.com, 1 +aegisolution.com, 1 aegon.hu, 1 aegrel.ee, 1 aeh5134.cc, 1 aeha.tk, 1 -aei.co.uk, 1 aeksantcugat.tk, 1 aeksistem.com, 1 aelgame.com, 1 -aelieve.com, 0 aelintx.com, 1 aelisya.net, 0 aelurus.com, 1 @@ -7368,6 +7445,7 @@ aeradoresgaivota.com.br, 1 aerandir.fr, 1 aeraustral.com.au, 1 +aere.com, 1 aerelon.de, 1 aerelsrl.com, 1 aergia.eu, 1 @@ -7384,6 +7462,7 @@ aeroclub-tolhuin.tk, 1 aeroequity.com, 1 aeroexpress.tk, 1 +aerofarms.com, 1 aeroflot.gq, 1 aeroframe.tk, 1 aeroglass.ml, 1 @@ -7440,18 +7519,18 @@ aethon.com, 1 aethonan.pro, 1 aethopy.ga, 1 +aetmaad.com, 1 aetna-medicareplans.com, 1 aevo-vergleich.de, 1 aevpn.org, 1 aextron.com, 1 aextron.de, 1 aextron.org, 1 +aez-adventures.net, 1 aezw.at, 1 af-clan.tk, 1 af.link, 1 afadvantage.gov, 1 -afafootball.co.th, 1 -afaghhosting.net, 1 afanasev.tk, 1 afanias.org, 1 afas-apps.nl, 1 @@ -7473,6 +7552,7 @@ affairemateriaux.fr, 1 affairs.com, 1 affcreations.com, 1 +affect3dstore.com, 1 affectionate.tk, 1 affektblog.de, 1 affidea.ie, 1 @@ -7489,6 +7569,7 @@ affiliates-psychicsource.com, 1 affiliates.trade, 1 affine.space, 1 +affinipay.com, 1 affinity.co, 1 affinity.com, 1 affinity.vc, 1 @@ -7537,6 +7618,7 @@ aficionados.com.br, 1 afilio.de, 1 afinadoronline.com.br, 1 +afinancehub.com, 1 afinaudio.com, 1 afinterio.com, 1 afishablogs.tk, 1 @@ -7546,7 +7628,6 @@ aflam-online.tk, 1 aflattr.com, 1 aflebedevo.tk, 1 -afoikrali.gr, 1 afonso.io, 1 aforadearrastu.tk, 1 aforism.tk, 1 @@ -7575,6 +7656,7 @@ africaone-publishing.com, 1 africaricecenter.org, 1 afrijet.ga, 1 +afrilatest.com, 1 afrimarket.ci, 1 afrique.buzz, 1 afriregister.ci, 1 @@ -7603,6 +7685,7 @@ afterfostercare.tk, 1 afterhate.fr, 1 afterhoursglass.com.au, 1 +aftermagic.com, 1 afternoonhereyes.tk, 1 afteroblivion.tk, 1 afterpay.com, 1 @@ -7619,19 +7702,15 @@ afwd.international, 1 afxsoft.ml, 1 afzetbak.nl, 1 -ag000.com, 1 ag018.cc, 1 ag066.vip, 1 -ag11.net, 1 ag123.la, 1 -ag138.com, 1 ag13842.com, 1 ag1386.com, 1 ag158.cc, 0 ag1603.com, 0 ag1604.com, 1 ag1607.com, 1 -ag166.com, 1 ag2.app, 1 ag2776.com, 1 ag2821.com, 1 @@ -7640,13 +7719,11 @@ ag3232g.com, 1 ag3792.com, 1 ag388.vip, 1 -ag393.com, 1 ag399.vip, 1 ag4.app, 0 ag518518.net, 1 ag5369.com, 1 ag5373.com, 1 -ag556.com, 1 ag5623.com, 1 ag5761.com, 1 ag5767.com, 1 @@ -7668,7 +7745,6 @@ ag68ks.com, 1 ag69000.com, 1 ag72.vip, 1 -ag775.com, 1 ag8-game.com, 1 ag8.email, 1 ag8.im, 1 @@ -7678,21 +7754,15 @@ ag806.tv, 1 ag80808.com, 1 ag80880.com, 1 -ag812.com, 1 ag812.tv, 1 -ag816.com, 1 ag818.net, 1 ag819.tv, 1 ag82011.vip, 1 ag82018.cc, 1 ag82018.com, 1 -ag821.com, 1 -ag822.com, 1 ag8400.com, 1 ag8500.com, 1 -ag860.com, 1 ag8600.com, 1 -ag865.com, 1 ag88.com, 1 ag880.win, 1 ag8808.com, 1 @@ -7709,29 +7779,21 @@ ag88dc22.com, 1 ag88ks.com, 1 ag89000.com, 1 -ag891.com, 1 ag898.cc, 1 -ag899.com, 1 ag8vip.com, 1 ag9.im, 1 -ag905.com, 1 -ag908.com, 1 ag9100.com, 1 ag918.cc, 1 ag918.co, 1 ag918.top, 1 ag96.win, 1 -ag961.com, 1 ag9757.com, 1 ag9773.com, 1 ag98.tv, 0 ag9800.com, 1 ag9815.com, 1 -ag983.com, 1 ag9835.com, 1 ag98ks.com, 1 -ag992.com, 1 -ag995.com, 1 ag9999.co, 1 ag9ks.com, 1 ag9vip.com, 1 @@ -7750,7 +7812,6 @@ agalloch.tk, 1 agambition.eu, 1 agamsecurity.ch, 0 -agape24-7.com, 1 agapelove.tk, 1 agar.kr, 1 agargiulo.com, 1 @@ -7801,13 +7862,12 @@ agenciacolors.com.br, 1 agenciacolors.digital, 1 agenciacorujadesign.com.br, 1 -agenciaempleo.tk, 1 agenciafiscal.pe, 1 agenciaingenium.cl, 1 agenciaonnmarketing.com, 1 agenciaplanner.com.br, 1 +agenciarse.com, 1 agenciarubik.com, 1 -agenciaspaces.com.br, 1 agencja-interaktywna.ga, 1 agencja-interaktywna.tk, 1 agencxy.ga, 1 @@ -7859,6 +7919,7 @@ aggressionpvp.com, 1 aggressivecarwraps.com, 1 aghayeva-edler.de, 1 +aghighgraphic.ir, 1 aghtas.com, 1 agiairini.cz, 1 agic-geneve.ch, 1 @@ -7875,7 +7936,6 @@ agilee.io, 1 agilepeopleopsframework.com, 1 agileui.com, 0 -agiley.se, 1 agilicus.ca, 1 agilicus.com, 1 agility-westvlaanderen.tk, 1 @@ -7935,11 +7995,13 @@ agks90.com, 0 agks92.com, 1 agktest1.ga, 1 +aglar.com.ec, 1 aglar.tk, 1 agleventis.com, 1 aglow.nl, 1 aglowiditsolutions.com, 1 agm4545.com, 1 +agmarvels.com, 1 agmuscle.com, 1 agnconnect.com, 1 agnesk.blog, 1 @@ -7950,7 +8012,6 @@ agnosticism.tk, 1 agnusbostel.tk, 1 agocs.me, 1 -agonpro.ch, 1 agonworks.com, 1 agoodnews.com, 1 agora-energiewende.de, 1 @@ -7962,6 +8023,7 @@ agoracupom.com.br, 1 agoradanza.tk, 1 agoradesk.com, 1 +agorapulse.com, 1 agoratek.fr, 1 agoraviagem.com.br, 1 agoravm.tk, 1 @@ -7982,7 +8044,6 @@ agouralandscapelighting.com, 1 agouralighting.com, 1 agouraoutdoorlighting.com, 1 -agowa338.de, 1 agpideas.com, 1 agpp.net, 1 agpsn.com, 1 @@ -8007,9 +8068,9 @@ agricult.tk, 1 agricultural-technology.tk, 1 agriculture-schools.com, 1 -agriculture.vic.gov.au, 1 agrifoglio.com, 1 agrifoodtoday.it, 1 +agrifutures.com.au, 1 agrigentonotizie.it, 1 agrikulturchic.com, 1 agripartner.fr, 1 @@ -8019,10 +8080,12 @@ agriresearch.tk, 1 agrish.tk, 1 agrisicilia.it, 0 +agrisimoes.pt, 1 agro-dom.solutions, 1 agro-ferma.tk, 1 agro-forestry.net, 1 agro-market24.ru, 1 +agrobank.uz, 1 agrobase.uz, 0 agrobaza.com.ua, 1 agrocare.tk, 1 @@ -8103,7 +8166,7 @@ ahealthyjourney.ca, 1 ahegaoroulette.com, 1 ahelos.tk, 1 -ahenkerp.com, 1 +ahero4all.org, 1 ahg-offices.fr, 1 ahhcomfortshoes.com, 1 ahidta.gov, 1 @@ -8121,6 +8184,7 @@ ahlsenutbildning.se, 1 ahlz.sk, 1 ahm.com.au, 1 +ahmad.space, 1 ahmad.works, 1 ahmadfathy.ml, 1 ahmadjakfar.tk, 1 @@ -8145,15 +8209,16 @@ ahoj.email, 1 ahoj.hu, 1 ahollamby.com, 1 +ahomeconcept.com, 1 ahorasalud.com, 1 ahornblatt.org, 1 +ahosamuel.com, 1 ahosi.com, 1 ahqf.com, 1 ahroproject.org, 1 ahrora.com, 1 ahrq.gov, 1 ahs.com, 1 -ahsanautos.pk, 1 ahsinsaleem.tk, 1 ahstrem.com, 1 ahswarranty.com, 1 @@ -8193,7 +8258,6 @@ aibot.tk, 1 aibsoftware.mx, 1 aibuz.org, 1 -aicamilwaukee.com, 1 aiccc.com.au, 1 aiccon.id, 1 aiccorp.com, 1 @@ -8219,7 +8283,6 @@ aide-hebergement.ca, 1 aide-valais.ch, 1 aide.com, 1 -aiden.cool, 0 aiden.link, 0 aidenashleypornstar.com, 1 aidenlx.top, 1 @@ -8229,6 +8292,7 @@ aiding.com, 1 aidliveers.ga, 1 aido.gq, 1 +aidoc.com, 1 aidong.com, 1 aidoru.net, 1 aids-dissidents.tk, 1 @@ -8291,7 +8355,6 @@ aimdigital.tk, 1 aimeeandalec.com, 1 aimeisi.com, 1 -aimerworld.com, 0 aimgroup.co.tz, 1 aiminet.com, 1 aimless.tk, 1 @@ -8300,6 +8363,7 @@ aimotive.com, 1 aimplas.com, 1 aimrom.org, 1 +aina.moi, 1 ainaishi.com, 1 ainamoroms.com, 1 ainfographie.com, 1 @@ -8317,13 +8381,17 @@ aiom.tk, 1 aion-beritra.fr, 0 aiosetups.com, 1 +aiot.pw, 1 aip.ai, 1 aipbarcelona.com, 1 aipcardio.ai, 1 aipcardio.com, 1 +aipcardio.hu, 1 aipdemos.com, 1 aipderm.ai, 1 aipderm.com, 1 +aipderm.hu, 1 +aipderm.sk, 1 aiphyron.com, 1 aipi.at, 1 aipi.ch, 1 @@ -8427,6 +8495,7 @@ airburners.com, 1 airbusters.com, 1 aircareair.tk, 1 +aircash.eu, 1 aircgroup.ru, 1 aircharteradvisors.com, 1 airchartervirginislands.com, 1 @@ -8435,13 +8504,16 @@ aircleansystems.com, 1 aircomet.tk, 1 aircompressormachine.com, 1 +airconditioning-centurion.co.za, 1 airconditioning.tk, 1 airconditioningcondensers.tk, 1 -airconditioningmidrand.co.za, 1 +airconditioningkemptonpark.co.za, 1 +airconditioningreplacementservice.com, 1 +airconditioningsandton.co.za, 1 +airconditioningservicingpretoria.co.za, 1 airconrandburg.co.za, 1 airconsboksburg.co.za, 1 airconsfourways.co.za, 1 -airconsrandburg.co.za, 1 airconuncle.sg, 1 aircraft-database.com, 1 aircraftnoisemodel.org, 1 @@ -8703,6 +8775,7 @@ airport-car-rental.tk, 1 airport-charlotte.com, 1 airportairline.com, 1 +airportal.cn, 1 airportbarking.eu, 1 airportcdgparis.com, 1 airportcoc.cf, 1 @@ -8719,6 +8792,7 @@ airportinrome.com, 1 airportknoxville.com, 1 airportlas.com, 1 +airportlimototoronto.com, 1 airportnigeria.com, 1 airportnz.com, 1 airportofdubai.com, 1 @@ -8733,7 +8807,6 @@ airportstockholm.com, 1 airportstuttgart.com, 1 airporttaxibudapest.com, 0 -airporttour.com, 1 airporttransferbudapest.co.uk, 0 airporttransferbudapest.com, 0 airportturkey.com, 1 @@ -8752,6 +8825,7 @@ airseatac.net, 1 airship.com, 1 airship.eu, 1 +airsial.com, 1 airskystore.com, 1 airslate.com, 1 airsoft.ch, 1 @@ -8764,6 +8838,7 @@ airtable.com, 1 airtame.cloud, 1 airtec-france.fr, 1 +airtel.co.tz, 1 airtel.com.ng, 1 airterms.cf, 1 airticketstravel.com, 1 @@ -8829,6 +8904,7 @@ aizxxs.net, 1 aj-laixada.tk, 1 aja.de, 1 +ajansmanisa.com, 1 ajansseo.com, 1 ajapplegatepornstar.com, 1 ajarope.com, 1 @@ -8840,7 +8916,6 @@ ajaxfansite.tk, 1 ajaxfansonly.tk, 1 ajaxforever.tk, 1 -ajaxified.com, 1 ajaxmasterdam.tk, 1 ajaxmfs.com, 1 ajaxnetwerk.tk, 1 @@ -8863,6 +8938,7 @@ ajinabraham.com, 1 ajl.io, 1 ajman-realty.ga, 1 +ajmanded.com, 1 ajmanepay.ae, 1 ajmanpay.gov.ae, 1 ajmansewerage.ae, 1 @@ -8878,7 +8954,6 @@ ajsb85.com, 1 ajscred.online, 1 ajt.io, 1 -ajutor.tk, 1 ajvandeven.com, 1 ajvco.com.hk, 1 ajvco.net, 1 @@ -8911,6 +8986,7 @@ akamu.de, 1 akaoma.com, 1 akaratasker.com, 1 +akari.net, 1 akarisoftware.com, 1 akaritakai.net, 1 akaritaste.ch, 1 @@ -8961,7 +9037,6 @@ akijo.de, 1 akikat.tk, 1 akilli-devre.com, 1 -akillitelefon.com, 1 akimeder.tk, 1 akimitsu.co.jp, 1 akinavn.vn, 1 @@ -8973,11 +9048,11 @@ akita-stream.com, 1 akita.cloud, 1 akitacyber.com, 1 -akito.moe, 1 akiyama.website, 1 akiym.com, 1 akj.io, 1 akkerwinde.tk, 1 +akko.wtf, 1 akkordy-skachat.ga, 1 akkorturizm.com, 1 akl.city, 1 @@ -9000,6 +9075,7 @@ akr.services, 1 akracing.se, 1 akramvet.tk, 1 +akrasa.com.au, 1 akrep.com, 1 akrilikhavuz.com, 1 akritikos.info, 1 @@ -9017,6 +9093,7 @@ akshavitrends.com, 1 akshay.in.eu.org, 1 akshit.me, 0 +aksnwn.com, 1 aksot.com, 1 akssma.com, 1 akszita.com, 1 @@ -9063,8 +9140,10 @@ al-monitor.com, 1 al-pres.com, 1 al-salam.tk, 1 +al-wood.it, 1 al-yawm.ga, 1 al2schaos.tk, 1 +al3abmizo.com, 1 al3ilm.com, 1 al3ilm.net, 1 al3xpro.com, 1 @@ -9118,9 +9197,9 @@ alambazarmath.tk, 1 alambique.tk, 1 alamen.site, 1 -alamitosbaytraders.com, 1 alamo-analytics.com, 1 alamowellnessalliance.com, 1 +alan-lam.co.uk, 1 alan-turnbull.co.uk, 1 alana.com.ua, 1 alanberger.me.uk, 0 @@ -9172,6 +9251,7 @@ alaturkaonline.com, 1 alaunus.com, 1 alavieestbelle.be, 1 +alazaherah.net, 1 alb-flirt.de, 1 alb-media.tk, 1 albaadani.com, 1 @@ -9193,6 +9273,7 @@ albaniaonline.tk, 1 albanien.tk, 1 albanildedios.tk, 1 +albanmaire.com, 1 albanskpaskhare.tk, 1 albanyca.gov, 1 albanylaser.ca, 1 @@ -9218,7 +9299,6 @@ albertify.xyz, 1 albertofarina.tk, 1 albertolopezaroca.tk, 1 -albertonplumber24-7.co.za, 1 albertosobrino.tk, 1 albertovr.com, 1 albertovr.net, 1 @@ -9227,8 +9307,8 @@ albertspahiu.tk, 1 albeso.ml, 1 albhof-wasserfall.de, 1 +albi-tourisme.fr, 1 albilaga.id, 1 -albinma.com, 0 albinonderdelen.nl, 1 albinvega.tk, 1 albion2.org, 1 @@ -9312,6 +9392,7 @@ aldo-saputra.ga, 1 aldo-shop.tk, 1 aldomedia.com, 1 +aldorlocal.gov, 1 aldorr.net, 0 aldous-huxley.com, 1 aldridge-ringers.tk, 1 @@ -9332,6 +9413,7 @@ alega.com.br, 1 alegriafm.tk, 1 alegromania.tk, 1 +alehinta.fi, 1 alejandrocruz.es, 1 alejandromateoconde.tk, 1 alejandromoda.com, 1 @@ -9360,9 +9442,11 @@ alenaserezhina.cf, 1 alenbadel.com, 1 alendronate.gq, 1 +alenvlahovljak.com, 1 alenwich.com, 1 aleph.land, 1 alephindia.in, 1 +aleragroup.com, 1 alerbon.net, 1 aleromtrowbank.tk, 1 alerque.com, 1 @@ -9370,7 +9454,9 @@ alertaenlinea.gov, 1 alertboxx.com, 1 alertes.biz, 1 +alertlogic.com, 1 alertmedia.com, 1 +alertoc.gov, 1 alerts.sg, 1 alertsclk.com, 1 alertwire.com, 1 @@ -9406,6 +9492,7 @@ alexander.dk, 1 alexanderb.info, 1 alexanderbernitz.eu, 1 +alexandererber.com, 1 alexanderg.tk, 1 alexanderjshapiro.com, 1 alexanderkhen.tk, 1 @@ -9425,6 +9512,7 @@ alexandraschmidt.coach, 1 alexandrastrauss.fr, 1 alexandrawett.net, 1 +alexandrawett.org, 1 alexandre-acaries.fr, 1 alexandreguarita.com.br, 1 alexandremottier.tk, 1 @@ -9438,6 +9526,7 @@ alexarthur.net, 1 alexauto.tk, 1 alexberts.ch, 1 +alexblanck.com, 1 alexblock.io, 1 alexbogovich.com, 0 alexbosch.net, 1 @@ -9468,6 +9557,7 @@ alexismeza.com.mx, 1 alexismeza.dk, 1 alexismeza.es, 1 +alexisparcellsmd.com, 0 alexispoficial.tk, 1 alexisquero.tk, 1 alexisshaw.com, 1 @@ -9500,7 +9590,7 @@ alexschokker.tk, 1 alexschroeder.ch, 1 alexsergeyev.com, 1 -alexsexton.com, 1 +alexsexton.com, 0 alexstudio.tk, 1 alextaffe.com, 1 alexthayne.co.uk, 1 @@ -9516,6 +9606,7 @@ aleymedya.ga, 1 aleymedya.gq, 1 aleymedya.ml, 1 +aleynadavetiye.com, 1 aleynamasajsalonu.gq, 1 alfa-auto.tk, 1 alfa-books.ga, 1 @@ -9553,6 +9644,7 @@ alforto.nl, 0 alfratehotelcampiglio.it, 1 alfred-figge.de, 1 +alfred.co.in, 1 alfredapp.com, 1 alfredlin015.com, 1 alfredo-misael.tk, 1 @@ -9565,6 +9657,7 @@ algbee.com, 1 algbra.com, 1 algebra-quiz.com, 1 +algebraenterprises.com, 1 algercounty.gov, 1 algerianportal.tk, 1 algeriaweb.tk, 1 @@ -9575,6 +9668,7 @@ alghubaibatours.com, 0 algoarmada.com, 1 algoentremanos.com, 1 +algoexplorer.io, 1 algofactory.de, 1 algolia.com, 1 algonaiowa.gov, 1 @@ -9583,6 +9677,7 @@ algorithmic.ml, 1 algorithmofsuccess.com, 1 algoritm.gq, 1 +algoritmika.org, 1 algoritmususpechu.cz, 1 algorytm.tk, 1 alhakim.com, 1 @@ -9630,6 +9725,7 @@ alidanbao.com, 1 aliefirfany.com, 1 alieke.design, 1 +aliel.fr, 1 alien-life.tk, 1 alien.net.au, 1 alienantfarm.tk, 1 @@ -9644,6 +9740,7 @@ alienstat.com, 1 alienstatsers.ga, 1 aliexfantaisies.com, 1 +aliexpressed.com, 1 alifan.tk, 1 alifeadjacent.com, 1 alifnasiya.uz, 1 @@ -9679,6 +9776,7 @@ alimentsduquebecaumenu.com, 1 alimenty.tk, 1 alimeta.it, 1 +alimonyattorney.net, 1 alimwilliams.tk, 1 alinalamour.com, 1 alinasmusicstudio.com, 1 @@ -9688,6 +9786,7 @@ alinecordeiro.adv.br, 1 alineonline.tk, 1 alinode.com, 1 +alio.lt, 1 aliorange.com, 1 aliosmanyuksel.com.tr, 1 alipad.com, 1 @@ -9716,10 +9815,11 @@ alitalk.com, 1 alitec.it, 1 alitpedia.ga, 1 +alittledelightful.com, 1 alitudi.com, 1 alitv.com, 1 -aliud.be, 1 aliv.biz, 1 +alivecast.co.jp, 1 alix-board.de, 1 aliyasin.org, 1 alizah.id, 1 @@ -9795,6 +9895,7 @@ allaboutswing.com, 1 allabouttechh.tk, 1 allaboutthekink.org, 1 +allaboutyouspa.co.uk, 1 allaccessglobal.tech, 1 allactioneventhire.co.uk, 1 allactionsecurity.com, 1 @@ -9859,7 +9960,6 @@ alldrives.tk, 1 alle-zonvakanties.nl, 1 alle.bg, 1 -alle.com, 1 allefrisuren.de, 1 alleganyco.gov, 1 allegiancemd.com, 1 @@ -9887,6 +9987,7 @@ allencountykentucky.gov, 1 allendalecounty.gov, 1 allensun.org, 1 +allentertainment.de, 0 allentherapeuticmassage.com, 1 allenturley.com, 1 allenwillis.ga, 1 @@ -9904,6 +10005,7 @@ alles-nur-ge.cloud, 1 alles.cx, 1 allesisgezondheid.nl, 1 +allesisonline.nl, 1 alleskan.gent, 1 alleskomtgoed.org, 1 allesley.com, 1 @@ -9916,7 +10018,6 @@ allesuitdekast.be, 1 allesvoorbeton.be, 1 allesvoorniets.tk, 1 -alletattoo.de, 1 allevamentoticinella.tk, 1 allexpress.su, 1 alleyread.com, 1 @@ -9955,6 +10056,8 @@ alliance-psychiatry.com, 0 allianceairlinesflights.com, 1 allianceautomation.com.au, 1 +alliancebank.com, 1 +allianceblock.io, 1 allianceforafreesociety.com, 1 allianceforafreesociety.net, 1 allianceguide.com, 1 @@ -9962,12 +10065,13 @@ alliances-globalsolutions.com, 0 allianskyrkan.se, 1 allianz-pro-schiene.de, 1 +allianzdirect.com, 1 allianzdirect.de, 1 allianzdirect.it, 1 allianzdirect.nl, 1 alliedmedia.org, 1 allier-vichy-moulins-expert-comptable.fr, 1 -allinclusiveoutlet.com, 1 +alliiertenmuseum.de, 1 allincoin.shop, 1 allindiacityguide.com, 1 allindiajobs.ga, 1 @@ -9995,6 +10099,7 @@ allmba.cf, 1 allmemy.com, 0 allmen.tk, 1 +allmendenetz.de, 1 allmessedup.tk, 1 allmobilenews.tk, 1 allmousepads.com, 1 @@ -10004,11 +10109,11 @@ allnovosibirsk.tk, 1 allns.fr, 1 allnumis.com, 1 -allnutritionrd.com, 1 allo-credit.ch, 0 allo-luxembourg.tk, 1 allofthestops.com, 1 allohol.de, 1 +alloldpics.com, 1 allontanamentovolatili.it, 1 allontanamentovolatili.milano.it, 1 alloprof.qc.ca, 1 @@ -10021,7 +10126,6 @@ allpatch.com, 1 allpedia.tk, 1 allphaseclean.com, 1 -allphptricks.com, 1 allpinouts.org, 1 allplayer.tk, 1 allpointsblog.com, 1 @@ -10030,9 +10134,10 @@ allpornvids.com, 1 allprices.world, 1 allprints.tk, 1 -allpropertyservices.com, 0 +allpropertyservices.com, 1 allproptonline.com, 1 allpussynow.com, 1 +allquakes.com, 1 allrad-buck.de, 1 allram.info, 1 allreptiles.tk, 1 @@ -10054,8 +10159,10 @@ allseasonswaterproofing.com, 1 allset.ml, 1 allshapes.co.nz, 1 +allshopbiz.com, 1 allshousedesigns.com, 0 allsmart.gr, 1 +allsoftfree.com, 1 allsoulinc.com, 1 allsoulmobile.com, 1 allsouls.co.za, 1 @@ -10069,6 +10176,7 @@ allstatedealerservices.com, 1 allsun.online, 1 allsurpl.us, 1 +allsurplus.com, 1 allsync.com, 1 allsync.nl, 1 alltak.com, 1 @@ -10146,6 +10254,7 @@ almatybusiness.gov.kz, 1 almatytips.com, 1 almayadeen.education, 1 +almayoreo.com.co, 1 almaz-host.ml, 1 almaz-host.tk, 1 almaz-sait-rp.ml, 1 @@ -10160,6 +10269,7 @@ almette.pl, 1 almhtnews.com, 1 almi.cz, 1 +almicroinstruments.com, 1 almirall.com, 1 almiriatechstore.co.ke, 1 almisnedrm.com, 1 @@ -10198,6 +10308,7 @@ alohotel.com, 1 alohotelorange.com, 1 alohotels.com, 1 +alojamientos-cuba.com, 1 alola.co.uk, 1 alolabor.org, 1 alomch.gq, 1 @@ -10211,7 +10322,6 @@ alonsoluzgas.es, 1 aloo.ga, 1 aloop.cloud, 1 -alopocos.com, 1 alorica.com, 1 aloris-controle.fr, 1 aloro.io, 1 @@ -10294,10 +10404,10 @@ alphaperfumes.com.br, 1 alphapoker.ru, 1 alpharail.se, 1 +alpharettaga.gov, 1 alpharoofga.com, 1 alpharotary.com, 1 alphasall.com, 0 -alphasib.ru, 1 alphasoft-i.net, 1 alphasolartech.com, 1 alphassl.de, 1 @@ -10316,6 +10426,7 @@ alphipneux.fr, 1 alpholiday.it, 1 alphotelmilano.it, 1 +alpilean.com, 1 alpinar.tk, 1 alpine-holiday.de, 1 alpine-tuning.de, 1 @@ -10326,6 +10437,7 @@ alpineplanet.com, 1 alpinepubliclibrary.org, 1 alpinestarmassage.com, 1 +alpinewy.gov, 1 alpinisti.com, 1 alplogopedia.it, 1 alpparts.com, 1 @@ -10333,6 +10445,7 @@ alquiler-de-furgonetas.tk, 1 alquran-online.tk, 1 alrait.com, 1 +alrawdhawaterproofing.com, 1 alre-outillage.fr, 1 alrehmantech.tk, 1 alrioart.com, 1 @@ -10340,6 +10453,7 @@ alroniks.com, 0 alsaagency.tk, 1 alsabil.tk, 1 +alsace-informatique.shop, 1 alsetat.com, 1 alshabab.tk, 1 alshamil.tk, 1 @@ -10455,8 +10569,8 @@ altisnet.ga, 1 altissia.org, 1 altitude-dev.com, 1 -altiup.ch, 1 -altiup.com, 1 +altiup.ch, 0 +altiup.com, 0 altius-europe.com, 1 altius.co.uk, 1 altius.com.pa, 1 @@ -10552,6 +10666,7 @@ alwaysmine.fi, 1 alwaysonssl.com, 1 alwiam.info, 1 +alwib.net, 1 alwistra.eu, 1 alwuz.com, 1 alxclub.tk, 1 @@ -10599,10 +10714,11 @@ ama.com.au, 1 ama.ne.jp, 1 amabiligranilhas.com, 1 +amac.tv, 1 amaderforum.tk, 1 amadeusproject.cf, 1 amadin.tk, 1 -amadispa.com.br, 1 +amadispa.com.br, 0 amadoraslindas.com, 1 amadvice.com, 1 amaeruinc.com, 1 @@ -10629,6 +10745,7 @@ amandaworldstudies.com, 1 amanduscommunication.com, 1 amanet.ro, 1 +amango.se, 1 amani-kinderdorf.de, 1 amanmerceria.com, 1 amansinghbhogal.com, 0 @@ -10642,6 +10759,7 @@ amaresq.com, 1 amargura.com, 1 amarilio.com.mx, 1 +amarillosquare.com, 1 amarilys.com, 1 amarinbabyandkids.com, 1 amaris.com, 1 @@ -10654,17 +10772,16 @@ amaruddinmufid.com, 1 amaruz.tk, 1 amarylis.com, 1 -amas.sd, 1 amasea.yachts, 1 amasing.tk, 1 amateri.com, 1 amateur-boxing.tk, 1 +amateur.cash, 1 amateur.cf, 1 amateur101.tk, 1 amateureuro.com, 1 amateurplayerstour.com, 1 amateurpornhours.com, 1 -amateurprospog.com, 1 amateurradionotes.com, 1 amateurs.ga, 1 amateurs.gq, 1 @@ -10683,6 +10800,7 @@ amavo.tk, 1 amaxautomotive.com.au, 1 amazcareer.com, 1 +amazcode.ooo, 1 amazdriver.com, 1 amazefabrics.com, 1 amazetimberfurniture.com.au, 1 @@ -10691,6 +10809,7 @@ amazinations.com, 1 amazing-cars98.tk, 1 amazing-castles.co.uk, 1 +amazingpetshere.com, 1 amazingraymond.com, 1 amazingraymond.com.au, 1 amazingribs.com, 1 @@ -10716,8 +10835,10 @@ ambassify.com, 1 ambassify.eu, 1 ambc.es, 1 +amber-teething-necklace.com, 1 amberalert.gov, 1 amberba.tk, 1 +amberesdetective.be, 1 amberhouse.cf, 1 amberhouse.ga, 1 amberhouse.gq, 1 @@ -10781,6 +10902,7 @@ ameego.org, 1 ameeradubai.com, 1 amees.me, 0 +ameeventos.pt, 1 ameho.me, 0 ameinteriores.pt, 1 ameisenbaer.tk, 1 @@ -10960,6 +11082,7 @@ amitriptyline25mg.cf, 1 amitriptylineonline.tk, 1 amitt.ga, 1 +amityvillepdny.gov, 1 amitywebsitedesign.com, 1 amiv.ch, 1 amjaadabdullah.com, 1 @@ -11007,6 +11130,7 @@ amoralizm.tk, 1 amoraquatropatas.org, 1 amordetelas.com, 1 +amordoce.com, 1 amorfestival.com, 1 amorgos-aegialis.com, 1 amorgosrentandgo.gr, 1 @@ -11069,6 +11193,7 @@ amr.de, 1 amrcaustin.com, 1 amrcla.com, 1 +amrealtypr.com, 1 amref.org, 1 amrff.com, 1 amrita.cafe, 1 @@ -11084,6 +11209,7 @@ amsmart.hu, 1 amsochile.cl, 1 amstat.org, 1 +amstelland.com, 1 amstelradio.tk, 1 amstelveentje.nl, 1 amsterdam.nl, 1 @@ -11094,7 +11220,6 @@ amsterdamtypography.nl, 1 amsuisse.com, 0 amt-taxfrance.com, 1 -amtentertainments.co.uk, 1 amtheone.com, 1 amtrakoig.gov, 1 amule.cf, 1 @@ -11109,8 +11234,10 @@ amur.tk, 1 amusa.cl, 1 amuzante.com, 1 +amva.it, 1 amvip9.com, 1 amvisualgraphics.com, 1 +amway.com.mx, 1 amwine.ru, 1 amxm.aero, 1 amxpj888.com, 0 @@ -11134,9 +11261,10 @@ amznworks.com, 1 an-alles-gedacht.de, 1 an.edu, 1 -an0ns.ru, 1 +an0ns.ru, 0 an0ns.tk, 1 an1.life, 1 +an7hrax.se, 1 anaal-nathrakh.tk, 1 anaaldea.tk, 1 anaalmeisjes.tk, 1 @@ -11157,6 +11285,7 @@ anachronaeon.tk, 1 anachronis.gq, 1 anacom.pt, 1 +anacron.pl, 1 anacruz.es, 1 anadiuvo.fi, 1 anaelog.com.au, 1 @@ -11167,6 +11296,7 @@ anagir.tk, 1 anagramma.tk, 1 anahitascribe.tk, 1 +anahtarfikir.com, 0 anahwaftah.ga, 1 anaiscoachpersonal.es, 1 anaisfae.art, 1 @@ -11174,6 +11304,7 @@ anakart.tk, 1 anakin.ca, 1 anakliarmalam.ml, 1 +anaktoro-chat.gr, 1 analbabsi.com, 1 analebear.com, 1 analgesia.ga, 1 @@ -11189,9 +11320,13 @@ analogfreeers.ga, 1 analogical.ga, 1 analogist.net, 1 +analogman.com, 1 +analottery.com, 1 +analotto.com, 1 analpantyhose.org, 1 -analvision.com, 1 +analpics.com, 1 analystexamers.ga, 1 +analysts.com, 1 analytics-media.com, 1 analytics-shop.com, 1 analyticsinmotion.com, 1 @@ -11207,7 +11342,6 @@ anamterminal.tk, 1 ananas.gq, 1 ananasposter.ru, 1 -anandchowdhary.com, 1 anangeix.tk, 1 anankecosmetics.com, 1 anantshri.info, 1 @@ -11218,6 +11352,7 @@ anar.biz, 1 anarajaoui.ma, 1 anarcasmetalicos.tk, 1 +anarchapulco.com, 1 anarchie-in-lippe.tk, 1 anarchie.tk, 1 anarchista.top, 1 @@ -11293,6 +11428,7 @@ anconatoday.it, 1 ancroma.ro, 1 anctm.com, 1 +ancuong.com, 1 ancusrd.com, 1 and-stuff.nl, 1 and.com, 0 @@ -11302,7 +11438,6 @@ andaluciaboard.tk, 1 andalusiaal.gov, 1 andantepiano.studio, 1 -andefang.com, 1 andel.info, 0 anders.hamburg, 1 andersen.it, 1 @@ -11370,7 +11505,6 @@ andreashartmann.net, 1 andreashellkvist.tk, 1 andreasjanker.de, 1 -andreaskloebl.at, 1 andreaskluge.eu, 1 andreaskrasa.com, 1 andreaslicht.nl, 1 @@ -11388,12 +11522,13 @@ andrehartensveld.tk, 1 andrehazeswinactie.nl, 1 andrei-nakov.org, 1 +andreichira.ro, 1 +andreihodorog.com, 1 andreina-atencio.com, 1 andrejbenz.com, 1 andrejstefanovski.com, 1 andremaciel.pt, 1 andrematosband.tk, 1 -andreo.ch, 0 andreoliveira.io, 1 andreotti-furniture.com, 1 andrepicard.de, 1 @@ -11485,7 +11620,6 @@ androidmarket.gq, 1 androidmarketturkiye.tk, 1 androidmax.tk, 1 -androidmovile.com, 1 androidnovinky.cz, 1 androidphones.ga, 1 androidplay.tk, 1 @@ -11535,6 +11669,7 @@ andyt.eu, 1 andythomasonline.tk, 1 andythomsonbooks.ca, 1 +andytownsendphotography.com, 1 andytsoi.nyc, 1 andyvandermeyde.tk, 1 andyveal.com, 1 @@ -11542,7 +11677,6 @@ andywilliamsonline.tk, 1 andzia.art.pl, 1 aneamia.com, 1 -anebel.com, 1 anecuni-club.com, 1 anecuni-rec.com, 1 anedot-sandbox.com, 1 @@ -11553,7 +11687,7 @@ anegabawa.com, 0 anehost.com, 1 anehtaconseil.com, 1 -anekatempatwisata.com, 0 +anekatempatwisata.com, 1 anekdot-pr.tk, 1 anekdotik.tk, 1 anekdotiki.tk, 1 @@ -11610,6 +11744,7 @@ angeloangioi.tk, 1 angelok.ru, 1 angeloroelen.tk, 1 +angelpowwow.com, 1 angelremigene.com, 0 angelsanctum.tk, 1 angelsandairwaves.tk, 1 @@ -11635,6 +11770,7 @@ angermanalvorna.tk, 1 angesehen.com, 1 angestoepselt.de, 1 +angie-webdesign.ch, 1 angiejones.com, 1 angielynx.net, 1 angiesite.tk, 1 @@ -11703,7 +11839,6 @@ anihonetwallpaper.com, 1 anikabyaabi.com, 1 anikaras.ga, 1 -anikaras.ml, 1 anikschwall.com, 1 anilasansor.com, 1 anillosdecompromiso.co, 1 @@ -11717,6 +11852,7 @@ animaemundi.be, 0 animal-clothing.com, 1 animal-liberation.com, 1 +animal-paris.fr, 1 animal-rights.com, 1 animal-world.cf, 1 animal-world.tk, 1 @@ -11755,7 +11891,6 @@ animari.eu, 1 animasencia.tk, 1 animashka.tk, 1 -animata.tk, 1 animataz.ga, 1 animate.de, 1 animazul.tk, 1 @@ -11836,6 +11971,7 @@ animewallpapers.tk, 1 animixplays.net, 1 animmouse.com, 1 +animonda.de, 1 animotica.com, 1 animoxavilorza.tk, 1 aninews.tk, 1 @@ -11843,6 +11979,7 @@ anipassion.com, 0 aniplus.cf, 1 aniplus.gq, 1 +anishnayak.com, 1 anisimov.ml, 1 anisotomatikkapi.com, 1 aniss.com, 1 @@ -11857,6 +11994,7 @@ aniviasport.store, 1 anivideo.com, 1 anivision.tk, 1 +aniwatch.me, 1 aniwhen.com, 1 aniya.moe, 1 anja-vastgoed.nl, 1 @@ -11869,19 +12007,27 @@ anjoola.com, 1 ankam.com, 1 ankane.org, 1 +ankaraarabakiralama.com.tr, 1 ankaraarabakiralama.name.tr, 1 ankaraarackiralama.name.tr, 1 ankaraciftkabin.com, 1 +ankaracikma.com.tr, 1 +ankaracikmaparca.com.tr, 1 ankaradaozelders.tk, 1 ankaraevdenevenakliyat.name.tr, 1 +ankarafiziktedavimerkezi.com.tr, 1 +ankarajeneratorkiralama.com.tr, 1 ankarakart.com.tr, 1 ankarakurumsalwebtasarim.com, 1 ankarama.com, 1 ankaramotosikletyedekparca.com, 1 +ankaraotocikmaparca.com.tr, 1 ankaraotokiralama.name.tr, 1 ankaraotokiralama.tk, 1 ankaraotomobilcikmaparca.com, 1 +ankaraotomobilcikmaparca.com.tr, 1 ankaraotomobilyedekparca.com, 1 +ankaraotomobilyedekparca.com.tr, 1 ankaraprofesyonelwebtasarim.com, 1 ankararentacar.name.tr, 1 ankaraseo.name.tr, 1 @@ -11889,6 +12035,7 @@ ankarauzmanlarnakliyat.com, 1 ankarawebtasarim.name.tr, 1 ankarawebtasarim.tk, 1 +ankarayedek.com.tr, 1 ankeney.com, 1 anker-wladyslawowo.pl, 1 anketlekazan.net, 1 @@ -11900,7 +12047,6 @@ ankos.cf, 1 ankureurope.co.uk, 1 ankurray.com, 1 -ankwanoma.com, 1 ankya9.com, 1 anleitung-deutsch-lernen.de, 1 anleitung-zum-flechten.de, 1 @@ -12026,13 +12172,14 @@ anongoth.pl, 0 anonhq.com, 1 anonicloud.ch, 1 +anoniem-domein.nl, 1 anonimizers.tk, 1 anonmega.tk, 1 anonofficial.tk, 1 anonrea.ch, 1 anons.fr, 0 anonser.tk, 1 -anontekno.com, 0 +anontekno.com, 1 anonwonders.tk, 1 anonybus.com, 1 anonym-surfen.de, 0 @@ -12091,6 +12238,7 @@ ansibeast.net, 1 ansichtssache.at, 1 ansogning-sg.dk, 1 +anson.ru, 1 ansoncountync.gov, 1 ansperformance.eu, 1 anstaskforce.gov, 1 @@ -12106,11 +12254,13 @@ antabuse.ga, 1 antabuse500mg.ga, 1 antabuskaufen1.gq, 1 +antagning-vn.se, 1 antagning.se, 1 antagonist1.tk, 1 antalya-taxi.cf, 1 antalya-turkey.tk, 1 antalya-yesim.cf, 1 +antalyaduvarkagidi.com.tr, 1 antalyaescmagazin.tk, 1 antalyaescortyaren.tk, 1 antalyahomes.com, 1 @@ -12126,6 +12276,7 @@ antarktida.ru, 1 antarktida.tk, 1 antarlina.com, 1 +antarvasnastory.co.in, 1 antavo.com, 1 antcas.com, 0 antechrista.tk, 1 @@ -12157,6 +12308,7 @@ anteros.shop, 1 antfarm.cf, 1 anthai.com, 1 +anthes.is, 1 anthiago.com, 1 anthisis.tv, 1 anthony-bardon.eu, 1 @@ -12227,6 +12379,7 @@ antifilter.network, 1 antiforce.com, 1 antifraud.cf, 1 +antifraudcentre-centreantifraude.ca, 1 antifurt.com, 1 antifurti.roma.it, 1 antigravity.cf, 1 @@ -12334,6 +12487,7 @@ antragsformular.com, 1 antragsgruen.de, 0 antraxx.ee, 1 +antrimnh.gov, 1 antroposboutique.it, 1 antroposofica.com.br, 1 ants-and-me.ml, 1 @@ -12363,6 +12517,7 @@ anvilsales.tk, 1 anvilsecure.com, 1 anvish.in, 1 +anwalt-website.de, 1 anwalt.us, 1 anwarulislam.tk, 1 anwarverdict.ml, 1 @@ -12391,15 +12546,16 @@ anyhobby.ga, 1 anyi.in, 1 anyilin.cn, 1 +anylu.mx, 1 anyma.it, 1 anymuscle.com, 1 anyone.cf, 1 anypeer.net, 1 anyplant.ga, 1 anyprime.net, 1 -anypromo.com, 1 anyquestions.govt.nz, 1 anyradio.ga, 1 +anyrisk.ru, 1 anyrose.ga, 1 anysale.ga, 1 anyshapemusic.com, 1 @@ -12407,6 +12563,7 @@ anystack.xyz, 1 anytimefitness.co.in, 1 anytimefitness.co.uk, 1 +anytimefitness.nl, 1 anytimefundingers.ga, 1 anytimefundingest.ga, 1 anytimeicon.io, 1 @@ -12414,7 +12571,6 @@ anytimesewerrepair.com, 1 anytots.com, 1 anyuta-mebel.tk, 1 -anyval.com, 0 anywayanyday.com, 1 anywhereworks.com, 1 anz.co.nz, 1 @@ -12427,7 +12583,7 @@ ao.com, 1 ao2.it, 1 ao27.net, 1 -ao3-cn.top, 1 +ao3-cn.top, 0 ao6.me, 1 ao6.works, 1 aoa.gov, 1 @@ -12453,11 +12609,13 @@ aomar-mohammedi.tk, 1 aonedatasolution.com, 1 aooobo.com, 1 +aopa.org, 1 aopedeure.nl, 1 aopsy.de, 1 aorangi-debt.co.nz, 1 aori.com, 1 aorosora.com, 1 +aosc.kz, 1 aosclan.tk, 1 aostacarnavals.it, 1 aosus.org, 1 @@ -12481,13 +12639,13 @@ apalancamiento.trade, 1 apambiente.pt, 1 apaniwebsite.xyz, 1 +apannpyaymedia.com, 1 apapinspection.ca, 1 aparaatti.org, 1 apart-hotel-weimar.de, 1 apartamentoslostejos.tk, 1 apartamentscalpatoi.cat, 1 apartamentsvituri.com, 1 -apartema.eu, 1 apartema.se, 1 apartmani-kamenik.com.hr, 1 apartment-in-rijeka.com, 1 @@ -12517,12 +12675,12 @@ apeiri.de, 1 apeironassets.com, 1 apelsin.ml, 1 +apem.com, 1 aperature.com, 1 apercloud.es, 1 aperioadvice.ga, 1 aperiomoney.ga, 1 aperiotaxation.ga, 1 -apert.be, 1 aperta.ro, 1 aperta.shop, 1 apertis.org, 0 @@ -12544,9 +12702,9 @@ apexchain-dev.com, 1 apexchain.io, 1 apexconsulting.io, 1 -apexdigital.com, 1 apexfacades.com.au, 1 apexitsolutions.ca, 1 +apexnc.gov, 1 apexperformancegym.com, 1 apfhaiti.org, 1 apfm.fr, 1 @@ -12573,6 +12731,8 @@ apiary.supply, 1 apicep.com, 1 apico-fish.ru, 1 +apiculture.net, 1 +apienergisahomol.com, 1 apiinfotech.com, 1 apil.org.uk, 1 apila.care, 1 @@ -12580,7 +12740,6 @@ apiled.io, 1 apimon.de, 1 apimoveisorocaba.com.br, 1 -apinat.de, 1 apination.com, 1 apio.systems, 1 apiora.ru, 1 @@ -12599,7 +12758,6 @@ apit-kovrov.ru, 1 apitodemestre.com.br, 1 apiu.me, 1 -apix.uz, 1 apk-world.cf, 1 apk.li, 1 apk4fun.com, 1 @@ -12607,12 +12765,13 @@ apkdownloadhunt.com, 1 apkdv.com, 0 apkfame.com, 1 +apkfree.com, 1 apkfuse.com, 1 apkindirsene.com, 1 apklatte.com, 1 apkmaze.com, 1 apkmint.co, 1 -apkmodo.net, 1 +apkmodo.net, 0 apkmody.io, 1 apknut.com, 1 apkoc.com, 1 @@ -12663,6 +12822,7 @@ apollodiet.com, 1 apollogames.cz, 1 apolloheatingandair.com, 1 +apollointeractive.com, 1 apollomobile.ga, 1 apollomobile.gq, 1 apollonas.tk, 1 @@ -12694,7 +12854,6 @@ apostasonline.guru, 1 apothecarydouglasville.com, 1 apotheek-ict.nl, 1 -apotheke.market, 1 apotheke.nrw, 1 apotheke.social, 1 apothekeonline.tk, 1 @@ -12716,7 +12875,6 @@ app.yinxiang.com, 0 app00228.com, 1 app11018.com, 1 -app2attract.nl, 1 app2get.de, 1 app3w.nl, 1 app4legal.com, 1 @@ -12754,6 +12912,7 @@ appelboomdefilm.nl, 1 appelerintrt.tk, 1 appemployees.tk, 1 +appen.com.cn, 1 appengine.google.com, 1 appers.co, 1 appetiser.com.au, 1 @@ -12762,7 +12921,6 @@ appfollow.io, 1 appgeek.com.br, 1 appgrowth.com, 1 -appharbor.com, 1 appian-cdn.com, 1 appiancloud-dynamic.com, 1 appiancloud-static.com, 1 @@ -12770,8 +12928,9 @@ appify.org, 1 appimlab.it, 1 appingrove.com.au, 1 +appinplace.com.au, 1 +appinvalley.com.au, 1 appjobs.com, 1 -applaudit.com, 1 applaus-kornwestheim.de, 1 apple-droid.com, 1 apple-watch-zubehoer.de, 1 @@ -12816,7 +12975,9 @@ applicationmanager.gov, 1 applicationtracker.com, 1 applied-privacy.net, 1 +appliedbehavioranalysisedu.org, 1 appliedmaths.lk, 1 +applique.co.jp, 1 appllio.com, 1 apploye.com, 1 apply-esta.us.com, 1 @@ -12865,6 +13026,7 @@ apps4inter.net, 0 appsafrica.com, 1 appsaraby.com, 1 +appsbd.com, 1 appsbud.com, 1 appscem.mx, 1 appscloudplus.com, 1 @@ -12883,7 +13045,6 @@ apptio.com, 1 apptoutou.com, 1 apptrigger.com, 1 -apptunity-website.azurewebsites.net, 1 appuals.com, 1 appub.co.jp, 1 appugo.tk, 1 @@ -12896,6 +13057,7 @@ appzoojoo.be, 1 aprazivel.com.br, 1 aprendaingles123.com, 1 +aprendainglesnabiblia.com.br, 1 aprendaviaweb.com.br, 1 aprende.com, 1 aprendejainternet.tk, 1 @@ -12988,6 +13150,7 @@ aquafc.com, 1 aquafilm.cf, 1 aquafirm.com, 1 +aquaformbg.com, 1 aquagino.nl, 1 aquaholic.tk, 1 aquahomo.com, 1 @@ -13022,8 +13185,10 @@ aquasaur.tk, 1 aquascaping.tk, 1 aquaselect.eu, 1 +aquastudios.games, 1 aquasun.pl, 1 aquatherm72.ru, 1 +aquaticbyte.com, 0 aquatiq.com, 1 aquatropical.tk, 1 aquaviaspa.es, 1 @@ -13064,7 +13229,6 @@ arabic-for-nerds.com, 1 arabic-shirts.com, 1 arabicbayan.tk, 1 -arabicclass.tk, 1 arabicdress.com, 1 arabicpost.live, 1 arabictranslation.tk, 1 @@ -13090,6 +13254,7 @@ aradiantlyhealthylife.com, 1 arados.de, 1 aradpulse.tk, 1 +aragotownshipmn.gov, 1 arai21.net, 1 arainfo.org, 1 arakanis.tk, 1 @@ -13125,6 +13290,7 @@ araxis.com, 1 araya.ga, 1 arbaiten.tk, 1 +arbaswedan.id, 1 arbautocare.com, 1 arbavere.ee, 1 arbeidsplassen.no, 1 @@ -13148,19 +13314,20 @@ arbologic.nl, 1 arborio.com.ua, 1 arboristic.de, 1 -arborpress.cf, 1 arbounie.nl, 1 arbradio.com, 1 arbu.eu, 0 arbucks.io, 1 arc-relight.com, 1 arc.run, 1 +arca.am, 1 arca.info.ro, 1 arca.live, 1 arcada-company.com, 1 arcadeencasa.com, 1 arcadegame.ga, 1 arcadegames.com, 1 +arcadeinn.com, 1 arcadetips.com, 1 arcadia.com.ph, 1 arcadiaca.gov, 1 @@ -13172,10 +13339,12 @@ arcanefrost.de, 1 arcanehardware.com, 1 arcanetides.com, 1 +arcantel.ch, 1 arcbouncycastles.co.uk, 1 arcdesantmarti.net, 1 arcenergy.co.uk, 1 arcese.com, 1 +arceusx.net, 1 arch-design.com, 1 archaeoadventures.com, 1 archaeology.lk, 1 @@ -13201,11 +13370,11 @@ archina.ir, 1 archined.nl, 1 archispace.com.cn, 1 +archistart.net, 1 archit.in, 1 architect-cassiman.be, 1 architectphd.tk, 1 architectryan.com, 1 -architecturaldesignschool.com, 1 architecture-colleges.com, 1 architectureblog.ml, 1 architectus.ga, 1 @@ -13213,7 +13382,6 @@ architekten.tk, 1 architektur.ga, 1 architektur.tk, 1 -architekturbuero-petersen.de, 1 architekturwiki.tk, 1 archival-services.gov.ge, 1 archive.gov.ge, 1 @@ -13292,11 +13460,11 @@ area.ge, 1 area21.ga, 1 area3.org, 1 -area4pro.com, 1 area51.dyndns1.de, 1 area51.social, 1 area51bit.com, 1 area51bit.it, 1 +area536.com, 0 areacinquentaeum.tk, 1 areaclienti.net, 0 areafiftylan.nl, 1 @@ -13320,7 +13488,6 @@ arena-news.tk, 1 arenaalbionu.pl, 1 arenadagon.tk, 1 -arenas-architecte.com, 1 arenatennis.ga, 1 arenda-auto.com, 0 arenda-bez-agenta.ml, 1 @@ -13351,6 +13518,7 @@ arfycat.com, 1 argama-nature.com, 1 arganaderm.ch, 0 +arganhomecenter.com, 1 arganwinkel.nl, 1 argb.de, 1 arge-bilisim.com, 1 @@ -13364,6 +13532,7 @@ argilo.net, 1 argocasino.com, 1 argon2.online, 1 +argonmail.com, 1 argos.co.uk, 1 argosasist.co.uk, 1 argovpay.com, 1 @@ -13398,13 +13567,15 @@ ariashii.tk, 1 ariba.info, 1 aribicara.tk, 1 +aric-assurances.fr, 1 aricabus.tk, 1 aricaluchalibre.tk, 1 ariden.net, 1 aridhia.com, 1 aridhia.io, 1 -ariege-pyrenees.net, 1 arielasher.cf, 1 +arieldiaz.codes, 1 +arielhr.ca, 1 arielpereira.tk, 1 ariens.com, 1 ariensco.com, 1 @@ -13426,9 +13597,11 @@ arilto.com, 1 arima.co.ke, 1 arima.tk, 1 +arimarie.com, 1 arimarie.net, 1 arimarie.org, 1 arina.is, 1 +arina.moscow, 1 arinahashimoto.com, 1 arinde.ee, 1 arinflatablefun.co.uk, 1 @@ -13495,17 +13668,19 @@ arkrowd.eu.com, 1 arks.cards, 1 arksan.com.tr, 1 -arktalentsolutions.com.mx, 1 arkulagunak.com, 0 +arkutinofamilyresort.com, 1 arlaperu.com, 1 arlatools.com, 1 arle.moe, 1 arlenarmageddon.com, 1 arlenitas.com, 1 +arleo.eu, 1 arlingtonelectric.com, 1 arlingtonlibrary.org, 1 arlingtonva.gov, 1 arlon.com, 1 +arm-host.com, 1 arm.gov, 1 arma3.com, 1 armacom.tk, 1 @@ -13528,6 +13703,7 @@ armansazehradis.com, 1 armaplatform.com, 1 armarinhovirtual.com.br, 1 +armazemautomotivo.com, 1 armazemdaminiatura.com.br, 1 armazemdeminasmg.com.br, 1 armazone.tk, 1 @@ -13615,7 +13791,7 @@ arockets.ru, 1 arod.tk, 1 arofabric.com, 1 -arogov.com, 1 +arogyabharti2021.in, 1 arokha.com, 1 aroma-therapy.tk, 1 aroma24.ml, 1 @@ -13638,9 +13814,9 @@ around-tables.co.jp, 1 aroundtheforum.com, 1 arouparia.com, 1 -arouzing.xyz, 1 arowsoft.tk, 1 arox.eu, 1 +aroya.io, 1 arp-arena.ml, 1 arp-mb.de, 1 arpa-h.gov, 1 @@ -13663,16 +13839,17 @@ arquitectura-ilimitada.tk, 1 arquitet.com.br, 1 arrakis.se, 1 +arrangeme.com, 1 arraudi.be, 1 arraudi.eu, 1 +array.io, 1 arraynow.com, 1 arrazane.com.br, 1 arrazola.org, 1 -arrestage.com, 1 arrestageinternational.com, 1 arresttracker.com, 1 arrival.com, 1 -arrive.by, 1 +arrive.by, 0 arrivedconsulting.com, 1 arrmaforum.com, 1 arroba.digital, 1 @@ -13709,6 +13886,7 @@ arslonga.ovh, 1 arsmagazine.tk, 1 arsmedika.ru, 1 +arsmundi.de, 1 arsmuseum.com, 1 arstudentloanhelp.com, 1 art-auction.jp, 1 @@ -13745,6 +13923,7 @@ artbygarr.com, 1 artc.at, 1 artcenter.tk, 1 +artclasscontent.com, 1 artcom-venture.de, 1 artcommunity.tk, 1 artcravers.in, 1 @@ -13802,11 +13981,13 @@ artetculture.tk, 1 artevos.com, 1 artevos.de, 1 +artex.com.br, 1 artexhibition.jp, 1 artextasia.com, 1 arteya.net, 1 artfabrics.com, 1 artfullyelegant.com, 1 +artgallery.co.uk, 1 artgaragecrewe.com, 1 artgorod.tk, 1 artgranit.tk, 1 @@ -13833,7 +14014,6 @@ articlestack.tk, 1 articlesutiles.cf, 1 articu.no, 1 -articulatedvaluation.com, 1 articulo19.org, 1 artifact.center, 1 artifact.spb.ru, 1 @@ -13854,9 +14034,10 @@ artigoagency.com, 1 artikel5ev.de, 1 artikel9.com, 1 +artilect.studio, 1 artinfo.ge, 1 artinfo.tk, 1 -artintend.com, 1 +artintend.com, 0 artioml.net, 1 artionet.ch, 1 artis-game.net, 1 @@ -13865,10 +14046,13 @@ artisan-ravalement-facade.fr, 1 artisan.tk, 1 artisanportrait.com, 1 +artisansbottega.com.au, 1 artisansofstone.com, 1 artisansoftaste.com, 1 artisavotins.com, 1 artishevski.com, 1 +artismist.com, 1 +artisreit.com, 1 artistagenda.com, 1 artistcorporation.com, 1 artistedeparis.fr, 1 @@ -13909,6 +14093,7 @@ artouch.com, 1 artozoul.fr, 1 artplaneta-leto.by, 1 +artpoint.ro, 1 artprojectsforkids.org, 0 artransparency.gov, 1 artrapid.com, 1 @@ -13954,7 +14139,6 @@ artyengine.com, 1 artyhouse.be, 0 arubasunsetbeach.com, 1 -aruble.net, 1 arul.io, 1 arunchullikkal.tk, 1 arunjoshua.com, 1 @@ -13982,7 +14166,6 @@ aryan-nation.com, 1 aryani-fitriana.tk, 1 aryankhera.xyz, 0 -aryasenna.net, 1 aryescommercial.com, 1 aryesgroup.net, 1 arysports.ml, 1 @@ -13996,15 +14179,16 @@ arztpraxis-kubalok.de, 1 as-aeu-ecp-dev-ecomeeting.azurewebsites.net, 1 as-aeu-ecp-qas-ecomeeting.azurewebsites.net, 1 -as-kapmea-mark-swissbear.azurewebsites.net, 1 as.roma.it, 1 as200753.com, 1 as200753.net, 1 as202413.net, 1 as203145.com, 1 +as203843.net, 1 as204982.net, 1 as207618.net, 1 as211960.net, 1 +as212993.net, 1 as41073.net, 1 as41405.net, 1 as48550.net, 1 @@ -14022,7 +14206,6 @@ asafomba.com, 0 asakoh.co.jp, 1 asal.tk, 1 -asami.mx, 1 asana.biz, 1 asana.com, 1 asana.plus, 1 @@ -14038,7 +14221,6 @@ asap.gov, 1 asapbio.org, 1 asapboardshop.com, 1 -asapboiler.co.uk, 1 asaphomeinspect.com, 1 asapmail.me, 1 asapp.com, 1 @@ -14051,6 +14233,7 @@ asato-jewelry.com, 1 asatys-partners.com, 1 asb.edu.my, 1 +asbaces.com, 1 asbestos-awareness.cf, 1 asbestos-awareness.ga, 1 asbestos-awareness.gq, 1 @@ -14060,6 +14243,8 @@ asbito.de, 1 asbrands.co.uk, 1 asburyparkreporter.com, 1 +asbweb.org, 1 +asc.es, 1 ascamo.tk, 1 ascamso.com, 1 ascannes-non-officiel.tk, 1 @@ -14067,7 +14252,9 @@ ascard.net, 1 ascauctions.com, 1 ascc.sg, 1 +asccontracts.com, 1 ascenderhcm.com, 1 +ascendix.com, 1 ascension.run, 1 ascensiongt.com, 1 ascensionnyc.org, 1 @@ -14081,12 +14268,13 @@ ascholarship.com, 1 aschool.kiev.ua, 1 asciitable.tips, 1 +ascirno.com, 1 ascl.org.uk, 1 ascolibasi.tk, 1 ascolympia.nl, 0 ascom.vi.it, 1 +ascon-profi.ru, 1 ascormovies.com, 1 -ascot.ac.th, 1 ascpaphilatelie.eu, 1 ascultaonlineradio.ml, 1 asd.gov.au, 0 @@ -14100,6 +14288,7 @@ asec01.net, 1 asecus.ch, 1 asegem.es, 1 +aseglobal.com, 1 aseith.com, 1 aselectionoffice.gov, 1 aselo.org, 1 @@ -14110,7 +14299,6 @@ asesecours.com, 1 asesinosdeltarot.tk, 1 asesor.live, 1 -asesoresvaro.com, 1 asesorialigorred.es, 1 asesoriavalledor.es, 1 asessiglo21.es, 1 @@ -14141,7 +14329,9 @@ ashesi.edu.gh, 1 ashessin.com, 1 ashevillemenshealth.com, 1 +ashewa.com, 1 ashfak.tk, 1 +ashfordcastle.com, 1 ashgroveclinic.com.au, 1 ashimwe.com, 1 ashisharma.tk, 1 @@ -14161,6 +14351,7 @@ ashotofadrenaline.net, 1 ashraful-islam.ml, 1 ashridgetrees.co.uk, 1 +ashtabulacountyprosecutoroh.gov, 1 ashtar.tk, 1 ashtech.tk, 1 ashtonbromleyceramics.co.uk, 1 @@ -14204,6 +14395,7 @@ asiansnus.com, 1 asiansongs.tk, 1 asianspa.co.uk, 1 +asiantube.tv, 1 asianwebcams.webcam, 1 asiaproductsdirect.tk, 1 asiasmi.tk, 1 @@ -14216,6 +14408,7 @@ asikoo.com, 1 asikoo.xyz, 1 asikpasagazetesi.tk, 1 +asikqq.id, 1 asile-colis.fr, 1 asilo.roma.it, 1 asinat.by, 1 @@ -14223,7 +14416,7 @@ asisee.co.il, 1 asistencialegal.tk, 1 asitanc.com, 1 -asitanc.cz, 1 +asitanc.cz, 0 asitt.nl, 1 asiyasia.tk, 1 ask-thenutritionist.com, 1 @@ -14249,8 +14442,7 @@ askizzy.org.au, 1 askjan.org, 1 askkaren.gov, 1 -asklawyersforjustice.com, 1 -askllp.com, 1 +asklocals.net, 1 askmagicconch.com, 0 askme-events.vip, 0 askme-fast.tk, 1 @@ -14260,7 +14452,6 @@ asko.ee, 1 askollelectric.bg, 1 asktanzania.com, 1 -askusutah.com, 1 askvg.com, 1 askwhy.cz, 1 askwhy.eu, 1 @@ -14302,8 +14493,7 @@ aspectcontext.com, 1 aspen.gov, 1 aspencat.tk, 1 -aspengoldgc.com, 1 -aspenhillsdesign.com, 1 +aspenpharma.com, 1 aspenpsychologywy.com, 1 asperatechnology.com, 1 asperatechnology.cz, 1 @@ -14314,6 +14504,7 @@ asphalting.org, 1 asphaltsolutionsnc.com, 1 asphyxia.su, 1 +aspi.cz, 1 aspiechattr.me, 1 aspietechygamer.tk, 1 aspiracloud.com, 1 @@ -14324,6 +14515,7 @@ aspiration.marketing, 1 aspire-dev2.com, 1 aspirecig.bg, 1 +aspiresys.com, 1 aspireuniversal.com, 1 aspirevc-prod.com, 1 aspirevc.com, 1 @@ -14343,6 +14535,7 @@ asra.gr, 1 asral7.com, 1 asremanoto.tk, 1 +asri.org, 1 asriyatno.tk, 1 asrob.eu, 0 asrtechnology.tk, 1 @@ -14363,6 +14556,7 @@ assemblage.gq, 1 assemble-together.org, 1 assemblee-copropriete.fr, 1 +assemblyai.com, 1 assemblywithoutthewalls.org, 1 assens.dk, 1 assentooriginal.com.br, 1 @@ -14384,10 +14578,12 @@ assignacii.ml, 1 assignmenthelponline.co.uk, 1 assignmenthelpservice.com, 1 +assignments4u.com, 1 assikerujked.tk, 1 assiplan.it, 1 assis.partners, 1 assistance-personnes-agees.ch, 1 +assistanceinparadise.com, 1 assistanteplus.fr, 1 assistel.com, 1 assistentesanitario.it, 1 @@ -14397,6 +14593,7 @@ assistere-a-casa.it, 1 assistere-a-domicilio.it, 1 assistere-in-famiglia.it, 1 +assistivo.shop, 1 assmb.ly, 1 assmgp.com, 1 asso.com.ua, 1 @@ -14411,6 +14608,8 @@ asspoop.com, 1 assr-online.com, 1 assta.ga, 1 +assumptionla.gov, 1 +assumptionoep-la.gov, 1 assumptionpj.org, 0 assurance-emprunteur.bzh, 1 assurances-brg.com, 1 @@ -14446,6 +14645,7 @@ astera-led.com, 1 asterix-obelix.ga, 1 asterobot.net, 1 +asteronline.com, 1 astettner.de, 1 astha.fr, 1 asthamishra.com, 1 @@ -14498,8 +14698,8 @@ astrolab.tk, 1 astroloeches.tk, 1 astrologerumesh.com, 1 -astrologiatarocchi.tk, 1 astrologic.cf, 1 +astrologics.in, 1 astrologie12.tk, 1 astrologify.com, 1 astrologjia.com, 0 @@ -14539,10 +14739,12 @@ asuamaytinh.com, 1 asuclassfinder.com, 1 asucrews.com, 1 +asufte.com, 1 asuikit.com, 1 asukalangley.tk, 1 asun.co, 1 asuntospropios.com, 1 +asura.in.th, 1 asurbernardo.com, 1 asurepay.cc, 0 asurgiant.ca, 1 @@ -14558,6 +14760,7 @@ asylinfo.no, 1 asylumguild.tk, 1 asynchrono.cf, 1 +asyndrom.com, 1 asyotec.es, 1 asystent-dzierzawy.pl, 1 asztrologus.eu, 1 @@ -14580,13 +14783,12 @@ atacul.ro, 1 atafu-village.tk, 1 atahualpa.com, 1 -atakac.com, 1 -atakac.net, 1 -atakoyescort.net, 1 -atakoyescorts.com, 1 +atakac.com, 0 +atakac.net, 0 atalantapsicologia.es, 1 atanas.ch, 1 atanet.it, 1 +atapindonesia.com, 1 atarinew.tk, 1 atary.tk, 1 ataton.ch, 0 @@ -14622,7 +14824,6 @@ atelierdelacreation.com, 1 atelierdeloulou.fr, 1 atelierdesflammesnoires.fr, 1 -atelierdosul.com, 1 atelierfantazie.sk, 1 atelierferro.be, 1 atelierhsn.com, 1 @@ -14632,10 +14833,8 @@ ateliernaruby.cz, 1 atelierssud.swiss, 1 atelierverbeelding.nl, 1 -atemon.com, 1 atenasconservadora.com.br, 1 atencionbimbo.com, 0 -atenealaser.com, 1 ateneumontbui.tk, 1 ateneupalafrugell.tk, 1 atenolol25mg.ga, 1 @@ -14675,11 +14874,15 @@ athenrymusicschool.net, 1 athens-escorts.com, 1 athensdrunktour.com, 1 +athensil.gov, 1 +athensmicro.com, 1 athenstn.gov, 1 athensvantours.com, 1 athensvantours.gr, 1 athensvt.gov, 1 atherosense.ga, 1 +athicart.com, 1 +athleticstore.bg, 1 athlin.de, 1 athomedeco.fr, 1 athorcis.ovh, 1 @@ -14712,6 +14915,7 @@ atisoftseo.com, 1 atisoftwebtasarim.com, 1 atisoftwebyazilim.com, 1 +ativaplayfitness.com.br, 1 ativapsicologia.com.br, 1 atix.tk, 1 atizanvip.com, 1 @@ -14746,7 +14950,6 @@ atlantikwall.ga, 1 atlantischild.hu, 1 atlantishop.si, 1 -atlantishq.de, 1 atlantismd.com, 1 atlantiswaterproofing.com, 0 atlantium.tk, 1 @@ -14759,6 +14962,7 @@ atlasams.com, 1 atlasassistans.net, 1 atlasauthority.com, 1 +atlasbridge.com, 1 atlasbrown.com, 1 atlasbus.by, 1 atlasbus.ru, 1 @@ -14767,12 +14971,13 @@ atlascultural.com, 1 atlasdev.nl, 1 atlasdog.org, 1 +atlasescorts.com, 1 atlasgaming.ma, 0 atlasleeuwen.tk, 1 atlaso.cz, 1 atlasone.us, 1 atlasreclame.nl, 1 -atlassian.net, 0 +atlassian.net, 1 atlassignsandplaques.com, 1 atlastax.ga, 1 atlastaxi.eu, 1 @@ -14838,12 +15043,14 @@ atraverscugy.ch, 0 atresclick.com, 1 atrevillot.com, 1 +atrexservices.com, 1 atrias.net, 1 atriballi.com.br, 1 atrinik.org, 1 atris-qa.media, 1 atris.media, 1 atriumschool.gr, 1 +ats.net, 1 atspeeds.com, 1 att-lda.pt, 1 attac.us, 1 @@ -14861,10 +15068,12 @@ attengo.ga, 1 attention.horse, 1 attentionpleats.com.tw, 1 +attesawp.com, 1 atthehelmins.com, 1 atticusblog.com, 1 attilagyorffy.com, 1 attilavandervelde.nl, 1 +attiliospagnolo.it, 1 attinderdhillon.com, 1 attireaccessories.com, 1 attiremr.tk, 1 @@ -14921,7 +15130,6 @@ aubergegilly.ch, 0 aubio.org, 1 aubonmanger.fr, 0 -aubtu.biz, 1 auburn-housekeeper.com, 1 auburnma.gov, 1 auburnmi.gov, 1 @@ -14929,18 +15137,20 @@ auburnpub.com, 1 auc.ch, 1 aucarresainteloi.com, 1 -aucasinoslist.com, 1 aucc.org.nz, 1 aucielrose.com, 1 +auckland-lawyer.co.nz, 1 +auckland-painter.co.nz, 1 aucklandcastles.co.uk, 1 auction.com, 1 auctionbv.tk, 1 audaces.com, 1 +audatopaz.com, 1 aude-mdb-hypnose.fr, 1 audencia.com, 1 audian.com, 1 audiclubbahrain.com, 1 -audiense.com, 0 +audiense.com, 1 audifs.com, 1 audilio.it, 1 audio-detector.com, 1 @@ -14966,7 +15176,6 @@ audiolibri.org, 1 audiologiasinfronteras.com, 1 audiologistdirectory.com, 1 -audiolokah.tk, 1 audiolot.com, 1 audiomedica.com, 1 audiomind.tk, 1 @@ -14997,6 +15206,7 @@ auditiontapes.co.uk, 1 auditmatrix.com, 1 auditore-host.tk, 1 +auditorwashingtoncountyohio.gov, 1 auditos.com, 1 auditpartnership.com, 1 auditsquare.com, 1 @@ -15085,7 +15295,6 @@ aurelieburn.fr, 1 aureliecharlesguillot.com, 1 aurelien-duchene.fr, 1 -aurelien-pratviel.fr, 1 aurelienaltarriba.fr, 1 aurelvoica.ro, 1 aureshotels.com, 1 @@ -15100,6 +15309,7 @@ aurora.net.au, 0 aurora403.com, 1 aurora911.net, 1 +auroraer.com, 1 aurorak12.org, 1 auroramarionvillepd-mo.gov, 1 auroranianoxx.net, 1 @@ -15107,7 +15317,7 @@ auroraoss.com, 1 aurorarecordings.com, 1 aurorasa-coaching.com, 1 -aurorasa.com, 1 +auroravtc.com, 1 auroz.video, 1 aurtho.com, 1 aurumkoins.tk, 1 @@ -15142,7 +15352,6 @@ aussiemilfs.com, 1 aussieofficefitout.com.au, 1 aussieofficefurniture.com, 1 -aussieparrotlets.com.au, 1 aussieservicedown.com, 1 aussiesmostlifted.com.au, 1 aussiestoresonline.com, 0 @@ -15219,7 +15428,6 @@ author24.info, 1 authorise.computer, 1 authorise.network, 1 -authority.pub, 1 authoritysolutions.com, 1 authorize.computer, 1 authorize.network, 1 @@ -15229,12 +15437,14 @@ autism-explained.com, 1 autisme-france.fr, 1 autismewoerden.nl, 1 +autismtoday.com, 1 autisten.club, 1 autistici.org, 1 auto-anleitung.de, 1 auto-arsenal.tk, 1 auto-borse.tk, 1 auto-dealership-news.com, 1 +auto-ecole-remparts.fr, 1 auto-help.tk, 1 auto-market.tk, 1 auto-motor-i-sport.pl, 1 @@ -15255,6 +15465,7 @@ autoaccident.com, 1 autoamor.com.br, 1 autoangels.ga, 1 +autoauctionsarizona.com, 1 autoauctionsohio.com, 1 autoauctionsvirginia.com, 1 autoaudio.pt, 0 @@ -15275,6 +15486,7 @@ autobusiness.ml, 1 autocadperfmon.azurewebsites.net, 1 autocaption.org, 1 +autocardesign.org, 1 autocartruck.com, 1 autocashmachine.tk, 1 autocenters.ca, 1 @@ -15294,6 +15506,7 @@ autocrossteam.tk, 1 autocrypt.org, 1 autodemolizioni.roma.it, 1 +autodesignmagazine.com, 1 autodidactic.ai, 1 autodidacticstudios.com, 1 autodidacticstudios.net, 1 @@ -15556,6 +15769,7 @@ autorijschooldehaas.nl, 1 autorijschooljohanbos.nl, 1 autorijschoolrichardschut.nl, 1 +autorisweb.com, 1 autos-mertens.com, 1 autosalesmachine.net, 1 autosalone.roma.it, 1 @@ -15574,6 +15788,7 @@ autosiero.nl, 1 autoskolaplzen.cz, 1 autosneed.com, 0 +autosoftdms.com, 1 autosolution.tk, 1 autosprint.tk, 1 autospurghi.milano.it, 1 @@ -15658,6 +15873,7 @@ ava-software.at, 1 ava.exposed, 1 ava360.com, 1 +avaaddamspornstar.com, 1 avaamo.com, 1 avaaz.org, 1 avacariu.me, 1 @@ -15762,6 +15978,7 @@ avarty.com, 1 avastantivirus.ro, 1 avasu.com, 1 +avatarai.me, 1 avatardiffusion.com, 1 avatarka.tk, 1 avaxprices.com, 1 @@ -15792,9 +16009,11 @@ avenade.nl, 1 avenade.org, 1 avenge.pet, 1 +avengehub.com, 1 avengepet.com, 1 avengersonline.ml, 1 avengersonlinemovie.ga, 1 +avensure.com, 1 aventuranursery.com, 1 avenue5.com, 1 avenuedesbebes.com, 1 @@ -15802,7 +16021,6 @@ avepol.cz, 1 avepol.eu, 1 averageinspired.com, 1 -averbuch.net, 1 averen.co.uk, 1 avernis.de, 1 avertoni.ru, 1 @@ -15844,6 +16062,7 @@ aviationstrategy.aero, 1 aviationweather.gov, 1 aviationzone.tk, 1 +aviatrix.com, 1 aviconverter.tk, 1 avidmode-dev.com, 1 avidmode-staging.com, 1 @@ -15870,19 +16089,18 @@ avisofi-credit-immobilier.fr, 1 avisoshuaraz.tk, 1 avisoversigten.dk, 1 +avispl.com, 1 avitahealth.org, 1 avitus.hu, 1 aviv-group.at, 1 avivanuestroscorazones.com, 1 aviweisfogel.co, 1 aviweisfogelinfo.org, 1 -avizeci.tk, 1 avlasov.tk, 1 avlhostel.com, 1 avm-multimedia.com, 1 avm99963.com, 1 avmemo.com, 1 -avmrc.nl, 1 avmtn.net, 1 avmup.com, 1 avn-buses.tk, 1 @@ -15925,7 +16143,7 @@ avp-emobility.de, 1 avpres.net, 0 avptp.org, 1 -avqueen.cn, 1 +avqueen.cn, 0 avrilhouse.tk, 1 avrilshine.tk, 1 avris.it, 1 @@ -15942,7 +16160,6 @@ avto-signal.ga, 1 avto-signal.gq, 1 avto-signal.ml, 1 -avto-skupka-dorogo.ru, 1 avtochip.tk, 1 avtodoki.tk, 1 avtodot.tk, 1 @@ -16009,7 +16226,6 @@ awersomecreatorfromrussia.tk, 1 awesome-coconut-software.fr, 1 awesomelifedeals.today, 1 -awesomemitten.com, 1 awesomenamegenerator.com, 1 awesomesheep48.me, 1 awesomesit.es, 0 @@ -16022,13 +16238,13 @@ awlonline.tk, 1 awmb.uk, 1 awningsaboveus.com, 1 -awningsydney.ga, 1 awo-bremen.de, 1 awo-sh.de, 1 awoau.com.au, 1 awomaninherprime.com, 0 awomansplacenj.com, 1 awrd.cz, 1 +awrostamani.com, 1 awsbs.de, 1 awscloudrecipes.com, 1 awsl.blog, 1 @@ -16057,6 +16273,7 @@ axcient.com, 1 axe-formation.com, 1 axe.io, 1 +axeapi.au, 1 axearrow.nl, 1 axel-faure.eu, 1 axel-fischer.net, 1 @@ -16079,7 +16296,7 @@ axin888.vip, 1 axiodl.com, 1 axioinvest.com, 1 -axiom-networks.org, 0 +axiom-networks.org, 1 axiomeosteopathie.ca, 1 axiomer.com, 1 axiomtechnologies.tk, 1 @@ -16091,6 +16308,7 @@ axisdesignarchitects.co.uk, 1 axisdesignarchitects.com, 1 axishw.com, 1 +axislinx.com, 1 axisortho.com.sg, 0 axispara-bg.com, 1 axl.net, 1 @@ -16101,6 +16319,7 @@ axome.com, 1 axon-toumpa.gr, 1 axoncoho.tk, 1 +axone-computers.fr, 0 axonholdingse.eu, 1 axre.de, 1 axrec.de, 1 @@ -16153,6 +16372,7 @@ aymhome.top, 0 ayon-games.tk, 1 ayothemes.com, 1 +ayovaksindinkeskdi.id, 1 ayresalpine.com, 1 ayresanaheim.com, 1 ayresapline.com, 1 @@ -16221,6 +16441,7 @@ ayresyorbalinda.com, 1 ayrohq.com, 1 ayrshirebouncycastlehire.co.uk, 1 +ayruu.com, 1 ayselonia.onl, 1 aysima.com, 1 ayubesportes.com.br, 1 @@ -16261,7 +16482,6 @@ azaleos.com, 1 azaleos.net, 1 azallon.com.br, 1 -azan.live, 0 azaria.blog, 1 azarkepic.com, 1 azartmania.ga, 1 @@ -16271,6 +16491,9 @@ azbukazvetov.ru, 1 azcensus2020.gov, 1 azdailysun.com, 1 +azdevsmartviewwebportal.azurewebsites.net, 1 +aze.dk, 1 +azehosting.net, 1 azenot.com, 0 azeo.com, 1 azeo.fr, 1 @@ -16293,7 +16516,6 @@ aziatki.tk, 1 azienda-tv.tk, 1 azimech.net, 1 -azimps.com.br, 1 azimut.fr, 1 azingostar.tk, 1 azinmahab.com, 1 @@ -16309,6 +16531,7 @@ azl.ink, 1 azlink.tk, 1 azlk-team.ru, 1 +azmi.me, 1 azmt.de, 1 aznaetelivy.ru, 1 azoang.com, 1 @@ -16336,6 +16559,7 @@ azsupport.com, 1 azsupport.host, 1 azsupport.org, 1 +aztecahome.com, 1 azton.tk, 1 aztraslochi.it, 1 aztrix.me, 1 @@ -16362,6 +16586,7 @@ azurlane.cool, 1 azurpedia.cf, 1 azuxul.fr, 1 +azvirtualschool.com, 1 azvpn.tk, 1 azzurrapelletterie.it, 1 b-angel.info, 1 @@ -16385,6 +16610,7 @@ b-ticket.ch, 1 b-tje.nl, 1 b-tree.be, 1 +b-utstore.com, 1 b-wartburg.de, 1 b.wtf, 1 b00de.ga, 1 @@ -16408,8 +16634,10 @@ b2b-nestle.com.br, 1 b2bchiemihara.com, 1 b2bhint.com, 1 +b2binpay.com, 1 b2bmail.ga, 1 b2bx.exchange, 1 +b2holding.no, 1 b2markt.de, 1 b3.nu, 1 b3103.com, 0 @@ -16510,7 +16738,7 @@ b88vip8.com, 1 b88vip9.com, 1 b899365.com, 1 -b89ff.com, 1 +b89ff.com, 0 b89gg.com, 0 b89hh.com, 1 b8a.me, 1 @@ -16525,11 +16753,8 @@ b960.com, 1 b96899.com, 1 b9728.co, 1 -b979333.com, 0 b979365.com, 0 -b979555.com, 0 b979666.com, 1 -b979999.com, 0 b9883.net, 1 b9884.net, 1 b9885.net, 1 @@ -16628,6 +16853,7 @@ babeeclothingandoutfits.com, 1 babehunt.tk, 1 babekids.tk, 1 +babel.es, 1 babeleo.com, 1 babelfisch.eu, 1 babes.com, 1 @@ -16638,6 +16864,7 @@ babevr.com, 1 babibonami.tk, 1 babico.name.tr, 1 +babindo.com, 1 babineaux.zone, 1 babitaji.tk, 1 babki-mgnovenno.ga, 1 @@ -16650,6 +16877,7 @@ baboo.com.br, 1 babounet.com, 1 babsbibs.com, 1 +babuccu.com, 0 baburhat.tk, 1 babursahvizeofisi.com, 1 babushkin-mir.tk, 1 @@ -16686,6 +16914,7 @@ babymozg.ga, 1 babynamen.nl, 1 babynames.net, 1 +babynamespedia.com, 1 babynoise.tk, 1 babypaparadise.com, 0 babypharm.ga, 1 @@ -16699,7 +16928,6 @@ babyshopsupport.com.au, 1 babyshower.cf, 1 babystrollers.ml, 1 -babytan.tk, 1 babytandarts.nl, 1 babyvillagegt.com, 1 babyz.tk, 1 @@ -16753,6 +16981,7 @@ backlashband.tk, 1 backlink-builder.tk, 1 backlinkboss.com, 1 +backlinkers.xyz, 1 backlinktr.tk, 1 backlog.jp, 1 backlogapp.io, 1 @@ -16766,6 +16995,7 @@ backpackinglight.com, 1 backpackingtours.com, 1 backpacktour.ru, 1 +backpagegals.com, 1 backporchartists.com, 1 backrestored.gq, 1 backrip.tk, 1 @@ -16784,6 +17014,7 @@ backterris.com, 1 backtest.org, 1 backtheeffup.com, 1 +backtobed.com, 1 backup-kurumsal.com, 1 backupassist.de, 1 backupauthentication.com, 1 @@ -16834,6 +17065,8 @@ badboyzclub.de, 1 badcarma.tk, 1 badcomputer.tk, 1 +baddiehub.com, 1 +baddielatina.com, 1 baddrones.llc, 1 badeand.net, 1 bademantelparadies.de, 1 @@ -16901,6 +17134,7 @@ baer.com, 1 baer.space, 1 baerkarrer.ch, 1 +baevserver.ddns.net, 1 bafito.com, 1 baframedya.tk, 1 bafus.ru, 1 @@ -16915,7 +17149,6 @@ baghtelecom.net, 1 bagiobella.com, 1 bagirahome.bg, 1 -baglu.com, 0 bagni-chimici.roma.it, 1 bagnichimici.milano.it, 1 bagnichimici.roma.it, 1 @@ -16935,7 +17168,6 @@ bahana.net, 1 baharmusic24.tk, 1 bahcehavuz.com, 1 -bahiastudios.com, 1 bahisbonus.work, 1 bahislokal6.com, 1 bahnenimbild.de, 1 @@ -16943,6 +17175,7 @@ bahnhelden.de, 1 bahninrotweissrot.at, 1 bahnmagazine.de, 1 +bahno.xyz, 1 bahrain.gq, 1 bahraincredit.com.bh, 1 bahrainmarina.bh, 1 @@ -17006,6 +17239,7 @@ bakerbasements.com, 1 bakercity.gov, 1 bakercitypd.gov, 1 +bakercosheriffor.gov, 1 bakercounty911or.gov, 1 bakercountyor.gov, 1 bakercountysheriffor.gov, 1 @@ -17054,7 +17288,6 @@ balance.education, 1 balance.equipment, 1 balance.technology, 1 -balance7.jp, 1 balancecreamers.ga, 1 balancecreamest.ga, 1 balancedbrawl.net, 1 @@ -17069,6 +17302,7 @@ balashiha-podmoskovie.ml, 1 balasingandaru.cf, 1 balaskas.gr, 1 +balatarin.com, 1 balatonlelleapartman.tk, 1 balboa.io, 1 balboa.org.uk, 1 @@ -17104,6 +17338,7 @@ balingwiredirect.com, 1 balintjanvari.com, 1 balist.es, 1 +balita.net.ph, 1 balivacationhomes.com, 1 balivakantiewoning.nl, 1 balivillassanur.com, 0 @@ -17141,7 +17376,7 @@ balls.zone, 1 balluncar.tk, 1 balmofgilead.org.uk, 1 -balnova.com, 1 +balneariodearchena.com, 1 baloch-intelligence.tk, 1 balochism.tk, 1 baloncestoarqueros.tk, 1 @@ -17180,7 +17415,6 @@ bamifm.tk, 1 bamily.rocks, 1 baming.com, 1 -bamoza.com, 1 bampers.tk, 1 bamsmackpow.com, 1 ban-list.gq, 1 @@ -17201,6 +17435,7 @@ bancastato.ch, 1 bancatransilvania.ro, 1 banco.bradesco, 1 +bancoagricola.com, 1 bancobai.ao, 0 bancobica.com.ar, 1 bancobpm.it, 1 @@ -17227,6 +17462,7 @@ banderas-mundo.es, 1 banderasdelmundo.xyz, 1 banderol.tk, 1 +bandhanbank.com, 1 bandhayoga.paris, 1 bandidosmc.com, 1 bandiere-mondo.it, 1 @@ -17258,6 +17494,7 @@ bangkok-thailand.org, 1 bangkokcookingclass.com, 1 bangkokflightservices.com, 1 +bangkoklife.com, 1 bangku.tk, 1 bangladesimagi.tk, 1 banglahotstory.tk, 1 @@ -17273,6 +17510,7 @@ banhphongtomquangtran.com, 1 bani-hashem.tk, 1 banimarket.by, 0 +baniuliuukis.lt, 1 banja-kulasi.ga, 1 banjonelson.tk, 1 bank, 1 @@ -17290,6 +17528,7 @@ bankcustomerassistance.gov, 1 bankeasternct.com, 1 bankee.us, 1 +banker.vn, 1 bankera.com, 1 banket-furshet-spb.ru, 1 banket.fr, 1 @@ -17299,9 +17538,11 @@ bankgradesecurity.com, 1 bankheadvegetables.com, 1 bankhelp.gov, 1 +bankid.com, 1 bankimsk.cf, 1 bankin.com, 1 banking-services.tk, 1 +bankingadda.in, 1 bankingheralders.ga, 1 bankinter.pt, 1 bankio.se, 1 @@ -17333,9 +17574,11 @@ bankwithfidelity.com, 1 banland.net, 1 banlinhdanong.com, 0 +banmapvn.com, 1 banned-bitches.tk, 1 banner-design.tk, 1 banner.ga, 1 +bannerbank.com, 1 bannercountyne.gov, 1 bannerexchange.tk, 1 bannermarquees.ie, 1 @@ -17364,31 +17607,35 @@ bao-in.net, 1 baobabgroup.com, 1 baobaoquming.net, 0 +baobimangco.com, 1 baocheng.tech, 1 baofuzhuan.com, 1 baogao.store, 1 baoge55.com, 1 baogiathicongnoithat.com, 1 baogougou.com, 0 -baohiemdailoc.com, 1 baokhangfood.com, 1 baoxue5.com, 0 bapco.com, 1 bapeel.tk, 1 bapha.be, 1 +baptist-health.com, 1 +baptist-health.org, 1 baptiste-peugnez.fr, 1 baptistecabrera.com, 1 baptisteplanckaert.tk, 1 baptistesale.tk, 1 bar-event.tk, 1 bar-valhalla.tk, 1 -bar2mannheim.de, 1 bar38.tk, 1 +baraboowi.gov, 1 barabrume.fr, 1 baracca.es, 1 barakayu.com, 1 baraklava.com, 1 baran-shop.ga, 1 +baranka.ru, 1 +baransys.com, 1 baranyavar.hu, 1 barao.tk, 1 barataeletrica.tk, 1 @@ -17415,6 +17662,7 @@ barberscorner.tk, 1 barbershop-harmony.org, 0 barbershop-lasvillas.com, 0 +barbershopbabo.com, 1 barbiecollectorjapan.cf, 1 barbiecollectorjapan.ga, 1 barbiecollectorjapan.gq, 1 @@ -17477,6 +17725,7 @@ baristabetter.com, 1 baristador.com, 1 baritoday.it, 1 +barkerandstonehouse.co.uk, 1 barkerjr.xyz, 1 barkingspidersaspets.com, 1 barkio.com, 1 @@ -17492,11 +17741,13 @@ barmusic.tk, 1 barnabasgolf.org, 1 barnabycolby.io, 1 +barnacional.com.au, 1 barnaul-altai.tk, 1 barnestransport.com, 1 barnesvilleohio.gov, 1 barneveldcentrum.nl, 1 barneydavey.com, 1 +barnflix.net, 1 barnhardt4berks.com, 1 barnhomega.com, 1 barnrats.com, 1 @@ -17531,9 +17782,7 @@ barrikade.tk, 1 barrilito.com.mx, 1 barrioitalia.com, 1 -barriotoboardroom.com, 1 barro.ga, 1 -barronbankruptcyattorney.com, 1 barruntos.tk, 1 barry-callebaut.com, 1 barrydenicola.com, 1 @@ -17541,10 +17790,11 @@ barrytownshipmn.gov, 1 barsashop.com.br, 1 barsgroup.com, 1 +barsleaks.com, 1 barsopen.ga, 1 -barss.io, 1 barsukas.net, 1 bart-f.com, 1 +bart-f.net, 1 bart1ebee.com, 1 barta.me, 1 bartavi.nl, 1 @@ -17554,6 +17804,7 @@ bartdesign.tk, 1 bartel.ws, 1 bartelt.name, 1 +barter.me, 1 barter.vg, 1 barth-herzberger.de, 1 barth.services, 1 @@ -17605,11 +17856,9 @@ baselnazifrei.info, 0 basement961.co.nz, 1 basementdefender.net, 1 -basementdoctornorthwest.com, 1 basementdoctorwestvirginia.com, 1 basementdoctorwv.com, 1 basementfinishingohio.com, 1 -basementguides.com, 1 basementwaterproofingannarbor.com, 1 basementwaterproofingasheville.com, 1 basementwaterproofingdesmoines.com, 1 @@ -17642,6 +17891,7 @@ basicattentiontoken.org, 1 basiccloud.nl, 1 basicguitarlessons.com, 1 +basicknowledge101.com, 1 basiclimits.tk, 1 basicports.com, 1 basicports.eu, 1 @@ -17668,6 +17918,7 @@ basketball-malavan.tk, 1 basketballnewz.tk, 1 basketforex.com, 1 +baskibu.com, 0 baskingalkin.tk, 1 basllp.co.uk, 1 basmacioglu.com, 1 @@ -17714,11 +17965,14 @@ basyrova.ml, 1 basysconsulting.com, 1 basyspro.net, 1 +batacas.com, 1 batailleros.tk, 1 bataminnovationhub.com, 1 batcave.tech, 1 batch.com, 0 batdongsancongnghiep.vn, 1 +batelco.com, 1 +baterias.com, 1 baterioverolety.cz, 1 batesvillearkansas.gov, 1 batextiles.tk, 1 @@ -17726,8 +17980,10 @@ bath.ltd.uk, 1 bath.men, 1 bathbodyshop.tk, 1 +bathcountyva.gov, 1 bathok.tk, 1 bathrobes.tk, 1 +bathroomgurureview.com, 1 bathroomremodelinggeorgia.com, 1 bathroomsinkcabinet.tk, 1 bathscobensraker.ga, 1 @@ -17761,6 +18017,7 @@ battlefrontoldschool.cf, 1 battleguard.net, 1 battleofthegridiron.com, 1 +battlepetsonline.com, 1 battlerealms.cc, 1 battlerite.tk, 1 battletech.tk, 1 @@ -17771,15 +18028,19 @@ batwatt.com, 1 bau.ua, 1 baubau.bg, 1 +bauchredner-zauberer.de, 1 bauchtanz.tk, 1 bauen-mit-ziegel.de, 0 +bauer-plus.de, 1 bauer-reininghorses.com, 1 bauer.network, 0 bauernhof-koch-edingen.de, 1 bauernhof-lercher.at, 1 bauernmarkt-fernitz.at, 1 +baufi-express.ag, 1 baufi-express.biz, 1 baufi-express.com, 1 +baufi-express.de, 1 baufi-express.eu, 1 baufi-express.info, 1 baufi-express.net, 1 @@ -17789,6 +18050,9 @@ baufiexpress.biz, 1 baufiexpress.com, 1 baufiexpress.de, 1 +baufiexpress.eu, 1 +baufiexpress.info, 1 +baufiexpress.net, 1 baufiexpress.org, 1 baugelitt.eu, 1 baugemeinschaftbernstein.de, 1 @@ -17818,6 +18082,7 @@ baxir.fr, 1 baxleyga.gov, 1 baxomilowa.tk, 1 +baxtercountyar.gov, 1 baxterstorey.online, 1 baxterstoreyirelandonline.com, 1 bayanbennett.com, 1 @@ -17831,6 +18096,8 @@ bayareaplasticsurgery.com, 1 bayashi.net, 1 bayburtmanset.com, 1 +baycitymi.gov, 1 +baycountyfltax.gov, 1 bayden.com, 1 baydreamer.tk, 1 bayer-stefan.com, 1 @@ -17843,6 +18110,7 @@ bayerstefan.com, 1 bayerstefan.de, 1 bayerstefan.eu, 1 +bayfly.net, 1 bayherbalist.com, 1 bayilelakiku.com, 1 bayltd.com, 1 @@ -17880,6 +18148,7 @@ bazar-online.tk, 1 bazar-pc.tk, 1 bazar.bg, 0 +bazardelcentro.net, 1 bazardunet.tk, 1 bazarfds.com.br, 1 bazari.com.pl, 1 @@ -17956,13 +18225,14 @@ bbs.lc, 1 bbschat.tk, 1 bbsec.xyz, 1 -bbsgood.com, 1 +bbsis.org, 1 bbunits.de, 1 bbusa.tk, 1 bbw-wrestling.com, 1 bbw.dating, 1 bbwanalsex.com, 1 bbwhale.org, 1 +bbwmellon.com, 1 bbwmovies.com, 1 bbwpictures.com, 1 bbwpornpics.com, 1 @@ -17981,10 +18251,12 @@ bcallesen.dk, 1 bcallesen.eu, 1 bcansw.com.au, 1 +bcbsfepvision.com, 1 bcbudonline.com, 1 bcbulle.ch, 0 bcccremeno.it, 1 bcdiesel.ca, 1 +bcdn.me, 1 bcdonadio.com, 1 bcdonadio.com.br, 1 bcdonadio.org, 1 @@ -18028,6 +18300,7 @@ bdd.fi, 1 bddam.fr, 1 bddam.one, 1 +bdeep.org, 1 bdew.net, 1 bdfriends.tk, 1 bdgroup-lab.com, 1 @@ -18037,6 +18310,7 @@ bdo-tools.jp, 1 bdpachicago.tech, 1 bdpestsolutionsstlouis.com, 1 +bdpn.ru, 1 bdragon.com, 1 bdsmbibliothek.net, 1 bdsmcontrol.com, 1 @@ -18087,7 +18361,8 @@ beachworldchampion.tk, 1 beacinsight.com, 1 beaconfed.org, 1 -beaconhospital.com.my, 1 +beaconhealthoptions.com, 1 +beaconhouse.org.uk, 1 beaconmm.com, 1 beaconny.gov, 1 beaconstac.com, 1 @@ -18161,9 +18436,9 @@ beatle.tk, 1 beatmaker.ml, 1 beatmalaria.org, 1 +beatoapp.com, 1 beaton.tk, 1 beatquantum.com, 1 -beatrice-nightscout.herokuapp.com, 1 beatrice-raws.org, 1 beatricedailysun.com, 1 beatriz-urbano-vega.tk, 1 @@ -18181,11 +18456,11 @@ beaufortcastawaycharter.com, 1 beaufortcountync.gov, 1 beauhilton.com, 1 -beaulaton.org, 1 beaulieu.ch, 1 beaumontcabusiness.gov, 1 beaute-eternelle.ch, 0 beautiful-lingerie.tk, 1 +beautiful.ai, 1 beautifulart.ml, 1 beautifulplaces.tk, 1 beautifulreflectionsmedspa.com, 1 @@ -18213,6 +18488,7 @@ beautyarticles.tk, 1 beautybism.com, 1 beautybox.ro, 1 +beautyboxes.net, 1 beautyby.tv, 1 beautycarepack.com.ng, 1 beautycom.club, 1 @@ -18239,6 +18515,7 @@ beavertails.com, 1 beavertales.ca, 1 beavillabea.it, 1 +beavivo.de, 1 bebaspedia.com, 1 bebbiboni.tk, 1 bebe2luxe.fr, 1 @@ -18291,6 +18568,7 @@ bedandbreakfasteuropa.com, 1 bedandbreakfasthoekvanholland.com, 1 bedavainternet.club, 1 +beddingexperts.com, 1 bede.fr, 1 bedeiah.tk, 1 bedels.nl, 1 @@ -18299,6 +18577,7 @@ bedfordnissanparts.com, 1 bedful.com, 1 bedienungsanleitung24.de, 1 +bedinfo.com, 1 bedlingtonterrier.com.br, 1 bedofcorpses.tk, 1 bedouille.com, 1 @@ -18342,11 +18621,12 @@ beelit.com, 0 beeming.net, 1 beemprimelogistics.com, 1 +beeone.nl, 1 beepcar.ru, 1 beer-sheva.city, 1 beer9.com, 1 -beerarchy.tk, 1 beercast.co.uk, 1 +beeremovaljohannesburg.co.za, 1 beeremovalpretoria.co.za, 1 beeremovalspretoria.co.za, 1 beergifts.tk, 1 @@ -18372,7 +18652,6 @@ beescloud.com, 1 beesco.us, 1 beesex.xyz, 1 -beestar.it, 1 beestation13.com, 1 beeswarmrehoming.com.au, 1 beesweethoney.co.za, 1 @@ -18436,11 +18715,13 @@ beiersdorf-svz.ch, 1 beijing.bj, 1 beijinglug.club, 1 +beikeil.de, 1 beimchristoph.de, 1 beinad.com, 1 beinad.ru, 1 beinghuman.tk, 1 beingmad.org, 1 +beingoptimist.com, 1 beingtricky.com, 1 beinsports.pro, 1 beinsured.cloud, 1 @@ -18492,6 +18773,7 @@ beko.ie, 1 bekolite.com, 1 bekoplc.com, 1 +bel-air1998.com, 1 bel-assainissement-service.fr, 1 bel-snegirek.ru, 0 belacapa.com.br, 1 @@ -18609,15 +18891,14 @@ bellezzasenzalimiti.it, 1 bellflowerlactation.com, 1 bellhowell.net, 1 -bellinifashion.nl, 1 bellissime.tk, 1 bellizas.com.br, 1 +bellmeadtx.gov, 1 belloo.date, 1 belloweb.tk, 1 bellowsafs.marketing, 1 belloy.net, 0 bellreguard.tk, 1 -bellsapplianceservice.com, 1 bellsweets.com, 1 bellthrogh.com, 1 belltownfarms.com, 1 @@ -18628,6 +18909,7 @@ belmontnh.gov, 1 belmontsheriffohio.gov, 1 belmundo.org, 1 +belocallyseo.com, 1 beloevino.ml, 1 belos.at, 1 belouga.org, 1 @@ -18687,6 +18969,7 @@ bendechrai.com, 0 bendemaree.com, 1 bender.ga, 1 +bendhvacpros.com, 1 bendigoland.com.au, 1 bendingtheending.com, 1 bendix.co, 1 @@ -18696,13 +18979,14 @@ beneathvt.com, 1 beneazy.cf, 1 benedetti.ca, 1 -benedict-balzer.de, 1 benedict.tk, 1 benedicthanshenwang.com, 1 benedictoaguilar.tech, 1 benedikto.tk, 1 benee-awraham.nl, 1 benefeds.com, 1 +benefitboys.com, 1 +benefitharbor.com, 1 benefits.gov, 1 benefitsystems.ro, 1 benefitz.cf, 1 @@ -18740,16 +19024,15 @@ benhoeg.com, 0 beniajan.tk, 1 benidormcd.tk, 1 -benihyangbaik.com, 1 -benilebusinesscity.com, 1 benimsetin.com, 1 benimsetin.org, 1 beninca.link, 1 -benjamin-hering.com, 1 benjamin-horvath.com, 1 benjamin-suess.de, 1 +benjamin-thomsen.de, 1 benjaminbedard.com, 1 benjaminblack.net, 1 +benjamincrozat.com, 1 benjamindietrich.com, 1 benjamindietrich.de, 1 benjaminfox.net, 1 @@ -18791,6 +19074,8 @@ benoitchantre.com, 1 benprisby.com, 1 benpro.fr, 1 +benq.com, 1 +benq.eu, 1 benrogers.tk, 1 bensbouncycastles.co.uk, 1 benschnarr.com, 1 @@ -18814,13 +19099,16 @@ bentoncountyia.gov, 1 bentoncountyor.gov, 1 bentongroup.co.uk, 1 +bentonvillemedia.com, 1 bentonweatherstone.co.uk, 1 bentonwi.gov, 1 bentpunk.tk, 1 bentrask.com, 1 benu.cz, 1 +benu.rs, 1 benuapotheek.nl, 1 benulekaren.sk, 1 +benunapredpis.cz, 1 benwoo.org, 1 benz-hikaku.com, 1 benzblog.tk, 1 @@ -18844,6 +19132,7 @@ beq.cc, 1 bequ1ck.com, 1 bequiia.com, 1 +berakal.com, 1 beran.tk, 1 berandalcorp.tk, 1 beranovi.com, 1 @@ -18853,6 +19142,7 @@ beratungswelt.dvag, 1 berbatov.ga, 1 berbervandenberg.tk, 1 +berchialla.it, 1 berchtesgaden-hilft.de, 1 berdan.tk, 1 berdu.id, 1 @@ -18863,6 +19153,7 @@ beregusha.com, 1 bereikbaargent.be, 1 berekenen.nl, 1 +berekenhet.nl, 1 berend.tk, 1 bereregisdental.co.uk, 1 beresbalazs.tk, 1 @@ -18898,12 +19189,12 @@ berichtsheft-vorlage.de, 1 berightthere.eu, 1 berikod.ru, 1 -berinovatif.net, 1 beris.us, 1 beritalima.com, 1 beritamotor.tk, 1 beritanow.tk, 1 beritatopbanten.com, 0 +beritavirall.com, 1 berjadagar.is, 1 berjou.me, 1 berk.tk, 1 @@ -18946,6 +19237,7 @@ bernar.do, 1 bernard-securite-protection.fr, 1 bernard.fr, 1 +bernardbeneito.com, 1 bernardcontainers.be, 0 bernardez-photo.com, 1 bernarditadiaz.tk, 1 @@ -18981,6 +19273,7 @@ berria.fi, 1 berriacast.com, 1 berriacast.fi, 1 +berriencountyga.gov, 1 berries.com, 1 berrnd.net, 1 berrus.com, 1 @@ -19031,7 +19324,7 @@ besdev.uk, 1 besedovichi.tk, 1 besensi.com, 1 -besiconstruct.be, 1 +besiconstruct.be, 0 besidemetal.tk, 1 besikta.se, 1 besiktasmtsk.com, 1 @@ -19077,6 +19370,7 @@ best-mum.fr, 1 best-nursing-colleges.com, 1 best-of-bounce.co.uk, 1 +best-party.ru, 1 best-pdf.com, 1 best-photobooth.ro, 1 best-pool-cleaner.com, 1 @@ -19102,6 +19396,7 @@ bestatter.de, 1 bestattungen-kammerer.de, 1 bestattungshaus-kammerer.de, 0 +bestaucasinosites.com, 1 bestautoinsurance.com, 1 bestbatteriesonline.com, 1 bestbefore.com, 1 @@ -19120,7 +19415,9 @@ bestbuyzone.com, 1 bestcamshow.tk, 1 bestcarscyprus.com, 1 +bestcarsleasedeals.com, 1 bestcash2020.com, 1 +bestcasinositesonline.com, 1 bestcivilattorneys.com, 1 bestclix.ml, 1 bestcms.tk, 1 @@ -19141,6 +19438,7 @@ bestecbdolie.com, 1 bestech.de, 1 bestechgadgets.tk, 1 +besteckliste.com, 1 bestedeal.nl, 1 besteenergieleverancier.com, 1 bestehostingproviders.nl, 1 @@ -19161,18 +19459,18 @@ bestfacts.ru, 1 bestfewo.de, 1 bestfitnesswatchreview.info, 1 +bestforexeasy.com, 1 bestfornutrition.com, 1 bestfotostudio.com, 1 bestfriend.ga, 1 bestfriendsequality.org, 1 bestgiftever.ca, 1 bestgriefbooks.com, 1 -besthairsale.com, 1 besthdgayporn.com, 1 besthemes.tk, 1 besthobi.com, 1 besthomescents.com, 1 -besthorsebedding.com, 1 +besthorsebedding.com, 0 besthost.cz, 1 besthouse.co.il, 1 besthumorsite.tk, 1 @@ -19181,8 +19479,6 @@ besties4life.ml, 1 bestinbarter.com, 1 bestinductioncooktop.us, 1 -bestinfo.com.au, 1 -bestinshowing.com, 1 bestinsider.net, 0 bestinsulatedwaterbottle.tk, 1 bestinterior.fr, 1 @@ -19337,6 +19633,7 @@ bestliege.be, 1 bestlifek9training.com, 1 bestlyrics.tk, 1 +bestmattressabout.com, 1 bestmattresses.tk, 1 bestmaturepics.com, 1 bestmedsmmj.com, 1 @@ -19352,6 +19649,7 @@ besto.ga, 1 besto.tk, 1 bestofbooks.gq, 1 +bestofdate.com, 1 bestofjazz.org, 1 bestofnuevovallarta.com, 1 bestoldmusic.tk, 1 @@ -19361,7 +19659,7 @@ bestparking.com, 1 bestparking.xyz, 1 bestpartyhire.com, 1 -bestperfumebrands.com, 1 +bestperfumebrands.com, 0 bestpig.fr, 1 bestplus.ml, 1 bestplus.tk, 1 @@ -19373,7 +19671,8 @@ bestportablegeneratorratings.com, 1 bestpost.org, 1 bestpracticesblog.com, 1 -bestprofessionalchainsaw.com, 1 +bestproductsaudit.com, 1 +bestpsychologydegrees.com, 1 bestreleases.tk, 1 bestremote.io, 1 bestroofinginkansascity.com, 1 @@ -19388,7 +19687,6 @@ bestshops.ga, 1 bestsingingbowls.com, 1 bestsiteporn.com, 1 -bestsmm.pk, 1 beststock.kr, 1 beststudio.ru, 1 besttechnews.ml, 1 @@ -19397,7 +19695,7 @@ besttrannytube.com, 1 besttraveluk.ga, 1 bestvetmortgage.com, 1 -bestvpns.co.uk, 1 +bestvpns.co.uk, 0 bestwebcams.ga, 1 bestwebcams.ml, 1 bestwebsite.gallery, 1 @@ -19476,6 +19774,7 @@ bet338c.com, 1 bet33app.com, 0 bet3639.com, 0 +bet365-fixed-matches.com, 1 bet365bc.net, 1 bet365bet2020.com, 1 bet365cn-casino.com, 1 @@ -19514,7 +19813,6 @@ bet365x2.com, 1 bet365x3.com, 1 bet365x6.com, 1 -bet365x8.com, 1 bet365x9.com, 1 bet391.com, 0 bet392.com, 0 @@ -19568,6 +19866,7 @@ bet86yn.com, 1 bet86zj.com, 1 bet909.com, 1 +bet99.com, 1 beta-cell.com, 1 beta-site-staging.azurewebsites.net, 1 betaa0.com, 1 @@ -19585,6 +19884,7 @@ betaclouds.net, 1 betacommand.tk, 1 betadesign.dk, 1 +betahyp.de, 1 betalgroup.com, 1 betalingsregelingen.nl, 1 betalingsservice.dk, 1 @@ -19604,6 +19904,7 @@ betb73.com, 0 betbed.ml, 1 betbravo.et, 1 +betc.com, 1 betcn-mart.com, 1 betecnet.de, 1 betel.tk, 1 @@ -19615,6 +19916,8 @@ betformular.com, 1 betfy.co.uk, 1 bethanyhome.org, 1 +bethanymo.com, 1 +bethanytownshipmi.gov, 1 bethatkinson.tk, 1 bethelparkpa.gov, 1 bethelparkpapolice.gov, 1 @@ -19626,6 +19929,7 @@ bethpage.net, 1 bethulietourism.co.za, 1 bethzone.tk, 1 +beticaret.com, 1 betingsite.com, 1 betish.tk, 1 betkorea1.com, 1 @@ -19636,7 +19940,6 @@ beton-vloer.nl, 1 beton.ie, 1 betonbewerkingsmachines.be, 1 -betonbit.com, 1 betondrew.com, 1 betongereedschap.be, 1 betonline.bz, 1 @@ -19655,11 +19958,11 @@ betsafe.lt, 1 betseven.pt, 1 betseybuckheit.com, 1 +betsfortoday.com, 1 betsharpangles.com, 1 betshoot.com, 1 betsonlinefree.com.au, 1 betspin.com, 1 -betsyshilling.com, 1 bett1.at, 1 bett1.ch, 1 bett1.de, 1 @@ -19672,6 +19975,7 @@ better.com, 0 better.fyi, 1 betterbaseball.com, 1 +betterbedding.com, 1 betterbladders.com, 1 betterboards.net, 1 betterbuiltbasements.com, 1 @@ -19714,14 +20018,15 @@ bettolinokitchen.com, 1 betty-baloo.com, 1 bettyblue.tk, 1 +betuca.com.br, 1 betulashop.ch, 1 betus.tk, 1 betvisa.com, 1 -between.be, 0 betweenland.ru, 1 betweenthehills.be, 1 betweenthesheets.tk, 1 betwin9.net, 1 +betwinner-india.com, 1 betwinner-ua.com, 1 betwinner-zerkalo.ru, 1 betwinner.cm, 1 @@ -19731,9 +20036,10 @@ betwinner.de.com, 1 betwinner.ng, 1 betwinner1.com, 1 +betwinner2.com, 1 +betwinner5.mobi, 1 betwinnerbahis.net, 1 betwinnerfrance.net, 1 -betwinnergiris.org, 1 betwinnerkenya.com, 1 betwinnerlive.com, 1 betwinnermobileapp.com, 1 @@ -19771,6 +20077,7 @@ beverhof.nl, 1 beverley.tk, 1 beverleycounselling.co.uk, 1 +beverleymoneyman.com, 1 beverly.tk, 1 beverlydrive.tk, 1 beverlyhospital.org, 1 @@ -19779,6 +20086,7 @@ bevif.com, 1 bevinco2020.com, 1 bevinsco.org, 1 +bevmo.com, 1 bevmoir.com, 1 bevnut.com, 1 bewegigsruum.ch, 1 @@ -19814,7 +20122,7 @@ beyond-destiny.tk, 1 beyond-infinity.org, 0 beyond-rational.com, 1 -beyond.com.br, 1 +beyond.com.br, 0 beyond.lk, 1 beyond3dview.com, 1 beyond3dviews.com, 1 @@ -19828,7 +20136,6 @@ beyondnodes.com, 1 beyonds.fr, 1 beyondthebar.cz, 1 -beyondthebrandmedia.com, 1 beyondthecode.io, 1 beyondthecrater.com, 1 beyondthecreek.com, 1 @@ -19851,6 +20158,7 @@ bezdech.tk, 1 bezdomny.tk, 1 bezemkast.nl, 0 +bezen.eco, 1 bezin.ga, 1 bezlepkovamatka.cz, 1 bezoek-benidorm.tk, 1 @@ -19858,11 +20166,14 @@ bezopasna-rabota.tk, 1 bezpecnostsiti.cf, 1 bezpieczny.pl, 1 +bezpiecznykierowca.info, 1 bezposrednio.net.pl, 1 bezpredel.tk, 1 bf-foto.eu, 1 +bf2statistics.eu, 1 bfam.tv, 1 bfbet365.com, 1 +bfbs.com, 1 bfcgermania88.de, 1 bfelob.gov, 1 bfem.gov, 1 @@ -19888,6 +20199,7 @@ bgbet365.com, 1 bgbhsf.top, 1 bgd-info.tk, 1 +bgdesign.de, 1 bgemi.net, 1 bgeo.io, 1 bgfashion.net, 1 @@ -19905,6 +20217,7 @@ bgmn.me, 1 bgmontaggi.com, 1 bgmsquad.com, 1 +bgmsquad.net, 1 bgoewert.com, 1 bgp.space, 1 bgr34.cz, 1 @@ -19938,7 +20251,6 @@ bhtechconnection.com, 1 bhtelecom.ba, 1 bhub.tk, 1 -bhuntr.com, 1 bhuvanreddy.space, 1 bhvapers.com, 1 bhw.name, 1 @@ -19950,11 +20262,10 @@ bi1gif.radio, 1 bi8cku.club, 1 bi8cku.tech, 1 -biabop.com, 1 +bia3consultores.es, 1 biaform.be, 1 -bial.com, 1 +biagiowineandspirits.com, 1 bialamydlarnia.pl, 0 -bialogardzkihiphop.tk, 1 biancadark.tk, 1 biancapulizie.it, 1 biancasalgueiro.tk, 1 @@ -19977,7 +20288,8 @@ biberonshop.bg, 1 bibet365.com, 1 bibi-xxx.com, 1 -bibimanga.com, 0 +bibimanga.com, 1 +bibit.id, 1 bibitbunga.com, 1 bible-maroc.com, 1 bible.ru, 1 @@ -19985,6 +20297,7 @@ bibleforchildren.ru, 1 bibleinsiderest.ga, 1 bibleonline.ru, 1 +biblereadlist.com, 1 biblesignposts.com, 1 bibleversesfordailyliving.com, 1 biblia.es, 1 @@ -20024,7 +20337,6 @@ bicicletassym.com, 1 bicicletassym.com.co, 1 bicignet.ga, 1 -bicistore.com.co, 1 bicommarketing.com, 1 bicranial.io, 0 bicromoestudio.com, 1 @@ -20037,11 +20349,13 @@ bidc.ltd, 1 biddl.com, 1 biddle.co, 1 +biddr.com, 1 bidenstopdeportations.com, 1 bidlab.org, 1 bidmachine.io, 1 bidman.cz, 1 bidman.eu, 1 +bidoluindirim.com, 1 bidonline.tk, 1 bidviewmarketing.com, 1 bieg.tk, 1 @@ -20104,6 +20418,7 @@ bigambitions.co.za, 1 bigart.tk, 1 bigassmonster.com, 1 +bigasstubes.com, 1 bigband.tk, 1 bigbearkh.com, 0 bigbeats.tk, 1 @@ -20116,13 +20431,13 @@ bigbluecomputers.tk, 1 bigbluedoor.net, 1 bigboard.tk, 1 +bigboobporn.com, 1 bigbooty.tv, 1 bigbootytube.net, 1 bigboris.tk, 1 bigbouncebouncycastles.co.uk, 1 bigbouncetheory.co.uk, 1 bigbounceuk.com, 1 -bigboysbrand.dk, 1 bigbrother.fi, 1 bigbuild.vic.gov.au, 1 bigbunce.ru, 1 @@ -20165,6 +20480,7 @@ bignaturals.com, 1 bignet.bid, 1 bignudetits.com, 1 +bigone.com, 1 bigorangelab.com, 1 bigorbitgallery.org, 1 bigpage.tk, 1 @@ -20227,7 +20543,6 @@ biker.dating, 1 bikerawardsers.ga, 1 bikerawardsest.ga, 1 -bikerebel.com, 1 bikerestart.com, 1 bikersclub.tk, 1 bikersmadrid.es, 1 @@ -20250,6 +20565,7 @@ bikkelbroeders.com, 0 bikkelbroeders.nl, 0 biknet.tk, 1 +bikroay.com, 1 bikyaku.fun, 1 bilalkilic.de, 1 bilalozdemir.me, 1 @@ -20277,7 +20593,6 @@ biletyplus.ua, 1 bilgehan.net, 1 bilgiliksel.com, 1 -bilgireis.com, 1 bilgisayarkursu.tk, 1 bilgo.com, 1 bilhos.com.tr, 1 @@ -20304,6 +20619,7 @@ billetto.co.uk, 1 billetto.dk, 1 billetto.eu, 1 +billetto.it, 1 billetto.se, 1 billfazz.com, 1 billgatos.tk, 1 @@ -20378,7 +20694,7 @@ bimacitizen.com, 1 bimbingan.tk, 1 bimbobakeriesusa.com, 0 -bimbole.it, 0 +bimedis.com, 1 bimibroccoli.co.uk, 1 bimibroccoli.com, 1 bimibroccoli.dk, 1 @@ -20393,6 +20709,7 @@ bimmerlabs.com, 1 bimoge.tk, 1 bimsynergistics.com, 1 +bin-laden.org, 1 bin95.com, 1 bina.az, 1 binafarma.com.br, 1 @@ -20424,6 +20741,7 @@ bind.ch, 1 bindb.com, 1 binding-problem.com, 1 +binds.co, 1 bindsolutions.com, 1 binezalohar.tk, 1 binf.tk, 1 @@ -20463,7 +20781,7 @@ binson-museum.tk, 1 binsp.net, 1 bintach.com, 1 -bintanglautplatinum.com, 0 +bintanglautplatinum.com, 1 bintangsyurga.com, 1 bintangtop.com, 1 bintelligence.cl, 1 @@ -20479,6 +20797,7 @@ bio-verzeichnis.de, 1 bio24.si, 0 bioadva.com, 1 +bioarc.com.au, 1 bioarchlinux.org, 1 bioaufvorrat.de, 1 bioblog.tk, 1 @@ -20494,6 +20813,7 @@ biodiagnostiki.clinic, 1 biodieselbr.com, 1 biodieseldata.com, 1 +biodieselpumps.com, 1 biodit.com, 0 biodobavki.tk, 1 biodots.at, 1 @@ -20526,6 +20846,7 @@ biohazardonline.tk, 1 biohazardous.tk, 1 biohof-paas.de, 1 +bioinfo-diag.fr, 1 bioinformaticsweb.tk, 1 biointelligence-explosion.com, 1 biokal-labsystems.eu, 1 @@ -20566,6 +20887,7 @@ biomedyczne.pl, 1 biometriccoe.gov, 1 biometrics.gov, 1 +biometservices.com, 1 biomin.co.uk, 1 biomod.tk, 1 biomodra.cz, 1 @@ -20581,9 +20903,9 @@ bioreference.com, 1 bioresonanz-ibiza.com, 1 biosafe.ch, 0 -biosafetech.com, 1 biosalts.it, 1 biosbits.org, 1 +bioscapers.com, 1 biosearch.tk, 1 bioselect.com.cy, 1 bioshine.com.sg, 1 @@ -20594,6 +20916,7 @@ biospw.com, 1 biostar.com.tw, 1 biosuit.ga, 1 +biosupplyalliance.com, 1 biot.tk, 1 biotal.ua, 1 biotanquesbts.com, 1 @@ -20635,11 +20958,13 @@ birdsite.ga, 1 birdslabel.com, 1 birdsnow.com, 1 +birdwatchireland.ie, 1 birdygaia.com, 1 birdymanbestreviews.com, 1 birgit-rydlewski.de, 1 birgitandmerlin.com, 1 birjdid.tk, 1 +birkanpusa.com.tr, 1 birkengarten.ch, 1 birkenstab.de, 1 birkhoff.me, 0 @@ -20648,8 +20973,8 @@ birkilise.org, 1 birlikdayanisma.com, 1 birman.tk, 1 -birmans.tk, 1 birminghamal911.gov, 1 +birminghammoneyman.com, 1 birminghamorthospine.com, 1 birminghamsunset.com, 1 birnenhain.de, 1 @@ -20662,6 +20987,8 @@ birtamode.tk, 1 birthday-to-you.com, 1 birthdayapp.today, 1 +birthdaybuzz.org, 1 +birthdayfeelings.com, 1 birthdayinsiderest.ga, 1 birthinjurylawyer.com, 1 birthright.host, 1 @@ -20669,6 +20996,7 @@ birwa.tk, 1 birzan.org, 1 birzman.ga, 1 +bis.gov, 1 bisa-sis.net, 1 bischoff-mathey.family, 1 biscuit.town, 1 @@ -20679,7 +21007,6 @@ biser-borisov.eu, 1 biser.online, 1 bishamon.pl, 1 -bishopp.com.au, 1 bishopscourt-hawarden.co.uk, 1 bishoptx.com, 1 bisik.ml, 1 @@ -20692,6 +21019,7 @@ bisnis.com, 1 bisnisesteen.tk, 1 bisnisinternetgratis.tk, 1 +bisnismuda.id, 1 bisnisonlinecerdas.tk, 1 biso.ga, 1 bisoga.ga, 1 @@ -20712,7 +21040,7 @@ bistrotdelagare.fr, 1 bistrozaim.ml, 1 bistum-eichstaett.de, 1 -bit-cloud.de, 0 +bit-cloud.de, 1 bit-flex.com, 1 bit-rapid.com, 0 bit-saar.de, 1 @@ -20727,6 +21055,7 @@ bitbincomputers.com, 1 bitbonus.cf, 1 bitbonusss.tk, 1 +bitbotster.com, 1 bitbox.me, 1 bitbroker.exchange, 1 bitbucket.com, 1 @@ -20793,6 +21122,7 @@ bitcoinjpn.com, 1 bitcoinkaufen.me, 1 bitcoinkaufen.news, 1 +bitcoinkurs.news, 1 bitcoinkurs.world, 1 bitcoinmakesense.com, 1 bitcoinnews.digital, 1 @@ -20805,6 +21135,7 @@ bitcoinprice.pizza, 1 bitcoinprice.rocks, 1 bitcoinprice.world, 1 +bitcoinreserve.com, 1 bitcoinseed.net, 1 bitcoinset.pl, 1 bitcoinslots.info, 1 @@ -20820,6 +21151,7 @@ bitcrazy.org, 1 bitdefender.de, 1 bitdizzle.xyz, 1 +bitdocs.xyz, 1 bitech-ec.com, 1 bitedge.com, 0 bitedu.pt, 1 @@ -20840,10 +21172,10 @@ bitfuse.net, 1 bitgarant.tk, 1 bitgo.com, 1 -bitgrapes.com, 1 bithap.com, 0 bither.net, 1 bithosting.pt, 1 +bitiobmen.com, 1 bititrain.com, 1 bitix.tk, 1 bitjunkiehosting.com, 1 @@ -20885,6 +21217,7 @@ bitpumpe.net, 1 bitradius.com, 1 bitrate.tk, 1 +bitredirixe.top, 1 bitref.com, 1 bitrefill.com, 1 bitrefill.info, 1 @@ -20914,12 +21247,12 @@ bitstorm.org, 1 bitsync.nl, 1 bitten.pw, 1 +bittentechsolutions.in, 1 bitterspringscabins.com.au, 1 bittersweetcandybowl.com, 1 bittervault.xyz, 1 bittimaatti.fi, 1 bittiraha.fi, 1 -bittivarasto.fi, 1 bitton.com.au, 1 bittounsi.com, 1 bittrend.ga, 1 @@ -20957,10 +21290,12 @@ biz-seecrets.gq, 1 biz4solutions.com, 1 biz4x.com, 1 +bizanka.pl, 1 bizapps.lv, 1 bizarrefuture.cf, 1 bizbelarus.tk, 1 bizboatest.ga, 1 +bizcalcs.com, 1 bizcatalyst360.com, 1 bizcope.com, 1 bizdekalmasin.com, 1 @@ -21037,6 +21372,7 @@ bjsms.de, 1 bjtxl.cn, 1 bjut.photos, 1 +bk-art.ru, 1 bk-info.lt, 1 bk1x.mobi, 1 bk1xbet.mobi, 1 @@ -21076,15 +21412,21 @@ bkin-22350.website, 1 bkin-22808.website, 1 bkin-22962.space, 1 +bkin-23261.website, 1 bkin-23612.space, 1 bkin-23658.website, 1 bkin-23906.website, 1 bkin-24119.space, 1 +bkin-24239.space, 1 bkin-24456.space, 1 +bkin-25297.space, 1 bkin-25798.website, 1 bkin-25982.xyz, 1 bkin-26191.top, 1 +bkin-26470.xyz, 1 +bkin-27135.xyz, 1 bkin-27185.xyz, 1 +bkin-27262.xyz, 1 bkin-27733.top, 1 bkin-27825.space, 1 bkin-28035.xyz, 1 @@ -21164,6 +21506,7 @@ bkramericas.com, 1 bksites.tk, 1 bkt.to, 1 +bktechnologies.com, 1 bkulup.com, 1 bl-builder.tk, 1 bl0ck.org, 1 @@ -21213,6 +21556,7 @@ black-market.ga, 1 black-pool.net, 1 black-raven.fr, 1 +black-rider-studio.eu, 1 black-rosella.tk, 1 black-side.tk, 1 black.dating, 1 @@ -21220,6 +21564,7 @@ blackandteal.com, 1 blackandwhite.tk, 1 blackapron.com.br, 1 +blackarch.org, 1 blackarch.sk, 1 blackarts.co.za, 1 blackassassins.tk, 1 @@ -21274,6 +21619,7 @@ blackhelicopters.net, 1 blackhillsinfosec.com, 1 blackhistorymonth.gov, 1 +blackisbetter.com, 1 blackjackballroomcasino.info, 1 blackjackprogramest.ga, 1 blackjaguar.tk, 1 @@ -21320,6 +21666,9 @@ blackspark.tk, 1 blackspider.tk, 1 blacksport.ru, 1 +blacksprut.com, 1 +blackstone.com, 1 +blackstoneone.net, 1 blackstonepress.tk, 1 blackstrapsecurity.com, 1 blackstump.xyz, 1 @@ -21331,14 +21680,17 @@ blacktemplars.tk, 1 blacktown.eu, 1 blacktownbuildingsupplies.com.au, 1 +blacktube.tv, 1 blacktubes.cf, 1 blacktubes.ga, 1 blacktubes.ml, 1 blacktype.bet, 1 +blackwaterlounge.com, 1 blackwaterutilities.tk, 1 blackwidow.tk, 1 blackwire.tk, 1 blackwoodrugby.tk, 1 +blackwoodseventcenter.com, 1 blackworld.ga, 1 blackwot.ru, 1 blackyau.cc, 0 @@ -21354,6 +21706,7 @@ blago-sostoyanie.gq, 1 blago-sostoyanie.ml, 1 blago.tk, 1 +blagomed.by, 1 blagosvet.ml, 1 blague.tk, 1 blahaj.eu, 1 @@ -21378,7 +21731,7 @@ blanchardandcalhoun.com, 1 blanchardla.gov, 1 blanchardvillewi.gov, 1 -blancoltd.co.uk, 0 +blancoltd.co.uk, 1 blanickymanifest.eu, 1 blankersfamily.com, 1 blanket.technology, 1 @@ -21418,23 +21771,25 @@ blauerhunger.de, 1 blauesschwarz.de, 0 blauglockenbaum.de, 1 +blaulicht-giessen.de, 1 blaumedia.com, 1 blautiefe.de, 1 blauwgras.nl, 1 blauwwit.be, 1 +blavandbike.de, 1 +blavandbike.dk, 1 blavaty.tk, 1 blayne.me, 0 blayneallan.com, 0 blazebd.com, 1 blazefire.tk, 1 blazeit.io, 1 +blazenet.net, 1 blazeweb.ml, 1 -blazincreationz.com, 1 blazing.cz, 1 blazingsaddles.ga, 1 blazingsuns.tk, 1 blazor.nl, 1 -blazor.sk, 1 blbcleaningservices.com.au, 1 blbet365.com, 1 blblblblbl.fr, 0 @@ -21450,7 +21805,6 @@ bleedingcool.com, 1 bleedmoneyest.ga, 1 bleekerenbleeker.nl, 1 -bleep-it.be, 1 bleep.zone, 1 bleepplc.co.uk, 1 blegalservicespty.com, 1 @@ -21463,7 +21817,6 @@ blending.kr, 1 blendle.com, 1 blendle.nl, 1 -blendr.com, 1 blendstudios.com, 1 blenneros.net, 0 blero.tk, 1 @@ -21491,6 +21844,7 @@ blijfbij.eu, 1 bliker.ga, 1 blikund.swedbank.se, 1 +blinblin.la, 1 blindaryproduction.tk, 1 blindfold.cf, 1 blindfold.ga, 1 @@ -21515,6 +21869,7 @@ blinkspeed.eu, 1 blinniza.tk, 1 blio.tk, 1 +blippr.com, 1 blissbox.com, 1 blissdrive.com, 1 blissfulsmile.com, 1 @@ -21523,6 +21878,7 @@ blissway.tk, 1 blist.xyz, 1 blisterreview.com, 1 +blitz-idee24.de, 1 blitzarena.io, 1 blitzga.me, 1 blitzkrieg.tk, 1 @@ -21550,18 +21906,20 @@ blm36.cc, 1 blm69.cc, 1 blnc.gov, 1 +blnsoftware.com, 1 blo-melchiorshausen.de, 1 blobemoji.com, 1 blobfolio.com, 1 +blobfox.coffee, 1 blobs.gg, 1 blocher.ch, 1 -blochoestergaard.com, 1 block-planet.xyz, 1 block-this.com, 1 block.xyz, 1 block65.com, 1 blockchain.com, 1 blockchain.info, 1 +blockchain.poker, 1 blockchainaiintegra.com, 1 blockchainbulteni.com.tr, 1 blockchaincasinos.online, 1 @@ -21575,13 +21933,14 @@ blockedyourcar.net, 1 blockedyourcar.org, 1 blockexplorer.online, 1 -blockhost.net, 1 blockified.io, 1 +blockinx.com, 1 blockmetry.com, 1 blockmomsest.ga, 1 blocksettle.com, 1 blockshopauto.com, 1 blockstream.com, 1 +blockstream.info, 1 blockstudio.it, 1 blocktab.io, 1 blockvideo.live, 1 @@ -21612,6 +21971,7 @@ bloganchoi.com, 1 blogaram.tk, 1 blogarts.net, 1 +blogbegin.xyz, 1 blogbookcassiopee.fr, 1 blogbooker.com, 1 blogcosmeticsurgeon.ga, 1 @@ -21625,10 +21985,10 @@ blogdimotori.it, 1 blogdosimoveis.com.br, 1 blogduwem.com, 1 +blogexpert.ca, 1 blogexpress.org, 1 blogfeng.tk, 1 blogforprofit.tk, 1 -blogger.de, 1 bloggermobile.tk, 1 bloggermoney.ml, 1 bloggermumofthreeboys.com, 1 @@ -21639,19 +21999,25 @@ blogging-life.com, 1 bloggingdirty.com, 1 bloggingkits.org, 1 +bloggingocean.com, 1 +bloggingqna.com, 1 +bloggingtriggers.com, 1 bloggingwithchildren.com, 1 blogguitar.tk, 1 bloggymoms.com, 1 bloggytalky.com, 1 +blogheist.com, 1 bloghogger.tk, 1 blogidol.tk, 1 bloginbeeld.nl, 1 bloginformatique.ml, 1 blogit.fi, 1 blogjunta.com, 1 +blogke.cn, 1 bloglogistics.com, 1 blogman.com, 1 blognews.cf, 1 +blognewspapers.com, 1 blognone.com, 1 blogofapps.com, 1 blogoflegends.com, 1 @@ -21669,9 +22035,11 @@ blogtechnologiczny.pl, 1 blogthedata.com, 1 blogthetindung.com, 1 +blogtienao.com, 1 blogtroterzy.pl, 1 bloguser.ru, 1 blogvadim.ga, 1 +blogville.us, 1 blokmap.be, 1 blokuhaka.fr, 1 blomberg.name, 1 @@ -21679,6 +22047,8 @@ bloms.de, 0 blonde-hexe.net, 1 blonde-hexe.org, 1 +blondish.net, 0 +bloobasket.com, 1 blood-kirsche.tk, 1 blood4pets.tk, 1 bloodandbones.tk, 1 @@ -21700,6 +22070,7 @@ bloombergadria.com, 1 bloomberglp.com, 1 bloombergtv.mn, 1 +bloomfire.com, 1 bloomingbit.io, 1 bloomingpink.in, 1 bloomingtonelectionsil.gov, 1 @@ -21711,13 +22082,16 @@ blopezabogado.es, 1 blorbo.link, 1 blossom.so, 1 +blossombeautytreatments.co.uk, 1 blossomtexas.gov, 1 blountsherifftn.gov, 1 blounttn.gov, 1 blowingrock.gov, 1 blrjmt.com, 1 blsattestation.com, 1 +blsgermanyvisa.com, 1 blsindia.sg, 1 +blsindiavisa-uae.com, 1 bltc.co.uk, 1 bltc.com, 1 bltc.net, 1 @@ -21749,14 +22123,17 @@ bluebirdservice.us, 1 bluebnc.com, 1 blueboat.io, 1 +bluecam.com, 1 bluecanvas.io, 1 bluecat.tk, 1 +bluecatnetworks.com, 1 bluecherry.tk, 1 bluechipspace.com, 1 bluecoastelectric.com, 1 bluecoatnetflowsupport.com, 1 bluecollarfetishwear.com, 1 bluecosmetics.tk, 1 +bluecrossmn.com, 1 blued.moe, 1 bluedeck.org, 1 bluedivision.tk, 1 @@ -21782,6 +22159,7 @@ bluelily.ga, 1 bluelime.it, 1 bluelinestation.com, 1 +bluelockchapters.com, 1 bluemagnetinteractive.com, 1 bluemail24.com, 1 bluemango-studios.com, 1 @@ -21816,12 +22194,13 @@ bluescape.com, 1 blueshouse.ro, 1 blueskiesmassage.com, 1 -bluesky-it.uk, 1 blueskybrokerage.tk, 1 blueskycoverage.com, 1 blueskyinsure.com, 1 +blueskywebdesign.net, 1 bluesnews.tk, 1 bluesoap.com.au, 1 +bluespirit.com, 1 bluespotmedia.ro, 1 bluestarbus.co.uk, 1 bluestardiabetes.com, 1 @@ -21849,6 +22228,7 @@ bluex.net, 1 bluex.org, 1 blueyonder.com, 1 +blufashion.com, 1 bluffcitytn.gov, 1 bluffplumber.co.za, 1 bluffsbyowner.com, 1 @@ -21870,12 +22250,15 @@ bluntandsnakes.com, 1 blupig.net, 1 bluproducts.com.es, 1 +blur.io, 1 blurringexistence.net, 1 blurt.cf, 1 blushbymounika.com, 0 blushingweb.tk, 1 blusmurf.net, 1 blutooth.ga, 1 +blutopia.xyz, 1 +blutspende.de, 1 bluuglass.com, 1 bluware.com, 1 bluxus.com, 1 @@ -21905,23 +22288,24 @@ bmotorsports.com, 1 bmriv.com, 1 bmros.com.ar, 1 -bmrpainting.com, 1 bmsexperthub.hu, 1 +bmsupermercados.es, 1 bmw-motorradclub-seefeld.de, 1 bmwcolors.com, 1 -bmwdasauto.com, 1 bmwhocking.com, 1 bmwpartsdeal.com, 1 bmyjacks.cn, 0 bmzm.nl, 0 bnb-buddy.nl, 1 bnb.direct, 1 +bnbhome.com, 1 bnboy.cn, 1 bnbsinflatablehire.co.uk, 1 bnc.sh, 1 bnck.me, 1 bnct.us, 1 bnd.house, 1 +bndlstech.com, 1 bnews.vn, 1 bnext.tech, 1 bngdigital.com, 1 @@ -21933,13 +22317,16 @@ bnjscastles.co.uk, 1 bnkconsulting.info, 1 bnnuy.com, 1 +bnpparibas-am.com, 1 bnpparibas.be, 1 bnpparibas.bg, 1 bnpparibas.co.uk, 1 bnpparibas.de, 1 bnpparibas.es, 1 +bnpparibas.it, 1 bnpparibas.lu, 1 bnpparibas.no, 1 +bnpparibas.pt, 1 bnpparibas.ru, 0 bnpparibascardif.com.ar, 1 bnrailstories.com, 1 @@ -21953,6 +22340,7 @@ boa.rw, 1 boam.nu, 1 boanastudio.com, 1 +board-portal.org, 1 board-room.ca, 1 board-room.org, 1 board-rooms.co.uk, 1 @@ -21961,8 +22349,10 @@ boardgameforces.com, 1 boardgamegeeks.de, 1 boardingschoolreview.com, 1 +boardroommind.com, 1 boardroompro.org, 1 boards.ie, 1 +boardsoftware.net, 1 boardspot.com, 1 boardusersers.ga, 1 boat-engines.eu, 1 @@ -21970,12 +22360,14 @@ boatmanwindsor.com, 1 boatns.com, 1 boatsandoats.com, 1 -boatseller.org, 0 +boatseller.org, 1 boattour.ru, 1 boattrader.com.au, 1 boauganda.com, 0 bob-dylan.tk, 1 bob-fuchs.de, 1 +bob.nl, 1 +bob.pe, 1 bob168.net, 1 bobaly.es, 0 bobancoamigo.com, 1 @@ -21989,6 +22381,7 @@ bobbyhensley.com, 1 bobbyoriginal.tk, 1 bobbyrobinson.tk, 1 +bobcat.com, 1 bobcoffee.com.br, 1 bobcopeland.com, 1 bobek.cz, 1 @@ -22055,6 +22448,7 @@ bodyecology.com, 1 bodygearguide.com, 1 bodyhealthcare.tk, 1 +bodyheightweight.com, 1 bodymassage.cf, 1 bodymod.tk, 1 bodymusclejournal.com, 1 @@ -22071,10 +22465,13 @@ boehm.sh, 1 boehs.org, 1 boeing747.tk, 1 +boekstuk.com, 1 boeleo.ru, 1 boensite.tk, 1 boenyc.gov, 1 boerandolphcountyga.gov, 1 +boeren.de, 1 +boerger.com, 1 boese.one, 1 boevik.ml, 1 boew.de, 1 @@ -22105,7 +22502,6 @@ bohan.co, 1 bohemiantooers.ga, 1 bohobasics.nl, 1 -bohostijl.nl, 1 bohramt.de, 1 bohyn.cz, 1 boikhor.com, 1 @@ -22141,6 +22537,8 @@ bokutake.com, 1 bol.io, 1 bolalocobrews.co.uk, 1 +bolaodarico.com.br, 1 +bolbilisim.com, 1 bolchettabolsos.es, 1 boldare.com, 1 boldbeau.pt, 1 @@ -22166,6 +22564,7 @@ bolivarfm.com.ve, 1 boliviaverde.tk, 1 bolivin.ga, 1 +bollervilla.de, 1 bolli.tech, 1 bollymarket.com, 1 bollywoodacapellas4djs.tk, 1 @@ -22178,6 +22577,7 @@ bologoe.tk, 1 bololo.fun, 1 bololo.online, 1 +bolonapps.com, 1 bolos.tk, 1 bolosbatiente.tk, 1 bolovegna.it, 1 @@ -22239,7 +22639,6 @@ bonapeti.ml, 1 bonaselect.lv, 1 bonawehouse.co.uk, 1 -bonbini.ga, 1 bonbonka.best, 1 bonbonshop.ro, 1 bonchaboncha.com.tw, 1 @@ -22255,11 +22654,13 @@ bondpro.gov, 1 bondscript.tk, 1 bondskampeerder.nl, 1 +bondvigilantes.com, 1 boneanu.tk, 1 bonebreakers.tk, 1 bonebunny.de, 1 boneko.de, 1 boneros.tk, 1 +bonesserver.com, 1 bonexio.tk, 1 bonfi.net, 1 bonfireleads.com, 0 @@ -22338,6 +22739,7 @@ book-in-hotel.com, 1 book-online.tk, 1 book-sites.cf, 1 +bookaflightdeals.com, 1 bookameeting.se, 1 bookbazar.co.in, 1 bookcheapairline.com, 1 @@ -22353,6 +22755,7 @@ bookingworldspeakers.com, 1 bookkeepingsolutions.com.au, 1 bookmaker.expert, 1 +bookmark.cam, 1 bookmark.gq, 1 bookmarkblog.tk, 1 bookmarkclub.ga, 1 @@ -22384,9 +22787,12 @@ booksoncamping.com, 1 bookstores.gq, 1 bookstrap.ga, 1 +booksy.com, 1 booktook.cz, 1 +booktruestorys.com, 1 bookvuz.tk, 1 bookwear.com, 1 +bookwhen.com, 1 bookworld.gr, 1 bookyourdata.com, 1 bookzaga.com, 1 @@ -22394,8 +22800,10 @@ booldamm.llc, 1 boombangcreditos.tk, 1 boomboomboat.com, 1 +boomersclub.com.au, 1 boomersurf.com, 1 boomfestival.org, 1 +boomingofthings.com, 1 boomkins.net, 1 boomshadow.net, 1 boomsocial.com, 1 @@ -22418,6 +22826,7 @@ booox.org, 1 booox.pw, 1 boop.gq, 1 +boop.icu, 1 boop.pro, 1 booq.org, 1 booquiz.com, 1 @@ -22434,7 +22843,9 @@ boostplm.com, 1 boostport.com, 1 boostport.com.au, 1 +boostroom.com, 1 boostsafety.com, 1 +boostyour.bio, 1 booths.cyou, 1 bootlabs.net, 1 bootlesshacker.com, 1 @@ -22443,6 +22854,7 @@ bootsa.ga, 1 bootsa.tk, 1 bootspropertycentral.co.uk, 1 +bootstrapcollab.com, 1 bootswinter.tk, 1 bootytube.net, 1 boozinyan.com, 1 @@ -22462,7 +22874,6 @@ borde.network, 1 bordeiu.ro, 1 bordelique.tk, 1 -bordenmax.nl, 1 bordercolli.tk, 1 bordercollie.tk, 1 bordercolliesworkingdogs.tk, 1 @@ -22494,6 +22905,7 @@ boreo.si, 1 boresmail.ru, 1 borfin.com, 1 +borgcube.com, 1 borgmestervangen.xyz, 1 borgoaureo.com, 1 borgodigatteraia.it, 1 @@ -22508,6 +22920,7 @@ borislam.tk, 1 borisof.tk, 1 borja.io, 1 +borjaacost.com, 1 borjalucero.es, 1 borlangefk.tk, 1 borman.biz, 1 @@ -22531,7 +22944,6 @@ bortox.it, 0 borysek.net, 1 borysenko.se, 1 -borza.blog, 0 borzaresearch.com, 1 borzov.tk, 1 bosabosa.org, 0 @@ -22569,9 +22981,12 @@ bostonblockchainassociation.org, 1 bostonews.tk, 1 bostonivy.co, 1 +bostonmedicalgroup.com, 1 bostonsportsmedicinemd.com, 1 bosun.io, 1 bot-manager.pl, 1 +botanischkunstenaarsnederland.nl, 1 +botanylinemarking.com.au, 1 botarticle.ga, 1 botbrother.ml, 1 botcamp.org, 1 @@ -22606,6 +23021,7 @@ bottinquebec.com, 1 bottke.berlin, 1 bottle.li, 1 +bottlecapsbev.com, 1 bottlerockshuttles.com, 1 bottom9clothing.com, 1 bottomfeedings.tk, 1 @@ -22701,7 +23117,6 @@ bouncycastlehirelouth.co.uk, 1 bouncycastlehiremalvern.co.uk, 1 bouncycastlehireoldham.co.uk, 1 -bouncycastlehirestroud.co.uk, 1 bouncycastlehiresurrey.co.uk, 1 bouncycastlehirewinchester.co.uk, 1 bouncycastleman.co.uk, 1 @@ -22736,6 +23151,7 @@ bountyfactory.io, 1 bountyhunter.tk, 1 bountyhuntermetaldetector.tk, 1 +bountyx.com, 1 bourasse.fr, 1 bourbo.net, 1 bourbonridgeretreat.com, 1 @@ -22788,14 +23204,17 @@ box.bz, 1 box2.cz, 1 boxbuttecountyne.gov, 1 +boxclub-marburg.de, 1 boxcritters.wiki, 1 boxcryptor.com, 0 boxdevigneron.fr, 1 boxdropcc.com, 1 +boxdroplacrosse.com, 1 boxeomexicano.tk, 1 boxer-shorts.net, 1 boxerdogdiaries.com, 1 boxerdogsaspets.com, 1 +boxfordhistoricalsociety.com, 1 boxing-kangaroo.ga, 1 boxing-videos.com, 1 boxing247.com, 1 @@ -22844,6 +23263,7 @@ bparlay.com, 1 bpastudies.org, 1 bpbdpadangsidimpuan.id, 1 +bpd.nl, 1 bpedia.org, 1 bphostels.com, 1 bpinvest.ch, 1 @@ -22866,14 +23286,13 @@ br-miyamoto.spdns.org, 1 br.search.yahoo.com, 0 br1334shop.com.br, 1 +br24-7.com, 1 br3in.nl, 0 br7.city, 1 br7.ru, 1 br8.pl, 1 bra-horapparat.se, 1 braathe.no, 1 -brabank.no, 1 -brabank.se, 1 brabantia.com, 1 braccialini.tk, 1 bracebridgechiro.com, 1 @@ -22918,10 +23337,11 @@ brain.gov, 1 brainatwork.it, 1 brainball.fr, 0 -brainboxai.com, 1 +brainbashers.com, 1 +brainboxai.com, 0 brainburger101.tk, 1 +braincorebismarck.com, 1 braindiamond.com, 1 -braindiamonds.com, 1 brainefive.com, 1 brainfeed.nl, 1 brainguru.co.in, 1 @@ -22931,6 +23351,7 @@ brainit.at, 1 brainjuice.tk, 1 brainmade.tk, 1 +brainmanager.io, 1 brainobeat.com, 1 brainotony.com, 1 brainoutlevel.com, 1 @@ -23003,6 +23424,7 @@ brandingcoapps.com, 1 brandingforthepeople.com, 1 brandinspiration.fr, 1 +brandit2.net, 1 brandketers.com, 1 brandmovers.co, 1 brandnucreations.com, 1 @@ -23017,14 +23439,12 @@ brandongomez.me, 1 brandonhaynesmd.com, 1 brandonhubbard.com, 1 -brandonjacksonphoto.com, 1 brandonlin.me, 1 brandonlui.com, 1 brandonlui.ml, 1 brandons.site, 1 brandontaylor-black.com, 1 brandonwalker.me, 1 -brandor.io, 1 brandrocket.dk, 1 brands-clothings.tk, 1 brands-polo.cf, 1 @@ -23119,10 +23539,16 @@ bravo.bi, 1 bravoasociados.com, 1 bravobet.et, 1 +bravodeal.com, 1 bravodescuento.es, 1 bravogutschein.at, 1 bravogutschein.de, 1 +bravokorting.nl, 1 +bravokupony.pl, 1 +bravopromo.be, 1 bravopromo.fr, 1 +bravosconto.it, 1 +bravovoucher.co.uk, 1 bravurasolutions.com, 1 brawin.cf, 1 brawlstarsitalia.com, 1 @@ -23148,11 +23574,12 @@ brbt.eu, 1 brbt.net, 1 brck.nl, 1 +brcshipsupply.com, 1 brd.ro, 1 breachlock.com, 1 +breachmedia.ca, 1 bread.fish, 1 breadandlife.org, 0 -breadheads.net, 1 breadmash.tk, 1 breadpirates.chat, 1 breakberlin.tk, 1 @@ -23182,7 +23609,6 @@ breastenlargement.gq, 1 breathe-easy.tk, 1 breathedreamgo.com, 0 -breathfinder.io, 1 breathingblanket.com, 1 breathingsound.ml, 1 breathingspace.scot, 1 @@ -23203,18 +23629,19 @@ breechdepot.com, 1 breederworld.dog, 1 breen.com.br, 1 -breeyn.com, 1 breezyapp.hu, 1 breffa.pl, 1 brefy.com, 1 brege.org, 1 bregnedal.dk, 1 bregnedalsystems.dk, 1 +bregroup.com, 1 brehoni.cz, 1 breinify.ai, 1 breinify.com, 1 breitband.bz.it, 1 breizh.pm, 1 +breizhpuffy.org, 1 breket.ml, 1 brelahotelberulia.com, 1 brelin.tk, 1 @@ -23261,6 +23688,7 @@ brettw.xyz, 1 bretzner.fr, 0 brevboxar.se, 1 +brevent.sh, 1 brew.fi, 1 brew.sh, 1 brewin.ml, 1 @@ -23299,11 +23727,13 @@ briankanode.com, 1 brianlachapelle.tk, 1 brianlanders.us, 1 +brianleejackson.com, 1 brianleemarketing.com, 1 brianmwaters.net, 1 brianna.tk, 1 brianoost.com, 1 brianpagan.net, 1 +brianregan.com, 1 brianroadifer.com, 1 briansemrau.com, 1 briansmith.org, 1 @@ -23359,6 +23789,7 @@ bridgeportlaboratory.tk, 1 bridgercanyonfiremt.gov, 1 bridges.ml, 1 +bridgesem.io, 1 bridgesinbelize.org, 1 bridgethailand28chidlom.com, 1 bridgetownrecords.tk, 1 @@ -23368,6 +23799,7 @@ brie.tech, 1 briefassistant.com, 1 briefbiz-news.tk, 1 +briefly.ru, 1 briefs.in.th, 1 briefvorlagen-papierformat.de, 1 briellenj.gov, 1 @@ -23391,8 +23823,9 @@ brighterimagelab.com, 1 brighterir.com, 1 brightfuturemadebyme.com, 1 +brightgk.com, 1 brightideaspromotional.co.uk, 1 -brightlingseamusicfest.co.uk, 1 +brightmachines.com, 1 brightmls.com, 1 brightonbank.com, 1 brightonbouncycastles.net, 1 @@ -23407,6 +23840,7 @@ brightsparks.com.sg, 1 brightsport-news.tk, 1 brighttax.com, 1 +brightvalley.com.au, 1 brightview.net.cn, 1 brightwakeintranet.co.uk, 1 brightzonecleaning.com.au, 1 @@ -23424,7 +23858,6 @@ brillie.tk, 1 brillio.com, 1 brillionwi.gov, 1 -brillionworks.com, 1 brimspark.com, 1 brimspark.systems, 1 brindabantheatre.tk, 1 @@ -23441,6 +23874,7 @@ brinokidzonline.tk, 1 brio-shop.ch, 1 brio-ukraine.store, 1 +brio.news, 1 briograce.com.mx, 1 brioukraine.store, 1 brisamar8.de, 1 @@ -23454,10 +23888,15 @@ brisp.nl, 1 bristebein.com, 1 bristolandwestonsuperbounce.com, 1 +bristolcountysavings.com, 1 +bristolmoneyman.com, 1 brit-thoracic.org.uk, 1 britania.tk, 1 +britannia.no, 1 britanniapandi.com, 1 +brite.com, 1 britelocate.com, 1 +british-assessment.co.uk, 1 britishairlinesflights.com, 1 britishbee.org.uk, 1 britishbee.uk, 1 @@ -23490,6 +23929,7 @@ britofootball.com, 1 britsoc.co.uk, 1 brittainconsulting.ca, 1 +brittany.com.ph, 1 brittanyferriesnewsroom.com, 1 brittas-world.tk, 1 britton-photography.com, 1 @@ -23497,6 +23937,7 @@ brix-central.tk, 1 brixxonline.nl, 1 brizawen.com, 1 +brizzo.net, 1 brk-t.com, 1 brk-t.org, 1 brk.dk, 1 @@ -23505,6 +23946,7 @@ brkt.church, 1 brktkiliseleri.com, 1 brktkiliseleri.org, 1 +brloh.sk, 1 brmascots.com, 1 brmnn.de, 1 brmsalescommunity.com, 1 @@ -23521,16 +23963,17 @@ broadax.ml, 1 broadbandchoices.co.uk, 1 broadbandexposed.co.uk, 1 +broadbandmap.gov, 1 broadbiz-news.tk, 1 broadcastlistingers.ga, 1 broadcastlistingest.ga, 1 broadcastrealtimeest.ga, 1 broadcasttowerers.ga, 1 +broadfoundation.org, 1 broadinstitute.org, 1 broadjournalest.ga, 1 broadleft.org, 1 broadsheet.com.au, 1 -broadsign.com, 1 broadwayfamilydentalpc.com, 1 broadwaytravel.com, 1 broadwayva.gov, 1 @@ -23560,16 +24003,19 @@ broke.network, 1 brokeinkorea.tk, 1 brokenbiz-news.tk, 1 +brokenbowokpd.gov, 1 brokencityllc.ga, 1 brokenhands.io, 1 brokenminds.tk, 1 brokenneckgang.com, 1 +brokenrevolution.com, 1 brokenships.com, 1 brokensword.tk, 1 brokentoaster.tk, 1 brokerdecredite.ro, 1 brokerlink.ca, 1 brokernet.ie, 0 +brokernews.com.au, 1 brokernotes.co, 1 brokerstalk.com, 1 brokeryouers.ga, 1 @@ -23579,8 +24025,8 @@ brols.eu, 1 bromfietsman.tk, 1 bromideas.ga, 1 -bromo.cf, 1 bromo.com, 1 +bromonetwork.com, 1 brompton-cocktail.com, 1 bronco-atodogalope.tk, 1 bronevichok.ru, 1 @@ -23592,7 +24038,6 @@ broodbesteld.nl, 1 broodingblogger.com, 1 brookeblogt.be, 1 -brookes.xyz, 1 brookframework.org, 1 brooklynboyblues.cf, 1 brooklynboyblues.ga, 1 @@ -23609,6 +24054,7 @@ brookshirebrothers.com, 1 brooksideas.ga, 1 brookvillepoliceny.gov, 1 +brookz.nl, 1 broomcastle.com, 1 broomcastle.eu, 1 broomcastle.net, 1 @@ -23617,6 +24063,7 @@ brosay-legko.ml, 1 brossman.it, 1 brossmanit.com, 1 +brother.com.hk, 1 brothers.gold, 1 brothersinbeetles.tk, 1 brottsfiltret.tk, 1 @@ -23626,7 +24073,6 @@ brouwer-greonterp.nl, 1 brouwerijdeblauweijsbeer.nl, 1 brouzuf.tk, 0 -brovary-eda.kiev.ua, 1 brovelton.com, 0 browardvotes.gov, 1 browfai.casa, 1 @@ -23634,6 +24080,7 @@ brownandjoseph.com, 1 brownavto-news.tk, 1 browncoil.gov, 1 +browncountyne.gov, 1 brownforces.desi, 1 brownforces.org, 1 brownie.plus, 1 @@ -23658,9 +24105,13 @@ brr.fyi, 1 brrr.fr, 1 brskt.be, 1 +brsociety.club, 1 brsvcs.in, 1 brtve.tk, 1 bru6.de, 1 +brubaker.ac, 1 +brubaker.cc, 1 +brubakerairconditioningrepair.com, 1 brubank.com, 1 brubankv1-staging.azurewebsites.net, 1 bruce-springsteen.tk, 1 @@ -23681,7 +24132,10 @@ brugpensioen.tk, 1 bruidstaarten.tk, 1 bruisedsky.com, 1 +bruitparif.fr, 1 brujoincaperuano.com, 1 +bruk2fa.no, 1 +brukalai.lt, 1 brulewi.gov, 1 brun-despagne.com, 1 brun.rocks, 1 @@ -23705,6 +24159,7 @@ brunolt.nl, 1 brunoramos.com, 0 brunoreno.be, 1 +brunosampaioblog.com, 1 brunroom.tk, 1 brunswick.com, 0 brush.ninja, 1 @@ -23761,36 +24216,41 @@ bsa157.org, 1 bsaab.se, 1 bsaft.ml, 1 +bsale.com.au, 1 bsalyzer.com, 1 bsapack564.org, 1 bsatroop1003.com, 1 bsatroop3.com, 1 bsatroop794.org, 1 bsbet365.com, 1 +bsbi.org, 1 bsc-rietz.at, 1 bsc01.dyndns.org, 1 bscc.support, 1 bscquimicos.com.br, 1 +bscrpc.com, 1 bscyb.ch, 1 bsd-box.net, 1 bsd-sec.com, 1 +bsd-unix.org, 1 bsd.com.ro, 1 bsd.gay, 1 bsdbox.de, 1 bsdes.net, 1 +bsdex.de, 1 bsdfreak.dk, 0 bsdguru.net, 1 bsdly.net, 1 bsdracing.ca, 1 bsdug.org, 1 bsdunix.xyz, 1 +bsebresult.in, 1 bsee.gov, 1 bserved.de, 0 bsf-knowledgecity.com, 1 bsg.ro, 1 bsgamanet.ro, 1 bsgcredit.ro, 1 -bsharptech.com.au, 1 bsidesf.com, 1 bsidesf.org, 1 bsidessf.com, 1 @@ -23813,6 +24273,7 @@ bss.solutions, 1 bss.systems, 1 bss01.de, 1 +bsskorcz.pl, 1 bssolvfagen-pre-storeswa-wap.azurewebsites.net, 1 bsstainless.com, 1 bst-brandschutz.at, 1 @@ -23850,6 +24311,7 @@ btcpop.co, 1 btcrit.com, 1 btcwip.com, 1 +btddd.com, 1 btdproductions.tk, 1 btec.ae, 1 bth.wtf, 1 @@ -23864,6 +24326,7 @@ btnissanparts.com, 1 btopc.jp, 1 btorrent.xyz, 1 +btrade.io, 1 btrans.by, 1 btraviswright.com, 1 btraviswrightmps.com, 1 @@ -23891,6 +24354,7 @@ bturboo.com, 1 btvw.de, 1 btwsa.tk, 1 +btxchange.io, 1 buatcv.online, 1 buayacorp.com, 1 bub.cat, 1 @@ -23920,6 +24384,7 @@ buch-angucken.de, 1 buchanancountyvirginia.gov, 1 buchananga.gov, 1 +buchanantwpmi.gov, 1 buchangroupinc.com, 1 buchdata.it, 1 buchhaltung-muehelos.de, 1 @@ -23983,6 +24448,7 @@ budget.ie, 1 budgetboats.net, 1 budgetimize.com, 1 +budgetlinemarking.com.au, 1 budgetlob.gov, 1 budgetlovers.nl, 1 budgetrf.tk, 1 @@ -23997,6 +24463,7 @@ buehler.rocks, 1 bueltge.de, 1 buena.me, 1 +buenavistawinery.com, 1 buenosproductos.net, 1 bueny.com, 1 bueny.net, 1 @@ -24063,6 +24530,7 @@ buildbackbetter.gov, 1 buildbytes.com, 1 buildconcierge.ga, 1 +builddirect.com, 1 buildersofthesilentcities.tk, 1 buildgp.com, 1 buildherers.ga, 1 @@ -24088,6 +24556,7 @@ buildplease.com, 1 buildr.gr, 1 builds.gg, 1 +buildstaging.com, 1 buildthewall2022.com, 1 buildworkout.com, 1 buileo.com, 1 @@ -24102,7 +24571,9 @@ builtinnyc.com, 1 builtinseattle.com, 1 builtinsf.com, 1 +builtinvacuum.com, 1 builtory.my, 1 +builttosell.com, 1 builtvisible.com, 1 builtwith.com, 1 buissonchardin.fr, 1 @@ -24118,6 +24589,7 @@ bukowski.se, 1 bukowski.tk, 1 bukpcszerviz.hu, 1 +buksu.edu.ph, 1 bukularis.ga, 1 bul3seas.eu, 1 bulario.com, 1 @@ -24137,13 +24609,16 @@ bulgakov.tk, 1 bulgariablog.tk, 1 bulgarianhouse.tk, 1 +bulgarianproperties.com, 1 bulgariya.cf, 1 bulhost.com, 1 bulindir.tk, 1 bulkowespacerkowo.nl, 1 bull.id.au, 0 +bulla.ua, 1 bulldog-buss.tk, 1 bulldog-hosting.de, 0 +bulldogdriveways.com, 1 bulldogfrances.tk, 1 bulldogkennel.tk, 1 bulldogs-sipoo.tk, 1 @@ -24164,6 +24639,7 @@ bullpendaily.com, 1 bullshitmail.nl, 1 bullterrierspain.tk, 1 +bulltorrent.com, 1 bullvalleyil.gov, 1 bullyprotection.ml, 1 bulmanat.tk, 1 @@ -24176,8 +24652,9 @@ bumble.com, 1 bumblebee.cf, 1 bumblebeekids.uk, 1 +bumblecraft.net, 1 bumenn.is, 1 -bumianoa.com, 0 +bumianoa.com, 1 bumirc.tk, 1 bummelwelt.ch, 1 bummelwelt.com, 1 @@ -24248,24 +24725,27 @@ burbankdental.com, 1 burberry-outlet.cf, 1 burberry-outlets.ca, 1 +burberrysunglasses.us, 1 burcevo.info, 1 burchfabrics.com, 0 burdurhaber.tk, 1 burdursondakika.tk, 1 bureaubolster.nl, 0 +bureaubraam.nl, 0 bureaudirectoryers.ga, 1 -bureaugoodwork.nl, 1 burenvoorburen.gent, 1 burevestnik.tk, 1 burewala.tk, 1 burewalanews.tk, 1 burg-hohnstein.com, 1 burg-hohnstein.info, 1 +burgas.bg, 1 burgawnc.gov, 1 burgerbudget.gent, 1 burgernet.nl, 0 burgers.io, 1 burgesspetcare.com, 1 +burghardt-neumann.de, 1 burghardt.pl, 1 burghtstam.tk, 1 burgoslacrosse.tk, 1 @@ -24277,12 +24757,14 @@ buriramradio.com, 1 burke.services, 1 burkhardt.at, 1 +burkitech.com, 1 burkoff.tk, 1 burkow.ru, 1 burlaka.net, 1 burlapsac.ca, 1 burlesontx.gov, 1 burling.cz, 1 +burlingamehistorical.org, 1 burlingameparentsclub.org, 1 burma-we-care.tk, 1 burmalin.ml, 1 @@ -24290,6 +24772,7 @@ burmeister-gmbh.de, 1 burmesecatscare.com, 1 burmesepythonpet.com, 1 +burnabyhighstar.com, 1 burncorp.org, 1 burndyt3.com, 1 burnedyouers.ga, 1 @@ -24311,10 +24794,11 @@ burnit.tk, 1 burnsland.com, 1 burntfish.com, 1 -burnworks.com, 1 +burnworks.com, 0 buro86.be, 1 buronducouderc.fr, 1 buronwater.com, 1 +burr.is, 1 burree.xyz, 1 burreli.tk, 1 burritosalsa.com, 1 @@ -24396,7 +24880,6 @@ businessafter.ga, 1 businessamongus.com, 1 businessanalyst.ml, 1 -businessanalytics24.com, 1 businessarrow.ga, 1 businessbad.ga, 1 businessbasecamp.eu, 1 @@ -24415,6 +24898,7 @@ businesscharts.ga, 1 businesscircus.ga, 1 businesscisco.tk, 1 +businesscloud.co.uk, 1 businesscollect.ga, 1 businesscollections.ga, 1 businesscolor.ga, 1 @@ -24533,8 +25017,10 @@ businessknight.ga, 1 businesslead.tk, 1 businessleader.co.uk, 1 +businessleadsworld.com, 1 businesslegacy.ga, 1 businessless.ga, 1 +businessliabilitypros.com, 1 businesslion.ga, 1 businesslistingd.com, 1 businesslite.pl, 1 @@ -24546,11 +25032,13 @@ businessmetric.ga, 1 businessmind.ml, 1 businessmystical.ga, 1 +businessnamegenerator.com, 1 businessnames.ga, 1 businessnations.ga, 1 businessnatural.ga, 1 businessnet.cf, 1 businessnetworks.tk, 1 +businessnews-nigeria.com, 1 businessnewsera.tk, 1 businessnight.ga, 1 businessoftheday.ga, 1 @@ -24596,6 +25084,7 @@ businessslide.ga, 1 businesssonic.ga, 1 businesssouthbeach.ga, 1 +businessspare.com, 1 businesssparkle.ga, 1 businessspicy.ga, 1 businesssplash.ga, 1 @@ -24631,6 +25120,7 @@ busold.ws, 1 buspark.com, 1 buspark.cz, 1 +buspatrol.com, 1 busphotos.tk, 1 busqnet.com, 1 bussi.at, 1 @@ -24662,6 +25152,7 @@ buswiki.ml, 1 busyon.cloud, 1 but-it-actually.work, 1 +but-its-not-your.business, 1 butarque.es, 1 butcherpaxtattoo.com, 1 butekno.net, 1 @@ -24669,6 +25160,7 @@ butfirstkoffee.in, 1 butianyun.com, 1 butik-mechty.tk, 1 +butikk-nesoddkatten.no, 1 butikvip.ru, 1 butl.nl, 1 butlaroo.com, 1 @@ -24676,6 +25168,7 @@ butlercountyogs.org, 1 butlerdisposal.com, 1 butlerfm.dk, 1 +butlins.com, 1 butorkarpitos.com, 0 butowka.tk, 1 butsa.tk, 1 @@ -24721,8 +25214,10 @@ buy-decadron.tk, 1 buy-deltasone.tk, 1 buy-essay-online.ga, 1 +buy-express-vpn.asia, 1 buy-human-hair-extension.tk, 1 buy-indocin.cf, 1 +buy-invertor.shop, 1 buy-jeansbiz.tk, 1 buy-kratom.us, 1 buy-lasix-without-a-doctor-s-prescription.ga, 1 @@ -24790,18 +25285,22 @@ buyingstatus.com, 1 buyingtvsers.ga, 1 buyingtvsest.ga, 1 +buyiptv.tech, 1 buyitmalta.online, 1 buyjewel.shop, 1 buylasix.ml, 1 buylevaquin.tk, 1 buymetforminonline.tk, 1 buymobic.ml, 1 +buymycomics.com, 1 buymyvoip.com, 1 buyneurontin.ml, 1 buyonlineclass.com, 1 buyonmov.online, 1 +buyorbye.com.au, 1 buyornot.tk, 1 buypapercheap.net, 1 +buypersonalproxy.com, 1 buyplore.com, 1 buyplussize.shop, 1 buyprednisolone24h.ml, 1 @@ -24811,6 +25310,7 @@ buypropecia.cf, 1 buyproperty.az, 1 buyproscaronlinecanada.ga, 1 +buyprosoma.com, 1 buyprovera.tk, 1 buyprozac.cf, 1 buypurenature.ga, 1 @@ -24825,6 +25325,7 @@ buystromectol.cf, 1 buystromectol.ml, 1 buysuisse.shop, 1 +buytadalafiltabs.com, 1 buytermpaper.com, 1 buytetracycline.cf, 1 buythermopro.com, 1 @@ -24841,15 +25342,16 @@ buyzithromaxonline.ml, 1 buyzofranonline.tk, 1 buyzoloft.cf, 1 +buzau.org, 1 buzhi.de, 1 buziaczki.pl, 1 buzinessmarket.ml, 1 buzt.cn, 1 -buzye.com, 1 buzzconcert.com, 1 buzzcontent.com, 1 buzzenginegroup.com, 1 buzzfeast.com, 1 +buzzframe.com, 1 buzzhub.tk, 1 buzzkuri.co.jp, 1 buzzkuri.com, 1 @@ -24910,6 +25412,7 @@ bwgjms.org, 1 bwh1.net, 0 bwhbwh.net, 1 +bwigroup.com.au, 1 bwilkinson.co.uk, 1 bwin18.cc, 0 bwin2288.com, 1 @@ -24930,8 +25433,10 @@ bxdj3.com, 1 bxin.de, 1 bxp40.at, 1 +by-g.ch, 1 by-pixcl.com, 1 by-robyn.nl, 1 +by-the-sword.com, 1 by-yesilbag.com, 1 by.cx, 0 by.place, 1 @@ -25011,7 +25516,7 @@ bytebe.at, 0 bytebodega.com, 1 bytebucket.org, 1 -bytecrafter.com, 1 +bytecrafter.com, 0 bytecrafter.net, 1 byteflies.com, 1 bytema.cz, 1 @@ -25066,6 +25571,7 @@ c-aeroconsult.com, 1 c-c-europeen.org, 1 c-chaud.com, 1 +c-data.nl, 1 c-dome.com, 1 c-g-h.net, 1 c-ma-copro.com, 1 @@ -25075,6 +25581,7 @@ c-rtx.com, 1 c-sagaseru.com, 1 c-shock.org, 1 +c-solarcity.com, 1 c-style.net, 0 c-three.jp, 1 c-world.co.uk, 1 @@ -25095,11 +25602,13 @@ c19colchicine.com, 1 c19curcumin.com, 1 c19early.com, 1 +c19early.org, 1 c19favipiravir.com, 1 c19fluvoxamine.com, 1 c19hcq.com, 1 c19ic.com, 1 c19ivermectin.com, 1 +c19ivm.org, 1 c19legacy.com, 1 c19ly.com, 1 c19melatonin.com, 1 @@ -25205,6 +25714,7 @@ cable.ru, 1 cable360.de, 1 cableatierra.tk, 1 +cablefreetv.org, 1 cablehighspeed.net, 1 cablemadrid.tk, 1 cablemod.com, 1 @@ -25267,6 +25777,7 @@ cadeengineering.com, 1 cadeirasparaescritorio.ind.br, 1 cadenadereferidos.tk, 1 +cadenceluxpornstar.com, 1 cadencescience.com, 1 cadetsge.ch, 0 cadflow.pt, 1 @@ -25291,6 +25802,7 @@ cadre.com, 1 cadreok.com, 1 cadsys.net, 1 +cadusilva.com, 1 caduta-capelli.tk, 1 cadvending.ch, 1 cadventura.com, 1 @@ -25309,6 +25821,7 @@ cafe-cliche.tk, 1 cafe-georges.cf, 1 cafe-habis.de, 1 +cafe-hamlet.fr, 1 cafe-musica.org, 1 cafe-pauline.de, 1 cafe-service.ru, 0 @@ -25318,6 +25831,7 @@ cafecentral.tk, 1 cafechesscourt.com, 1 cafechroma.tk, 1 +cafecliche.com, 1 cafecobus.tk, 1 cafedelcielo.co, 1 cafedesignbooks.com, 1 @@ -25422,6 +25936,7 @@ cakir.info.tr, 1 cakirlarshipyard.com, 1 cakko.ml, 1 +caknowledge.com, 1 cal.goip.de, 1 cal9000.com, 1 calaad.net, 1 @@ -25447,6 +25962,7 @@ calaverascounty.gov, 1 calaverasmedicalcannabis.com, 1 calcasieu.gov, 1 +calcasieuclerk.gov, 1 calcasieuparish.gov, 1 calcasieusheriff.gov, 1 calcedge.com, 1 @@ -25462,11 +25978,12 @@ calculadoraconversor.com, 1 calculadorasonline.com, 1 calcularis.ch, 1 -calculat.io, 1 calculate.co.kr, 1 calculateaspectratio.com, 1 calculates.org, 1 +calculator-app.com, 1 calculator-imt.com, 1 +calculator.aws, 1 calculator.tf, 1 calculatortvers.ga, 1 calculatortvest.ga, 1 @@ -25559,6 +26076,7 @@ callhippo.com, 1 callhome.link, 1 callhub.io, 1 +callifi.com, 1 calligraph.gq, 1 calligraphychic.com, 1 callisabel.fr, 1 @@ -25593,6 +26111,7 @@ calucon.de, 1 calumetcounty.gov, 1 calvario.tk, 1 +calvaryhospital.org, 1 calverleyparish.church, 1 calvertcityky.gov, 1 calvin.my, 1 @@ -25616,7 +26135,6 @@ camaronazo.com, 1 camarzanadetera.tk, 1 camashop.de, 1 -camasirkazani.com, 1 camastowncar.com, 1 camazoon.com, 1 cambados.tk, 1 @@ -25637,6 +26155,7 @@ cambridgeanalytica.cz, 1 cambridgeanalytica.net, 1 cambridgeanalytica.org, 0 +cambridgemoneyman.com, 1 cambridgesecuritygroup.org, 1 cambridgetutors.com, 1 cambuslangharriers.org, 1 @@ -25660,6 +26179,7 @@ cameo.ee, 1 cameos.bo, 1 camera-podvod.tk, 1 +camerahainam.net, 1 camerahire.com.au, 1 cameraman.tk, 1 cameramark.nl, 1 @@ -25675,6 +26195,7 @@ cameronsiguenza.com, 1 cameronstar.tk, 1 cameronwince.com, 1 +cameronwv.gov, 1 cameroonlounge.com, 1 camerweb.es, 1 camfire.family, 1 @@ -25715,6 +26236,7 @@ campaigner.gq, 1 campaignlake.com, 1 campaignwiki.org, 1 +campaignzee.com, 1 campalhilal.org, 1 campamentos.info, 1 campanhamamypoko.com.br, 1 @@ -25725,7 +26247,7 @@ campdesante.com, 1 campdetarragona.tk, 1 campeonatoalemao.com.br, 1 -campercaravanmosman.nl, 1 +camperdays.de, 1 camperdirectoryers.ga, 1 camperdirectoryest.ga, 1 camperlist.com, 1 @@ -25755,6 +26277,7 @@ campingshop.pl, 1 campingskyhooks.com, 1 campingwatchest.ga, 1 +campioninsanatate.ro, 1 campistry.net, 1 camplaza.tk, 1 campmackinaw.com, 1 @@ -25778,6 +26301,7 @@ campuspodsest.ga, 1 campuswire.com, 1 campvana.com, 1 +campwaltblog.com, 1 camrecord.ml, 1 camreviews.org, 1 camrosewebservices.com, 1 @@ -25819,6 +26343,7 @@ canadacommunity.org, 1 canadacouncil.ca, 1 canadafactcheck.ca, 1 +canadagoosejacketscanada.ca, 1 canadamails.tk, 1 canadapet.club, 1 canadapets.club, 1 @@ -25834,9 +26359,11 @@ canadianoutdoorequipment.com, 1 canadianpharmacyonline.com, 1 canadianpointerclub.tk, 1 +canadiansinternet.com, 1 canadiansrit.tk, 1 canadiantouristboard.com, 1 canajoana.eu, 1 +canal-onanismo.org, 1 canal4.com.ni, 1 canalbpv.com, 1 canalcienciascriminais.com.br, 1 @@ -25866,6 +26393,7 @@ canberraoutletcentre.com.au, 1 canberrarunners.org.au, 1 cancan.ml, 1 +cancer.gov, 1 canceraid.coach, 1 canceraid.com, 1 canceraid.com.au, 1 @@ -25940,6 +26468,7 @@ canhq.tk, 1 canhtuaone.com, 0 cani-compostelle.fr, 1 +canibrowse.net, 1 canidaerd.com, 1 canihavesome.coffee, 0 canile.it, 1 @@ -25950,12 +26479,15 @@ canker.org, 1 cankhon.tk, 1 cankirihaber.tk, 1 +canlidiziizlesene.org, 1 canliradyodinle.fm, 1 canlitelefonhatti.ga, 1 canlom.tk, 1 canmipai.com, 1 cannabis-marijuana.com, 1 cannabiscare.ca, 1 +cannabisdiscounter.ca, 1 +cannabishouseyeg.com, 1 cannabislegality.info, 1 cannabisoffers.net, 1 cannabisreports.org, 1 @@ -25981,6 +26513,7 @@ canopycleaningmelbourne.com.au, 1 canopytax.com, 1 canormanyaran.com, 1 +canossagardens.org.au, 1 canossahospital.org.au, 1 canovamedical.co.uk, 1 canovamedical.com, 1 @@ -26008,6 +26541,7 @@ cantinhodapetala.com.br, 1 cantongroup.com, 1 cantonmi.gov, 1 +cantonmopolice.gov, 1 cantonms.gov, 1 cantor.cloud, 1 cantosdisidentes.tk, 1 @@ -26019,11 +26553,13 @@ canv4s.com, 1 canva-dev.com, 1 canva-staging.cn, 1 +canva-staging.com, 1 canva.cn, 1 canva.com, 1 canvas-art.tk, 1 canveganseat.com, 1 canyoncreekjeep.com, 1 +canyonisd.net, 1 canyons.media, 0 canyonshoa.com, 1 canyoupwn.me, 1 @@ -26035,7 +26571,9 @@ caodesantohumberto.com.br, 1 caos.ch, 1 caostura.com, 1 +cap50.be, 1 cap73.fr, 1 +cap75.com, 1 capa.digital, 1 capachitos.cl, 0 capacityproject.org, 1 @@ -26054,6 +26592,7 @@ capellan.pe, 1 capellen.tk, 1 capeprivacy.com, 0 +capetown.travel, 1 capetownelite.co.za, 1 caph.info, 1 caphane.com, 1 @@ -26074,6 +26613,7 @@ capitalcounselor.com, 1 capitalendurancegroup.com, 1 capitalibre.com, 1 +capitalise.ai, 1 capitalism.party, 1 capitalism.rip, 1 capitalist.cf, 1 @@ -26102,6 +26642,7 @@ capitapeskanova.tk, 1 capitein.tk, 1 capitolcounseling.net, 1 +capitolnational.com, 1 capitolpathways.org, 1 capitolrisk.tk, 1 capitoltrades.com, 1 @@ -26141,6 +26682,7 @@ captain-droid.com, 1 captainark.net, 1 captaincaz.org, 1 +captainchef.net, 1 captainclaw.tk, 1 captainclinic.com.tw, 1 captainfit.in, 1 @@ -26191,11 +26733,13 @@ caraliadeluxe.net, 1 caramellespinell.tk, 1 caranya.my.id, 1 +caratennison.net, 1 carauctionnetwork.com, 1 carauctionsalabama.com, 1 carauctionscarolina.com, 1 carauctionsgeorgia.com, 1 carauctionsillinois.com, 1 +carauctionsnewyork.com, 1 caraudiostore.tk, 1 caravaca.tk, 1 caravansciences.tk, 1 @@ -26206,6 +26750,9 @@ carbaza.ru, 1 carberra.io, 1 carberra.xyz, 1 +carbeso.co.network, 1 +carbeso.site, 1 +carbgrent.com, 1 carbon-project.org, 1 carbon.coop, 1 carbon12.org, 1 @@ -26217,6 +26764,7 @@ carbonholic.org, 1 carbonkiller.org, 1 carbonlib.com, 0 +carbonmapper.org, 1 carbonmonoxidelawyer.net, 1 carbonnel.me, 1 carbono.uy, 1 @@ -26250,6 +26798,7 @@ cardiaccane.com, 1 cardiagnose.nl, 1 cardiagnostics.tk, 1 +cardiffmoneyman.com, 1 cardinauto.fr, 1 cardingforum.co, 1 cardington.tk, 1 @@ -26268,16 +26817,15 @@ cardmarketersers.ga, 1 cardmarketersest.ga, 1 cardmart.tk, 1 -cardmates.com.br, 1 cardmetricsers.ga, 1 cardmetricsest.ga, 1 cardoneshop.it, 1 cardoni.net, 1 cardpaymentoptions.com, 1 -cardpress.com.br, 1 cardpyramiders.ga, 1 cardranking.jp, 1 cardrecovery.fr, 1 +cards4jobs.com, 1 cardschat.com, 1 cardsolutionsbh.com.br, 1 cardstesting.tk, 1 @@ -26297,9 +26845,11 @@ careercapital.co.za, 1 careerdiary.co.uk, 1 careerfoundry.com, 1 +careergigo.com, 1 careergo.org, 1 careernet.in, 1 careeroptionscoach.com, 1 +careersinpsychology.org, 1 careertransformed.com, 1 carefix.pro, 1 carefy.ph, 1 @@ -26331,6 +26881,7 @@ carfinans.ru, 1 carforme.gr, 1 carfraemill.co.uk, 1 +cargo.build, 1 cargobas.com, 1 cargobay.net, 1 cargoio.com, 1 @@ -26341,6 +26892,7 @@ cargotariff.ml, 1 carhunters.cz, 1 cari.com.my, 1 +caribank.org, 1 caribbean-tekton.com, 1 caribbean.dating, 1 caribbeancinemas.com, 1 @@ -26349,7 +26901,7 @@ caribeeficiente.com.co, 1 caribuku.tk, 1 caricature.fr, 1 -carien.eu, 0 +carien.eu, 1 cariki.gq, 1 carikiv.gq, 1 carillon.tk, 1 @@ -26366,6 +26918,7 @@ cariproperti.com, 1 carisenda.com, 1 carium.com, 1 +carkeysanantonio.com, 1 carkeysystem.com, 1 carl-blum-haus.tk, 1 carl-topham.com, 0 @@ -26390,7 +26943,6 @@ carlobiagi.de, 1 carlocksmith--dallas.com, 1 carlocksmithbaltimore.com, 1 -carlocksmithcarrollton.com, 1 carlocksmithellicottcity.com, 1 carlocksmithfallbrook.com, 1 carlocksmithkey.com, 1 @@ -26466,6 +27018,7 @@ carol-lambert.com, 1 carolcappelletti.com, 1 carolcestas.com, 1 +caroletolila.com, 1 caroli.biz, 1 caroli.com, 1 caroli.info, 1 @@ -26503,7 +27056,6 @@ carp-world.tk, 1 carp-zeeland.tk, 1 carp4life.tk, 1 -carparo.net, 1 carpeleo.com, 1 carpeleo.mobi, 1 carpeleo.se, 1 @@ -26511,6 +27063,7 @@ carpet24.gr, 1 carpetandhardwoodflooringpros.com, 1 carpetcleanerswilmington.com, 1 +carpetcleaning-cypress.com, 1 carpetcleaningprofessionals.co.uk, 1 carpetcleaningtomball.com, 1 carpetcobblers.ga, 1 @@ -26524,6 +27077,7 @@ carpticon.tk, 1 carpuya.ga, 1 carrabiners.tk, 1 +carraboucrafts.com, 1 carre-jardin.com, 1 carre-lutz.com, 1 carre.nl, 1 @@ -26548,7 +27102,6 @@ carrollcountynhdeeds.gov, 1 carrolltontx.gov, 1 carroseletricosbh.com.br, 1 -carrosserie-delaval.be, 1 carrouselcompany.fr, 1 carrozziere.roma.it, 1 carry.luxe, 1 @@ -26556,7 +27109,6 @@ cars4salecy.com, 1 carseatchecks.ca, 1 carshippingcarriers.com, 1 -carsinsuranceis.com, 1 carsoft.tk, 1 carson-aviation-adventures.com, 1 carson-matthews.co.uk, 1 @@ -26565,8 +27117,10 @@ carsonmorrow.com, 1 carsoug.com, 1 carspicture.tk, 1 +carsplan.com, 1 carspneu.cz, 1 carsreborn.com, 1 +carstar.com.ua, 1 carstub.com, 1 carsurance.net, 1 carsworld.cf, 1 @@ -26588,7 +27142,6 @@ cartegrise.com, 1 cartegrise.xyz, 1 carteles.tk, 1 -cartellimax.it, 1 cartelloni.roma.it, 1 cartercountymo.gov, 1 carterdan.net, 1 @@ -26611,6 +27164,7 @@ cartorios.tk, 1 cartoservice.tk, 1 cartouche24.eu, 1 +cartridge.bg, 1 cartridge.gq, 1 cartridgereviewers.ga, 1 cartridgereviewsers.ga, 1 @@ -26623,6 +27177,7 @@ cartwrightrealestate.com, 1 carty.bg, 1 carun.us, 0 +carunion.nl, 1 carus.com, 1 carver.tk, 1 carvercountymn.gov, 1 @@ -26649,14 +27204,14 @@ casabitare.it, 1 casaboix.es, 1 casabudget.it, 1 +casacapalbio.com, 1 casacazoleiro.com, 1 casachameleonhotels.com, 1 casacochecurro.com, 1 casacoleccionistagaldar.tk, 1 +casacolosseo.com, 1 casacoscolo.tk, 1 -casact.org, 1 casadasmolas.tk, 1 -casadasportasejanelas.com, 1 casadedios.tk, 1 casadegomes.com, 1 casadetiteres.tk, 1 @@ -26684,6 +27239,7 @@ casamiento.com.uy, 1 casamientos.com.ar, 1 casandraemge.tk, 1 +casanonnaida.it, 1 casanovafishtacos.com, 1 casanuova.tk, 1 casapalla.com.br, 1 @@ -26693,6 +27249,7 @@ casasdeapuestasdeportivas.cl, 1 casasdeapuestasdeportivas.pe, 1 casasensunbridge.com, 1 +casashops.com, 1 casasincreibles.com, 1 casasparaperross.com, 1 casasuara.com, 1 @@ -26740,6 +27297,7 @@ cashamerican.tk, 1 cashati.com, 1 cashbackcow.us, 1 +cashbacksummit.com, 1 cashblog.ga, 1 cashbook.co.tz, 1 cashbot.sk, 1 @@ -26765,6 +27323,7 @@ cashsector.ga, 1 cashservices.com.au, 1 cashsmartbookkeeping.co.za, 1 +cashwave.com, 1 cashworks.ga, 1 cashworks.tk, 1 cashyourcar.sydney, 1 @@ -26777,10 +27336,9 @@ casino-cash-flow.ru, 1 casino-cash-flow.su, 1 casino-cashflow.ru, 1 +casino-hero.de, 1 casino-online.info, 1 casino-r.com, 1 -casino-spin-city.info, 1 -casino-spincity.club, 1 casino-trio.com, 1 casino-z-top.ru, 1 casino-z.com, 1 @@ -26918,9 +27476,7 @@ casinomucho.com, 1 casinomucho.org, 1 casinomucho.se, 1 -casinonederland10.com, 1 casinonieuws.nl, 1 -casinoonlineca.ca, 1 casinoonlineprova.com, 1 casinoportugal.pt, 1 casinopromote.com, 1 @@ -26934,16 +27490,18 @@ casinoscout.nl, 1 casinoslotsww.com, 1 casinosnederland.com, 1 -casinosnobrasil.com.br, 1 casinospesialisten.net, 1 casinotokelau.tk, 1 casinotop10.net, 1 casinotopplistan.com, 1 casinotopplisten.com, 1 casinotopsonline.com, 1 +casinoua.club, 1 casinovalley.ca, 1 casinovendors.com, 1 +casinovergleich.com, 1 casio-caisses-enregistreuses.fr, 1 +casio.bg, 0 casitawn.cf, 1 casjay.cloud, 0 casjay.com, 0 @@ -26998,6 +27556,7 @@ castingfrancais.com, 1 castingnetworks.com, 1 castings.tk, 1 +castit.biz, 1 castlabs.com, 0 castle-emarketing.com, 1 castle-engine.io, 1 @@ -27044,6 +27603,7 @@ catalogobiblioteca.com, 1 catalogobiblioteca.net, 1 catalogosvirtualesonline.com, 1 +catalogueau.com, 1 catalojic.tk, 1 catalonia.tk, 1 catalyst-ecommerce.com, 1 @@ -27074,6 +27634,7 @@ catcat.cc, 1 catcatnya.com, 1 catchall.tw, 1 +catchapp.mobi, 1 catchers.cc, 1 catchhimandkeephim.com, 1 catchief.com, 1 @@ -27088,7 +27649,6 @@ caterbing.com, 1 catering-fantasia.tk, 1 catering-xanadu.cz, 1 -cateringvanhetland.nl, 1 cateromarket.pl, 1 catfishworld.tk, 1 catfood.cf, 1 @@ -27159,6 +27719,7 @@ catscreativecakes.ga, 1 catskillselfstorage.com, 1 catsmagic.pp.ua, 1 +catsmotors.com.ph, 1 catsnow.com, 1 catsofcapetown.com, 1 catsoft.me, 1 @@ -27181,6 +27742,7 @@ catvsmice.com, 1 catwilliford.com, 1 catz-productions.tk, 1 +caucasusandmercury.com, 1 caucus.fr, 1 caueteam.tk, 1 caughtredhanded.co.nz, 1 @@ -27208,6 +27770,7 @@ cavisson.com, 1 cavistenancy.fr, 1 cavzodiaco.com.br, 1 +caw.be, 1 cawagiras.ga, 1 caxaa.mx, 1 caxalt.com, 1 @@ -27215,8 +27778,8 @@ caylercapital.com, 1 cazadordebuenaonda.com, 1 cazaviajes.es, 1 -cazes.info, 1 cazfire.gov, 1 +cazinoz.ru, 1 cazoo-dev.co.uk, 1 cazoo-dev.com, 1 cazoo-test.co.uk, 1 @@ -27236,6 +27799,7 @@ cbcnet.co.za, 1 cbcnet.info, 1 cbd-natural.de, 1 +cbd-world-online.com, 1 cbd.casa, 1 cbd.supply, 1 cbd181.com, 1 @@ -27256,6 +27820,7 @@ cbet.lt, 1 cbflleida.cat, 1 cbh.org, 1 +cbhcfl.gov, 1 cbhq.net, 1 cbi-epa.gov, 1 cbin168.com, 1 @@ -27271,6 +27836,7 @@ cbnegocial.com.br, 1 cboard.ml, 1 cboard.net, 1 +cboss.xyz, 1 cbpridecenter.org, 1 cbr-rcb.ca, 1 cbr-xml-daily.ru, 1 @@ -27295,6 +27861,7 @@ cc9297.co, 1 cc9397.com, 0 cc9728.co, 1 +cca.ky, 1 ccaa.gg, 1 ccaag.link, 1 ccaag.me, 1 @@ -27310,6 +27877,7 @@ ccatpracticetest.com, 1 ccatpracticetests.com, 1 ccattestprep.com, 1 +ccautomobil.de, 1 ccayearbook.com, 1 ccb.gov, 1 ccbin.tk, 1 @@ -27345,7 +27913,7 @@ cciofficial.com, 1 ccisystems.com, 1 cck-law.com, 1 -ccl-sti.ch, 0 +ccl776o.tk, 0 cclasabana.com.co, 1 ccli.com, 1 ccmg.com, 1 @@ -27356,13 +27924,13 @@ ccnexus.global, 1 ccnm.cc, 1 ccoo.cat, 1 -ccoooss.com, 1 ccover.ru, 1 ccpaas.net, 1 ccparishwilmington.org, 1 ccpetmotel.com, 1 ccpinturas.com, 1 ccpinvestments.com, 1 +ccpl.org, 1 ccplot.org, 1 ccprwebsite.org, 1 ccrun.tk, 1 @@ -27375,6 +27943,8 @@ ccsrv.eu, 1 ccsys.com, 1 cctf-m.com, 0 +cctld.com, 1 +ccts-cprst.ca, 1 cctv-camera.cf, 1 cctv-supraveghere.ro, 1 cctv-systems.tk, 1 @@ -27394,6 +27964,7 @@ cd-shopware.de, 1 cd-sport.com, 1 cd.search.yahoo.com, 0 +cd88kz.com, 1 cda-aigle.ch, 1 cdaid.gov, 1 cdaldeano.tk, 1 @@ -27417,6 +27988,7 @@ cdf.wiki, 1 cdfnature2019.fr, 1 cdga.org, 1 +cdgitalia.org, 1 cdhb.health.nz, 1 cdhome.ga, 1 cdhqt.com, 1 @@ -27512,6 +28084,7 @@ cegfw.com, 1 cegss.org.gt, 1 ceiba.com.co, 1 +ceiexam.sg, 1 ceifx.com, 1 ceilimoss.tk, 1 ceilingpac.org, 1 @@ -27559,6 +28132,7 @@ celectro-pro.com, 1 celendo.ga, 1 celeraindustries.tk, 1 +celestestarpornstar.com, 1 celestia.tk, 1 celestialenergies.com.au, 1 celestialmusic.tk, 1 @@ -27566,6 +28140,7 @@ celexa365.tk, 1 celiac.com, 1 celigo.com, 1 +celinaohiopd.gov, 1 celine-patisserie.fr, 1 celineitalia.tk, 1 celinepsychotherapie.com, 1 @@ -27662,7 +28237,7 @@ centralconvergence.com, 1 centralcountiesservices.org, 0 centraldoencanador.com.br, 1 -centrale-vapeur.pro, 0 +centrale-vapeur.pro, 1 centralebigmat.eu, 1 centralegedimat.eu, 1 centralengland.coop, 1 @@ -27693,14 +28268,12 @@ centre-equestre.net, 1 centre-maiakovski.fr, 1 centre-momboye.fr, 0 -centre-tomatis-geneve.ch, 1 +centre-tomatis-geneve.ch, 0 centreagree.com, 1 centrecountyvotes.gov, 1 -centredaccueil.fr, 0 centreimageriedunord.com, 1 centremanagement.eu, 1 centrenationaldulivre.fr, 1 -centreon.com, 1 centrepointorguk-dev.azurewebsites.net, 1 centretownshipin.gov, 1 centricagency.co.uk, 1 @@ -27715,7 +28288,6 @@ centrodememoriahistorica.gov.co, 1 centrodemioma.com.br, 1 centroecuestrecastellar.com, 1 -centrojovencuenca.es, 1 centrolavoro.org, 1 centromedico.tk, 1 centromotion.com, 1 @@ -27751,6 +28323,7 @@ centurion-meet.site, 1 centurion.ovh, 1 centurioninfosec.com, 0 +centurionlaboratories.com.ua, 1 centurionunderground.com, 1 century21.es, 1 century21.pt, 1 @@ -27765,10 +28338,10 @@ cephalexincapsules.ml, 1 cephalexincapsules.tk, 1 cephalexine.gq, 1 +cepheid.com, 1 cepmarket.com.tr, 0 ceprenomnexistepas.ovh, 1 cepsychologie.com, 1 -ceptamircisi.com, 1 cepxuo.tk, 1 ceraelec.com, 1 ceramahit.ru, 1 @@ -27778,13 +28351,13 @@ ceramicoatingspecialists.com, 1 cerastar.com, 1 cerber.re, 1 -cerberis.com, 1 cerberusecurity.com, 1 cerberusftp.com, 1 cerbottana.duckdns.org, 1 cerby.com, 0 cercanos.co, 1 cercidiana.pt, 1 +cercle-helvetia.ch, 1 cerda-avocats.com, 1 cerebelo.info, 1 cerebrosano.gov, 1 @@ -27796,6 +28369,7 @@ ceremonybydesign.com.au, 1 cerena-silver.ru, 0 ceres-corp.org, 1 +cerezacomunicacion.com, 1 cerivo.co.uk, 1 cermak.photos, 1 cernac.cz, 1 @@ -27806,6 +28380,7 @@ ceroresiduo.com, 1 cerovica.tk, 1 cerpus-course.com, 1 +cerquitamio.com, 1 cerrajeriaamericadelquindio.com, 1 cerrajeriaenvillavicencio.com, 1 cerritosca.gov, 1 @@ -27828,6 +28403,7 @@ certificateofpurchasing.ga, 1 certificatespending.com, 1 certificatetools.com, 0 +certificationmap.com, 1 certificato-prevenzione-incendi.it, 1 certificazione.it, 1 certificazioni-energetiche.it, 1 @@ -27845,6 +28421,7 @@ certpro.uk, 1 certready.tk, 1 certreg.eu, 0 +certsign.fr, 1 certspotter.com, 1 certspotter.org, 1 certum.cn, 1 @@ -27856,7 +28433,7 @@ cervenyjezek.eu, 1 cervera.com.br, 1 ces-ltd.co.uk, 0 -cesantias.co, 0 +cesantias.co, 1 cesar-hector.tk, 1 cesarparedespacora.com, 1 cesarpinto.com, 1 @@ -27873,6 +28450,7 @@ ceskaexpedice.org, 1 ceskepivnesety.sk, 1 ceskepivnisety.cz, 1 +ceskozive.cz, 1 cesobaly.cz, 1 cesonia.io, 1 cestasedelicias.com.br, 1 @@ -27883,6 +28461,7 @@ cestujtenamiru.cz, 1 cestunamiru.cz, 1 cesurteknikservis.com, 1 +cesusc.edu.br, 1 cetamol.com, 1 cetelon.tk, 1 ceti.ga, 1 @@ -27896,15 +28475,18 @@ cevt.ar, 1 cewek.ml, 1 cewood.xyz, 1 +cexplorer.io, 1 ceyhanmolla.com, 1 ceyizlikelisleri.com, 1 cezdent.com, 1 cf-connect.nl, 1 cf-ide.de, 1 cf-tm.net, 1 +cf11.de, 0 cfa.gov, 1 cfan.space, 1 cfasync.ga, 1 +cfbenchmarks.com, 1 cfc-swc.gc.ca, 1 cfcbigideas.com, 1 cfcontracting.com, 1 @@ -27916,6 +28498,7 @@ cfenns.ath.cx, 1 cfent.xyz, 1 cfigura.com, 1 +cfnmpics.com, 1 cfno.org, 1 cfo.gov, 1 cfo4you.com, 1 @@ -27937,7 +28520,6 @@ cg-consult.fr, 1 cg-design.tk, 1 cg-n.fr, 1 -cg-systems.hu, 1 cg.al, 1 cg.search.yahoo.com, 0 cgal.org, 1 @@ -27961,6 +28543,7 @@ cglib.xyz, 1 cgmbacklot.com, 1 cgminc.net, 1 +cgmllc.net, 1 cgmote.com, 1 cgn-medienservice.de, 1 cgo-it.de, 1 @@ -27980,7 +28563,6 @@ cgtx.us, 1 cgu-ingenieria.tk, 1 cgunited.com, 1 -cgurtner.ch, 1 ch-ariege-couserans.fr, 1 ch-axlesthermes.fr, 1 ch-investor.tk, 1 @@ -28048,6 +28630,8 @@ challengerinvestors.tk, 1 challenges.gov, 1 challengeskins.com, 1 +chalons-agglo.fr, 1 +chalonsenchampagne.fr, 1 chalov.ml, 1 chamartin.tk, 1 chamath.co.uk, 1 @@ -28095,6 +28679,7 @@ chamsochoa.com, 0 chamudi.lk, 1 chamudi.net, 1 +chamurliyski.com, 1 chanakyanewz.com, 1 chanchi.idv.hk, 1 chanddriving.co.uk, 1 @@ -28112,10 +28697,11 @@ changeforfuture.cf, 1 changemywifipassword.com, 1 changenow.io, 1 +changenow.world, 1 changesfor.life, 1 changethislater.com, 1 changetowellness.com, 1 -changview.com, 1 +changing-cities.org, 1 chanhassenmn.gov, 1 chankin.tk, 1 channel, 1 @@ -28178,6 +28764,7 @@ charge.gq, 1 chargebacks911.com, 1 chargeless.io, 1 +chargeover.com, 1 chargifi.com, 1 chargify.com, 1 chariots.tk, 1 @@ -28190,6 +28777,7 @@ charlageneral.tk, 1 charleliphile.tk, 1 charlenevondell.com, 1 +charleroi-duty-free.com, 1 charles-brian.com, 1 charles-darwin.com, 1 charles-migaud.fr, 1 @@ -28198,6 +28786,7 @@ charlescwcooke.com, 1 charlesdickens.tk, 1 charlesmarsan.com, 1 +charlesperkinsacademy.com.au, 1 charlesrogers.co.uk, 1 charlestonfacialplastic.com, 1 charlestonpersonalinjurylawyer.com, 1 @@ -28231,6 +28820,8 @@ charlotte-touati.ch, 1 charlotteanne.tk, 1 charlottecountyva.gov, 1 +charlottemi.gov, 1 +charlottestokelypornstar.com, 1 charlottesvillegolfcommunities.com, 1 charlottesvillehorsefarms.com, 1 charlotteswimmingpoolbuilder.com, 1 @@ -28238,6 +28829,7 @@ charlylou.de, 1 charmander.me, 1 charmanterelefant.at, 0 +charmcitytech.com, 1 charming-powers.tk, 1 charmingarsehole.tk, 1 charmingsaul.com, 1 @@ -28248,7 +28840,6 @@ charpy.cc, 1 charqawi.tk, 1 charr.xyz, 1 -chars.ga, 0 charset.org, 1 charta-digitale-vernetzung.de, 1 chartbox.tk, 1 @@ -28260,9 +28851,11 @@ chartsy.de, 1 charuni.ru, 1 charuru.moe, 1 +chasafilli.ch, 1 chascrazycreations.com, 1 chase.co.nz, 1 chaseandzoey.de, 1 +chasecorp.com, 1 chasecountyne.gov, 1 chasetrails.co.uk, 1 chaskamn.gov, 1 @@ -28310,6 +28903,7 @@ chathamcountync.gov, 1 chathamil.gov, 1 chathund.de, 1 +chatify.com, 1 chatinsieme.it, 1 chatkisskiss.tk, 1 chatkitty.com, 1 @@ -28325,6 +28919,7 @@ chatopia.tk, 1 chatounerie.com, 1 chatovod.tk, 1 +chatphp.com, 1 chatpoint.tk, 1 chatreplay.stream, 1 chatroomfans.tk, 1 @@ -28346,7 +28941,6 @@ chaturbate.com, 1 chaturbate.eu, 1 chaturbate.global, 1 -chaturbater.ru, 1 chaturbates.org, 1 chaturbates.ru, 1 chaturbates.xyz, 0 @@ -28361,6 +28955,7 @@ chaussenot.net, 1 chaussurerunning.fr, 1 chauvelcinema.com, 1 +chaveirogrimaldi.com, 1 chaverde.org, 1 chazalet.fr, 0 chbs.me, 1 @@ -28387,12 +28982,14 @@ cheapairlinesuk.com, 1 cheapairplaneticket.biz, 1 cheapalarmparts.com.au, 0 +cheapandbesthosting.com, 1 cheapautoinsuranceblog.com, 1 cheapbloggingers.ga, 1 cheapchiaplotting.com, 1 cheapessay.net, 1 cheapestdirectdebit.co.uk, 1 cheapestgamecards.co.uk, 1 +cheapestgamecards.com, 1 cheapestwaytofly.com, 1 cheapexpenseers.ga, 1 cheapexpenseest.ga, 1 @@ -28484,12 +29081,15 @@ checkme.ml, 1 checkmedia.org, 1 checkmin.cf, 1 +checkmk.com, 1 checkmyessay.com, 1 checkmyessays.com, 1 checkmyhttps.net, 1 checkmypsoriasis.com, 1 +checknetworks.com.au, 1 checkngo.com, 1 checkout.google.com, 1 +checkpoint.com, 1 checkr.com, 1 checkra.in, 1 checkras.tk, 1 @@ -28499,9 +29099,11 @@ checkrpay.com, 1 checkrz.com, 1 checkspf.net, 1 +checkstubmaker.com, 1 checktls.nl, 1 checktype.com, 1 checkui.com, 1 +checkusernames.com, 1 checkyourlive.de, 1 checkyourmath.com, 1 checkyourprivilege.org, 1 @@ -28528,6 +29130,7 @@ chefdehome.com, 1 chefforaday.it, 1 chefkoch.de, 1 +cheflindseyfarr.com, 1 chefnardulli.com, 1 chefpablito.tk, 1 chefshooba.com, 1 @@ -28548,7 +29151,9 @@ chelpogoda.tk, 1 chelsea98.com, 1 chelseafs.co.uk, 1 +chelseagroton.com, 1 chelseahgaul.com, 1 +chelseaok.gov, 1 cheltenhambouncycastles.co.uk, 1 cheltenhampa.gov, 1 cheltik.ru, 1 @@ -28583,6 +29188,8 @@ chengyutrading.com, 1 chenky.com, 1 chenna.me, 1 +chennai.nic.in, 1 +chennaimetrorail.org, 1 chennaiskills.cf, 1 chennien.com, 1 chennuo.xyz, 1 @@ -28641,6 +29248,7 @@ chestercountypediatrics.com, 1 chestercountyroboticsurgery.com, 1 chestercountysc.gov, 1 +chesterfieldmayfair.com, 1 chesterfieldplaceapartmentsstl.com, 1 chesterultimatefrisbee.tk, 1 chestnut.cf, 1 @@ -28663,8 +29271,8 @@ chezbernard.tk, 1 cheztitine.tk, 1 chfr.search.yahoo.com, 0 +chg.codes, 1 chhlayban.tk, 1 -chhlin.com, 1 chhory.com, 1 chhy.at, 1 chialab.eu, 1 @@ -28762,6 +29370,7 @@ childrensdentalranch.com, 1 childrensentertainmentleicester.co.uk, 1 childrensfurniture.co.uk, 1 +childrensheartfoundation.org, 1 childrensmentalhealthcampaign.org, 1 childrensrecipes.tk, 1 childstats.gov, 1 @@ -28769,6 +29378,7 @@ childtaxcredit.gov, 1 childwelfare.gov, 1 chile.tk, 1 +chileprevencion.cl, 1 chiletrenes.tk, 1 chili.ml, 1 chilian.de, 1 @@ -28779,6 +29389,7 @@ chilipy.ga, 1 chilis.com, 1 chill-house.ga, 1 +chill.bet, 1 chillebever.nl, 1 chillhop.com, 1 chillipadi.tk, 1 @@ -28806,6 +29417,7 @@ chinabank.ph, 1 chinablows.com, 1 chinacdn.org, 1 +chinadream404.com, 1 chinafree.online, 1 chinafree.site, 1 chinaglobalsecurities.cn, 1 @@ -28835,6 +29447,7 @@ chineseplease.moe, 1 chinfolk.tk, 1 ching.tv, 1 +chinguitmedia.com, 1 chinookmt.gov, 1 chinookwebdesign.ca, 1 chinovalleyaz.gov, 1 @@ -28849,9 +29462,9 @@ chipcore.com, 0 chipdig.com, 1 chipollinko.com.ua, 1 +chippewa.com, 1 chippewacountywi.gov, 1 chippy.ch, 0 -chippysworkshop.co.uk, 1 chips-scheduler.de, 1 chips.gov, 1 chipset.no, 1 @@ -28859,11 +29472,9 @@ chirality.de, 1 chiralsoftware.com, 1 chireiden.me, 1 -chirica.law, 0 chirkunov.tk, 1 chiro-doctor.com, 1 chiro-merksplas.tk, 1 -chiro-neuchatel.ch, 0 chiro.org, 1 chiroharbalorifa.tk, 1 chiroherne.tk, 1 @@ -28875,9 +29486,6 @@ chiropracticwpb.com, 1 chiropraktik-riemann.de, 1 chiropraktik-wildner.de, 1 -chiropraticien-neuchatel.ch, 0 -chiropratique-neuchatel.ch, 0 -chirosphere.ch, 0 chirotestelt.tk, 1 chirototem.tk, 1 chirowij.tk, 1 @@ -28893,17 +29501,20 @@ chita.tk, 1 chitaem.tk, 1 chitashop.ml, 1 +chitchok.com, 1 chitinfo.tk, 1 chitlar.ml, 1 chitraltune.tk, 1 chittagongtextile.tk, 1 chitti4feet.com, 1 +chiucainlaw.co.nz, 1 chiusa-klausen.com, 1 chiva-ariege.fr, 1 chizouworld.tk, 1 chizra.com, 1 chjeco.com, 1 chk-ccs.com, 1 +chklocal.com, 1 chkmkt.com, 1 chkserv.com, 1 chksite.com, 1 @@ -28996,7 +29607,6 @@ chosting.dk, 1 chou-chinois.com, 1 chouchouweb.com, 1 -chouette-photo.com, 1 chovancova.sk, 1 chowchowugo.com, 1 chowderandchampions.com, 1 @@ -29025,13 +29635,15 @@ chriscutts.uk, 1 chrisdasie.com, 1 chrisdecairos.ca, 1 -chrisebert.net, 1 chrisfinazzo.com, 0 chrisgieger.com, 1 chrisirwin.ca, 1 chrisjean.com, 1 chriskthomas.com, 1 chrislane.com, 1 +chrislauderback.com, 1 +chrislauderback.net, 1 +chrislauderback.org, 1 chrisliebaer.de, 1 chrisluen.com, 1 chrismarker.org, 1 @@ -29067,7 +29679,7 @@ christhewebguy.com, 1 christiaanconover.com, 1 christian-folini.ch, 1 -christian-garo.com, 1 +christian-garo.com, 0 christian-garo.org, 1 christian-gredig.de, 1 christian-host.com, 1 @@ -29117,13 +29729,11 @@ christiansburgva.gov, 1 christiansciencevancouverwa.org, 1 christiansrit.tk, 1 -christiantimes.org.hk, 1 christianwenz.de, 1 christianwitts.tech, 1 christiehawkes.com, 1 christinaaguilera.com.br, 1 christinabjoern-nilsson.dk, 1 -christinaclairecollins.com, 1 christinacrawford.cf, 1 christinacrawford.ga, 1 christinacrawford.gq, 1 @@ -29176,7 +29786,6 @@ christthekingparish.net, 1 christtheredeemer.us, 1 christwaycounseling.com, 1 -christwin.com, 1 christysstampingspot.com, 1 chrisupjohn.xyz, 1 chrisvannooten.tk, 1 @@ -29230,6 +29839,7 @@ chronotech.fr, 1 chrony.tk, 1 chrpaul.de, 0 +chrsmtc.com, 1 chrstn.eu, 1 chrstngr.cm, 1 chrt-tcdp.gc.ca, 1 @@ -29250,6 +29860,7 @@ chsvotes.gov, 1 chtj.uk, 1 chtodelat.ga, 1 +chtsi.uk, 1 chtyvo.tk, 1 chuangyi.com, 1 chubbygirlpics.com, 1 @@ -29296,6 +29907,7 @@ churchlw.tk, 1 churchm.ag, 1 churchofchrist.tk, 1 +churchofcyprus.org.cy, 1 churchofpop.net, 1 churchofsaintbenedict.com, 0 churchofsaintrocco.org, 1 @@ -29308,7 +29920,6 @@ churchthemes.com, 1 churchwebcanada.ca, 1 churchwebsupport.com, 1 -churchwp.com, 1 chus-plongee.fr, 1 chuskocity.tk, 1 chuspace.com, 1 @@ -29328,18 +29939,25 @@ ci.com.br, 1 ci5.me, 1 cia-gaming.de, 1 +cia-landlords.co.uk, 1 ciagutek.pl, 1 ciahalim.tk, 1 cialde.it, 1 cialis-trial.gq, 1 +cialisatabs.com, 1 cialisbmed.com, 1 +cialisdtablets.com, 1 cialisfreetrial.ga, 1 cialisisa.com, 1 +cialismarketim.net, 1 +cialismarketing.net, 1 cialismen.com, 1 cialisonlinee.com, 0 +cialisot.com, 1 cialisrmed.com, 1 +cialisud.com, 1 +cialisusapills.com, 1 cialisvtr.com, 1 -cialona.nl, 1 ciancode.com, 1 cianmawhinney.me, 1 cianmawhinney.xyz, 1 @@ -29356,6 +29974,7 @@ cibleclick.com, 1 cica.es, 1 cicavkleci.cz, 1 +ciceron.cloud, 1 cicerony.gov, 1 ciceronypd.gov, 1 cicery.com, 1 @@ -29388,6 +30007,8 @@ cierreperimetral.com, 1 cifapme.net, 1 cifop-numerique.fr, 1 +ciftkabincikmaparca.com.tr, 1 +ciftkabinyedekparca.com.tr, 1 ciftlikesintisi.com, 1 cigar-cartel.com, 1 cigarafterten.com, 1 @@ -29413,13 +30034,13 @@ cilipa.com, 1 cilkamail.cloud, 1 cilkanet.cloud, 1 +cilloc.be, 1 cilt.tk, 1 ciltskillnet.ie, 0 cima-idf.fr, 1 cimaroom.com, 1 cimbalino.org, 1 cimballa.com, 1 -cimet.com.au, 1 cimet.io, 1 cimfax.com, 1 cimtools.net, 1 @@ -29440,7 +30061,6 @@ cinedarkwolf.tk, 1 cinefilia.tk, 1 cinefun.net, 1 -cineglitzz.in, 1 cinegore.tk, 1 cinejoia.tv, 1 cinelandia.tk, 1 @@ -29463,7 +30083,6 @@ cinenote.link, 1 cineping.com, 1 cineplex.my, 1 -cinesso.de, 1 cineterror.tk, 1 cineworld.co.in, 1 cinexilio.tk, 1 @@ -29487,22 +30106,23 @@ cinqdecembre.com, 1 cinquecentoclubholland.tk, 1 cinqueportsvets.co.uk, 1 +cins.rs, 1 cintamanilingerie.co.uk, 1 cintapersonalizada.es, 1 cintaraso.es, 1 cinteo.com, 1 cinthia.tk, 1 -cinziamacchi.it, 1 cio-ciso-interchange.org, 1 cio-cisointerchange.org, 1 -cio.go.jp, 0 +cio-spirit.de, 1 cio.gov, 1 -ciordigital.com, 1 cioscloud.com, 1 cioudways.com, 1 cioudways.pro, 1 +cioxhealth.com, 1 cip.md, 1 cipartyhire.co.uk, 1 +cipf.ca, 1 ciph.zone, 1 cipher.team, 1 cipherboy.com, 1 @@ -29543,6 +30163,7 @@ circuit.co.uk, 1 circuitcityelectricaladelaide.com.au, 1 circuitclerkmarioncountyms.gov, 1 +circular-flooring.eu, 1 circular.fashion, 1 circular.tw, 1 circularity.id, 1 @@ -29566,8 +30187,10 @@ cirurgicasaopaulo.com.br, 1 cirurgicavirtual.com.br, 1 cisa.gov, 1 +cisabroad.com, 1 cisamexico.com, 1 ciscoasanetflow.com, 1 +ciscobrewers.com, 1 ciscocyberthreatdefense.com, 1 ciscodude.net, 0 ciscom.tk, 1 @@ -29618,6 +30241,7 @@ cities.cl, 1 citiledger.ga, 1 citimarinestore.com, 1 +citiswich.com.au, 1 citizen428.net, 1 citizenewatch.tk, 1 citizenkevin.com, 0 @@ -29641,6 +30265,8 @@ citruspi.io, 1 citsc.de, 1 citti.de, 1 +cittinfo.com, 1 +citto.ru, 1 city-glas.com, 1 city-home.tk, 1 city-nn.com, 1 @@ -29648,6 +30274,7 @@ city-spin.site, 1 city-walks.info, 1 city.kharkov.ua, 1 +cityapparels.com, 1 citybusexpress.com, 0 citycalculator.ml, 1 citycardgand.com, 1 @@ -29667,6 +30294,7 @@ cityjam.tk, 1 citylift.com.ua, 1 citylocal.cf, 1 +citymagazine.si, 1 citymeats.com, 1 citymoobel.ee, 1 cityofadelga.gov, 1 @@ -29675,6 +30303,7 @@ cityofbambergsc.gov, 1 cityofbathmaine.gov, 1 cityofbayardnm.gov, 1 +cityofbaylakefl.gov, 1 cityofbayminetteal.gov, 1 cityofbinghamton.gov, 1 cityofblairwi.gov, 1 @@ -29704,7 +30333,9 @@ cityofioneoregon.gov, 1 cityofithacany.gov, 1 cityofjuneauwi.gov, 1 +cityofkandiyohimn.gov, 1 cityofkasaanak.gov, 1 +cityoflakebuenavistafl.gov, 1 cityoflakegeneva.gov, 1 cityoflancasterca.gov, 1 cityoflancasterpa.gov, 1 @@ -29729,6 +30360,7 @@ cityofnovi.gov, 1 cityofocontowi.gov, 1 cityofpagedalemo.gov, 1 +cityofpalmdaleca.gov, 1 cityofpearidgear.gov, 1 cityofpeople.gent, 1 cityofperris.gov, 1 @@ -29736,15 +30368,19 @@ cityofpinconningmi.gov, 1 cityofpinebluff-ar.gov, 1 cityoframseymn.gov, 1 +cityofrobertsidaho.gov, 1 cityofroncevertewv.gov, 1 +cityofsacramento.gov, 1 cityofsalemky.gov, 1 cityofsenatobiams.gov, 1 cityofsourlake.gov, 1 cityofspoonerwi.gov, 1 +cityofthorp.gov, 1 cityoftitans.com, 1 cityoftitansmmo.com, 1 cityoftybee.gov, 1 cityofvacaville.gov, 1 +cityofvermilionohio.gov, 1 cityofwadley-ga.gov, 1 cityofwakefieldmi.gov, 1 cityofwasilla.gov, 1 @@ -29756,6 +30392,8 @@ citypress.gq, 1 citypro.tk, 1 cityradiusmaps.com, 1 +cityseeker.com, 1 +cityspin.org, 1 citysportapp.com, 0 cityspot.us, 1 citysquarenews.tk, 1 @@ -29867,7 +30505,6 @@ claarycherry.com, 1 clacetandil.com.ar, 1 clad.cf, 1 -clague.moe, 1 claibornecountytn.gov, 1 claim-justice.com, 1 claimconnect.com, 1 @@ -29931,7 +30568,6 @@ clara.de, 1 claraanalytics.com, 1 clarasegura.tk, 1 -clare-landmark.com, 1 clare3dx.com, 1 claremontyachtclub.org.au, 1 clarendon.network, 1 @@ -29951,6 +30587,7 @@ claritin.ml, 1 clarity-c2ced.appspot.com, 1 claritydesignworks.com, 1 +clarityskin.com, 1 clark.de, 1 clarkaesthetics.com, 1 clarkassociatesinc.biz, 1 @@ -29987,6 +30624,8 @@ classdesignhome.com, 1 classdojo.com, 1 classentials.com, 1 +classeturista.com, 1 +classflow.com, 1 classic-diva.cf, 1 classic-diva.ga, 1 classic-diva.ml, 1 @@ -30003,7 +30642,6 @@ classichorrornetwork.tk, 1 classichost.gq, 1 classicmagazine.ml, 1 -classicrockhistory.com, 1 classics.io, 1 classicstories.tk, 1 classictheatrecumbria.co.uk, 1 @@ -30032,6 +30670,8 @@ claudiney.id, 1 claudiney.info, 1 claudiohdz.com, 1 +claumarservice.com, 1 +claunchdesign.com, 1 claus-bahr.de, 1 claus-cremer.tk, 1 clauseriksen.net, 0 @@ -30056,6 +30696,7 @@ clbmconsultancy.com, 1 clco.fr, 1 clcv-brest.fr, 1 +cld.cx, 1 cldejessey.com, 1 cldfile.com, 1 cldinc.com, 1 @@ -30070,7 +30711,6 @@ cleandrains.com.au, 1 cleanenergy.gov, 1 cleanenergywire.org, 1 -cleaner-en.com, 1 cleaner.tk, 1 cleanertoday.com, 1 cleanfacesest.ga, 1 @@ -30091,7 +30731,6 @@ cleanuri.com, 1 cleanway.dk, 1 clear.ml, 1 -clearance365.co.uk, 1 clearbit.com, 1 clearbooks.co.uk, 1 clearbookscdn.uk, 1 @@ -30100,6 +30739,7 @@ clearchatsandbox.com, 1 clearcreekcountyco.gov, 1 clearcreekcountydronepilot.com, 1 +cleared.io, 1 clearer.cloud, 1 cleargage.com, 1 cleargoals.com, 1 @@ -30113,7 +30753,6 @@ clearsafetalk.com, 1 clearsailingproperties.com, 1 clearsoftcomputacion.com, 1 -clearspringhealthcare.com, 1 clearspringinsurance.com, 1 clearstep.health, 1 clearstoneip.com, 1 @@ -30128,6 +30767,7 @@ clearwaterseries.tk, 1 clearwatersexhealth.com, 1 clearwayadvice.com.au, 1 +clearworks.net, 1 cleary.xyz, 1 cleatis.fr, 1 cleelandspecialists.com.au, 1 @@ -30142,6 +30782,7 @@ clementfevrier.fr, 1 clementluck.com, 1 clementsfamily.co, 1 +clendeninwv.gov, 1 cleo.com, 1 cleocinonline.gq, 1 cleova.com, 1 @@ -30204,7 +30845,7 @@ clevyrstudios.com, 1 clevyrvr.com, 1 cleysense.com, 0 -clic-et-site.com, 1 +clhg.com, 1 clic-music.com, 1 clic29.fr, 1 clica.net, 1 @@ -30215,7 +30856,6 @@ click-generator.com, 1 click2affiliate.xyz, 1 click2bet.top, 1 -click2order.co.uk, 1 click4click.ga, 1 clickalphaville.com.br, 1 clickbasin.co.uk, 1 @@ -30233,9 +30873,11 @@ clickenergy.com.au, 1 clickforum.cf, 1 clickfreescore.com, 1 +clickhelp.com, 1 clickheretobegin.tk, 1 clickhost.com.au, 1 clickhouse.tech, 1 +clickhyundai.com, 1 clickinfo.tk, 1 clickingmad.com, 1 clickipo.com, 1 @@ -30255,6 +30897,7 @@ clickstart.ml, 1 clicktest.cf, 1 clickthebucket.com, 1 +clicktodiscount.com, 1 clicktolinkb.gq, 1 clicktrans.com, 1 clicktrans.de, 1 @@ -30265,10 +30908,12 @@ clicoclick.com, 1 clien.net, 1 client.coach, 0 +client.photos, 1 client24.tk, 1 clientboss.com, 1 clientcms.co.uk, 1 clientify.com, 1 +clientpay.com, 1 clientportal.com, 1 clientportal.photo, 1 cliff-rilly-website.tk, 1 @@ -30278,11 +30923,13 @@ cliftonheritage.net, 1 clik.ga, 1 cliksource.com, 0 +clima.vip, 1 climaencusco.com, 1 climaffaires.com, 1 climatechange2021.org, 1 climatecrafters.com, 1 climatejustice.nyc, 1 +climatepolicyinitiative.org, 1 climatgate.tk, 1 climaticequipment.tk, 1 climatizzatore.it, 0 @@ -30291,6 +30938,7 @@ climaverde.gr, 1 climb4achild.org, 1 climbing.tk, 1 +climbinggear.info, 1 climeradar.com, 1 clinchcountyga.gov, 1 clindamycin-150mg.ga, 1 @@ -30336,6 +30984,7 @@ clintburnett.com, 1 clintonbloodworth.com, 1 clintoncomo.gov, 1 +clintoncountyin.gov, 1 clintoncountyny.gov, 1 clintoncountypa.gov, 1 clintonlibrary.gov, 1 @@ -30356,6 +31005,8 @@ clive.io, 1 cliveptr.cc, 1 clk1.ru, 1 +clkbw.com, 1 +clkdmg.site, 1 clmbr.ch, 0 clmde.de, 1 clmz.nl, 1 @@ -30409,6 +31060,7 @@ closets-cheap.tk, 1 closingholding.com, 1 closrr.cloud, 1 +closrr.com, 1 clothes-for-school.tk, 1 clothilde-wattelier.fr, 1 clothing-2010.tk, 1 @@ -30417,6 +31069,7 @@ clothingjeans.tk, 1 cloud-glaeser.dedyn.io, 1 cloud-hair.jp, 1 +cloud-iam.com, 1 cloud-lines.ml, 1 cloud-screen.com, 1 cloud-world.tk, 1 @@ -30430,7 +31083,6 @@ cloud24x7.us, 1 cloud255.com, 1 cloud42.ch, 0 -cloud7.news, 1 cloud9bouncycastlehire.com, 1 cloud9vets.co.uk, 1 cloudads.ga, 1 @@ -30498,6 +31150,7 @@ cloudmarathi.work, 1 cloudmarket.com.br, 1 cloudmigrator365.com, 1 +cloudminister.com, 1 cloudmoney.tk, 1 cloudmyhome.site, 1 cloudmyhome.top, 1 @@ -30516,6 +31169,7 @@ cloudplan.nl, 1 cloudpole.de, 1 cloudpublic.pro, 1 +cloudretails.com, 1 cloudrive.cf, 1 cloudsavvyit.com, 1 cloudscribe.com, 1 @@ -30554,6 +31208,7 @@ cloudsweeper.de, 1 cloudsys.dnsalias.net, 1 cloudteam.de, 1 +cloudtec.srv.br, 1 cloudtelemanagement.com, 1 cloudtensolutions.com, 1 cloudtocloud.ddns.net, 0 @@ -30579,6 +31234,7 @@ cloudwise.nl, 1 cloudwithlightning.net, 1 cloudwxys.com, 1 +cloudyrion.com, 1 cloudzentechnologies.com, 1 clouglobal.com, 1 cloutcloset.ga, 1 @@ -30586,12 +31242,15 @@ clouwways.com, 1 clouz.de, 0 clover-sendai.com, 1 +cloversonoma.com, 1 clovertwo.com, 1 +clovisoncology.com, 1 clovisplumbingservices.com, 1 clovorin.gq, 1 clowd.haus, 1 clowd.ovh, 1 clown-clan.tk, 1 +clown-zappo.de, 1 clownish.co.il, 1 cloxy.com, 1 cloyes.com, 1 @@ -30614,16 +31273,17 @@ club-night.tk, 1 club-oz.tk, 1 club-premiere.com, 1 -club-reduc.com, 0 +club-reduc.com, 1 club-slow.jp, 1 club-soul.tk, 1 -club-yy.com, 1 +club-transformation-digitale.com, 1 club.zj.cn, 1 club10x.com, 1 clubanimal.cl, 1 clubapk.com, 1 clubatleticonacionalpotosi.tk, 1 clubbers-comtois.tk, 1 +clubcollinssquare.com.au, 1 clubcorolla.cf, 1 clubcorsavenezuela.com, 0 clubcupido.com.br, 1 @@ -30685,11 +31345,11 @@ clubon.space, 1 clubpes.tk, 1 clubpeugeot405.tk, 1 +clubrubionu.com, 1 clubserveers.ga, 1 clubsuccessjapan.com, 1 clubtamarugal.tk, 1 clubtecknocore.tk, 1 -clubtraining.com.au, 0 clubtravel.com.pt, 1 clubtur.dk, 1 clubvttlesloupsdemaixe.tk, 1 @@ -30700,8 +31360,10 @@ cluefluest.ga, 1 clueless.ga, 1 clueless.tk, 1 +cluelesscraft.com, 1 cluj.apartments, 1 cluj.help, 1 +clun.top, 0 clush.pw, 1 cluster.biz.tr, 1 cluster446.fr, 1 @@ -30716,6 +31378,7 @@ clyde-tx.gov, 1 clydewi.gov, 1 cm-agueda.pt, 1 +cm-funchal.pt, 1 cm-law.eu, 1 cm-loures.pt, 1 cm-penalvadocastelo.pt, 1 @@ -30778,14 +31441,16 @@ cmskeyholding.com, 1 cmskh.co.uk, 1 cmsnl.com, 1 +cmsonline.com, 1 cmsua.ca, 1 cmtportal.co.uk, 1 +cmtso.com, 1 cmv.gr, 1 cmw.net, 1 cmweller.com, 1 cn.search.yahoo.com, 0 cn8522.com, 1 -cna5.net, 1 +cna.com.br, 1 cnabogota.tk, 1 cnam-idf.fr, 1 cnaprograms.online, 1 @@ -30794,6 +31459,7 @@ cnb1901.com, 1 cnbs.ch, 1 cnc-lehrgang.de, 1 +cncexplorer.com, 1 cncfraises.fr, 1 cnclp.org.uk, 1 cncn3.cn, 1 @@ -30821,11 +31487,13 @@ cnpkg.org, 1 cnpy.gdn, 1 cnre.eu, 1 +cnslub.ru, 1 cnss.gob.do, 1 cnt.com.ec, 1 cntraveller.com, 1 cnvt.fr, 1 co-founder-stuttgart.de, 1 +co-store.com, 1 co-yutaka.com, 1 co.lu, 1 co.search.yahoo.com, 0 @@ -30852,6 +31520,7 @@ coactive.com, 1 coag.gov.au, 1 coagclinic.com, 1 +coalitieduurzamedigitalisering.nl, 1 coalition.tk, 1 coalmen.ga, 1 coalpointcottage.com, 1 @@ -30860,9 +31529,11 @@ coasa.me, 0 coassessment.com, 1 coast.tk, 1 +coastalhealthins.com, 1 coastalpayroll.net, 1 coastalphysie.com, 1 coastalpowder.com.au, 1 +coasteering.co.uk, 1 coastline.net.au, 1 coastmedicalservice.com, 1 coastnews.cf, 1 @@ -30877,6 +31548,7 @@ cobaka.tk, 1 cobaltia.org, 1 cobbcountygeorgia.ml, 1 +cobiz.nl, 1 coboxviagens.com.br, 1 cobracastles.co.uk, 1 cobralelie.nl, 1 @@ -30908,6 +31580,7 @@ cockerspanielingles.com.br, 1 cockfile.com, 1 cockmonkey.tk, 1 +cockroachesremoval.com, 1 cockybot.com, 1 coco-01.gq, 1 coco-apo.de, 1 @@ -30926,8 +31599,10 @@ cocomelody.de, 1 cocomelody.jp, 1 coconutguy.gq, 1 +coconutio.com, 1 coconutoil.ml, 1 coconutoil24.com, 1 +coconuts-fashion.gr, 1 coconutscrapbooking.com, 1 cocoscastles.co.uk, 1 cocosunbeds.co.uk, 1 @@ -30946,6 +31621,8 @@ coda.moe, 1 coda.today, 1 coda.world, 1 +coda18.gov, 1 +coda23.gov, 1 codabix.com, 1 codabix.de, 1 codandn.com, 1 @@ -30975,6 +31652,7 @@ codebrasileiro.tk, 1 codebreak.tk, 1 codebreakers.it, 1 +codecatalyst.aws, 1 codeclouds.com, 1 codeclub.gq, 1 codecolliders.com, 1 @@ -31005,10 +31683,12 @@ codeidea.ga, 1 codein.ca, 0 codeine.co.uk, 1 +codeine.world, 1 codeit.guru, 1 codeit.us, 1 codejumper.ml, 1 codekk.com, 1 +codelist.biz, 1 codeloop.pw, 1 codemahrt.com, 1 codemperium.com, 1 @@ -31073,7 +31753,6 @@ codewild.de, 1 codewitchbella.com, 1 codewithalisha.ga, 1 -codewiz.xyz, 1 codewrecks.com, 1 codex.online, 1 codexpo.net, 1 @@ -31086,6 +31765,7 @@ codigoexactodearea.com, 1 codigojose.com, 1 codigomusical.tk, 1 +codigosddd.com.br, 1 codigosmart.com, 1 coding-aloud.nz, 1 coding-basic.tk, 1 @@ -31094,6 +31774,7 @@ coding.net, 1 codingale.com, 1 codingblog.org, 1 +codingforentrepreneurs.com, 1 codingforspeed.com, 1 codingfromhell.net, 1 codinginfinity.me, 1 @@ -31114,6 +31795,7 @@ coedpictures.com, 1 coegmbh.de, 1 coelmay.net, 1 +coeminna.edu.ng, 0 coenjutte.tk, 1 coens.me.uk, 1 coentropic.com, 1 @@ -31121,8 +31803,10 @@ coequals.tk, 1 cofense.at, 1 cofetaria-narcisa.ro, 1 +coffee-like.com, 1 coffee-mamenoki.jp, 1 coffee-up.it, 1 +coffee-webstore.com, 1 coffee.co.uk, 1 coffeebean.cf, 1 coffeebeanstudios.tk, 1 @@ -31130,7 +31814,6 @@ coffeeciel.com, 1 coffeeciel.com.tr, 1 coffeeholic.tk, 1 -coffeehousewriters.com, 1 coffeemoment.nl, 1 coffeeonlinemagazine.com, 1 coffeeplazahamburg.com, 1 @@ -31162,6 +31845,7 @@ cognixia.us, 1 cognosweb.net, 1 cogsquad.house, 1 +cogstate.com, 1 cogumelosmagicos.org, 1 coharushika.com, 1 cohassetfirema.gov, 1 @@ -31176,12 +31860,12 @@ coil.gov, 1 coimmvest.com, 1 coin-exchange.cz, 1 +coin-group.com, 1 coin-miners.info, 1 coin-money.tk, 1 coin-quest.net, 1 coin.dance, 1 coin.space, 1 -coin68.com, 1 coinamount.com, 0 coinauctionshelp.com, 1 coinbase.com, 1 @@ -31198,7 +31882,6 @@ coincoin.eu.org, 1 coinf.it, 1 coinflux.com, 1 -coinforce.com, 1 coinfundit.com, 1 coingate.com, 1 coinjar-sandbox.com, 1 @@ -31210,6 +31893,8 @@ coinmotion.com, 1 coinnewspulse.com, 1 coinpaprika.com, 1 +coinpedia.org, 1 +coinplay.com, 1 coinroom.com, 1 coins2001.ru, 1 coinsales.net, 1 @@ -31218,8 +31903,6 @@ coinsmat.com, 1 coinsuggest.com, 1 cointosh.jp, 1 -cointree.com, 1 -coinvex.org, 1 coinwind.vip, 1 coinx.pro, 1 coiracom.net, 1 @@ -31236,9 +31919,9 @@ cola-host.tk, 1 colaborame.tk, 1 colaborativa.tv, 1 +colaboratorija.lt, 1 colabug.com, 1 colah.com.au, 1 -colaker.net, 1 colapsys.net, 0 colarelli.ch, 1 colarose.tk, 1 @@ -31322,6 +32005,7 @@ collateral360.com, 1 collateralmurder.com, 1 collbox.co, 0 +collectaction.com, 1 collectdocs.com, 1 collecter.tk, 1 collectfood.com, 1 @@ -31341,6 +32025,7 @@ collectorsystems.com, 1 colleencornez.com, 1 college-chagall.tk, 1 +collegeboxes.com, 1 collegeeducation.ml, 1 collegegirlhd.com, 1 collegeinlouisiana.com, 1 @@ -31392,6 +32077,7 @@ collins4mayor.org.nz, 1 collinsdictionary.com, 1 collinselectricco.com, 1 +collinssquare.com.au, 1 colloquio.tk, 1 colloquy.mobi, 1 colmadord.com, 1 @@ -31424,7 +32110,6 @@ coloradosos.gov, 1 colorblindfilms.com, 1 colorblindprogramming.com, 1 -colorbrush.ru, 0 colorcodedlyrics.com, 1 colorcomm.com, 1 colorfularchive.eu.org, 1 @@ -31445,7 +32130,6 @@ colorunhas.com.br, 1 colorwow.cf, 1 colorwow.ga, 1 -colossalit.com.au, 1 colossean.com, 1 colosseumticket.cz, 1 colostral.com, 1 @@ -31476,12 +32160,14 @@ columbusks.gov, 1 columbustelegram.com, 1 columbusunderground.com, 1 +columbuswines.com, 1 colwichks.gov, 1 colwyn.me, 1 colwynfm.com, 1 colyakoomusic.com, 1 com-b.vn, 1 com-news.io, 1 +com-tic.africa, 1 com.cc, 1 com4.no, 1 comactor.com, 1 @@ -31493,8 +32179,10 @@ comanefure.com, 1 comaporter.com, 1 comarcadelaranda.tk, 1 +comarch.com, 1 comarch.es, 1 comarch.pl, 1 +comarch.ru, 1 comarkinstruments.cloud, 1 comarkinstruments.net, 1 comasenavi.com, 1 @@ -31504,6 +32192,7 @@ combidesk.com, 1 combigo.com, 1 combineconquer.com, 1 +combloux.com, 1 combos-2020.tk, 1 combron.be, 1 combron.co.uk, 1 @@ -31523,10 +32212,12 @@ comebookmark.cf, 1 comebookmark.ga, 1 comebookmark.ml, 1 +comediant.de, 1 comedicgrouperu.com, 1 comedimagrire.it, 1 comedonchisciotte.org, 1 comedyhuis.nl, 1 +comedykellner-spasskellner.de, 1 comefareper.online, 1 comenc.ddns.net, 1 comengpt.com, 1 @@ -31547,15 +32238,19 @@ comete-electricite.fr, 1 cometofaith.org, 1 cometonovascotia.ca, 1 +cometoplay.co.uk, 1 comevius.com, 1 comevius.org, 1 comevius.xyz, 1 +comfandivirtual.com.co, 1 comff.net, 1 comfintouch.com, 0 comfis.nl, 1 comfitsweets.co.uk, 1 comflores.com.br, 1 comfortablelife.tk, 1 +comfortcareconnection.com, 1 +comfortingcbd.store, 1 comfortsleepclinic.com, 1 comfortsolutionsair.com, 1 comfriesland.tk, 1 @@ -31570,7 +32265,6 @@ comhack.com, 1 comic-kunstbilder.de, 1 comical.ml, 1 -comick.top, 1 comicsans.tk, 0 comicsanshouse.ddns.net, 1 comicslate.org, 1 @@ -31634,6 +32328,7 @@ commoncore4kids.com, 1 commongoodit.com, 1 commongrave.tk, 1 +commoninf.com, 1 commons-mayflower.tk, 1 commonsenseamericanpolitics.com, 1 commonsensedivorce.ca, 1 @@ -31656,8 +32351,10 @@ community-services.cz, 0 communityaligned.com, 1 communitybangladesh.tk, 1 +communitybridgesaz.org, 1 communitycodeofconduct.com, 1 communitycollegereview.com, 1 +communitycollegespotlight.org, 1 communitydirectory.tk, 1 communityflow.info, 1 communityfunded.com, 1 @@ -31668,7 +32365,6 @@ commvnion.com, 1 comnavichiba.com, 1 comnavigifu.com, 1 -comnavihyogo.com, 1 comnavikochi.com, 1 comnavikyo.com, 1 comnavimie.com, 1 @@ -31715,6 +32411,7 @@ companycam.com, 1 companycleaninghome.com, 1 companydi.com, 1 +companywebcast.com, 1 comparai.com.br, 1 comparatif-moto.fr, 1 compare-energie.fr, 1 @@ -31748,6 +32445,7 @@ compdermcenter.com, 1 compdev.ru, 1 compeatix.com, 1 +compelloid-staging-client-b2c.azurewebsites.net, 1 compeon.de, 1 competencyassessment.ca, 1 competis.cf, 1 @@ -31764,6 +32462,7 @@ completecareair.com, 1 completecase.com, 1 completecontrol.tk, 1 +completed.com, 1 completehub.com, 1 completeprivacy.tk, 1 completesecurityessex.co.uk, 1 @@ -31781,17 +32480,18 @@ compliance-management.ch, 0 compliance-risk.com, 1 compliance-systeme.de, 1 +compliancealpha.com, 1 compliancebox.co, 1 compliancedictionary.com, 1 compliancerisksoftware.co.uk, 1 complianz.io, 1 compliment.cf, 1 -compliq.se, 1 complt.xyz, 1 complyadvantage.com, 1 complycheck.co, 1 componentcore.com, 1 composersforum.org, 1 +composite-isfahan.ir, 1 compositedevtec.tk, 1 compostelle-bouddha.fr, 1 compoundc.eu, 1 @@ -31837,6 +32537,7 @@ computer-menschen.de, 1 computer-science-schools.com, 1 computer-service-24.de, 1 +computer-service-remscheid.de, 1 computer-service.ch, 1 computer-world.pro, 1 computer-worlds.tk, 1 @@ -31862,7 +32563,6 @@ computersoftware.tk, 1 computersolutions.cn, 1 computersystems.guru, 0 -computertech-ut.com, 1 computertechreviews.com, 1 computerthings.net, 1 computertips.tk, 1 @@ -31870,6 +32570,7 @@ computerz.solutions, 0 computime.com, 1 computing.land, 1 +computingaustralia.com.au, 1 computingaustralia.group, 1 computingessentials.tk, 1 computingsociety.co.uk, 1 @@ -31880,8 +32581,7 @@ comquadro.com.br, 1 comquestmed.com, 1 comradesofmight.tk, 1 -comsoli.com.br, 1 -comsolibrasil.com.br, 1 +comsian.net, 1 comswp.com, 1 comtex.com.au, 1 comtily.com, 1 @@ -31958,7 +32658,7 @@ concreteworksohio.com, 1 concreteworksplus.com, 1 concurseirosdeplantao.com.br, 1 -concursocultural.com.br, 1 +concursocultural.com.br, 0 concursos.com.br, 1 concursosabertos.com.br, 1 concursuri.biz, 0 @@ -31981,7 +32681,7 @@ coneall.com, 1 conectada.tk, 1 conectadev.com, 1 -conectainmobiliariasa.com, 1 +conectens.com, 1 conectumfinanse.pl, 1 conejicos.tk, 1 conejovalleyelectrical.com, 1 @@ -32003,9 +32703,9 @@ confer.ch, 1 conference-expert.eu, 1 conference.dnsfor.me, 1 -conferencealert.com, 1 conferencehall.com.ua, 1 conferencemonkey.org, 1 +conferenciaepiscopal.es, 1 confettidogs.com, 1 confia.io, 1 confiancefoundation.org, 1 @@ -32083,14 +32783,15 @@ connectavid.com, 1 connectedandsmart.com, 1 connectedbynexus.com, 1 +connectedinvestors.com, 1 connectfss.com, 1 connecticallc.com, 1 connecticare.com, 1 connecticutnet.tk, 1 connectingrentals.com, 1 -connectingrentalsofbethel.com, 1 connectingup.org, 1 connectionplanet.nl, 1 +connectionstrings.com, 1 connective.com.au, 1 connectivia.it, 0 connectivityparty.tk, 1 @@ -32098,21 +32799,22 @@ connectme.com.mx, 1 connectmy.car, 1 connectnow.nl, 1 -connecto-data.com, 1 connecto.group, 1 connectthedoc.com, 1 +connectto.com, 1 connectum.eu, 1 connectusa.com, 0 connelink.fr, 1 conner.work, 1 conneropticals.ga, 1 connexas.eu, 1 +connexio.digital, 1 connexion.health, 1 connexionht.com, 1 connext.de, 1 connictro.de, 1 conniesacademy.com, 1 -connollycove.com, 1 +connor.nl, 1 connorhatch.com, 1 connorjc.io, 1 connorlim.net, 1 @@ -32206,6 +32908,7 @@ constinit.org, 1 constipationrecords.tk, 1 constituenttracker.com, 1 +constitution.website, 0 constru-vegas.com.mx, 1 construccionesceyve.com, 1 construct.net, 1 @@ -32222,6 +32925,7 @@ consul-novocherkassk.ml, 1 consul.io, 0 consuladospanama.org, 1 +consuldat.com, 1 consulenteambientale.it, 1 consulentedellavoro.it, 1 consulenza.pro, 1 @@ -32279,7 +32983,7 @@ contact.xyz, 1 contactaffix.com, 1 contactelus88.fr, 1 -contactsolo.tk, 1 +contactmcr.com, 1 contactsrl.it, 1 contadorespublicos.co, 1 contagiousaf.com, 1 @@ -32289,8 +32993,10 @@ contato.vip, 1 conteelegant.ro, 1 contemplativeeducation.org, 1 +contemplativelens.com, 0 +contemptevoke.com, 1 contenedoresdereciclaje.online, 1 -contenized.com, 1 +contenized.com, 0 contentcreatorsource.com, 1 contentmarathon.com, 1 contentpass.net, 1 @@ -32355,6 +33061,7 @@ controlpad.com, 1 controlshiftlabs.com, 1 controltvpodcast.tk, 1 +controlup.com, 1 controlvoltage.cc, 1 controlyourwifi.com, 1 controsoffitti.milano.it, 1 @@ -32371,6 +33078,7 @@ convergnce.com, 1 conversationexchange.com, 1 conversatis.cf, 1 +conversechucktaylor.us, 1 converser.tk, 1 conversiepartners.nl, 1 conversionsciences.com, 1 @@ -32380,6 +33088,7 @@ convert2sql.com, 1 converter.ml, 1 convertimg.com, 1 +convertire-documenti.it, 1 convertkit.com, 1 convertr.io, 1 conveyance.pro, 1 @@ -32390,6 +33099,7 @@ convoyin.com, 1 conwaymi.gov, 1 conwaypdnh.gov, 1 +conwayregional.org, 1 conwaysc.gov, 1 conxcon.de, 1 cooalliance.com, 1 @@ -32411,11 +33121,13 @@ cookiecorner.com, 1 cookiecrook.com, 1 cookiedatabase.org, 1 +cookielaw.org, 1 cookiepedia.co.uk, 1 cookiepro.com, 1 cookiesoft.de, 1 cookiestudies.cf, 1 cooking-food.cf, 1 +cookingandme.com, 1 cookingaround.town, 1 cookingcrusade.com, 1 cookingiseasy.tk, 1 @@ -32423,7 +33135,6 @@ cookingperfected.com, 1 cookingperformancegroup.com, 1 cookingreporter.com, 1 -cookingwithruthie.com, 1 cookinsumos.com, 1 cookmedical.com, 0 cooko.at, 1 @@ -32447,6 +33158,7 @@ coole-fete.de, 1 coolerssr.space, 1 coolfilm.cf, 1 +coolgeography.co.uk, 1 coolgifs.de, 1 coolink.pub, 1 cooljs.me, 1 @@ -32473,7 +33185,6 @@ coop-land.ru, 1 coop.com.py, 1 coopal.jp, 1 -coopelectricidaddevoto.com.ar, 1 coopemep.live, 0 coopercity.gov, 1 coopercityfl.gov, 1 @@ -32482,10 +33193,12 @@ coordonnees-gps.fr, 1 coore.jp, 1 coorpacademy.com, 1 +coosbayor.gov, 1 cooznacza.pl, 1 copa.cf, 1 copabarena.tk, 1 copacabanafc.tk, 1 +copadata.be, 1 copasulassessoria.com.br, 1 copdfoundation.org, 1 copdrop.ga, 1 @@ -32507,6 +33220,7 @@ coprotag.fr, 1 coptel.cz, 1 coptkm.cz, 1 +copurhoca.com, 1 copybysophie.com.au, 1 copycats.tk, 1 copycaught.co, 1 @@ -32544,11 +33258,12 @@ corbax.com, 1 corbi.net.au, 1 corbusier.gq, 1 +corcorangl.com, 1 corcoranmn.gov, 1 cord-blood.tk, 1 cordalife.com, 1 cordeirosolutions.ga, 1 -cordejong.nl, 1 +cordejong.nl, 0 cordelia.tk, 1 cordemar.info, 1 corder.tech, 1 @@ -32579,6 +33294,7 @@ coredna.com, 1 coredns.rocks, 1 coredrive.com, 1 +coreflowbased.eu, 1 corefy.com, 1 coreg.tk, 1 corehealthberks.com, 1 @@ -32612,6 +33328,7 @@ corinnanese.de, 1 corinsamsterdam.com, 1 corintech.net, 1 +corinthfilms.com, 1 corisu.co, 1 corkcityfc.tk, 1 corkedwinebar.com, 1 @@ -32620,6 +33337,7 @@ corleoncatering.com, 1 corlija.com, 1 corlinde.nl, 1 +cormactagging.ie, 1 cormed-heverlee.tk, 1 cornday.org, 1 corneerasmus.com, 1 @@ -32657,7 +33375,6 @@ coronalab.eu, 0 coronasafe.network, 1 coronastationphotography.com, 1 -coronatestalmere.nl, 1 coronavaccinatiedatum.nl, 1 coronavirus-19.es, 1 coronavirus.de, 1 @@ -32666,6 +33383,7 @@ coronavirustesting.gov, 1 coronersconnect.co.uk, 1 cororocierodebelen.tk, 1 +corovan.com, 1 corp.goog, 1 corpersbook.com, 1 corpfin.net, 1 @@ -32680,7 +33398,9 @@ corporate-electric.ky, 1 corporateclash.net, 1 corporatecomputingsolutions.com, 1 +corporategift.com, 1 corporatehelicopters.com, 1 +corporatehitech.com.au, 1 corporateinbound.com, 1 corporateinfluencers.com, 1 corporativoarval.info, 1 @@ -32718,7 +33438,7 @@ corsa-b.uk, 1 corsac.nl, 1 corsectra.com, 1 -corsepro.com, 0 +corsepro.com, 1 corservsolutions.com, 1 corsetacademy.tk, 1 corsi.tk, 1 @@ -32759,8 +33479,10 @@ corvuscorax.xyz, 1 coryadum.com, 1 coryellcountytx.gov, 1 +corykoz.com, 1 coryluba.com, 1 -corytyburski.com, 1 +corytennison.net, 1 +corytyburski.com, 0 cosasnuevas.tk, 1 cosasque.com, 1 cosavederein1giorno.it, 1 @@ -32774,6 +33496,7 @@ coskun.tk, 1 coslinker.com, 0 cosmasiakraft.tk, 1 +cosmekaitori.jp, 1 cosmetic-surgery-prices.co.uk, 1 cosmeticasimple.com, 1 cosmeticenter.com.br, 1 @@ -32797,6 +33520,7 @@ cosmicyes.de, 1 cosmodacollection.com, 1 cosmohit.ua, 1 +cosmohost.info, 1 cosmohosting.site, 1 cosmoiler.com, 1 cosmonaut.tk, 1 @@ -32848,6 +33572,7 @@ cosude.org.pe, 1 cosumnescsd.gov, 1 cosuno.com, 1 +cosy-interior.com, 1 cosyden.tk, 1 cotak.gov, 1 cotalent.com.mx, 1 @@ -32856,6 +33581,7 @@ coteax.nl, 1 cotehy.com, 1 cotejardin.gent, 1 +cotennis.net, 1 coteouestmedia.com, 1 coteries.com, 0 coth.ml, 1 @@ -32917,6 +33643,7 @@ countybankdel.com, 1 countyjailinmatesearch.com, 1 countyofbarton.gov, 1 +countyofmontereyca.gov, 1 coup-dun-soir.ch, 1 coupa.com, 1 coupedevils.tk, 1 @@ -32924,8 +33651,10 @@ couplay.org, 1 couplesapp.co, 1 couplescoachingonline.com, 1 +couponarea.com, 1 couponava.com, 1 couponchief.com, 0 +couponcodefind.com, 1 couponcodesme.com, 1 couponfollow.co.uk, 1 couponite.com, 0 @@ -32958,9 +33687,9 @@ coursingweb.tk, 1 court1tickets.co.uk, 1 court1tickets.com, 1 +court23taylormi.gov, 1 courthousedirect.com, 1 courtlandtwpmi.gov, 1 -courtneybearse.com, 0 courtonetickets.co.uk, 1 courtonetickets.com, 1 courttranscriptontario.ca, 1 @@ -32976,9 +33705,11 @@ covenantbattle.net, 1 coventry.com, 1 coventrycollege.ac.uk, 1 +coventrymoneyman.com, 1 coventryobserver.co.uk, 1 coventryuk.tk, 1 cover-fashion.de, 1 +coverage-db.org, 1 coveragecareservices.co.uk, 1 coveragent.de, 1 covercrust.com, 1 @@ -33006,6 +33737,7 @@ covid19responsepod.com, 1 covid19scotland.co.uk, 0 covid19statstracker.com, 1 +covid19tvm.com, 1 covidactnow.org, 1 covidcoldfacts.com, 1 coviddiary.live, 1 @@ -33035,12 +33767,14 @@ coworking-luzern.ch, 1 coworking-space.tk, 1 coxcapitalmanagement.com, 1 +coxhealthfoundation.com, 1 coxxs.me, 1 coxxs.moe, 1 coya.tw, 1 coyo.tl, 1 coyocloud.com, 1 coyote.cf, 1 +coyote105.com, 1 cozanne.fr, 1 coze.zone, 1 cozmerce.com, 1 @@ -33055,7 +33789,6 @@ cozynergy.com, 1 cozzack.com, 1 cp-st-martin.be, 1 -cp014.com, 1 cp015.com, 1 cp017.com, 0 cp061.com, 0 @@ -33083,6 +33816,7 @@ cpdhealthcare.com, 1 cpe-colleg.de, 1 cpegypt.tk, 1 +cpeip.cl, 1 cpelighting.tk, 1 cpfpa.com, 1 cpfrancophonie.org, 1 @@ -33096,6 +33830,7 @@ cpm-steuerberater.de, 1 cpm-steuerberater.pro, 1 cpm-steuerberater.support, 1 +cpmedien.net, 1 cppaste.org, 1 cppressinc.com, 1 cpqcol.gov.co, 1 @@ -33115,6 +33850,7 @@ cpucheu.com, 1 cpufanshop.ga, 1 cpvmatch.eu, 1 +cpxz.nl, 1 cpy.pt, 1 cqfuchen.com, 1 cqn.ch, 0 @@ -33123,7 +33859,7 @@ cqre.business, 1 cqre.pl, 1 cqswxx.com, 1 -cqvradio.ddns.net, 1 +cqvradio.ddns.net, 0 cr.search.yahoo.com, 0 cr05.fr, 1 cr1coffee.com, 1 @@ -33186,7 +33922,6 @@ craftinghand.com, 0 craftist.de, 1 craftmachinec.com, 1 -craftmeow.com, 1 craftmeow.support, 1 craftngo.hu, 1 craftottawa.ca, 1 @@ -33195,6 +33930,7 @@ craftsmany.net, 1 craftsofcleo.com, 1 crafttalk.tk, 1 +craftwarehouse.com, 1 craftwmcp.xyz, 1 craftychameleonbar.com, 1 craftydev.design, 1 @@ -33225,6 +33961,7 @@ cranforddental.com, 1 crangasi.tk, 1 cranioo.nl, 1 +craniosacralsimeoni.com, 1 crankshaft.space, 1 cranstonri.gov, 1 craphound.com, 1 @@ -33246,6 +33983,7 @@ cratedb.cloud, 1 cratedb.net, 1 crates-io.cn, 1 +cratexcalgary.com, 1 cratexedm.com, 1 cratexind.com, 1 cratss.co.uk, 1 @@ -33259,6 +33997,7 @@ crawler.ninja, 1 crawloween.com, 1 crawlspaceandbasementsolutions.com, 1 +crax.tube, 1 craxpro.io, 1 crayon.co, 1 craytos.jp, 1 @@ -33287,6 +34026,7 @@ crazymarvin.com, 1 crazymeeshu.com, 1 crazymonkey.gq, 1 +crazynetwork.it, 1 crazypaul.com, 1 crazypellas.tk, 1 crazypete.ga, 1 @@ -33304,7 +34044,8 @@ crc32.online, 1 crca911co.gov, 1 crcdatatech.com, 1 -crcr.pw, 1 +crcr.pw, 0 +cre8ivedeals.com, 1 cre8studios.net, 1 crea-etc.net, 0 crea-shops.ch, 0 @@ -33319,7 +34060,6 @@ creafitchile.cl, 1 creaintel.net, 1 creaketing.com, 1 -crealab.top, 1 crealabs.it, 1 crealogix-online.com, 1 creamcastles.co.uk, 1 @@ -33375,13 +34115,13 @@ creativedigital.co.nz, 1 creativeeducation.tk, 1 creativeexpertdesigner.com, 1 -creativeground.com.au, 0 creativeideasagency.com, 1 creativeink.de, 1 creativekkids.com, 1 creativelaw.eu, 1 creativeliquid.com, 1 creativelysustainable.com, 1 +creativemarket.com, 1 creativemindslms.tk, 1 creativenz.govt.nz, 1 creativephysics.ml, 1 @@ -33411,9 +34151,11 @@ credex.bg, 1 credifut.com, 1 credify.tech, 1 +credigo.io, 1 credimax.com.bh, 1 credit-10.com, 1 credit-default-swaps.tk, 1 +credit.in.th, 1 creditcard.run, 1 creditcardgenerator.money, 1 crediteurope.ru, 1 @@ -33441,6 +34183,7 @@ creditxpert.com, 1 crednox.com, 1 credoperth.org, 1 +creekie.me, 1 creeks-coworking.com, 1 creeksidebiblechurch.org, 1 creeksideduluth.com, 1 @@ -33473,6 +34216,7 @@ crestasantos.com, 1 crestaurant.com.au, 1 crestdatasys.com, 1 +crestfitness.co.in, 1 crestoncottage.com, 0 crestor20mg.ml, 1 crestorgeneric.ml, 1 @@ -33489,10 +34233,12 @@ crewsing.tk, 1 crewvision.pt, 1 crex24.com, 1 -crfcap.org, 1 +crfcap.org, 0 crgalvin.com, 1 crgm.net, 1 crh.org, 1 +crhisgbibon.com, 1 +criadomorro.com.br, 1 criandosites.com.br, 1 criativedesign.com.br, 1 cribboker.net, 1 @@ -33510,6 +34256,7 @@ cricmela.com, 1 cricpa.com, 1 crictechs.com, 1 +cridem.org, 1 criena.com, 1 criena.net, 1 crigler-najjar.fr, 1 @@ -33532,12 +34279,14 @@ crimevictims.gov, 1 crimewatch.net, 1 crimewatchfl.com, 1 +crimewatchpa.com, 1 criminal-attorney.ru, 1 criminal-market.ml, 1 criminal-news.tk, 1 criminal.enterprises, 1 criminalcasecheats.ml, 1 criminaljusticehub.org.uk, 1 +criminaljusticeprograms.com, 1 criminallawyerjobdescription.ga, 1 criminallawyerjobdescription.gq, 1 criminallawyerjobdescription.ml, 1 @@ -33545,6 +34294,7 @@ criminalminds.tk, 1 criminalnote.tk, 1 criminalskin.tk, 1 +criminologia.or.cr, 1 crimson.no, 0 crimsonconnect.co.uk, 1 crimsoncoward.com, 1 @@ -33621,6 +34371,7 @@ criticcoos.tk, 1 criticizetheworld.tk, 1 critiker.com, 1 +critiquejeu.info, 1 critiquejeu.org, 1 critterculture.com, 1 crixto.io, 1 @@ -33631,6 +34382,7 @@ crm-dialog.de, 1 crm.onlime.ch, 0 crm114d.com, 1 +crmall.com, 1 crmdumariage.com, 1 crmforce.mil, 1 crmot.com, 1 @@ -33686,7 +34438,6 @@ crossair.tk, 1 crosschq.com, 1 crosscom.ch, 1 -crossconnected.co.uk, 1 crossdresscontest.com, 1 crossedwires.net, 1 crossfiremovies.tk, 1 @@ -33699,6 +34450,7 @@ crosslakefibre.ca, 1 crosslifenutrition.co.uk, 0 crosslimit.ga, 1 +crosslink.ae, 1 crossorange.jp, 1 crossover.tk, 1 crossoverit.com, 1 @@ -33706,6 +34458,7 @@ crosspointmn.org, 1 crossriver.com, 1 crossroads-gmbh.ch, 1 +crossroast.be, 1 crossway.nl, 1 crosswayz.tk, 1 crosswordarchive.org, 1 @@ -33737,6 +34490,7 @@ crownpoint.com, 0 crownsterling.io, 1 crowter.li, 1 +crowwing.gov, 1 crox.co, 1 croxu.com, 1 croydonapartments.com.au, 1 @@ -33751,8 +34505,16 @@ crt.cloud, 1 crt.sh, 1 crt2014-2024review.gov, 1 +crtalleres.com, 1 +crti.dz, 1 crtified.me, 1 crucerosplus.com, 1 +crucial.com, 1 +crucial.de, 1 +crucial.es, 1 +crucial.fr, 1 +crucial.jp, 1 +crucial.tw, 1 cruelalice.net, 1 cruelcarbon.tk, 1 cruelgirls.tk, 1 @@ -33791,6 +34553,7 @@ cry.nu, 0 cryo-informatique.com, 1 cryoflesh.com, 1 +cryosint.com, 1 cryothanasia.com, 1 cryovex.com, 1 cryozenic.com, 1 @@ -33821,7 +34584,6 @@ crypto-trade.org, 1 crypto-twist.com, 1 crypto-wiki.tk, 1 -crypto.be, 1 crypto.cat, 1 crypto.graphics, 1 crypto.is, 0 @@ -33841,7 +34603,10 @@ cryptoearnblog.xyz, 1 cryptoeighty.com, 1 cryptoexchangescript.com, 1 +cryptofacilities.co.uk, 1 +cryptofacilities.com, 1 cryptofan.org, 1 +cryptofinance.ai, 1 cryptofomo.capital, 1 cryptofomocapital.com, 1 cryptofox.nl, 1 @@ -33861,6 +34626,7 @@ cryptolot.ru, 1 cryptomail.nl, 1 cryptomaniaks.com, 1 +cryptomining.mobi, 1 cryptomixer.io, 0 cryptomkt.com, 1 crypton.academy, 1 @@ -33875,8 +34641,6 @@ cryptonit.cf, 1 cryptonom.org, 1 cryptonym.com, 1 -cryptool.org, 1 -cryptoonnews.xyz, 1 cryptop.ml, 1 cryptoparty.at, 1 cryptoparty.dk, 1 @@ -33887,6 +34651,7 @@ cryptopaste.org, 1 cryptophobia.nl, 1 cryptopuk.com, 1 +cryptopuppers.co, 1 cryptopyramide.com, 1 cryptorival.com, 1 cryptoruay.com, 1 @@ -33899,6 +34664,7 @@ cryptotrendclub.com, 1 cryptouniverse.io, 1 cryptoviet.com, 1 +cryptowat.ch, 1 cryptowhitelists.com, 1 cryptox-trading.com, 1 cryptoya.io, 1 @@ -33917,6 +34683,7 @@ crystal-zone.com, 1 crystal.com.co, 1 crystalapp.ca, 1 +crystalball.photo, 1 crystalblockchain.com, 1 crystalcave.nl, 0 crystalcaves.tk, 1 @@ -33929,7 +34696,6 @@ crystalgrid.net, 1 crystalhealthandbeauty.co.uk, 1 crystallake.tk, 1 -crystallizedcouture.com, 1 crystalpack.com.au, 1 crystalsdollz.tk, 1 crystalsky.tk, 1 @@ -33977,6 +34743,7 @@ csca.me, 0 cscau.com, 0 cschreiber.llc, 1 +cschristmas.com.au, 1 csci571.com, 1 cscmotors.com, 1 cscred.online, 1 @@ -33985,6 +34752,7 @@ csdacadcv.ga, 1 csdcareerday.com, 1 csdisaster.club, 1 +csdisco.com, 1 csds.md, 1 cse-uniserve.com.au, 1 csehnyelv.hu, 1 @@ -34023,7 +34791,6 @@ cshm-schm.ca, 1 cshostorg.tk, 1 cshub.com, 1 -cshub.nl, 1 csilies.de, 1 csillagoszpumi.se, 1 csirt.ee, 1 @@ -34063,7 +34830,6 @@ cst-vbg.ru, 1 cst188.cc, 1 cstanley.net, 1 -cstb.ch, 0 cstevens.cc, 1 cstg.com, 1 cstmadrid.tk, 1 @@ -34074,12 +34840,14 @@ cstrong.nl, 1 csty.ltd, 1 csu.st, 1 +csub.edu, 1 csulb-cmp-eir.com, 1 csumathtutor.com, 1 csupe.hu, 1 csusop.gov, 1 csuw.net, 1 csvalpha.nl, 1 +csvlombardia.it, 1 csvplot.com, 1 cswapps.com, 1 cswebi.net, 1 @@ -34095,6 +34863,7 @@ ctdi.pl, 1 ctech.cf, 1 ctemplar.com, 1 +ctes.cz, 1 ctet.nic.in, 1 ctf-albstadt.de, 1 ctf-archive.com, 1 @@ -34125,6 +34894,7 @@ ctrl.gr, 0 ctrlcvz.tk, 1 ctsl.net, 1 +ctsu.org, 1 cttso.gov, 1 ctu.cz, 1 ctyrisinkneri.cz, 1 @@ -34172,8 +34942,10 @@ cubia3.com, 1 cubia4.com, 1 cubic-lynx.com, 1 +cubicempire.com, 1 cubiclands.com, 1 cubicle.tk, 1 +cubicle7games.com, 1 cubiest.com, 1 cubigames.tk, 1 cubikus.fr, 1 @@ -34194,6 +34966,7 @@ cuckoo.ee, 1 cucumber.io, 1 cuddlecat.io, 1 +cuddlecomfort.com, 1 cuddlingyaks.com, 1 cuddlybeardaycare.com.au, 1 cudesa.gq, 1 @@ -34203,13 +34976,13 @@ cuecasonline.com.br, 1 cuegee.com, 1 cuentadias.cl, 1 -cuentamecomopaso.es, 1 cuentas-gratis.ga, 1 cuentasmutualamr.org.ar, 1 cues.org.uk, 1 cuestiondetiempo.tk, 1 cuetoems.com, 1 cuevafelina.tk, 1 +cufoon.com, 1 cugetliber.ro, 1 cuhawaii.com, 1 cuidade.fr, 1 @@ -34224,7 +34997,6 @@ culan.dk, 0 culha.net, 1 culinary.ga, 1 -culinoa.be, 1 culpoilu.tk, 1 cultivariable.com, 1 cultofperf.org.uk, 1 @@ -34236,6 +35008,7 @@ culturaeuropea.tk, 1 culturagenial.com, 1 culturahack.tk, 1 +culturaldistrict.org, 1 culturaldiversity.tk, 1 culturalmaninhos.tk, 1 culturalparadiso.tk, 1 @@ -34286,6 +35059,7 @@ cuoc.org.uk, 1 cuongthach.com, 1 cuongthach.net, 1 +cuongtran.xyz, 1 cuoredesigns.tk, 1 cuorineri.tk, 1 cupabonita.com, 1 @@ -34437,6 +35211,10 @@ customhomerealty.com, 1 customizedcelebrations.co.uk, 1 customizeyourshower.com, 0 +customleads.net, 1 +customlogoit.com, 1 +custommadecasino.com, 1 +custommadegolfevents.com, 1 custompac.co.uk, 1 custompapers.com, 1 custompoolsbydesign.com, 1 @@ -34456,6 +35234,7 @@ custosd.org, 1 cut-piehler.de, 1 cutads.ml, 1 +cutaneon.com, 1 cutaquigusa.com, 1 cute-urls.ml, 1 cute2u.com, 1 @@ -34475,6 +35254,7 @@ cutpasteprofit.tk, 1 cutt.pro, 0 cutter.li, 1 +cuttingedgedoorandtrim.com, 1 cuttingedgeoptronics.com, 0 cuttingedgeperiodontist.com, 1 cuttingedges.tk, 1 @@ -34527,6 +35307,7 @@ cw.center, 1 cwaclub.tk, 1 cwallpapersheb.tk, 1 +cwarzee.net, 1 cwaurora.top, 1 cwbc-bearing.com, 1 cwbrtrust.ca, 1 @@ -34554,7 +35335,6 @@ cwrau.info, 1 cwrau.io, 1 cwrau.rocks, 1 -cwtrade.co.uk, 1 cwwise.com, 1 cx.cx, 0 cx100.io, 1 @@ -34564,7 +35344,10 @@ cxfund.com.cn, 1 cxm.co.uk, 1 cxnetwork.com, 1 +cxologic.com, 1 cxologic.io, 1 +cxologic.net, 1 +cxologic.org, 1 cxorisks.com, 1 cxotrustsummit.com, 1 cy.ax, 1 @@ -34591,7 +35374,6 @@ cyber-yaroslavl.tk, 1 cyber.gc.ca, 1 cyber.gov, 1 -cyber.je, 1 cyber72.com, 1 cyberab.org, 1 cyberark.com, 1 @@ -34637,6 +35419,7 @@ cyberhipsters.nl, 1 cyberhost.uk, 1 cyberianhusky.com, 0 +cyberintro.fr, 1 cyberislam.tk, 1 cyberium-planet.cf, 1 cyberjake.xyz, 1 @@ -34670,6 +35453,7 @@ cyberproducciones.tk, 1 cyberprogramming.tk, 1 cyberpubonline.com, 1 +cyberpuerta.mx, 1 cyberpunk.guru, 1 cyberquest.cf, 1 cyberregister.nl, 1 @@ -34678,6 +35462,7 @@ cyberry.eu, 1 cybersafesolutions.com, 0 cybersafetn.gov, 1 +cybersails.co.za, 1 cybersamurai.tk, 1 cyberscan.io, 1 cyberschmiede.at, 1 @@ -34755,11 +35540,11 @@ cydetec.com, 1 cydogbrowser.com, 1 cyelint.com, 1 +cyesec.com, 1 cyfly.org, 1 cygnaltech.com, 1 cygnan.com, 1 cygnatus.com, 1 -cygnet-infotech.com, 1 cygnethealth.co.uk, 1 cygnetmidwest.com, 1 cygnius.net, 1 @@ -34823,6 +35608,7 @@ cyware.com, 1 cz.ma, 1 cz.nl, 1 +cz10.com.br, 1 czakey.net, 1 czarni-czarne.tk, 1 czaw.org, 1 @@ -34864,8 +35650,6 @@ d-eisenbahn.com, 1 d-ku.de, 1 d-macindustries.com, 1 -d-parts.de, 1 -d-parts24.de, 1 d-shed.tk, 1 d-soft.tk, 1 d-solutions.com.au, 1 @@ -34873,6 +35657,7 @@ d-tousei.co.jp, 1 d-toys.com.ua, 1 d-training.de, 1 +d-uhlig.de, 1 d-va.cf, 1 d-vision-create.com, 1 d.ac, 1 @@ -34911,7 +35696,7 @@ d4done.com, 1 d4fx.de, 1 d4h.live, 1 -d4insight.com, 1 +d4insight.com, 0 d4wson.com, 1 d4x.de, 1 d500world.tk, 1 @@ -35016,6 +35801,7 @@ daddybio.com, 1 daddyfinger.me, 1 daddyhax.ml, 1 +daddylive.link, 1 daddylonglegs.tk, 1 daddysluder.net, 1 dadecityfl.gov, 1 @@ -35041,6 +35827,7 @@ daevel.net, 1 dafater.sa, 1 dafe2021.ee, 1 +daffodilusa.org, 1 dafmeyda.com, 1 dafnik.me, 1 dafont.com, 1 @@ -35085,7 +35872,6 @@ daily-sudoku.tk, 1 daily.it, 1 dailyalerts.ga, 1 -dailybely.com, 1 dailybihar.com, 1 dailybits.be, 1 dailyblocks.com, 1 @@ -35097,13 +35883,16 @@ dailydodge.com, 1 dailydosehealth.com, 1 dailydote.com, 1 +dailydoze.com, 1 dailyemailinboxing.com, 1 +dailyenergyinsider.com, 1 dailyenglishchallenge.com, 1 dailyfantasysports101.com, 1 dailyfly.com, 1 dailyfootballpredictions.com, 1 dailyhealthylife.ml, 1 dailyhealthylife.tk, 1 +dailyjournalonline.com, 1 dailyjunkies.com, 1 dailyknicks.com, 1 dailykos.com, 1 @@ -35129,6 +35918,7 @@ dailytrip.de, 1 dailyusbusiness.tk, 1 dailywarteg.com, 1 +dailywealth.com, 1 dailywork.ga, 1 dailyxenang.com, 1 daimonikos.com, 1 @@ -35148,7 +35938,7 @@ daja.ml, 1 dajaks.tk, 1 dajaschoonheidsinstituut.nl, 1 -dajaskincare.nl, 1 +dajaskincare.nl, 0 daji.ba, 1 dajiale.org, 1 dajjal.org, 1 @@ -35174,7 +35964,6 @@ dalbar.com, 1 dalbarsqm.com, 1 dalbitresb.com, 1 -dale-west.com, 1 daleanddollops.com, 1 dalecountyal.gov, 1 dalek.co.nz, 1 @@ -35251,6 +36040,7 @@ damnednation.tk, 1 damngoodpepper.com, 0 damnkid.ml, 1 +damnmodz.com, 1 damonline.dk, 1 dampedia.com, 1 dampfbahn-leverkusen.com, 1 @@ -35269,8 +36059,8 @@ dana-hilliot.tk, 1 danadameson.tk, 1 danads.com, 1 -danaglennsmith.com, 1 danalina.by, 1 +danalpay.com, 1 danalytics.com.pe, 1 danamica.dk, 1 danandrum.com, 1 @@ -35282,6 +36072,7 @@ danbaldwinart.com, 1 danbarrett.com.au, 0 danbergen.com, 1 +danbolig.dk, 1 danca.com, 1 dance-colleges.com, 1 dance-school.tk, 1 @@ -35322,7 +36113,6 @@ dangerscience.com, 1 dangmai.tk, 1 dangr.zone, 1 -dangranger.co.uk, 1 danhalliday.com, 1 danhoej.dk, 0 danholloway.online, 1 @@ -35351,6 +36141,7 @@ danielaferpe.tk, 1 danielalvarez.net, 1 danielbankhead.com, 1 +danielbarros.com.br, 1 danielbeilharz.com, 1 danielbeilharz.de, 1 danielcardoso.net, 1 @@ -35455,7 +36246,7 @@ dannemora.tk, 1 dannhanks.com, 1 dannicholas.net, 1 -danniellealbrechtdesigns.com, 1 +dannon.com, 1 danny-rohde.de, 1 danny.fm, 1 dannycairns.com, 1 @@ -35475,6 +36266,7 @@ dannyvanwamelen.tk, 1 dannywall.com.au, 1 danoji.cf, 1 +danone.es, 1 danonenorthamerica.com, 1 danonsecurity.com, 1 danotage.tv, 1 @@ -35485,7 +36277,6 @@ dansa.com.co, 1 dansage.co, 0 dansaunders.me, 1 -dansdiscounttools.com, 1 dansedesalonsaintave.fr, 1 danselibre.net, 1 danselibre.org, 1 @@ -35541,6 +36332,7 @@ dapursolo.tk, 1 daracokorilo.com, 1 darador.net, 0 +darajambili.com, 1 daramad-telegram.ga, 1 darani.ch, 1 daravk.ch, 1 @@ -35574,6 +36366,7 @@ darioclip.com, 1 dariosirangelo.me, 1 darioturchetti.me, 1 +darioush.com, 1 dariusheghbali.tk, 1 darix.tk, 1 dark-ages.tk, 1 @@ -35663,6 +36456,7 @@ darkwebkittens.xyz, 0 darkwoods.tk, 1 darkx.me, 1 +darkxxxtube.com, 1 darlehen-ratgeber.de, 1 darlene.hu, 1 darlenenbocek.com, 1 @@ -35671,6 +36465,7 @@ darlingtonia.nl, 1 darlingtonwi.gov, 1 darmowy-tarot.pl, 1 +darmsr.com, 1 darnashop.fr, 1 darom.jp, 1 darpa.mil, 1 @@ -35680,6 +36475,7 @@ darrenm.net, 1 dart-tanke.com, 1 dart-tanke.de, 1 +dartagnan.com, 1 dartbeginners.tk, 1 dartcarrousel.tk, 1 dartcode.org, 0 @@ -35693,6 +36489,7 @@ dartstart.tk, 1 dartydiscount.fr, 1 darululum.ga, 1 +darumaproducciones.es, 1 darumpro.ru, 1 darwinkel.net, 1 darwinpark.tk, 1 @@ -35710,12 +36507,14 @@ das-mediale-haus.de, 1 das-pna.ao, 1 das-sommercamp.de, 1 +das.nl, 1 dasabeauty.vn, 1 dasabomobil.de, 1 dasble.com, 1 dascan.com.br, 1 daseinsfreu.de, 1 daservajesus.com, 1 +daservajesus.io, 1 daservajesus.net, 1 dasgeestig.nl, 1 dashadmit123.com, 1 @@ -35746,6 +36545,7 @@ data-access-point.com, 1 data-analyse.nl, 1 data-detox.de, 1 +data-encoder.com, 1 data-exchange.tk, 1 data-jt.de, 1 data-loader.com, 1 @@ -35824,19 +36624,21 @@ datamish.com, 1 datapiped.com, 1 dataprivacysolution.com, 1 +dataproject.com, 1 dataprot.net, 1 datapun.ch, 1 datarails.com, 1 dataregister.info, 1 +datarobot.com, 1 dataroom-online.org, 1 datarooms-advisor.org, 1 -datarooms-review.com, 1 datarooms.in, 1 datasat.solutions, 1 datascene.xyz, 1 datascience.cafe, 1 datascience.ch, 0 datasciencedojo.com, 1 +datasciocean.tech, 1 datasite.com, 1 dataskydd.net, 1 datasourcenj.org, 1 @@ -35850,6 +36652,7 @@ datasubjects.com, 1 datasunrise.com, 1 dataswamp.org, 1 +dataswitcher.com, 1 datatekniikka.fi, 0 datateknologsektionen.se, 0 datatree.nl, 1 @@ -35875,6 +36678,7 @@ date-hijri.net, 1 dateien.at, 1 datelligent.com, 1 +datema.no, 1 datememe.com, 1 datenbitch.org, 0 datengrab.ws, 1 @@ -35934,6 +36738,7 @@ datovyportal.cz, 1 datumplus.co.uk, 1 datumstudio.jp, 1 +dature.cloud, 1 datustribe.tk, 1 datutoday.tk, 1 datutorials.tk, 1 @@ -35944,6 +36749,7 @@ dauksiagire.lt, 1 daum-group.de, 1 daunatotala.ro, 1 +daunt.link, 1 dauphincounty.gov, 1 dausendschoen.de, 1 davalochki.tk, 1 @@ -35958,7 +36764,7 @@ davecardwell.com, 1 davedevries.nl, 1 daveedave.de, 1 -davehewison.com, 1 +davelbostoncoach.com, 1 davelucia.com, 1 davemusic.tk, 1 davenportok.gov, 1 @@ -36004,7 +36810,7 @@ davidbrookes.me, 0 davidbyrne.tk, 1 davidcraft.de, 1 -daviddegner.com, 1 +davidcrousehouse.com, 1 daviddietrich.com, 1 davidebasile.tk, 1 davidelstob.com, 1 @@ -36031,15 +36837,18 @@ davidkeane.com, 1 davidkennardphotography.com, 1 davidking.xyz, 1 +davidkuhls.de, 1 davidlamprea.com, 1 davidlamprea.eu, 1 davidlane.io, 0 davidlemler.me, 1 davidlillo.com, 1 davidlindekilde.dk, 1 +davidlouisedelman.com, 1 davidlyness.com, 1 davidmcevoy.org.uk, 1 davidmessenger.co.uk, 1 +davidmgarvin.com, 1 davidmlujan.com, 1 davidmocq.com, 1 davidnadaski.com, 1 @@ -36087,6 +36896,7 @@ davo-usedcars.be, 1 davogroep.nl, 1 davorin.cf, 1 +davosalestax.com, 1 davros.eu, 1 davros.ru, 1 davulcuyuz.com, 1 @@ -36112,6 +36922,7 @@ dawnofthedawg.com, 1 dawnpatrol.cloud, 1 dawnson.is, 1 +dawnzine.com, 1 dawrimiz.com, 1 dawson-floridavilla.co.uk, 1 dawsoncountyga.gov, 1 @@ -36126,8 +36937,11 @@ daxrunbase.com, 1 day, 1 day-of-battlecats.blog, 1 +day-peak.com, 1 day.marketing, 1 +dayanode.com, 1 daybreaklearning.com.au, 1 +daybreakmanagement.com, 1 daycontactlens.com, 1 daycubrem.com, 1 daydream.team, 1 @@ -36177,7 +36991,6 @@ db-sanity.com, 1 db-works.nl, 1 db.ci, 1 -dba-campus.de, 1 dba-support.nl, 1 dbapress.org, 1 dbaron.org, 1 @@ -36202,6 +37015,7 @@ dblcastles.co.uk, 1 dbldub.net, 1 dblfree.com, 0 +dblsuretybonds.com, 1 dbmiller.org, 1 dbmtv.news, 1 dbnext.de, 1 @@ -36232,6 +37046,7 @@ dc-occasies.be, 1 dc-service.by, 1 dc-solutions.at, 1 +dc-texas.com, 1 dc-zone.com, 1 dc7342.im, 1 dcain.me, 1 @@ -36239,7 +37054,6 @@ dcareer.tk, 1 dcave.net, 1 dcbouncycastles.co.uk, 1 -dcc.name, 1 dccdurgor1nbl.cloudfront.net, 1 dccode.gov, 1 dccomputerrepair.com, 1 @@ -36271,6 +37085,7 @@ dcpudwa.gov, 1 dcrdev.com, 1 dcs.pp.ua, 1 +dcso.de, 1 dctrl.ch, 1 dcvc.com, 1 dcw.io, 1 @@ -36296,6 +37111,7 @@ dd9397.com, 0 dd9721.com, 0 dd9728.co, 1 +dda.gov.ae, 1 ddatsh.com, 1 ddays2008.org, 1 ddcakedeliveryservice.co.uk, 1 @@ -36304,7 +37120,6 @@ ddel.de, 1 dden.ca, 0 dden.website, 1 -dderyce.com, 1 ddf.net, 1 ddhosted.com, 0 ddi.one, 1 @@ -36392,10 +37207,12 @@ dealinflatables.co.uk, 1 dealjumbo.com, 1 deallix.com, 1 +dealnxt.com, 1 dealogic.com, 1 dealproject.org.au, 1 dealroom.co, 1 dealschief.com, 1 +dealsfinders.blog, 1 dealsfromheaven.com, 1 dealsmagnet.com, 1 dealsoncart.com, 1 @@ -36422,6 +37239,7 @@ deasyvow.com, 1 death.social, 1 deathberry.ddns.net, 1 +deathclub.eu, 1 deathcult.fun, 1 deathlords.tk, 1 deathmarch.tk, 1 @@ -36448,6 +37266,7 @@ debatereport.com, 1 debats.tk, 1 debattinnlegg.no, 1 +debatyun.jp, 1 debauchery.ml, 1 debbiesblog.nl, 1 debbiessieraden.tk, 1 @@ -36469,6 +37288,7 @@ deblender.be, 1 deblender.shop, 1 deblocking.ga, 1 +deboo.info, 1 debora-singkreis.de, 1 deborahkaty.tk, 1 deborahmarinelli.eu, 1 @@ -36478,7 +37298,7 @@ debricked.com, 1 debrunet.com, 1 debrunet.net, 1 -debrunet.nl, 1 +debrunet.nl, 0 debrunet.org, 1 debrusoft.ch, 1 debtmetricest.ga, 1 @@ -36508,6 +37328,7 @@ decathlon.lt, 1 decathlon.lv, 1 decathlon.my, 1 +decathlon.ph, 1 decathlon.vn, 1 decaturcountyiowa.gov, 1 decaturish.com, 1 @@ -36531,6 +37352,7 @@ deck.academy, 1 deckenplatten.org, 1 deckersheaven.com, 1 +deckfix.co.nz, 1 deckshop.pro, 1 declarando.es, 1 declarativ.ga, 1 @@ -36636,7 +37458,6 @@ deepgame.tk, 1 deephill.com, 1 deephousex.ru, 1 -deepid.com, 1 deepinnov.com, 1 deepinsight.io, 1 deepl.com, 1 @@ -36655,6 +37476,7 @@ deepu-mathew.tk, 1 deepumathew.tk, 1 deepvalley.tech, 1 +deepwatch.com, 1 deepwoodshop.com, 1 deerfieldapartmentsstl.com, 1 deerfieldknoll.com, 1 @@ -36679,6 +37501,7 @@ defendas.com, 1 defendbearbutte.org, 1 defender-pro.com, 1 +defenderautoglass.com, 1 defendinnovation.org, 1 defendtheweb.co.uk, 1 defendtheweb.net, 1 @@ -36693,6 +37516,7 @@ deffo.com.au, 0 defi-metier.org, 1 defiant.com, 1 +defichain.com, 1 defietsambassade.be, 1 defietsambassade.gent, 1 defietsambassadegent.be, 1 @@ -36713,7 +37537,6 @@ defiscan.live, 1 defiskills.io, 0 defisolutions.ch, 0 -defisolutions.com, 1 defkey.com, 1 deflorio1948.it, 1 deflumeri.com, 1 @@ -36763,7 +37586,6 @@ degressif.com, 1 degroetenvanrosaline.nl, 1 degrootenslot.nl, 0 -degroupage.info, 1 degustuju.cz, 1 dehaanadvocatenkantoor.nl, 1 dehaancaravans.nl, 1 @@ -36814,15 +37636,18 @@ dekko.io, 1 dekleinezeppos.be, 1 dekodi.de, 1 +dekoh-shouyu.com, 0 dekonijnenburcht.tk, 1 dekoration.cf, 1 dekoration.gq, 1 dekoration.ml, 1 dekoration.tk, 1 +dekordiyon.com, 1 dekulk.nl, 0 del-ex.de, 1 delahrzolder.nl, 1 delam.site, 1 +delamoreretirement.com.au, 1 delaquila.com.co, 1 delasamericas.tk, 1 delavega.ua, 1 @@ -36849,11 +37674,14 @@ deletebin.com, 1 deletebin.org, 1 deletecat.com, 1 +delfi.ee, 1 delfi.lt, 1 +delfi.net, 1 delfic.org, 1 delfinus.tk, 1 delftstudy.nl, 1 delhi-escorts.in, 1 +delhi.edu, 1 delhicleanairforum.tk, 1 delhionlinegifts.com, 1 delhitownshipmi.gov, 1 @@ -36864,6 +37692,7 @@ delicadosonico.tk, 1 delicale.com.br, 1 delicatewonders.com, 1 +delici.art.br, 1 deliciascomercial.com, 1 delicious-audio.com, 1 delicious.gq, 1 @@ -36883,6 +37712,7 @@ deliuksta.lt, 1 deliverability.guru, 1 delivereasy.tk, 1 +delivery.it, 1 deliveryman.site, 1 delivr.com, 1 delker.com, 1 @@ -36909,8 +37739,10 @@ delphine.dance, 1 delpilarrungue.cl, 1 delprete.me, 1 +delsfranchise.com, 1 delsolphotography.com, 1 delta-data.ch, 1 +delta-electric.net, 1 delta-games.tk, 1 delta-hawks.tk, 1 delta-host.ml, 1 @@ -36920,6 +37752,7 @@ delta.ru, 1 delta24.ml, 1 delta8.one, 1 +deltacity.net, 1 deltacomputer.com, 1 deltacomputer.de, 1 deltacountyco.gov, 1 @@ -36952,6 +37785,7 @@ delunee.co, 1 deluxe-bot.tk, 1 deluxe-dubai.com, 1 +deluxeblogtips.com, 1 deluxecar.fr, 1 deluxewindowanddoor.com, 1 deluxthaispa.ru, 1 @@ -36984,7 +37818,6 @@ demeubelmakelaar.nl, 1 demeyere-usedcars.be, 1 demfloro.ru, 1 -demibaguette.com, 1 demicon.biz, 1 demijn.nl, 1 demilletech.net, 1 @@ -36996,6 +37829,7 @@ demisch-tim.de, 1 demischtim.de, 1 demish.tk, 1 +demmakina.com, 1 demmer.one, 1 demo-ferma.ga, 1 demo.sb, 1 @@ -37061,10 +37895,12 @@ denchik.tk, 1 dendi.tk, 1 dendibanget.tk, 1 +dendra.io, 1 denegka-mgnovenno.cf, 1 denegmnogo.tk, 1 denejki.tk, 1 denet.pro, 1 +denformlab.lt, 1 dengg.name, 1 dengidoma24.ml, 1 dengisrazu.tk, 1 @@ -37104,7 +37940,6 @@ denizuydur.nl, 1 denk-it.be, 1 denkeandersblog.de, 1 -denken-durchdenken.de, 1 denker.tk, 1 denkerstube.net, 1 denkit.com, 1 @@ -37113,6 +37948,7 @@ denknowles.com, 1 denkorolev.ga, 1 denkubator.de, 1 +denner.ch, 1 denninger.jp, 1 denningny.gov, 1 dennis-carpenter.com, 1 @@ -37130,9 +37966,9 @@ dennmart.me, 1 dennogumi.org, 1 deno.com, 1 +deno.uno, 1 denous.nl, 1 denovocorp.com, 1 -denovosoftsol.com, 1 denrei.com, 1 densmirnov.com, 1 densocean.net, 1 @@ -37149,23 +37985,28 @@ dentalcareerfinder.com, 1 dentalcolleges.tk, 1 dentalelegance.co.uk, 1 +dentalimplantscost.com.au, 1 dentaloptimizer.com, 1 +dentalqore.com, 1 +dentalqoretemp.com, 1 dentalreklamlari.tk, 1 dentals.cf, 1 dentalsupportuk.com, 1 dentaltalent.nl, 1 +dentaltransitions.com, 1 dentalturism.com, 1 dented.gq, 1 dentelegan.com, 1 +dentislabor.lt, 1 dentist-profi.ga, 1 dentistaaroma.com, 1 dentistabarbarajaqueline.com.br, 1 dentistalagoasanta.com.br, 1 dentistesdarveauetrioux.com, 1 dentistglasgow.com, 1 -dentistinbrooklyn.com, 1 dentistquezoncity.com, 1 dentistree.in.ua, 1 +dentistscost.com.au, 1 dentistsgainesvillega.com, 1 dentistslilburnga.com, 1 dentolo.de, 1 @@ -37182,6 +38023,7 @@ denver7.com, 1 denverautoinsurancecompany.com, 1 denverbph.com, 1 +denverchamber.org, 1 denverclassifieds.net, 1 denverdigital.com, 1 denverescorts.net, 1 @@ -37215,23 +38057,26 @@ departmentofoncology.com, 1 departure-transfer-reservation.com, 1 departureboard.io, 1 +depaulmanorestate.com.au, 1 depdesign.com, 1 depeche.ga, 1 depechemode-live.com, 1 -depechemode.de, 1 +depechemode.de, 0 +deped.blog, 0 deped.io, 1 depedcommons.org, 1 depedept.com, 0 depedsurigaodelnorte.com, 1 +depedtambayan.blog, 0 depedtambayan.net, 1 depedtayo.com, 1 depedtayo.ph, 1 depelos.co, 1 depelteau.com, 1 deperewi.gov, 1 +dephoro.com, 1 depicus.com, 1 depijp.tk, 1 -depilacioncon.com, 1 depilazione.roma.it, 1 depilestil.es, 1 depiratas.com.es, 1 @@ -37283,6 +38128,7 @@ derbuntering.de, 1 derby.ge, 1 derbybouncycastles.com, 1 +derbymoneyman.com, 1 derbyshire-language-scheme.co.uk, 1 derbyware.com, 1 derchris.me, 1 @@ -37308,7 +38154,6 @@ derguns.town, 1 derhaeuptling.de, 1 derhil.de, 1 -derincocuk.com, 1 derinsular.tk, 1 derivative-calculator.net, 1 derivativeshub.pro, 1 @@ -37319,6 +38164,7 @@ derkuki.de, 1 derlux.tk, 1 dermacarecomplex.com, 1 +dermafeelstudio.com, 1 dermaldistinction.com, 1 dermapaz.net, 1 dermaprocollagen.com, 1 @@ -37359,7 +38205,7 @@ derw.pw, 1 derwaldschrat.net, 1 derze.cloud, 1 -des-hommes-et-des-clous.com, 1 +desacanggu.id, 1 desafiomovilidadsustentable.com, 1 desagaz.com, 1 desakatorock.tk, 1 @@ -37367,6 +38213,7 @@ desanctispro.com, 1 desapego.com.br, 1 desarrollamosweb.com, 1 +desarrollowp.com, 1 descargapormega.ml, 1 descargar-apk.org, 1 descobrim.com, 1 @@ -37400,7 +38247,6 @@ desertsounds.org, 1 desgenst.ch, 1 deshevle-net.com, 1 -deshiread.com, 1 deshobi.cloud, 1 desic-sl.com, 1 desiderantes.tk, 1 @@ -37433,12 +38279,12 @@ designeus.ga, 1 designeus.gq, 1 designeus.tk, 1 +designforchangetaiwan.org, 1 designformanufacturability.net, 1 designgears.com, 1 designgraphic.fr, 1 designgurus.org, 1 designhuddle.com, 1 -designideasguide.com, 1 designmodernideas.tk, 1 designops-conference.online, 1 designpro.tk, 1 @@ -37538,6 +38384,7 @@ detakhukum.com, 1 detalika.ru, 1 detao.org, 1 +detayplastik.com.tr, 1 detc.tk, 1 detdom.tk, 1 detectagro.com, 1 @@ -37550,12 +38397,12 @@ detecy.com, 1 deteken.be, 1 detekenmuze.nl, 1 +detektywtd24.pl, 1 detelefoonboer.nl, 1 determapp.de, 1 determinatie.tk, 1 detfagligehus.dk, 1 deti-online.com, 1 -deti-vse.ml, 1 deti.ga, 1 detiklife.com, 1 detiks.cf, 1 @@ -37593,6 +38440,7 @@ deuelcountyne.gov, 1 deunanube.com, 1 deurenfabriek.nl, 1 +deuro.net, 1 deustech-media.tk, 1 deustech.tk, 1 deutex.fr, 1 @@ -37606,9 +38454,11 @@ deutscherquidditchbund.de, 1 deutsches-schutzportal.de, 1 deutscheshoponline.com, 0 +deutschexporno.com, 1 deutschland-dsl.de, 1 deutschlandreport.com, 1 deux.solutions, 1 +deuxfleurs.fr, 1 deuxsol.co, 1 deuxsol.com, 1 dev, 1 @@ -37617,7 +38467,6 @@ dev-gutools.co.uk, 1 dev-lab.online, 1 dev-pmcc.net, 1 -dev-sev-web.pantheonsite.io, 1 dev-soft.pl, 1 dev-tek.de, 1 dev-test.nl, 1 @@ -37628,7 +38477,6 @@ devafterdark.com, 1 devagency.fr, 1 devahi.gq, 1 -devalbert.com, 1 devalkincentives.nl, 1 devalps.eu, 1 devanstavern.tk, 1 @@ -37649,6 +38497,7 @@ develmaster.tk, 1 develogs.ru, 1 develope.cz, 1 +developedbygayuh.my.id, 1 developer.android.com, 1 developer.moe, 1 developer.mydigipass.com, 0 @@ -37678,7 +38527,6 @@ deviant.email, 1 deviation.tk, 1 devicemanager.ch, 1 -devicesgadget.com, 1 devicom.mx, 1 devignstudios.co.uk, 1 devil-may-cry.tk, 1 @@ -37698,6 +38546,7 @@ devinfo.net, 0 devinite.com, 1 devinlasarre.com, 1 +devinslick.com, 1 devirc.net, 1 devise-host.com, 1 devisnow.fr, 1 @@ -37709,6 +38558,7 @@ devloope.com, 1 devmanagersest.ga, 1 devmode.fm, 1 +devnet.ma, 1 devnet.tk, 1 devnull.team, 1 devnull.win, 1 @@ -37838,6 +38688,7 @@ dfm.ae, 1 dfmn.berlin, 1 dfmvf.org, 1 +dfpblog.com, 1 dfpg.com, 1 dfranke.com, 1 dfspdfl.gov, 1 @@ -37867,7 +38718,9 @@ dgbouncycastlehire.com, 1 dggb.co.in, 1 dggm.ru, 1 +dghr-info.de, 1 dghyp-immobrief.de, 1 +dghyp-press.de, 1 dghyp.com.tw, 1 dghyp.info, 1 dgl-24.de, 1 @@ -37914,8 +38767,8 @@ dhelixnet.de, 1 dhemant.de, 1 dhhs.gov, 1 +dhiraagu.com.mv, 1 dhirendrayadav.com, 1 -dhit.pl, 1 dhl-smart.ch, 1 dhlcotizadorexpo-qa.azurewebsites.net, 1 dhlinux.org, 1 @@ -37977,7 +38830,6 @@ diamantovaburza.cz, 1 diamgroup.pl, 1 diamir.de, 1 -diamond-cutting.kiev.ua, 1 diamond-hairstyle.dk, 1 diamondblueair.com, 1 diamondcargotrailers.org, 1 @@ -38037,6 +38889,7 @@ dibacode.com, 1 dibal.ua, 1 dibiphp.com, 1 +dic.ae, 1 dicaprio.tk, 1 dicasgostosas.com, 1 diccionarioabierto.com, 1 @@ -38077,6 +38930,8 @@ diclofenactopical.ga, 1 diclofenactopical.tk, 1 dico-charentais.tk, 1 +dicoado.ch, 1 +dicoado.com, 1 dicoado.org, 1 dicoeste.com, 1 dicomed.tk, 1 @@ -38110,6 +38965,7 @@ didesalud.com, 1 didi-online.tk, 1 dididiamond.net, 1 +dididiamond.org, 1 didier-equipereussite.com, 1 didierfle-decibel.fr, 1 didierfle-latelier.fr, 1 @@ -38117,6 +38973,7 @@ didierghez.com, 1 didierlaumen.be, 1 didigotoffer.com, 1 +didihirsch.org, 1 didiwinata.com, 1 didtrumpopengovernmentyet.com, 1 die-bergfuehrer.de, 1 @@ -38136,6 +38993,8 @@ die.one, 1 diebasis-box.de, 1 diebasis-partei.de, 1 +diecieventi.com, 1 +diecke.nu, 1 diecourier.co.za, 1 diedenhofen.tk, 1 diedesigntante.de, 1 @@ -38156,13 +39015,14 @@ diegovasconcelos.com.br, 1 diegovisual.tk, 1 diehildebrands.de, 1 +diehumanisten.de, 1 +diekleinekartenfabrik.de, 1 diekperaiwseis.gr, 1 diem25.org, 1 diemattels.at, 1 diemperu.com, 1 dienaturbinderei.at, 1 dienchaninstitute.com, 1 -diendorfer.space, 1 diengiolachoa.com, 1 dienmattroichonthanh.com, 1 dienna.nl, 1 @@ -38224,7 +39084,6 @@ differenziare.it, 1 difficulty.ga, 1 diffnow.com, 1 -diffzi.com, 1 diflucangeneric.ml, 1 diflucanonline.tk, 1 diflucanpill.ga, 1 @@ -38243,6 +39102,7 @@ digchip.org, 1 digchips.com, 1 digdata.de, 1 +digdong.com.br, 1 digginsmo.gov, 1 dighans.com, 1 digi-trax.com, 1 @@ -38256,18 +39116,19 @@ digibild.ch, 1 digibook.id, 1 digiboxx.com, 1 +digibrink.com, 1 digibull.email, 1 digibull.link, 1 digicelidgy.com, 1 digicert-support.com, 1 digicert.com.ru, 1 digicert.nl, 0 +digichefs.com, 1 digicode.hu, 1 digicomtel.com.br, 1 digicy.cloud, 1 digidroom.be, 1 digifloat.io, 1 -digiful.fi, 1 digikol.net, 1 digiland.tk, 1 digilicious.com, 1 @@ -38275,6 +39136,8 @@ digimaat.agency, 1 digimagical.com, 0 digimedia.cd, 0 +digimind-evolution.com, 1 +digimobee.info, 1 digimoncard.io, 1 digino.jp, 1 digino.us, 1 @@ -38290,6 +39153,7 @@ digiscrap.nl, 1 digiscrap.shop, 1 digisecmalta.com, 1 +digisfil.fr, 1 digisign.tk, 1 digit.bg, 1 digit.ec, 1 @@ -38314,7 +39178,8 @@ digital-mu.tk, 1 digital-nut.com, 1 digital-rainbow-dolls.tk, 1 -digital-techs.com, 1 +digital-sculpture.org, 1 +digital-watchdog.com, 1 digital-workshop.at, 0 digital.democrat, 1 digital.gov, 1 @@ -38350,6 +39215,7 @@ digitalcompudev.com, 1 digitalcourage.de, 1 digitalcraftmarketing.co.uk, 1 +digitalcrisis.com, 1 digitaldashboard.gov, 1 digitaldeli.com, 1 digitaldeli.org, 1 @@ -38406,6 +39272,8 @@ digitalizer.my.id, 1 digitalizzazioneverona.it, 1 digitalkashmir.ml, 1 +digitalkoran.com, 1 +digitalks.com.br, 1 digitallife.tk, 1 digitallink.be, 1 digitalliteracy.gov, 1 @@ -38416,6 +39284,7 @@ digitalmarketingindallas.com, 1 digitalmarketingnetic.com, 1 digitalmind.su, 1 +digitalmove.co.uk, 1 digitalninja.tk, 1 digitalnomadsunderground.com, 1 digitalphone.tk, 1 @@ -38433,7 +39302,9 @@ digitalradio.ie, 1 digitalrealitybbs.com, 1 digitalreborn.com, 1 +digitalrecipe.com.au, 1 digitalredshirts.com, 1 +digitalrhino.eu, 1 digitalrights.center, 1 digitalrights.fund, 1 digitalroma.tk, 1 @@ -38450,13 +39321,17 @@ digitalsuply.com.br, 1 digitalsupporter.ml, 1 digitalsurge.io, 1 +digitalsushma.com, 1 digitaltbyra.no, 1 digitaltcertifikat.dk, 1 digitaltech.vip, 1 digitaltechupdates.com, 1 +digitaltechviews.com, 1 digitaltry.tk, 1 digitalupcoming.tk, 1 digitalvag.tk, 1 +digitalworkplaceforum.com.br, 1 +digitalzylinder-shop.com, 1 digite.com, 1 digitec.ch, 1 digitecgalaxus.ch, 1 @@ -38465,6 +39340,7 @@ digitium.fr, 1 digitkon.com, 1 digitogy.com, 1 +digitoimistopipeline.fi, 1 digitoucan.com, 1 digitra.com, 1 digitreads.com, 1 @@ -38473,6 +39349,7 @@ digitypa.fi, 1 digityza.com, 1 digivan.ml, 1 +digivita.ir, 1 digminecraft.com, 1 dignited.com, 1 dignity.tk, 1 @@ -38480,6 +39357,7 @@ digpubdev.org, 1 digpubprd.org, 1 digpubqa.org, 1 +digsys.bg, 1 digwiz.biz, 0 digwp.com, 1 dih-technology.com, 1 @@ -38506,7 +39384,6 @@ dik-manusch.tk, 1 dikiaap.id, 1 dikkevettescania.tk, 1 -diko.ml, 1 diktatur.tk, 1 dilation.party, 1 dildoexperten.se, 1 @@ -38517,6 +39394,8 @@ dillewijnzwapak.nl, 1 dillonco.gov, 1 dillonm.io, 1 +dillynbarber.com, 0 +dilmahtea.com, 1 dilmahtea.me, 1 dilmarames.com, 1 dima.pm, 0 @@ -38578,6 +39457,7 @@ dingcc.me, 1 dingdong-shop.ru, 1 dingelbob-schuhcreme.gq, 1 +dingeldein-messtechnik.de, 1 dinglecottage.co.uk, 1 dinglishuzi.com, 1 dingos.tk, 1 @@ -38634,6 +39514,7 @@ diplom-ru.tk, 1 diplomatcruises.co.uk, 1 diplomatiegabon.ga, 1 +diplomsshop.online, 1 diplona.de, 1 dipro.id, 1 dipsytroller.com, 1 @@ -38680,6 +39561,7 @@ directoryg.com, 1 directoryworld.tk, 1 directpaydayloansonline.ga, 1 +directright.ca, 1 directright.com, 1 directright.net, 1 directrightcartage.com, 1 @@ -38697,6 +39579,7 @@ diretonoponto.gq, 1 direwolfsoftware.ca, 1 dirhami.com, 1 +dirigentesdigital.com, 1 dirk-dogs.tk, 1 dirk-weise.de, 1 dirkdavid.org, 1 @@ -38795,6 +39678,8 @@ discountforelectronics.tk, 1 discountisolatie.nl, 1 discounto.de, 1 +discountoffice.be, 1 +discountoffice.nl, 1 discountpark.fr, 1 discountpokale.at, 1 discountpokale.de, 1 @@ -38812,6 +39697,8 @@ discoverchinanow.gq, 1 discoverchinanow.ml, 1 discoverfloridasprings.com, 1 +discoverglo.com, 1 +discovergy.com, 1 discoverhealthage.com, 0 discoveringdocker.com, 1 discoverkeesler.com, 1 @@ -38822,13 +39709,13 @@ discoverradiance.com, 1 discoverthreejs.com, 1 discoverucg.co.uk, 1 -discovery-ls.com, 1 discoveryaima.com, 1 discoveryballoon.org, 1 discoveryottawa.ca, 1 discpersonalitytesting.com, 1 discrede.tk, 1 discrypt.ca, 1 +discshop.co.nz, 1 disctranulis.gq, 1 discus-communications.dk, 1 discuss-data.net, 1 @@ -38841,6 +39728,7 @@ disfigured.tk, 1 disfold.com, 1 disguise.cf, 1 +dishalawfirm.com, 1 dishcrawl.com, 0 dishonorablespeechinpolitics.com, 1 dishwashermagic.tk, 1 @@ -38916,6 +39804,7 @@ dislepsia.tk, 1 dismail.de, 1 dismed.fr, 1 +dismoimondroit.fr, 1 disney-stitch.com, 1 disneywallpapers.tk, 1 disobey.net, 1 @@ -38930,6 +39819,7 @@ displayenergycertificate.co.uk, 1 displayrd.com, 1 disposable.link, 1 +disposalqa.com, 1 dispur.nic.in, 1 disroot.org, 1 disrupters.ch, 0 @@ -38964,7 +39854,6 @@ distraction.tk, 1 distractors.tk, 1 distratus.com, 1 -distri.com.ua, 1 distribuidoracristal.com.br, 1 distribuidoradecierres.com, 1 distribuidoraplus.com, 1 @@ -39012,8 +39901,10 @@ divanogiusto.it, 1 divari.nl, 1 divatri.tk, 1 +divband.com, 0 divcoder.com, 1 dive-japan.com, 1 +divedigital.id, 1 divegearexpress.com, 1 divegearexpress.net, 1 diveidc.com, 1 @@ -39033,6 +39924,7 @@ diversitywatch.co.nz, 1 diversovariable.tk, 1 divertidores.tk, 1 +divestos.org, 1 divewithfrank.com, 1 divicar.com.br, 1 dividedstates.tk, 1 @@ -39041,10 +39933,13 @@ divider.tk, 1 divienna.nl, 1 diviflash.com, 1 +divigear.com, 1 +divihosting.nl, 1 divinasaiamodas.com.br, 1 divineangel.tk, 1 divinecnainstitute.com, 1 divinedecay.tk, 1 +divinefeminineyoga.com, 1 divinegames.studio, 1 divinemercyparishvld.com, 1 divinerooms.com, 1 @@ -39071,6 +39966,7 @@ divvy.tk, 1 diwei.vip, 1 dixa.tech, 1 +dixeo.fr, 1 dixibox.com, 1 dixie.com, 0 dixiepest.com, 1 @@ -39091,14 +39987,15 @@ diyeventhire.co.nz, 1 diygeek.com, 1 diymediahome.org, 1 -diymusician101.tk, 1 diysec.tk, 1 +diysolarforum.com, 1 diysonline.com, 1 diyzealot.com, 1 dizainkyhni.ml, 1 dizayn-cheloveka.ru, 1 dizayner.tk, 1 dizihastasi.com, 1 +dizirix.net, 1 dizkartes.nl, 1 dizkofloor.com, 1 dizlexiqa.tk, 1 @@ -39138,6 +40035,7 @@ djamelkokene.com, 1 djamiroquai.tk, 1 djang.tk, 1 +django.baby, 1 django.city, 1 django.cyou, 1 djangobirthday.com, 0 @@ -39181,7 +40079,6 @@ djdennis.tk, 1 djdiego.tk, 1 djduckie.tk, 1 -djeanepersonalorganizer.com.br, 1 djefsane.tk, 1 djembeforum.tk, 1 djerba-tunisie.tk, 1 @@ -39275,7 +40172,6 @@ djtiago.tk, 1 djtime.fr, 1 djtourist.tk, 1 -djura.in.rs, 1 djurensvanner.tk, 1 djurklinikenangelholm.se, 1 djursland-psykologen.dk, 1 @@ -39315,6 +40211,7 @@ dkos7.com, 1 dkos8.com, 1 dkos9.com, 1 +dkproducts.nl, 1 dkravchenko.su, 0 dksh.com, 1 dksinger.tk, 1 @@ -39345,6 +40242,7 @@ dleet.com, 1 dleger.space, 1 dlepavilion.com, 1 +dlevans.com, 1 dlf.exchange, 1 dlfsymposium.nl, 1 dlg.im, 1 @@ -39354,6 +40252,7 @@ dlld.com, 1 dlld.org, 1 dlld.us, 1 +dlmarket.jp, 1 dlmeto.com, 1 dlmixcloud.com, 1 dlouwrink.nl, 0 @@ -39364,11 +40263,12 @@ dlt.green, 1 dlttrading.com, 1 dluxelab.com, 1 +dlv-registry.com, 1 +dlv-registry.org, 1 dlyabega.tk, 1 dlyaribalki.tk, 1 dlyatepla.ml, 1 dlyl888.com, 1 -dm-918kiss.com, 1 dm-drogeriemarkt.ba, 0 dm-drogeriemarkt.bg, 0 dm-drogeriemarkt.it, 0 @@ -39391,6 +40291,7 @@ dm4productions.com, 1 dm6.co, 1 dm7ds.de, 1 +dmaclinic.com, 1 dmaglobal.com, 1 dmarc-hd.org, 1 dmarc.com, 1 @@ -39416,6 +40317,7 @@ dmdd.org.uk, 1 dmdiamonds.tk, 1 dmdpayroll.com, 1 +dme.net, 1 dmehub.com, 1 dmesg.sk, 1 dmfd.net, 1 @@ -39430,6 +40332,7 @@ dmi.es, 1 dmi.gov.lb, 1 dmiapis.id, 1 +dmihome.net, 1 dmilb.org, 1 dmillerlaw.com, 1 dmitrysnotes.ru, 1 @@ -39465,12 +40368,15 @@ dna-technology.ua, 1 dna.li, 0 dnabler.eu, 1 +dnadk.com, 1 +dnafinanceiro.com, 1 dnakids.co.uk, 1 dnalounge.com, 1 dnapagamentos.com.br, 1 dnapizza.com, 1 dnash.tk, 1 dnaspaces.eu, 1 +dnaspaces.io, 1 dnb.co.in, 1 dnc.org.nz, 1 dndblog.tk, 1 @@ -39488,6 +40394,7 @@ dngsnl.com, 1 dnhome.net, 1 dnhome.uk, 1 +dnjwpa.com.pl, 1 dnk.company, 1 dnmlab.it, 1 dnms.com, 1 @@ -39529,6 +40436,7 @@ dnspropagation.net, 1 dnsrate.com, 1 dnsrevolve.com, 1 +dnsscience.org, 1 dnssecandipv6.se, 1 dnssecunsigned.com, 1 dnssex.com, 1 @@ -39549,6 +40457,7 @@ do67.de, 1 do67.net, 1 doanhai.tk, 1 +doanhnhankhanhhoa.vn, 0 dobavki.club, 1 dobbshvac.com, 1 dobledemichaeljackson.tk, 1 @@ -39623,6 +40532,7 @@ docsunited.net, 1 docswallet.com, 1 doctabaila.com, 1 +doctaforum-diferidos.com, 1 doctaforum-events.org, 1 docteur-delorme.fr, 1 doctor-locks.co.uk, 1 @@ -39665,6 +40575,7 @@ documentnode.io, 1 documods.com, 1 docupaymentuat.xyz, 1 +docupub.com, 1 docusearch.com, 1 docusend.biz, 1 docusign.ca, 1 @@ -39691,7 +40602,6 @@ dodecaedro.tk, 1 dodgecountymn.gov, 1 dodgecountyne.gov, 1 -dodgersway.com, 1 dodgevillewi.gov, 1 dodi-alhelo.tk, 1 dodi-repacks.site, 1 @@ -39699,6 +40609,8 @@ dodikod.tk, 1 dodolle.co.uk, 1 dodotek.digital, 1 +dodotool.ru, 1 +dodungphongtam.com, 1 doedelzakken-jsh.tk, 1 doegirls.com, 1 doehle-group.com, 1 @@ -39714,6 +40626,7 @@ doesinfotech.com, 1 doesmycodehavebugs.today, 1 doetwat.nl, 1 +dof.gov.ph, 1 dofashion.tk, 1 dofus-aide.tk, 1 dofus.market, 1 @@ -39726,7 +40639,6 @@ dogalsoyamumu.com, 1 dogan.ch, 0 doganoglu.net, 1 -dogcam.tk, 1 dogcat.vn, 0 dogcratereview.info, 1 dogday.tk, 1 @@ -39788,10 +40700,13 @@ dohertyconsulting.tk, 1 doi.org, 1 doihavetoputonpants.com, 1 +doinaruscior.eu, 1 doist.com, 1 doit-intl.com, 1 +doit.com, 1 doitauto.de, 1 doj.gov.in, 1 +dojah.io, 1 dojifish.space, 1 dojin.nagoya, 1 dojki.cf, 1 @@ -39819,6 +40734,7 @@ dokument.tk, 1 dokuraum.de, 1 dokutech.fr, 1 +dolanan.tech, 1 dolanyok.com, 1 dolbyatmosmusiclist.com, 1 dolce-vita-mia.tk, 1 @@ -39908,6 +40824,7 @@ domainhacks.io, 1 domainhostingcompany.tk, 1 domainics.ml, 1 +domainlions.com, 1 domainmonitor.net, 1 domainoo.com, 1 domainoo.fr, 1 @@ -39937,6 +40854,7 @@ domaza.ml, 1 domcc.tel, 1 domeconseil.fr, 1 +domein-direct.com, 1 domein-direct.nl, 1 domeindns.nl, 1 domekklimkowka.com, 1 @@ -39947,7 +40865,6 @@ domenick-lieneweg.de, 1 domenico.lviv.ua, 1 domenicods.tk, 1 -domfee.com, 1 domhaase.me, 1 domhos.tk, 1 domialt.de, 1 @@ -40000,7 +40917,6 @@ domnaslonecznej.pl, 1 domob.eu, 1 domodeco.fr, 1 -domop.net, 1 domop.org, 1 domostroiy.tk, 1 domostroydon.ru, 0 @@ -40021,6 +40937,7 @@ domrotang.ru, 0 domsamogona.ru, 1 domscripting.com, 1 +domu.ro, 1 domucmayintainha.com.vn, 1 domus-global.com, 1 domus-global.cz, 1 @@ -40067,6 +40984,7 @@ donation.ph, 1 donationexecutor.com, 1 donazione.it, 1 +doncastermoneyman.com, 1 dondiabolo.com, 1 dondibogusky.com, 1 donec.tk, 1 @@ -40095,6 +41013,7 @@ donnabrothers.com, 1 donnacha.blog, 1 donnachie.net, 1 +donnahay.com.au, 1 donnapepe.tk, 1 donner-reuschel.de, 1 donnerhollenconstruction.com, 1 @@ -40108,6 +41027,7 @@ donotcall.gov, 1 donotdepart.com, 1 donpanda.cz, 1 +donpi.it, 1 donpietraos.tk, 1 donplafon.ru, 1 donpomodoro.com.co, 1 @@ -40177,11 +41097,13 @@ doors-and-windows.tk, 1 doorservice.ml, 1 doorswest.net, 1 -doortim.nl, 1 doortodoor.ml, 1 +doottrucks.com.au, 1 dopamine.tk, 1 dopefile.cf, 1 dopefile.tk, 1 +dopei.com, 1 +dopeillustrators.com, 1 dopesoft.de, 1 dopewars.tk, 1 dopiatku.pl, 1 @@ -40196,7 +41118,6 @@ doradocomputer.com, 1 dorados.tk, 1 doradoscampeon.tk, 1 -doradosystems.es, 1 doraemonchile.tk, 1 dorama.gq, 1 doramamusic.gq, 1 @@ -40238,6 +41159,7 @@ dorpsoverlegboskoop.nl, 1 dorpsparade.tk, 1 dorquelle.com, 1 +dorrtownshipmi.gov, 1 dorsavi.com, 1 dorsaycreative.com, 1 dorsetentertainments.co.uk, 1 @@ -40255,7 +41177,6 @@ dosenpendidikan.co.id, 1 dosenpintar.com, 1 dosensosiologi.com, 1 -dosequis.com, 1 doserres.tk, 1 dosevue.com, 1 dosgame.club, 1 @@ -40279,6 +41200,7 @@ dostips.com, 1 dostkuijper.nl, 1 dosug.gq, 1 +dosug.host, 1 dosug.so, 1 dosugru.gq, 1 dosvientoselectric.com, 1 @@ -40323,7 +41245,9 @@ dotlimino.tk, 1 dotneko.net, 1 dotnetdocs.ir, 1 +dotnetfoundation.org, 1 dotnetsandbox.ca, 1 +dotnext.co.za, 1 dotovh.ovh, 1 dotphoto.com, 1 dotplex.com, 1 @@ -40391,6 +41315,7 @@ douzer.earth, 1 douzer.industries, 1 dovebuttare.it, 1 +doveconviene.it, 1 dovecraft.com.ua, 1 doveholesband.co.uk, 1 dovemoe.com, 1 @@ -40449,9 +41374,11 @@ downtimerobot.com, 1 downtoagony.tk, 1 downtownafrica.com, 1 +downtownboise.org, 1 downtowncharm.is, 1 downtownindy.org, 1 downtownla.com, 1 +downtownmesa.com, 1 downtownpdx.dog, 1 downtownraleigh.org, 1 downtownsuiteliving.com, 1 @@ -40490,6 +41417,8 @@ dp-films.de, 1 dp.cx, 1 dpangerl.de, 0 +dpanosian.com, 1 +dpc-software.de, 1 dpc.ae, 1 dpc.fr, 1 dpcs.link, 1 @@ -40505,16 +41434,20 @@ dpisecuretests.com, 1 dpjuse.tk, 1 dpk.es, 1 +dpkk.ph, 1 dplpmtud.com, 1 dpm-ident.de, 0 dpmc.govt.nz, 1 dpmr446.fr, 1 +dpoairport.au, 1 +dpoairport.com.au, 1 dpomax.com.br, 1 dponapratica.com.br, 1 dpower.tk, 1 dppstar.com, 1 dprb.biz, 1 dpress24.it, 1 +dprmp.org, 1 dpsg-hohenlinden.de, 1 dpsmassage.nl, 1 dpucarriersma.gov, 1 @@ -40627,7 +41560,6 @@ drahmedmaged.com, 1 drainagedirect.com, 0 draintechnorthwest.net, 1 -draintheswampparty.com, 1 drainwllc.com, 1 drak.tk, 1 drake.partners, 1 @@ -40641,6 +41573,7 @@ draknet.eu, 1 draliabadi.com, 0 dralucilavolasco.com.br, 1 +drama-live.tv, 1 drama.tk, 1 dramacooltv.org, 1 dramakorea.tk, 1 @@ -40683,12 +41616,14 @@ drawtwo.gg, 1 drawvesly.ovh, 1 drawxp.com, 1 +drawzit.com, 1 draycotthotel.com, 1 drbadnick.tk, 1 drbanerjeecures.in, 1 drbarnabus.com, 1 drbenbarry.com, 1 drblog.tk, 1 +drbonesonline.com, 1 drbonine.com, 1 drbresnick.com, 1 drcardiofit.com, 1 @@ -40747,7 +41682,7 @@ dreamofice.cn, 1 dreamofice.com, 1 dreampages.tk, 1 -dreamphreak.com, 1 +dreampointech.com, 1 dreamqueen.tk, 1 dreamreality.tk, 1 dreamsbythelake.com, 1 @@ -40765,9 +41700,11 @@ dreamsxxl.com, 1 dreamsystems.tk, 1 dreamtapestry.ga, 1 +dreamtechie.com, 1 dreamweavers.live, 1 dreamwork.financial, 1 dreamworldstudio.tk, 1 +dreamy-flat-lyon.fr, 1 dreamytheatre.com, 1 dreamz-staging.zone, 1 dreamz.com, 1 @@ -40788,6 +41725,7 @@ dreigold.de, 1 dreinulldrei.de, 1 dreischneidiger.de, 1 +dreistaxservices.com, 1 dreizwosechs.de, 0 drema.tk, 1 drendermobilyaservisi.com, 1 @@ -40828,7 +41766,8 @@ drexelwood.com, 1 dreyfussplasticsurgery.com, 1 drezzy.it, 1 -drfranciscofonseca.com.br, 0 +drfirst.com, 1 +drfranciscofonseca.com.br, 1 drfrey.ch, 0 drfuhrman.com, 1 drgabrielschmitt.com, 1 @@ -40924,7 +41863,6 @@ drivemorganvanlines.com, 1 driven2shine.eu, 1 drivenes.net, 1 -driventoday.com, 1 driveoakleytransport.com, 1 drivepaultransportation.com, 1 driver.ru, 1 @@ -40956,11 +41894,13 @@ drjacquesmalan.com, 1 drjaensch.de, 1 drjart.com, 0 +drjavadrezazadeh.com, 1 drjihsderma.com, 1 drjoe.ca, 1 drjosebarrera.com, 1 drjulianneil.com, 1 drjungspine.com, 1 +drk-blutspende.de, 1 drkai.com.tw, 1 drkashany.ir, 1 drkazim.com, 1 @@ -41061,6 +42001,7 @@ drpetervoigt.de, 1 drpico.com.au, 1 drpil.nl, 1 +drpost.xyz, 1 drpure.top, 1 drrachellemeaux.com, 1 drradin.com, 1 @@ -41084,6 +42025,7 @@ drstevenwarnock.com, 1 drsturgeonfreitas.com, 1 drsubbio.com, 1 +drt.org.nz, 1 drthalhammer.at, 1 drthiagorighetto.com.br, 1 drtimmarch.com, 1 @@ -41139,7 +42081,6 @@ drybysuperior.com, 1 drycreekphoto.com, 1 drydensfairfax.com, 1 -drydrydry.com, 1 dryerrepairaustin.com, 1 dryerventcleaningarlington.com, 1 dryerventcleaningcarrollton.com, 1 @@ -41157,6 +42098,8 @@ drzhnn.com, 1 drziyayavuz.com, 1 ds-hostingsolutions.net, 1 +ds-networks.at, 1 +ds-networks.eu, 1 ds-srv.net, 1 ds-statistik.de, 1 ds-ultimate.de, 1 @@ -41180,7 +42123,9 @@ dscharrer.com, 1 dschwarzachtaler.de, 1 dscjobs.org, 1 +dscmotorsport.co.za, 1 dscsigncert.com, 1 +dsdlove.com, 1 dsdomains.com, 1 dsds-ltd.com, 0 dse-assessments.co.uk, 0 @@ -41189,6 +42134,7 @@ dsecure.me, 1 dseg.org, 1 dsektionen.se, 0 +dsfc.net, 1 dsfzsq.com, 1 dsg.ac.cn, 1 dsg.gd.cn, 1 @@ -41198,6 +42144,7 @@ dsgarms.com, 1 dsgholsters.com, 1 dsgnet.hu, 1 +dsgnwrld.com, 1 dsgv.de, 1 dsgvo-addon.eu, 1 dsgvo-analyse.de, 1 @@ -41226,10 +42173,11 @@ dspretoria.co.za, 1 dspropertyservicesltd.co.uk, 1 dsreal.de, 1 +dssresearch.com, 1 dsswise.org, 1 dstamou.de, 1 dsteiner.at, 1 -dstvnearme.co.za, 1 +dsu4.ru, 1 dsuinnovation.com, 1 dsv-gruppe.de, 1 dsv-salesmanager.de, 1 @@ -41241,6 +42189,7 @@ dtbw.org, 1 dtconsoles.tk, 1 dtdsh.com, 1 +dte.vn, 1 dtf.digital, 1 dtg-fonds.com, 1 dtg-fonds.de, 1 @@ -41279,6 +42228,7 @@ dualcore.tk, 1 dualexistence.xyz, 1 dualias.xyz, 0 +dualsun.com, 1 dualuniverse.game, 1 duama.top, 1 duan-dky.me, 1 @@ -41286,17 +42236,16 @@ duarteeleiteconsultoria.com.br, 1 dubai-company.ae, 1 dubai-fashions.com, 1 +dubaiaerospace.com, 1 dubaibliss.com, 1 dubaicartraders.com, 1 dubaicourses.com, 1 -dubaiendeavor.com, 1 dubaifastfoods.com, 1 dubaifitnesschallenge.com, 1 dubaigrandsale.com, 1 -dubaipinnacle.com, 1 dubaiprivatejetcharter.com, 1 dubairanking.com, 1 -dubairecipes.com, 1 +dubairun.com, 1 dubaisc.ae, 1 dubaishoppingcity.com, 1 dubaistudiocity.ae, 1 @@ -41306,11 +42255,14 @@ dubaizone.cf, 1 dubawa.org, 1 dubcowa.tk, 1 +dubex.de, 1 dubious-website.com, 1 dubiouscreations.com, 1 dubkov.org, 0 dubl.tk, 1 +dublinguide.ie, 1 dublinrail.tk, 1 +dublinseocompany.ie, 1 duboeuf.com, 1 duboisinternational.com, 1 duboisinvestissements.com, 1 @@ -41408,9 +42360,11 @@ dukatek.cz, 1 duke-nukem.tk, 1 dukeandduchessdrivingschool.co.uk, 1 +dukefox.com, 0 dukegat.de, 0 dukeofmetal.tk, 1 dukers-baelemans.nl, 0 +dukes.ca, 1 dukhanstore.com, 1 dukin.tk, 1 dukkanacmak.com, 1 @@ -41426,6 +42380,7 @@ duloxetinbestellen.gq, 1 duloxetine.gq, 1 dulse.fr, 1 +dulurtekno.co.id, 1 dulux.co.nz, 1 dulux.com.au, 1 dum.moe, 1 @@ -41500,6 +42455,7 @@ duoquadragintien.fr, 1 duoyin.com, 1 dupagecounty.gov, 1 +dupagecourts.gov, 1 dupageresults.gov, 1 dupfx.com, 1 duplicazionechiavi.it, 1 @@ -41529,6 +42485,7 @@ durfteparticiperen.nl, 1 durganews.com, 1 durhammaine.gov, 1 +durhammoneyman.com, 1 durhamnh.gov, 1 duria.de, 1 duriaux-dentiste.ch, 0 @@ -41537,6 +42494,7 @@ durulezzetler.com, 1 durvalpereira.com.br, 1 durys.be, 1 +dusablemuseum.org, 1 dushu.cat, 1 duskraven.tk, 1 dusmomente.com, 1 @@ -41644,6 +42602,7 @@ dvorekkarlin.cz, 1 dvorupotocnych.sk, 1 dvotx.org, 1 +dvpc.net, 1 dvu.com.tr, 1 dvwc.org, 1 dvx.cloud, 1 @@ -41654,21 +42613,22 @@ dweilorkest-frederikshaven.tk, 1 dwgeneralcontractors.com, 1 dwgf.xyz, 1 +dwhd.org, 0 dwhightmolina.com, 1 dwienzek.de, 1 dwightd.com, 1 dwihn.org, 1 dwiminneapolislawyer.com, 1 -dwipakharismamitra.com, 0 +dwipakharismamitra.com, 1 dwnld.me, 1 dwood.store, 1 dworzak.ch, 1 dwscdv3.com, 1 dwservice.net, 1 +dwtf.de, 1 dwtm.ch, 1 dwtonline.com, 1 dww.hu, 1 -dwword.com, 0 dwwt.eu, 1 dwwt.net, 1 dwwt.nl, 1 @@ -41693,6 +42653,7 @@ dy.me, 0 dy1d.com, 1 dyachenko.ml, 1 +dyarakotijobs.com, 1 dybuster.at, 1 dybuster.ch, 1 dybuster.com, 1 @@ -41723,17 +42684,14 @@ dylmye.me, 1 dylnuge.com, 1 dym.asia, 1 -dym.bz, 1 dym2012.com, 1 dym2013.com, 1 dym2014.com, 1 dym2017.com, 1 dymdajce.ovh, 1 dyme.com, 0 -dyme.media, 1 dymension-uat.co.uk, 1 dymension.co.uk, 1 -dymersion.com, 1 dymfbbs.com, 1 dymmo.tk, 1 dymmovie.com, 1 @@ -41743,7 +42701,9 @@ dymowski.de, 0 dyn-dnhensel.de, 1 dyn-nserve.net, 1 +dyn.net, 1 dynabob.tk, 1 +dynacast.com, 1 dynacrop.space, 1 dynadns.de, 1 dynalab.pl, 1 @@ -41764,6 +42724,7 @@ dynamicservers.co.uk, 1 dynamicsnetwork.net, 1 dynamicsretailnotes.com, 1 +dynamictesting.co.uk, 1 dynamictostatic.com, 1 dynamicyou.co.uk, 1 dynamis.tk, 1 @@ -41790,7 +42751,6 @@ dynx.pl, 1 dypromed.com, 1 dyregrave.dk, 1 -dyremyhr.no, 1 dyrenesverden.no, 1 dyreplassen.no, 1 dyrkar.com, 1 @@ -41820,6 +42780,7 @@ dziseldra.com, 1 dziura.email, 0 dziurdzia.pl, 1 +dzivniekubriviba.lv, 0 dzmonarchie.tk, 1 dzndk.net, 1 dzndk.org, 1 @@ -41865,6 +42826,7 @@ e-diasporan.ga, 1 e-diasporan.gq, 1 e-diasporan.ml, 1 +e-driver.fr, 1 e-dv.eu, 1 e-e.icu, 1 e-emploi.be, 1 @@ -41872,6 +42834,7 @@ e-estonia.com, 0 e-estonians.ee, 1 e-facture.net, 1 +e-farm.com, 1 e-fireplaces.tk, 1 e-fishing.tk, 1 e-fiskal.rs, 1 @@ -41955,6 +42918,7 @@ e-streams.tv, 1 e-student.tk, 1 e-styling.tk, 1 +e-surveillant.nl, 1 e-sushi.net, 1 e-sweaters.tk, 1 e-tables.tk, 1 @@ -42035,6 +42999,7 @@ ea-lateleassistance.com, 1 ea-ru.org, 1 ea2drocks.com, 1 +eaa-online.org, 1 eaanderson.com, 1 eac.gov, 1 eac010.com, 1 @@ -42357,17 +43322,17 @@ eaglemessaging.com, 1 eaglemtn.com, 1 eaglenation.net, 1 +eaglepasstx.gov, 1 eagleplanners.agency, 1 eagleriverwi.gov, 1 eaglerockseattle.com, 1 eagletechz.com.br, 1 eaglevilletn.gov, 1 -eaglewreck.info, 1 eaglexiang.org, 0 eagleyecs.com, 1 eaimty.com, 1 eainjurycenter.com, 1 -eajglobal.net, 1 +eakes.com, 1 ealadel.com, 1 ealarm-safemode.ch, 1 ealekseyev.ml, 1 @@ -42392,13 +43357,13 @@ earfolds.com, 1 earlsttech.ca, 1 earlybetter.com, 1 -earlyimage.com.au, 1 earlyvoting.cf, 1 earlyvoting.gq, 1 earlyvoting.ml, 1 earlyyearshub.com, 1 earmarks.gov, 1 earnet.tk, 1 +earni.fi, 1 earningsgames.tk, 1 earningthatis.tk, 1 earth-people.org, 1 @@ -42408,6 +43373,7 @@ earthcore.com, 1 earthcorporation.cf, 1 eartheld.tk, 1 +earthiq.news, 1 earthjustice.org, 1 earthlink.net, 1 earthpixz.com, 1 @@ -42445,11 +43411,13 @@ eastgreenwichnews.com, 1 eastgrmi.gov, 1 easthaddamct.gov, 1 +easthaven-ct.gov, 1 eastheaven.ml, 1 eastlothianbouncycastles.co.uk, 1 eastmaintech.com, 1 eastman.com, 1 eastmedo.pl, 1 +eastnatfoods.com, 1 eastnorschool.co.uk, 1 easton.ga, 1 eastpeoria-il.gov, 1 @@ -42459,14 +43427,17 @@ eastportcorp.tk, 1 eastprovidenceri.gov, 1 eastshare.ml, 1 +eastshore.xyz, 1 eastside.tk, 1 eastsidecottages.co.uk, 1 eastsideroofingcontractor.com, 1 eastspencer.gov, 1 eaststudios.net, 1 +easttamakiauto.co.nz, 1 easttower-uc.com, 1 easttowereg.com, 1 eastvalleyautorebuild.com, 1 +eastvalleyendo.com, 1 eastwashingtonpa.gov, 1 eastwindsorhistory.tk, 1 eastyorkshirebuses.co.uk, 1 @@ -42484,6 +43455,7 @@ easyaddress.io, 1 easyadsnbanners.tk, 0 easybank.at, 1 +easybiztech.co.za, 1 easybom.com, 1 easybot.tk, 1 easybranches.com, 1 @@ -42508,6 +43480,7 @@ easygrow.tk, 1 easyhomebiz.tk, 1 easyhtml.tk, 1 +easyigbo.com, 1 easyit.ga, 1 easyit.tk, 1 easyjumping.tk, 1 @@ -42584,7 +43557,7 @@ eautocash.de, 1 eautocollision.com, 1 eautolease.com, 1 -eauxdespleiades.ch, 0 +eauxdevienne.fr, 1 eava.ga, 1 eazy.gr, 1 eazyfreight.co.uk, 1 @@ -42601,6 +43574,7 @@ ebaifzf.com.br, 1 ebakery.de, 1 eban.bzh, 1 +ebanca.com, 1 ebankcbt.com, 1 ebanking.indovinabank.com.vn, 1 ebankingabersicher.ch, 1 @@ -42619,7 +43593,6 @@ ebatech.org, 1 ebatechenergiedisplay.nl, 1 ebatechenergiemanagement.nl, 1 -ebay-kleinanzeigen.de, 1 ebayinc.com, 1 ebcfx.com, 1 ebci-nsn.gov, 1 @@ -42636,7 +43609,6 @@ ebetbananom.tk, 1 ebikemod.de, 1 ebilanzplus.de, 1 -ebill.pl, 1 ebino.pl, 1 ebiografia.com, 1 ebiografias.com.br, 1 @@ -42694,6 +43666,7 @@ ebrofoods.es, 1 ebru-gundes.tk, 1 ebrununkasnagi.com, 1 +ebscomedical.com, 1 ebuha.ga, 1 ebuku.tk, 1 eburg.ml, 1 @@ -42710,7 +43683,6 @@ ecardoo.de, 1 ecardoo.net, 1 ecardoo.org, 1 -ecardsupply.com, 1 ecarscash.com, 1 ecat.ua, 1 ecaterina.tk, 1 @@ -42729,11 +43701,11 @@ ecenter.bg, 1 ecetechsol.com, 1 ecetiner.com, 1 -ecfnj.com, 1 ecfunstalls.com, 1 ecgclic.fr, 1 echarity.ae, 1 echbay.com, 1 +echelon.pl, 1 echi.pw, 1 echidna-rocktools.eu, 1 echidna-usa.com, 1 @@ -42788,6 +43760,7 @@ eclinic.vet, 1 eclipse-cross.info, 1 eclipse4academia-startups.com, 1 +eclipsecon.org, 1 eclipseforum.tk, 1 eclipsegame.tk, 1 eclipseinspectionservices.co.uk, 1 @@ -42807,6 +43780,8 @@ ecobalispa.com, 1 ecobin.nl, 1 ecobrotherss.com, 1 +ecobunker.co.uk, 1 +ecobunkerusa.com, 1 ecocanada.jobs, 1 ecoceutics.com, 1 ecoconut.org, 1 @@ -42850,6 +43825,7 @@ ecologiahoy.com, 1 ecologic-france.com, 1 ecologica.it, 1 +ecologistasenaccion.org, 1 ecologiya.tk, 1 ecoloriptv.tk, 1 ecombustibil.ro, 1 @@ -42859,6 +43835,7 @@ ecomia.dk, 1 ecommerce-bikinsistem.tk, 1 ecommerce-optimizer.com, 1 +ecommercedb.com, 1 ecommercenews.asia, 1 ecommercenews.co.nz, 1 ecommercenews.com.au, 1 @@ -42869,6 +43846,8 @@ econfia.cf, 1 econmarketingdigital.com, 1 economarketing.ca, 1 +economia.cl, 1 +economias.pt, 1 economic-sanctions.com, 1 economicnews.ga, 1 economicplan.gov.au, 1 @@ -42889,6 +43868,7 @@ ecoon.net, 1 ecopak.org, 1 ecopark.asia, 1 +ecopark.co, 1 ecorak.de, 1 ecored.pl, 1 ecorp-australia.tk, 1 @@ -42907,7 +43887,7 @@ ecostarfoam.com, 1 ecostruxureit.com, 1 ecosuperb.com, 1 -ecosystem.atlassian.net, 0 +ecosystem.atlassian.net, 1 ecosystemmanager-uat1.azurewebsites.net, 1 ecotecelevator.com, 1 ecoteplo.net, 1 @@ -42941,7 +43921,6 @@ ecrownoffire.com, 1 ecrums.gov, 1 ecscoutgroup.cf, 1 -ecstaticentertainment.com, 1 ecsupplyinc.com, 1 ectora.com, 1 ectpro.co.th, 1 @@ -42961,6 +43940,7 @@ ed-studios.tk, 1 ed.gs, 1 eda-ah.com, 1 +eda.cooking, 1 eda.gov, 1 eda72.com, 1 edacasa.com.br, 1 @@ -42990,6 +43970,7 @@ edeals.com.co, 1 edeca.net, 1 ededdeddy.tk, 1 +edefrutos2020.com, 1 edegembicycleclub.tk, 1 edegulkoyu.tk, 1 edehsa.com, 1 @@ -43026,7 +44007,6 @@ edgeconnectnj.net, 1 edgecustomersportal.com, 1 edgedynasty.com, 1 -edgegame.xyz, 1 edgeless.pp.ua, 0 edgelogs.com, 1 edgemagazine.net, 1 @@ -43046,6 +44026,7 @@ edicionescrimentales.tk, 1 edihair.com, 1 edik.tk, 1 +edikacomptabilite.com, 1 edilane.com, 1 edilane.de, 1 edilondon.com, 1 @@ -43076,6 +44057,7 @@ edited.pl, 1 edithlouw.tk, 1 edition-bambou.com, 0 +edition-sonblom.de, 0 editions-campanile.fr, 1 editionsnoiretrouge.com, 1 editorakanope.com.br, 1 @@ -43085,6 +44067,8 @@ editorinleaf.com, 1 editorsguild.com, 1 editspace.tk, 1 +editus.it, 1 +edje.com, 1 edl.com.ph, 1 edlib.is, 1 edlib.pics, 1 @@ -43107,12 +44091,12 @@ edp.com, 1 edpgassu.pt, 1 edpillsonline24.com, 1 -edplan.io, 1 edpnc.com, 1 edpr.com, 1 edpubs.gov, 1 edr-d.expert, 1 edragneainpuscarie.ro, 1 +edremith.com, 1 edremitweb.site, 1 edrepay.com, 1 edrgroup.nl, 1 @@ -43164,7 +44148,9 @@ educationarea.tk, 1 educationboard.ml, 1 educationconnect.tk, 1 +educationdegree.com, 1 educationdepartment.ml, 1 +educationendowmentfoundation.org.uk, 1 educationet.tk, 1 educationevolving.org, 1 educationfirst.ml, 1 @@ -43194,10 +44180,10 @@ educlove.com, 1 educnum.fr, 1 educourse.nl, 1 -edudaily24.com, 1 eduessay.com, 1 edufestival.pl, 1 edufever.com, 1 +edufever.in, 1 eduflow.at, 1 edugeton.com, 1 edugram.com, 1 @@ -43229,6 +44215,7 @@ eduproquality.tk, 1 eduqfix.com, 1 eduradiadores.com.br, 1 +eduresultbd.com, 1 eduroam.no, 1 eduroam.uy, 1 edusanjal.com, 1 @@ -43251,6 +44238,7 @@ edvgarbe.de, 1 edvision.ga, 1 edvmesstec.de, 1 +edvservice-pohl.de, 1 edvsolutions.org, 1 edward-tagle.tk, 1 edwardbrowninvestment.tk, 1 @@ -43290,6 +44278,7 @@ ee9721.com, 0 ee9728.co, 1 ee973.com, 0 +eeagrants.cz, 1 eebt.hu, 1 eecs388.org, 0 eeeeeeeeee.de, 1 @@ -43308,15 +44297,16 @@ eemcevn.com, 1 eemskrant.nl, 1 een-eenvoudige-test-voor-de-maximum-lengte-van-een-nederlandse.nl, 1 +een.com, 1 eencompass.com, 1 eenmailsturen.nl, 1 eennieuwepc.nl, 1 eentweevijf.be, 1 -eenvoudhup.com, 1 eenvren.com, 1 eenvxing.com, 1 eeqj.com, 1 eer.io, 1 +eeri.org, 1 eerstejaarsweekend.nl, 1 eerstemaanlanding.tk, 1 eery.de, 1 @@ -43333,6 +44323,7 @@ efcross.com, 1 efectococuyo.com, 1 efeen.nl, 1 +efeindonesia.com, 1 efektyvnist.pro, 1 efeso.co.nz, 1 efeso.nz, 1 @@ -43357,7 +44348,6 @@ effectory.com, 1 effectpointphotography.cf, 1 effectualness.co.za, 1 -effectualness.web.za, 1 effer.me, 1 effex.ru, 1 effexorgeneric.ml, 1 @@ -43393,6 +44383,7 @@ efmcredentialing.org, 1 efmo.de, 1 efoood.org, 1 +efootball4u.es, 1 eformost.ca, 1 eforw.com, 1 efp.nl, 1 @@ -43462,7 +44453,6 @@ egins.tk, 1 egipet-tiz.tk, 1 egiptwakacje.tk, 1 -egitim.academy, 1 egittophilia.tk, 1 egles.eu, 1 eglinlife.net, 1 @@ -43487,18 +44477,21 @@ egotripproductions.org, 1 egov4.ch, 1 egovernment-podcast.com, 1 +egproduction.com, 1 egrasmanipur.nic.in, 1 egreensvape.com, 1 egregius.be, 0 egres.xyz, 1 egretail.no, 0 egrojsoft.info, 1 +egrouen.net, 1 egroupware.org, 1 egrow.io, 1 egrp365.ru, 1 egsky.net, 1 egt-bg.com, 1 -egt.ee, 1 +egt-digital.com, 1 +egt.ee, 0 egu-ev.eu, 1 egu-gmbh.de, 1 egu.eu, 1 @@ -43529,12 +44522,15 @@ ehdata.net, 1 ehealth.gov.au, 1 ehealth.kg, 1 +ehealthexchange.org, 1 eheartspecialist.com, 1 eheliche-disziplin.schule, 1 eheya.net, 1 ehipaa.com, 1 +ehlers-net.de, 1 ehlersdanlos.dk, 1 ehlersdanlos.tk, 1 +ehliyetsinavsorulari.org, 1 ehmsen.nu, 1 ehmtheblueline.com, 1 ehne.de, 1 @@ -43543,6 +44539,7 @@ ehomusicgear.com, 1 ehorizon.jp, 1 ehpad-ariege.fr, 1 +ehr.bg, 1 ehr.gov, 1 ehrdata.com, 1 ehrenburg.info, 1 @@ -43559,7 +44556,6 @@ ehuber.info, 1 ei-bo.org, 1 eiao.me, 1 -eibak.com, 1 eiber.net, 1 eibich.de, 1 eichel.eu, 1 @@ -43571,6 +44567,7 @@ eickhof.us, 1 eickhofcolumbaria.com, 1 eidelpes.info, 1 +eientei.org, 1 eifel.website, 1 eiffage.com, 1 eiga.com, 1 @@ -43579,6 +44576,7 @@ eigenetiket.tk, 1 eigenpul.se, 1 eigenpulse.com, 1 +eigentech.com, 1 eigenvector.space, 1 eigenvector.systems, 1 eightballde.luxe, 1 @@ -43622,10 +44620,12 @@ einsatzstiefel.info, 1 einscube.com, 1 einsteinathome.org, 1 +einsteinbros.com, 1 einsteincapital.ca, 1 einsteinium.fr, 1 einsteinmishra.com, 1 einsteins.tk, 1 +einstokbeer.com, 1 eintageinzug.de, 1 eintoepfe-bruchsal.de, 1 eintracht-rodde.de, 1 @@ -43637,6 +44637,7 @@ eirgroup.com.au, 1 eirik.eu, 1 eirikyrolae.tk, 1 +eis.org.uk, 1 eisaev.ru, 1 eisblau.org, 1 eisei-iinkai.com, 1 @@ -43696,7 +44697,6 @@ ekd.de, 1 ekdoseis.gr, 1 ekeblock.com, 1 -ekedc.com, 1 ekf.ee, 1 ekfgroup.com, 1 ekhabar.ml, 1 @@ -43729,6 +44729,7 @@ ekophone.bg, 1 ekosaltis.lt, 1 ekosf.ru, 1 +ekospajzka.cz, 1 ekostecki.de, 1 ekouniejow.pl, 1 ekozercy.pl, 1 @@ -43741,9 +44742,10 @@ ekspert.tk, 1 ekspertemerytalny.pl, 1 eksploraz.com, 1 +ekspres.az, 1 +ekspress.ee, 1 ekstremno.com, 1 ektefa.sa, 1 -ekuma.tk, 1 ekvastra.in, 1 ekwador.com, 1 ekyu.moe, 1 @@ -43761,6 +44763,7 @@ elabib.com, 1 elad.wtf, 1 eladalfassa.com, 1 +eladerezo.com, 1 elaheze.com, 0 elahuehuete.art, 1 elainerock.com, 1 @@ -43776,7 +44779,6 @@ elariannews.ml, 1 elars.de, 1 elartedelaguerra.tk, 1 -elartedelapaz.org, 1 elarvee.xyz, 1 elasten.eu, 1 elastiekschieten.tk, 1 @@ -43827,6 +44829,7 @@ eldercare.gov, 1 eldercaring.ca, 1 elderdevelopmentgroup.com, 1 +elderindex.org, 1 elderjustice.gov, 1 elderplan.org, 1 elderreviews.gq, 1 @@ -43839,6 +44842,7 @@ eldoradoil.gov, 1 eldrid.ge, 1 ele-sm.com, 1 +eleanorleightrio.com, 1 elearningi.pl, 1 elearningpilot.com, 1 elearningx.org, 1 @@ -43850,6 +44854,7 @@ electicofficial.com, 0 electionpresidentiellegabon2009.ga, 1 electionrunners.com, 1 +elections.ca, 1 elections.nz, 1 electionsbycounty.com, 1 electionsdatabase.com, 1 @@ -43891,11 +44896,12 @@ electriccalabasas.com, 1 electriccamarillo.com, 1 electriccitysf.com, 1 +electriccoin.co, 1 electricconejovalley.com, 1 electricdosvientos.com, 1 electricdreams.xyz, 1 -electricfencealberton.co.za, 1 electricfenceboksburg.co.za, 1 +electricfencelonehill.co.za, 1 electricfencesandton.co.za, 1 electricfencingpinetown.co.za, 1 electricfireplaces.tk, 1 @@ -43923,13 +44929,13 @@ electricianoakpark.com, 1 electricianpacificpalisades.com, 1 electricianpretoria24-7.co.za, 1 +electricianschooledu.org, 1 electriciansimivalley.com, 1 electricianthousandoaks.com, 1 electricianwestlakevillage.com, 1 electricien-44.fr, 1 electricienasnieres.fr, 1 electricimagination.co.uk, 1 -electricit.uk, 1 electricity.tk, 1 electricityplans.com, 1 electriclakesherwood.com, 1 @@ -43943,6 +44949,7 @@ electricthousandoaks.com, 1 electricwestlakevillage.com, 1 electriczone.tk, 1 +electrobaza.ru, 1 electrocity.ie, 1 electrocomplect.com.ua, 1 electrodomesticos.tk, 1 @@ -43990,6 +44997,7 @@ elegant-design.tk, 1 elegant-techno.com, 1 eleganta.ga, 1 +elegantanal.com, 1 elegantchaos.beauty, 1 elegantfamilyhotelsandresorts.com, 1 elegantlacebridal.com, 1 @@ -44000,7 +45008,6 @@ eleicoes2018.com, 1 elejordemarketingconsultancy.com, 1 eleken.jp, 1 -elekius.ml, 1 elekner.tk, 1 elektiriktasarruf.tk, 1 elektri-sch.de, 1 @@ -44041,7 +45048,6 @@ elektromet.pl, 1 elektrometz.de, 1 elektromobil-zubehoer.de, 1 -elektromont.tk, 1 elektromotor.tk, 1 elektronickakancelar.cz, 1 elektronische-post.org, 1 @@ -44049,7 +45055,6 @@ elektropartner.nu, 1 elektropost.org, 1 elektroprom.tk, 1 -elektroruoff.de, 1 elektrosety.com.ua, 1 elektrotango.tk, 1 elektrotechnik-heisel.de, 1 @@ -44060,6 +45065,7 @@ elektryczka.pl, 1 elelenin.cf, 1 elemenop.tk, 1 +element.hr, 1 element.io, 1 elemental.software, 1 elementalengine.com, 1 @@ -44129,7 +45135,6 @@ elettrodomestici.roma.it, 1 elettrolinkimpianti.it, 1 elettronew.com, 1 -elettronicagroup.com, 1 eleusis-zur-verschwiegenheit.de, 1 elev8fashion.ca, 1 elevacionesrama.com, 1 @@ -44271,6 +45276,7 @@ elitegaragedoors247.com, 1 elitehouse.tk, 1 eliteimsolutions.com, 1 +elitel.nl, 1 elitelandscapedesigns.ca, 1 elitemud.tk, 1 elitenovice.tk, 1 @@ -44315,6 +45321,7 @@ elkmontal.gov, 1 elkmotel.at, 1 elkodaily.com, 1 +elkollege.ru, 1 elkonsults.com, 1 elkvalley-nsn.gov, 1 ell-net.tokyo, 1 @@ -44335,13 +45342,13 @@ ellenpage.tk, 1 ellensburgwa.gov, 1 ellesoft-freeware.tk, 1 -ellevit.ch, 0 ellhofen-peccioli.de, 1 elliboettcher.de, 1 ellierider.com, 1 elligre.tk, 1 +elliman.com, 1 ellinaras.tk, 1 -elliot.work, 1 +elliot.cat, 1 elliot.wtf, 1 elliottbernstein.com, 1 elliottgaming.ga, 1 @@ -44404,7 +45411,6 @@ elosoavila.tk, 1 elosrah.com, 0 elotec-lichtenfels.de, 1 -eloutput.com, 1 elovip.com.br, 1 eloxt.com, 1 elpac.info, 1 @@ -44415,11 +45421,9 @@ elpandemonio.tk, 1 elpaseadordeperros.com, 1 elpellejodelabreva.tk, 1 -elpelusa.es, 1 elperdigon.tk, 1 elperiodicodelaenergia.com, 1 elperiodicodeycodendaute.es, 1 -elperiodo.net, 1 elphnt.io, 1 elpincho.tk, 1 elpitazo.net, 1 @@ -44438,10 +45442,10 @@ elradix.be, 1 elradix.eu, 1 elranchofeliz.org, 1 +elrealsw.com, 1 elrebollar.tk, 1 elrefugiodelpirata.com, 1 elrenook.gov, 1 -elreportero.net, 1 elreportero.tk, 1 elreserva.com, 1 elri.blog, 1 @@ -44466,6 +45470,7 @@ elsvanmerhaeghe.be, 1 elsweb.net, 1 elsword.moe, 0 +elsylist.com, 1 elta.com.ua, 1 eltair.com, 1 eltar.pl, 1 @@ -44504,6 +45509,7 @@ elvis-presley.tk, 1 elvismania.tk, 1 elvispresley.net, 1 +elvisvrconnect.co.uk, 1 elvorti.bg, 1 elvorti.com, 1 elvtr.com, 1 @@ -44531,10 +45537,12 @@ email.repair, 0 email24.cf, 1 emailable.com, 1 +emailablev.com, 1 emailadressen.nl, 1 emailalaperformance.fr, 1 emailalias.nl, 1 emailbusters.tk, 1 +emailconfiguration.com, 1 emailexpress.ga, 1 emailfreeshop.tk, 1 emailgonderim.tk, 1 @@ -44564,9 +45572,9 @@ emapgo.com, 1 emaps.tk, 1 emaratalyoum.com, 1 +emarhotel.bg, 1 emarketingmatters.com, 1 emas-beja.pt, 1 -emasex.com, 1 emasex.es, 1 emater.com, 1 emavending.club, 1 @@ -44577,9 +45585,9 @@ embarcados.com.br, 1 embarkboathire.com.au, 1 embassycargo.eu, 1 +embawood.az, 1 embebelo.com, 1 embedded.com, 1 -embelgium.org, 1 embellir-aroma.com, 1 embellir-kyujin.com, 1 ember.co, 1 @@ -44595,6 +45603,7 @@ embox.net, 1 embracecontext.com, 1 embraceni.org, 1 +embracer.com, 1 embracethedarkness.co.uk, 1 embracezine.tk, 1 embraco.com, 1 @@ -44640,6 +45649,7 @@ emergency-broadcast-system.tk, 1 emergency-federal-register.gov, 1 emergencycommand.us, 1 +emergencyhvacservices.com, 1 emergencyportal.tk, 1 emergentvisiontec.com, 1 emergenzaduepuntozero.it, 1 @@ -44731,6 +45741,7 @@ emmanuelle-et-julien.ch, 1 emmanuellecerat.ca, 1 emmanuelorocker.com, 1 +emmaowl.com, 1 emmastarr.net, 1 emmaste.edu.ee, 1 emmastree.com, 1 @@ -44741,7 +45752,6 @@ emmedicom.tk, 1 emmepole.tk, 1 emmerdale.me.uk, 1 -emmiwelentain.com, 1 emmynet.de, 1 emo-poris.com, 1 emo.ie, 1 @@ -44766,6 +45776,7 @@ emotebank.com, 1 emotebot.com, 1 emotionalonlinestorytelling.com, 1 +emotionsanonymous.org, 1 emotionsgroup.kz, 1 emotive.productions, 1 emoxie.com, 0 @@ -44798,6 +45809,7 @@ empiria.site, 1 emplealis.com, 1 empleandon0s.com, 0 +emplifi.io, 1 emploi-collectivites.fr, 0 employeeexpress.gov, 1 employer.gov, 1 @@ -44818,6 +45830,7 @@ emporioguarani.com.br, 1 emporioonline.com.br, 1 emporiopurochile.com.br, 1 +emporiumbeverages.com, 1 empoweraces.com, 1 empowerdb.com, 1 empoweren.com, 1 @@ -44832,7 +45845,6 @@ emprendeconchrisfx.com, 1 emprendedoresdesevilla.es, 1 emprendepedia.com, 1 -emprendeperuano.com, 1 emprendimientoweb.co, 1 empresa1.com.br, 1 empresa365.com, 1 @@ -44845,7 +45857,6 @@ emptyfields.com, 1 emptypath.com, 1 emptysmile.tk, 1 -empyrean-advisors.com, 1 empyreanrule.com, 1 emrah.io, 1 emrawi.org, 1 @@ -44861,6 +45872,7 @@ emsdinghies.com, 1 emse.fr, 1 emsliespharmacy.com.au, 1 +emsnow.com, 1 emsrealfood.nl, 0 emsubtitle.com, 1 emtex.at, 1 @@ -44896,7 +45908,6 @@ en-wp.com, 1 en-wp.org, 1 en0.io, 1 -en2nube.es, 1 en4rab.co.uk, 1 en4u.org, 1 enaah.de, 1 @@ -44911,6 +45922,7 @@ enam.gov.in, 1 enamae.net, 1 enamelpin.club, 1 +enaminestore.com, 1 enamonada.com, 1 enaturelive.com, 1 enbarra.cl, 1 @@ -44967,6 +45979,7 @@ endeavourbiz.com, 1 endee.de, 1 endeksa.com, 1 +endener.com, 1 ender.co.at, 1 ender.fr, 1 ender.moe, 1 @@ -44979,7 +45992,6 @@ enderle.cloud, 1 enderman.eu, 1 enderszone.com, 0 -endgame-economics.com, 1 endiana.cf, 1 endiana.ga, 1 endiana.gq, 1 @@ -44988,6 +46000,7 @@ endless.pet, 1 endlessdiy.ca, 1 endlessfashion.tk, 1 +endlessmedia.co.za, 1 endlessvideo.com, 1 endlesswebsite.tk, 1 endofevolution.com, 1 @@ -45008,6 +46021,7 @@ enduranceday.be, 1 enduranceseries.ca, 1 endurerow.com, 1 +endurobikeadvanture.com, 1 enduroxtrem.tk, 1 endustriyelfirinlar.com, 1 endviolence.gc.ca, 1 @@ -45060,6 +46074,7 @@ energielabelbinneneenweek.nl, 1 energievergelijken.nl, 1 energiewechsel.de, 1 +energija-visiems.lt, 1 energikompetens.se, 1 energizer.eu, 1 energoproff.com, 1 @@ -45147,6 +46162,7 @@ engelandautohuur.nl, 1 engelkeller.ch, 1 engelmann.com, 0 +engelorchester.de, 1 engelsism.tk, 1 engelundlicht.ch, 1 engelwerbung.com, 1 @@ -45194,6 +46210,7 @@ englishbulgaria.net, 1 englishcast.com.br, 1 englishclassworksheets.com, 1 +englishclub.com, 1 englishcompany-mobile.jp, 1 englishcompany.jp, 1 englishdirectory.de, 1 @@ -45204,7 +46221,6 @@ englishouse.tk, 1 englishphonopass.com, 1 englishprovence.com, 1 -englishstudyonline.org, 1 englishtofrench.eu, 1 englishwineproducers.co.uk, 1 englishyamal.ru, 0 @@ -45217,10 +46233,12 @@ engso-education.eu, 1 engso.com, 1 engso.eu, 1 +engsubjav.com, 1 engution.biz, 0 engvid.com, 1 engweld.co.uk, 1 engym.com.tw, 1 +engz.icu, 1 enhanced-mail.tk, 1 enhancemedia.co.uk, 1 enia.com, 1 @@ -45228,7 +46246,6 @@ enigma.swiss, 0 enigmacpt.com, 0 enigmamusic.tk, 1 -enigmatry-website-test.azurewebsites.net, 1 enigmatry.com, 1 enigmavault.io, 1 enip2.ru, 1 @@ -45246,26 +46263,28 @@ enjinwallet.io, 1 enjoy-drive.com, 1 enjoybeer.dk, 1 +enjoycasino.biz, 1 enjoymaloy.info, 1 enjoytransferitalia.com, 1 -enka-soudure.com, 1 enka-works.com, 1 enka-works.jp, 1 enka-works.net, 1 enkelanmalan.se, 1 enkelpaamelding.no, 1 enker.tk, 1 +enkrypt.com, 1 enky.be, 1 enlace.vip, 1 enlacesgranotas.tk, 1 enlamochiladeadri.com, 1 enlasnubes.tk, 1 enlaztravel.com, 1 -enlight.no, 1 enlightenspeech.com, 1 +enlightio.com, 1 enlightsec.se, 1 enlnf.link, 1 enloestatebank.com, 1 +enlr.ru, 1 enlyft.com, 0 enmieux.be, 1 enmowe.tech, 0 @@ -45337,13 +46356,15 @@ entabe.jp, 1 entactogen.com, 1 entactogens.com, 1 +entdeckertouren.com, 1 enteente.com, 1 entegrations.io, 1 entelesource.com, 1 enter.co, 1 enter.eco, 1 enteratesoria.tk, 1 -enterle.com, 1 +enterclaim.com, 1 +enterdev.co, 1 enteronline.tk, 1 enterpresence.com, 1 enterprisecloudservices.inc, 1 @@ -45363,7 +46384,7 @@ entheogens.com, 1 entheorie.net, 1 entheoshearing.com, 1 -entireproductions.com, 1 +enthrallinggumption.com, 1 entityelevation.com, 1 entomologia.it, 1 entorangecounty.com, 1 @@ -45383,6 +46404,7 @@ entreprenet.gq, 1 entrepreneurnight.com, 1 entreprises.gouv.fr, 1 +entreterse.com.br, 1 entrevistadesucesso.ga, 1 entrezdansladanse.fr, 1 entropy.su, 1 @@ -45399,6 +46421,7 @@ enuchi.jp, 1 envaldemoro.com, 1 envant.co.uk, 1 +envelope.co.nz, 1 envelopeartisans.com, 1 envelopegroup.com, 1 enveloppenopmaat.nl, 1 @@ -45409,15 +46432,18 @@ enviartucurriculumvitae.com, 1 enviatufoto.com, 0 envide.no, 1 +enviesdeville.fr, 1 enviosnegocios.tk, 1 envir.ee, 1 envirhom.com, 1 +enviroli.co.nz, 1 enviroli.co.uk, 1 enviroli.org.uk, 1 enviroli.uk, 1 environcom.co.uk, 1 environment.ai, 1 environmental-colleges.com, 1 +environmentalscience.org, 1 envirotecstructures.com.au, 1 envisionmedicalgroup.com, 0 envisionsproperty.com, 1 @@ -45425,13 +46451,13 @@ envistacu.com, 1 enviyatar.tk, 1 envoie.moi, 1 +envoyair.com, 1 envoyez.moi, 1 envoyglobal.com, 1 envoypresents.com, 1 envydesigns.tk, 1 envygeeks.io, 1 envysmile.com, 1 -envywe.com, 1 enweb.ml, 1 enwikipedia.tk, 1 enwillyado.tk, 1 @@ -45469,6 +46495,7 @@ epa.com.es, 1 epagos.com.ar, 1 epal.pt, 1 +epaoig.gov, 1 epasar.my, 0 epasuno.org, 1 epavape.eu, 1 @@ -45481,9 +46508,8 @@ epdeveloperchallenge.com, 1 epdiekirch.tk, 1 epdigital.biz, 1 -epharma.com.br, 1 +ephemia.com, 1 ephesusbreeze.com, 1 -ephraimshores.com, 1 epi-lichtblick.de, 1 epi.one, 0 epic-vistas.com, 1 @@ -45514,7 +46540,6 @@ epiclub.com.au, 1 epicmoney.tk, 1 epicmusicradio.ml, 1 -epicnex.com, 1 epicpages.com, 1 epicridesbahamas.com, 1 epicsecure.de, 1 @@ -45526,12 +46551,14 @@ epicvistas.de, 1 epidastudio.com, 1 epidauros.be, 1 +epieos.com, 1 epigrafes-led-farmakeia.gr, 1 epilier.uz, 1 epilis.gr, 1 epinesdeparadis.com, 1 epiphaniusmacar.com, 1 epiphanyofourlordchurch.com, 1 +episails.com, 1 episkevh-plaketas.gr, 1 episode.tk, 1 epistas.com, 1 @@ -45544,6 +46571,7 @@ epizentrum.work, 1 epizentrum.works, 1 epk.se, 1 +epl.ee, 1 eplayer.cz, 1 eplayer.sk, 1 eplenet.tk, 1 @@ -45585,7 +46613,6 @@ epreskripce.cz, 1 eprezto.com, 1 eprint-grimsby.co.uk, 1 -eprojectfreetv.com, 1 eprom.cf, 1 eprosto.cf, 1 eprzybornik.pl, 1 @@ -45620,7 +46647,6 @@ equeim.ru, 0 equi.ac, 1 equiac.com, 1 -equicoaching-events.com, 1 equidam.com, 1 equifaxobjection.com, 1 equilibratura.roma.it, 1 @@ -45629,7 +46655,6 @@ equine-dentistry-scope.com, 1 equinecoaching.ca, 1 equinenow.com, 1 -equinesalacia.com, 1 equinetherapy.ca, 1 equinox.io, 1 equinoxe.de, 1 @@ -45754,7 +46779,6 @@ ericisaweso.me, 0 ericjohnltd.com, 1 erick.blog, 1 -ericksonvasquez.com, 1 ericktello.tk, 1 ericleuthardt.com, 1 ericleuthardtphotography.club, 1 @@ -45782,7 +46806,6 @@ erik.dedyn.io, 1 erik1erik1.com, 1 erikaepedro.ga, 1 -erikbraam.com, 1 erikdslater.com, 1 erikheemskerk.nl, 1 erikhubers.nl, 1 @@ -45800,6 +46823,7 @@ erinmyers.us, 1 erinn.io, 1 eris-bj.com, 1 +erisinfo.com, 1 erisrenee.com, 1 eristajanmutka.com, 1 erisys.net, 1 @@ -45808,10 +46832,12 @@ erium.fr, 1 erkaelderbarenaaben.dk, 1 erkankavas.com, 1 +erkeklersoruyor.com, 1 erkenntniswen.de, 1 erkiss.club, 1 erkiss.live, 1 erkiss1.com, 1 +erkiss12.com, 1 erkiss8.com, 1 erkiss9.com, 1 erkkiaronen.fi, 1 @@ -45836,7 +46862,6 @@ erokat.ga, 1 erolib.ga, 1 eromasajes.com, 1 -eromon.net, 1 eron.info, 1 eropics.to, 1 erosbeautyandwellness.com, 1 @@ -45859,6 +46884,7 @@ erp.band, 1 erpband.ru, 1 erpcargo.com, 0 +erpcloud.systems, 1 erpelstolz.at, 1 erperium.com, 1 erperium.nl, 1 @@ -45886,6 +46912,7 @@ ersinbiltekin.tk, 1 ersinerce.com, 0 erspro.net, 1 +erste-hilfe-sbh.de, 1 erste.guru, 1 erstehilfeprodukte.at, 1 ert.ovh, 1 @@ -45897,6 +46924,7 @@ ertvag.no, 1 eru.cz, 1 eru.im, 1 +eru.moe, 1 erudicia.com, 1 erudicia.de, 1 erudicia.es, 1 @@ -45978,7 +47006,7 @@ esbuilders.co.nz, 0 esc-romania.tk, 1 esc-turkey.tk, 1 -esc.gov, 1 +esc18.net, 1 esc3.net, 1 esc9.net, 1 escae.ml, 1 @@ -45996,9 +47024,11 @@ escaperoomsolutions.com, 1 escapio.com, 1 escavador.com, 1 +escepticos.es, 1 escg.digital, 1 esclinux.tk, 1 escmatrix.com, 1 +esco.weir, 1 escobarservice7000.com, 1 escoben.tk, 1 escogitasrls.com, 1 @@ -46025,6 +47055,7 @@ escortlistings.ph, 1 escortlistingsuk.co.uk, 1 escorts.works, 1 +escortslittleblackbook.com, 1 escortz.gq, 1 escoteiros.tk, 1 escovator-records.tk, 1 @@ -46038,7 +47069,6 @@ escueladego.tk, 1 escueladelsabor.com, 1 escueladeministerioytecnologia.com, 1 -escuelaelretamo.cl, 1 escuelagobierno.org, 1 escuelainfantilpizcas.com, 1 escuelaparapapas.tk, 1 @@ -46053,6 +47083,7 @@ esdiscuss.org, 1 eseances.ch, 1 esecuredata.com, 1 +esemtia.com, 1 eservices-greece.com, 1 eset.ml, 1 esexchange.ga, 1 @@ -46071,7 +47102,6 @@ eshop-prices.com, 1 eshop-ptz.ru, 1 eshoprzd.ru, 1 -eshspotatoes.com, 1 eshtapay.com, 1 esiac.net, 1 esicia.rw, 1 @@ -46112,6 +47142,7 @@ esmtp-mx.com, 1 esnekkaucuk.com, 1 eso-database.com, 1 +eso-skillfactory.com, 1 esocite.la, 1 esoko.eu, 1 esolcourses.com, 1 @@ -46123,6 +47154,7 @@ esote.net, 1 esoteric.website, 1 esotericastrologer.org, 1 +esotericcosmos.com, 1 esoterik.link, 1 esoterikerforum.de, 1 espace-caen.fr, 0 @@ -46176,6 +47208,7 @@ espocada.com, 1 esport-agency.fr, 1 esport-brande.dk, 0 +esporters.today, 1 esportsbattles.ga, 1 espower.com.sg, 1 espressodokter.nl, 1 @@ -46209,6 +47242,7 @@ essaykeeper.com, 1 essaylib.com, 1 essaymaker.gq, 1 +essaymojo.com, 1 essaynews.com, 1 essaypro.net, 1 essays.me, 1 @@ -46222,10 +47256,13 @@ essencesdeprana.org, 1 essencespresso.es, 1 essenciasparis.com.br, 1 +essenerbaeder.de, 0 essentialinteriors.ga, 1 +essentialliving.co.uk, 1 essentialoils.co.za, 1 essentialoils.nl, 1 essentialoilsimports.com, 1 +essentiel-mkt.com, 1 essentiel-physique.com, 1 essentry.com, 1 essentta.com, 1 @@ -46234,10 +47271,12 @@ essex.cc, 1 essexcosmeticdentists.co.uk, 0 essexhighways.org, 1 +essexmoneyman.com, 1 essextimbercraft.co.uk, 1 essilorpse.com, 1 essilorpse.net, 1 essite.net, 1 +essjayericsson.com, 1 esslm.sk, 1 esslym.com, 1 essnet.co.jp, 1 @@ -46245,6 +47284,7 @@ essplusmed.org, 1 essr.org.uk, 1 essteebee.ch, 0 +esswp.com, 1 est-it.de, 1 est8.ai, 1 establo.pro, 1 @@ -46289,6 +47329,7 @@ esthergoh.com, 1 estherlew.is, 1 esthesoleil.jp, 1 +estheticianedu.org, 1 estila.co, 1 estiloelevadores.com.br, 1 estilopack-loja.com.br, 1 @@ -46318,7 +47359,6 @@ estudio21pattern.com, 0 estudiogarcia-rada.com, 1 estudiomantis.tk, 1 -estudionale.com, 1 estudios-biblicos.tk, 1 estudiosalmogavares.tk, 1 estudiosmart.com, 1 @@ -46392,7 +47432,7 @@ etestyonline.tk, 1 etf.nu, 1 etf2l.org, 1 -etfacta.com, 1 +etfacta.com, 0 etfcentral.com, 1 eth-news.info, 1 eth-services.de, 1 @@ -46405,17 +47445,19 @@ ethanlew.is, 1 ethanopp.com, 1 ethanrjones.name, 1 -ethantskinner.com, 0 +ethansailant.com, 1 ethanyoo.com, 1 ethelbrooks.es, 1 ether.school, 1 etherandir.com, 1 etherapeut.de, 1 +ethercalc.net, 1 etherderbies.com, 1 etherdream.com, 1 ethereal-skies.tk, 1 ethereal.games, 1 etherealcollapse.tk, 1 +etherealgolddispensary.com, 1 ethereum-news.info, 1 ethereumnews.best, 1 ethereumnews.digital, 1 @@ -46452,6 +47494,7 @@ ethiobaba.com, 1 ethioconsulate-la.org, 1 ethiopian.dating, 1 +ethiqueadvisory.com, 1 ethitter.com, 1 ethnews.today, 1 ethniki-antistasi-dse.gr, 1 @@ -46492,7 +47535,6 @@ etrolleybizstore.com, 1 ets-software.de, 1 etselquemenges.cat, 1 -etskinner.com, 0 etsmarconi.be, 1 etspuka.de, 1 etsradio.org, 1 @@ -46527,6 +47569,7 @@ eu4ua.org, 1 euaaaio.ru, 1 euanbarrett.com, 1 +euassisti.com.br, 1 eubitoken.com, 1 euc.world, 1 euchre.us, 1 @@ -46566,6 +47609,7 @@ eulenschmiede.de, 1 euleres.tk, 1 eulessplumbers.com, 1 +eumail.co, 1 euman.ml, 1 eumananc.ro, 1 eumk6.ml, 1 @@ -46613,11 +47657,11 @@ eurodentaire.com, 1 eurodesk.eu, 1 eurodontic.co.uk, 0 +eurodoo.com, 1 euroenergy.tk, 1 euroestetica.ec, 1 euroexpres.info, 1 eurofinance.com, 1 -eurofins.com, 0 eurofire.tk, 1 euroflora.com, 1 euroflora.mobi, 1 @@ -46640,6 +47684,7 @@ euromexde.com, 1 euronic.fi, 1 eurookna.tk, 1 +europa-passage.de, 1 europaband.fr, 1 europabio.org, 1 europack.kiev.ua, 1 @@ -46707,13 +47752,10 @@ eutawal.gov, 1 euterpiaradio.ch, 1 eutotal.com, 1 -euusofreedom.com.br, 1 euvo.tk, 0 euwid.de, 1 euzissima.com.br, 1 ev-greentech.com, 1 -ev-menden-meindorf.de, 1 -ev-menden.de, 1 ev-zertifikate.de, 1 eva-briegel-fanpage.tk, 1 eva.cz, 1 @@ -46724,6 +47766,7 @@ evaberg.net, 1 evacs.net, 1 evacs.org, 1 +evacuumstore.com, 1 evadi.ca, 1 evafernandez.tk, 1 evafojtova.cz, 1 @@ -46745,6 +47788,7 @@ evamachkova.cz, 0 evamathil.de, 1 evamira.com, 1 +evamlakar.si, 1 evanbaker.xyz, 1 evanescenceisfallen.tk, 1 evanescencenorge.tk, 1 @@ -46798,6 +47842,7 @@ evenbijproaten.online, 1 evendesign.gq, 1 evenementenhoekvanholland.nl, 1 +evenesis.com, 1 evenimenteromania.tk, 1 eveningstar.tk, 1 eveningtaxservices.com, 1 @@ -46805,7 +47850,6 @@ evenstargames.com, 1 event-blick.de, 1 event-reisen.tk, 1 -event-trac.com, 1 event1teamstore.com, 0 event4fun.no, 1 event64.ru, 1 @@ -46816,12 +47860,12 @@ eventdata.co.uk, 1 eventdata.uk, 1 eventdays.tk, 1 -eventerlebnis.ch, 1 eventfun.tk, 1 eventide.space, 1 eventive.org, 0 eventlocation2.de, 1 eventmake.es, 1 +eventnature.de, 1 eventnexus.co.uk, 1 eventosbgp.com, 1 eventosdeluchalibre.tk, 1 @@ -46873,6 +47917,7 @@ evernaut.com, 1 everpcpc.com, 1 everready.tk, 1 +eversana.com, 1 everseo.tk, 1 eversightwealth.com, 1 evertonarentwe.com, 1 @@ -46892,6 +47937,7 @@ everydaydishes.com, 1 everydaygary.com, 1 everydaylifeinsurance.com, 1 +everydaymarts.com, 0 everydaynews.ro, 1 everydaypower.com, 1 everydaytherich.com, 1 @@ -46908,7 +47954,9 @@ everysaving.ca, 1 everysaving.co.uk, 1 everysaving.co.za, 1 +everysaving.com, 1 everysaving.com.au, 1 +everysaving.ie, 1 everysaving.sg, 1 everystudent.bg, 1 everystudent.com.tw, 1 @@ -46927,7 +47975,6 @@ everythinq.com, 1 everytrycounts.gov, 1 everyveterancountsohio.gov, 1 -everzocial.com, 1 evesan.com, 1 eveshaiwu.com, 1 eveshamglass.co.uk, 1 @@ -46936,6 +47983,7 @@ evetech.net, 1 evezqurbanli.tk, 1 evga.com, 1 +evgenymorozov.com, 1 evhoeft.com, 1 eviadc.com, 1 eviamv.com, 1 @@ -46972,10 +48020,11 @@ evisos.com, 1 evisos.com.ar, 1 evisos.com.mx, 1 +evisos.es, 1 evitacion.com, 1 eviz.co, 1 +evkitdigital.com.br, 1 evlear.com, 1 -evlilikarayanlar.com, 1 evlilikilan.com, 1 evlqa1sp1tzb05zo-reoo0vhj9a1t5pousfudnkg.com, 0 evntage.com, 1 @@ -46985,6 +48034,7 @@ evodation.org, 1 evojska.tk, 1 evok.com.co, 1 +evokeearlylearning.com.au, 1 evokepk.com, 1 evolucioneducativa.com.ec, 1 evolucionestudios.com.bo, 1 @@ -47005,6 +48055,7 @@ evolvetechnologies.co.uk, 1 evolvicity.org, 1 evolvingseo.com, 1 +evolvingthoughts.net, 1 evonet.co.za, 1 evony.eu, 1 evonys.com, 1 @@ -47033,10 +48084,10 @@ ev