Skip to content
This repository was archived by the owner on Jan 6, 2025. It is now read-only.

Fix deadlock on deserialization failure - #116

Merged
tnull merged 3 commits into
lightningdevkit:mainfrom
tnull:2024-02-fix-request-map-deadlock
Mar 5, 2024
Merged

Fix deadlock on deserialization failure#116
tnull merged 3 commits into
lightningdevkit:mainfrom
tnull:2024-02-fix-request-map-deadlock

Conversation

@tnull

Copy link
Copy Markdown
Collaborator

Previously, we introduced disconnecting a counterparty who sends us bogus messages that we're unable to parse. However, before we disconnect we also send out a last LSPSMessage::Invalid in the hopes that the
counterparty understands this.

However, when we added this logic we unfortunately overlooked that we lock the request_id_to_method_mapMutex for parsing the message, but also try to lock when the PeerHandler calls get_and_clear_pending_msg.

Here, we avoid the resulting deadlock by dropping the lock as soon as it's not required anymore after parsing.

In a second commit, we avoid unnecessary locking of request_ids_and_methods_map in get_and_clear_pending_msg and remove a potentially dangerous (if we ever were to fail serialization for some reason) unwrap.

Previously, we introduced disconnecting a counterparty who sends us
bogus messages that we're unable to parse. However, before we disconnect
we also send out a last `LSPSMessage::Invalid` in the hopes that the
counterparty understands this.
However, when we added this logic we unfortunately overlooked that we
lock the `request_id_to_method_map` `Mutex` for parsing the message, but
also try to lock when the `PeerHandler` calls
`get_and_clear_pending_msgs`.
Here, we avoid the resulting deadlock by dropping the lock as soon as
it's not required anymore after parsing.
.. in `get_and_clear_pending_msg`. We also remove a potentially
dangerous (if we ever were to fail serialization for some reason)
`unwrap`.
Disconnecting might be unfortunate if we have open channels with the
counterparty. If they send us bogus data, we now just add them to a
(currently unpersisted) ignore list.
We should in the future figure out when to drop them from this list, so
that peers have the chance to recover.
Comment threadsrc/manager.rs
action: ErrorAction::IgnoreAndLog(Level::Trace),
});
}
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will this respond to peer with an error or just log it on our end? We've run into issues where we just silently fail/ignore requests (when user hits our rate limits) and the wallet user experience is odd because it just hangs. This could introduce that experience?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, but in this case it's really intended as it's a DoS protection if the user sends us bogus data. The alternative is disconnecting them which I'd even prefer, but we don't know if the user has any channels with us that still need to be kept operational. While this just adds the user to the ignorelist until restart, we def. want to remove them after a while in the future, especially once we start persisting things, as tracked here: https://github.com/lightningdevkit/lightning-liquidity/issues/117

@tnull
tnull merged commit 8809ab1 into lightningdevkit:mainMar 5, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@tnull@johncantrell97
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Fix deadlock on deserialization failure by tnull · Pull Request #116 · lightningdevkit/lightning-liquidity · GitHub
Skip to content
This repository was archived by the owner on Jan 6, 2025. It is now read-only.

Fix deadlock on deserialization failure - #116

Merged
tnull merged 3 commits into
lightningdevkit:mainfrom
tnull:2024-02-fix-request-map-deadlock
Mar 5, 2024
Merged

Fix deadlock on deserialization failure#116
tnull merged 3 commits into
lightningdevkit:mainfrom
tnull:2024-02-fix-request-map-deadlock

Conversation

@tnull

Copy link
Copy Markdown
Collaborator

Previously, we introduced disconnecting a counterparty who sends us bogus messages that we're unable to parse. However, before we disconnect we also send out a last LSPSMessage::Invalid in the hopes that the
counterparty understands this.

However, when we added this logic we unfortunately overlooked that we lock the request_id_to_method_mapMutex for parsing the message, but also try to lock when the PeerHandler calls get_and_clear_pending_msg.

Here, we avoid the resulting deadlock by dropping the lock as soon as it's not required anymore after parsing.

In a second commit, we avoid unnecessary locking of request_ids_and_methods_map in get_and_clear_pending_msg and remove a potentially dangerous (if we ever were to fail serialization for some reason) unwrap.

Previously, we introduced disconnecting a counterparty who sends us
bogus messages that we're unable to parse. However, before we disconnect
we also send out a last `LSPSMessage::Invalid` in the hopes that the
counterparty understands this.
However, when we added this logic we unfortunately overlooked that we
lock the `request_id_to_method_map` `Mutex` for parsing the message, but
also try to lock when the `PeerHandler` calls
`get_and_clear_pending_msgs`.
Here, we avoid the resulting deadlock by dropping the lock as soon as
it's not required anymore after parsing.
.. in `get_and_clear_pending_msg`. We also remove a potentially
dangerous (if we ever were to fail serialization for some reason)
`unwrap`.
Disconnecting might be unfortunate if we have open channels with the
counterparty. If they send us bogus data, we now just add them to a
(currently unpersisted) ignore list.
We should in the future figure out when to drop them from this list, so
that peers have the chance to recover.
Comment threadsrc/manager.rs
action: ErrorAction::IgnoreAndLog(Level::Trace),
});
}
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will this respond to peer with an error or just log it on our end? We've run into issues where we just silently fail/ignore requests (when user hits our rate limits) and the wallet user experience is odd because it just hangs. This could introduce that experience?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, but in this case it's really intended as it's a DoS protection if the user sends us bogus data. The alternative is disconnecting them which I'd even prefer, but we don't know if the user has any channels with us that still need to be kept operational. While this just adds the user to the ignorelist until restart, we def. want to remove them after a while in the future, especially once we start persisting things, as tracked here: https://github.com/lightningdevkit/lightning-liquidity/issues/117

@tnull
tnull merged commit 8809ab1 into lightningdevkit:mainMar 5, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@tnull@johncantrell97
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Fix deadlock on deserialization failure by tnull · Pull Request #116 · lightningdevkit/lightning-liquidity · GitHub
Skip to content
This repository was archived by the owner on Jan 6, 2025. It is now read-only.

Fix deadlock on deserialization failure - #116

Merged
tnull merged 3 commits into
lightningdevkit:mainfrom
tnull:2024-02-fix-request-map-deadlock
Mar 5, 2024
Merged

Fix deadlock on deserialization failure#116
tnull merged 3 commits into
lightningdevkit:mainfrom
tnull:2024-02-fix-request-map-deadlock

Conversation

@tnull

Copy link
Copy Markdown
Collaborator

Previously, we introduced disconnecting a counterparty who sends us bogus messages that we're unable to parse. However, before we disconnect we also send out a last LSPSMessage::Invalid in the hopes that the
counterparty understands this.

However, when we added this logic we unfortunately overlooked that we lock the request_id_to_method_mapMutex for parsing the message, but also try to lock when the PeerHandler calls get_and_clear_pending_msg.

Here, we avoid the resulting deadlock by dropping the lock as soon as it's not required anymore after parsing.

In a second commit, we avoid unnecessary locking of request_ids_and_methods_map in get_and_clear_pending_msg and remove a potentially dangerous (if we ever were to fail serialization for some reason) unwrap.

Previously, we introduced disconnecting a counterparty who sends us
bogus messages that we're unable to parse. However, before we disconnect
we also send out a last `LSPSMessage::Invalid` in the hopes that the
counterparty understands this.
However, when we added this logic we unfortunately overlooked that we
lock the `request_id_to_method_map` `Mutex` for parsing the message, but
also try to lock when the `PeerHandler` calls
`get_and_clear_pending_msgs`.
Here, we avoid the resulting deadlock by dropping the lock as soon as
it's not required anymore after parsing.
.. in `get_and_clear_pending_msg`. We also remove a potentially
dangerous (if we ever were to fail serialization for some reason)
`unwrap`.
Disconnecting might be unfortunate if we have open channels with the
counterparty. If they send us bogus data, we now just add them to a
(currently unpersisted) ignore list.
We should in the future figure out when to drop them from this list, so
that peers have the chance to recover.
Comment threadsrc/manager.rs
action: ErrorAction::IgnoreAndLog(Level::Trace),
});
}
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will this respond to peer with an error or just log it on our end? We've run into issues where we just silently fail/ignore requests (when user hits our rate limits) and the wallet user experience is odd because it just hangs. This could introduce that experience?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, but in this case it's really intended as it's a DoS protection if the user sends us bogus data. The alternative is disconnecting them which I'd even prefer, but we don't know if the user has any channels with us that still need to be kept operational. While this just adds the user to the ignorelist until restart, we def. want to remove them after a while in the future, especially once we start persisting things, as tracked here: https://github.com/lightningdevkit/lightning-liquidity/issues/117

@tnull
tnull merged commit 8809ab1 into lightningdevkit:mainMar 5, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@tnull@johncantrell97
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Fix deadlock on deserialization failure by tnull · Pull Request #116 · lightningdevkit/lightning-liquidity · GitHub
Skip to content
This repository was archived by the owner on Jan 6, 2025. It is now read-only.

Fix deadlock on deserialization failure - #116

Merged
tnull merged 3 commits into
lightningdevkit:mainfrom
tnull:2024-02-fix-request-map-deadlock
Mar 5, 2024
Merged

Fix deadlock on deserialization failure#116
tnull merged 3 commits into
lightningdevkit:mainfrom
tnull:2024-02-fix-request-map-deadlock

Conversation

@tnull

Copy link
Copy Markdown
Collaborator

Previously, we introduced disconnecting a counterparty who sends us bogus messages that we're unable to parse. However, before we disconnect we also send out a last LSPSMessage::Invalid in the hopes that the
counterparty understands this.

However, when we added this logic we unfortunately overlooked that we lock the request_id_to_method_mapMutex for parsing the message, but also try to lock when the PeerHandler calls get_and_clear_pending_msg.

Here, we avoid the resulting deadlock by dropping the lock as soon as it's not required anymore after parsing.

In a second commit, we avoid unnecessary locking of request_ids_and_methods_map in get_and_clear_pending_msg and remove a potentially dangerous (if we ever were to fail serialization for some reason) unwrap.

Previously, we introduced disconnecting a counterparty who sends us
bogus messages that we're unable to parse. However, before we disconnect
we also send out a last `LSPSMessage::Invalid` in the hopes that the
counterparty understands this.
However, when we added this logic we unfortunately overlooked that we
lock the `request_id_to_method_map` `Mutex` for parsing the message, but
also try to lock when the `PeerHandler` calls
`get_and_clear_pending_msgs`.
Here, we avoid the resulting deadlock by dropping the lock as soon as
it's not required anymore after parsing.
.. in `get_and_clear_pending_msg`. We also remove a potentially
dangerous (if we ever were to fail serialization for some reason)
`unwrap`.
Disconnecting might be unfortunate if we have open channels with the
counterparty. If they send us bogus data, we now just add them to a
(currently unpersisted) ignore list.
We should in the future figure out when to drop them from this list, so
that peers have the chance to recover.
Comment threadsrc/manager.rs
action: ErrorAction::IgnoreAndLog(Level::Trace),
});
}
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will this respond to peer with an error or just log it on our end? We've run into issues where we just silently fail/ignore requests (when user hits our rate limits) and the wallet user experience is odd because it just hangs. This could introduce that experience?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, but in this case it's really intended as it's a DoS protection if the user sends us bogus data. The alternative is disconnecting them which I'd even prefer, but we don't know if the user has any channels with us that still need to be kept operational. While this just adds the user to the ignorelist until restart, we def. want to remove them after a while in the future, especially once we start persisting things, as tracked here: https://github.com/lightningdevkit/lightning-liquidity/issues/117

@tnull
tnull merged commit 8809ab1 into lightningdevkit:mainMar 5, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@tnull@johncantrell97
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Fix deadlock on deserialization failure by tnull · Pull Request #116 · lightningdevkit/lightning-liquidity · GitHub
Skip to content
This repository was archived by the owner on Jan 6, 2025. It is now read-only.

Fix deadlock on deserialization failure - #116

Merged
tnull merged 3 commits into
lightningdevkit:mainfrom
tnull:2024-02-fix-request-map-deadlock
Mar 5, 2024
Merged

Fix deadlock on deserialization failure#116
tnull merged 3 commits into
lightningdevkit:mainfrom
tnull:2024-02-fix-request-map-deadlock

Conversation

@tnull

Copy link
Copy Markdown
Collaborator

Previously, we introduced disconnecting a counterparty who sends us bogus messages that we're unable to parse. However, before we disconnect we also send out a last LSPSMessage::Invalid in the hopes that the
counterparty understands this.

However, when we added this logic we unfortunately overlooked that we lock the request_id_to_method_mapMutex for parsing the message, but also try to lock when the PeerHandler calls get_and_clear_pending_msg.

Here, we avoid the resulting deadlock by dropping the lock as soon as it's not required anymore after parsing.

In a second commit, we avoid unnecessary locking of request_ids_and_methods_map in get_and_clear_pending_msg and remove a potentially dangerous (if we ever were to fail serialization for some reason) unwrap.

Previously, we introduced disconnecting a counterparty who sends us
bogus messages that we're unable to parse. However, before we disconnect
we also send out a last `LSPSMessage::Invalid` in the hopes that the
counterparty understands this.
However, when we added this logic we unfortunately overlooked that we
lock the `request_id_to_method_map` `Mutex` for parsing the message, but
also try to lock when the `PeerHandler` calls
`get_and_clear_pending_msgs`.
Here, we avoid the resulting deadlock by dropping the lock as soon as
it's not required anymore after parsing.
.. in `get_and_clear_pending_msg`. We also remove a potentially
dangerous (if we ever were to fail serialization for some reason)
`unwrap`.
Disconnecting might be unfortunate if we have open channels with the
counterparty. If they send us bogus data, we now just add them to a
(currently unpersisted) ignore list.
We should in the future figure out when to drop them from this list, so
that peers have the chance to recover.
Comment threadsrc/manager.rs
action: ErrorAction::IgnoreAndLog(Level::Trace),
});
}
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will this respond to peer with an error or just log it on our end? We've run into issues where we just silently fail/ignore requests (when user hits our rate limits) and the wallet user experience is odd because it just hangs. This could introduce that experience?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, but in this case it's really intended as it's a DoS protection if the user sends us bogus data. The alternative is disconnecting them which I'd even prefer, but we don't know if the user has any channels with us that still need to be kept operational. While this just adds the user to the ignorelist until restart, we def. want to remove them after a while in the future, especially once we start persisting things, as tracked here: https://github.com/lightningdevkit/lightning-liquidity/issues/117

@tnull
tnull merged commit 8809ab1 into lightningdevkit:mainMar 5, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@tnull@johncantrell97
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Fix deadlock on deserialization failure by tnull · Pull Request #116 · lightningdevkit/lightning-liquidity · GitHub
Skip to content
This repository was archived by the owner on Jan 6, 2025. It is now read-only.

Fix deadlock on deserialization failure - #116

Merged
tnull merged 3 commits into
lightningdevkit:mainfrom
tnull:2024-02-fix-request-map-deadlock
Mar 5, 2024
Merged

Fix deadlock on deserialization failure#116
tnull merged 3 commits into
lightningdevkit:mainfrom
tnull:2024-02-fix-request-map-deadlock

Conversation

@tnull

Copy link
Copy Markdown
Collaborator

Previously, we introduced disconnecting a counterparty who sends us bogus messages that we're unable to parse. However, before we disconnect we also send out a last LSPSMessage::Invalid in the hopes that the
counterparty understands this.

However, when we added this logic we unfortunately overlooked that we lock the request_id_to_method_mapMutex for parsing the message, but also try to lock when the PeerHandler calls get_and_clear_pending_msg.

Here, we avoid the resulting deadlock by dropping the lock as soon as it's not required anymore after parsing.

In a second commit, we avoid unnecessary locking of request_ids_and_methods_map in get_and_clear_pending_msg and remove a potentially dangerous (if we ever were to fail serialization for some reason) unwrap.

Previously, we introduced disconnecting a counterparty who sends us
bogus messages that we're unable to parse. However, before we disconnect
we also send out a last `LSPSMessage::Invalid` in the hopes that the
counterparty understands this.
However, when we added this logic we unfortunately overlooked that we
lock the `request_id_to_method_map` `Mutex` for parsing the message, but
also try to lock when the `PeerHandler` calls
`get_and_clear_pending_msgs`.
Here, we avoid the resulting deadlock by dropping the lock as soon as
it's not required anymore after parsing.
.. in `get_and_clear_pending_msg`. We also remove a potentially
dangerous (if we ever were to fail serialization for some reason)
`unwrap`.
Disconnecting might be unfortunate if we have open channels with the
counterparty. If they send us bogus data, we now just add them to a
(currently unpersisted) ignore list.
We should in the future figure out when to drop them from this list, so
that peers have the chance to recover.
Comment threadsrc/manager.rs
action: ErrorAction::IgnoreAndLog(Level::Trace),
});
}
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will this respond to peer with an error or just log it on our end? We've run into issues where we just silently fail/ignore requests (when user hits our rate limits) and the wallet user experience is odd because it just hangs. This could introduce that experience?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, but in this case it's really intended as it's a DoS protection if the user sends us bogus data. The alternative is disconnecting them which I'd even prefer, but we don't know if the user has any channels with us that still need to be kept operational. While this just adds the user to the ignorelist until restart, we def. want to remove them after a while in the future, especially once we start persisting things, as tracked here: https://github.com/lightningdevkit/lightning-liquidity/issues/117

@tnull
tnull merged commit 8809ab1 into lightningdevkit:mainMar 5, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@tnull@johncantrell97
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Fix deadlock on deserialization failure by tnull · Pull Request #116 · lightningdevkit/lightning-liquidity · GitHub
Skip to content
This repository was archived by the owner on Jan 6, 2025. It is now read-only.

Fix deadlock on deserialization failure - #116

Merged
tnull merged 3 commits into
lightningdevkit:mainfrom
tnull:2024-02-fix-request-map-deadlock
Mar 5, 2024
Merged

Fix deadlock on deserialization failure#116
tnull merged 3 commits into
lightningdevkit:mainfrom
tnull:2024-02-fix-request-map-deadlock

Conversation

@tnull

Copy link
Copy Markdown
Collaborator

Previously, we introduced disconnecting a counterparty who sends us bogus messages that we're unable to parse. However, before we disconnect we also send out a last LSPSMessage::Invalid in the hopes that the
counterparty understands this.

However, when we added this logic we unfortunately overlooked that we lock the request_id_to_method_mapMutex for parsing the message, but also try to lock when the PeerHandler calls get_and_clear_pending_msg.

Here, we avoid the resulting deadlock by dropping the lock as soon as it's not required anymore after parsing.

In a second commit, we avoid unnecessary locking of request_ids_and_methods_map in get_and_clear_pending_msg and remove a potentially dangerous (if we ever were to fail serialization for some reason) unwrap.

Previously, we introduced disconnecting a counterparty who sends us
bogus messages that we're unable to parse. However, before we disconnect
we also send out a last `LSPSMessage::Invalid` in the hopes that the
counterparty understands this.
However, when we added this logic we unfortunately overlooked that we
lock the `request_id_to_method_map` `Mutex` for parsing the message, but
also try to lock when the `PeerHandler` calls
`get_and_clear_pending_msgs`.
Here, we avoid the resulting deadlock by dropping the lock as soon as
it's not required anymore after parsing.
.. in `get_and_clear_pending_msg`. We also remove a potentially
dangerous (if we ever were to fail serialization for some reason)
`unwrap`.
Disconnecting might be unfortunate if we have open channels with the
counterparty. If they send us bogus data, we now just add them to a
(currently unpersisted) ignore list.
We should in the future figure out when to drop them from this list, so
that peers have the chance to recover.
Comment threadsrc/manager.rs
action: ErrorAction::IgnoreAndLog(Level::Trace),
});
}
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will this respond to peer with an error or just log it on our end? We've run into issues where we just silently fail/ignore requests (when user hits our rate limits) and the wallet user experience is odd because it just hangs. This could introduce that experience?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, but in this case it's really intended as it's a DoS protection if the user sends us bogus data. The alternative is disconnecting them which I'd even prefer, but we don't know if the user has any channels with us that still need to be kept operational. While this just adds the user to the ignorelist until restart, we def. want to remove them after a while in the future, especially once we start persisting things, as tracked here: https://github.com/lightningdevkit/lightning-liquidity/issues/117

@tnull
tnull merged commit 8809ab1 into lightningdevkit:mainMar 5, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@tnull@johncantrell97
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); Fix deadlock on deserialization failure by tnull · Pull Request #116 · lightningdevkit/lightning-liquidity · GitHub
Skip to content
This repository was archived by the owner on Jan 6, 2025. It is now read-only.

Fix deadlock on deserialization failure - #116

Merged
tnull merged 3 commits into
lightningdevkit:mainfrom
tnull:2024-02-fix-request-map-deadlock
Mar 5, 2024
Merged

Fix deadlock on deserialization failure#116
tnull merged 3 commits into
lightningdevkit:mainfrom
tnull:2024-02-fix-request-map-deadlock

Conversation

@tnull

Copy link
Copy Markdown
Collaborator

Previously, we introduced disconnecting a counterparty who sends us bogus messages that we're unable to parse. However, before we disconnect we also send out a last LSPSMessage::Invalid in the hopes that the
counterparty understands this.

However, when we added this logic we unfortunately overlooked that we lock the request_id_to_method_mapMutex for parsing the message, but also try to lock when the PeerHandler calls get_and_clear_pending_msg.

Here, we avoid the resulting deadlock by dropping the lock as soon as it's not required anymore after parsing.

In a second commit, we avoid unnecessary locking of request_ids_and_methods_map in get_and_clear_pending_msg and remove a potentially dangerous (if we ever were to fail serialization for some reason) unwrap.

Previously, we introduced disconnecting a counterparty who sends us
bogus messages that we're unable to parse. However, before we disconnect
we also send out a last `LSPSMessage::Invalid` in the hopes that the
counterparty understands this.
However, when we added this logic we unfortunately overlooked that we
lock the `request_id_to_method_map` `Mutex` for parsing the message, but
also try to lock when the `PeerHandler` calls
`get_and_clear_pending_msgs`.
Here, we avoid the resulting deadlock by dropping the lock as soon as
it's not required anymore after parsing.
.. in `get_and_clear_pending_msg`. We also remove a potentially
dangerous (if we ever were to fail serialization for some reason)
`unwrap`.
Disconnecting might be unfortunate if we have open channels with the
counterparty. If they send us bogus data, we now just add them to a
(currently unpersisted) ignore list.
We should in the future figure out when to drop them from this list, so
that peers have the chance to recover.
Comment threadsrc/manager.rs
action: ErrorAction::IgnoreAndLog(Level::Trace),
});
}
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will this respond to peer with an error or just log it on our end? We've run into issues where we just silently fail/ignore requests (when user hits our rate limits) and the wallet user experience is odd because it just hangs. This could introduce that experience?

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, but in this case it's really intended as it's a DoS protection if the user sends us bogus data. The alternative is disconnecting them which I'd even prefer, but we don't know if the user has any channels with us that still need to be kept operational. While this just adds the user to the ignorelist until restart, we def. want to remove them after a while in the future, especially once we start persisting things, as tracked here: https://github.com/lightningdevkit/lightning-liquidity/issues/117

@tnull
tnull merged commit 8809ab1 into lightningdevkit:mainMar 5, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@tnull@johncantrell97