<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html lang="en" style="--code-editor-font: var(--default-mono-font, "GitLab Mono"), JetBrains Mono, Menlo, DejaVu Sans Mono, Liberation Mono, Consolas, Ubuntu Mono, Courier New, andale mono, lucida console, monospace;">
<head>
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
<title>
GitLab
</title>
<style data-premailer="ignore" type="text/css">
a { color: #1068bf; }
</style>
<style>img {
max-width: 100%; height: auto;
}
body {
font-size: .875rem;
}
body {
-webkit-text-shadow: hsla(0,0%,100%,.01) 0 0 1px;
}
body {
font-family: "GitLab Sans",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Noto Sans",Ubuntu,Cantarell,"Helvetica Neue",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"; font-size: inherit;
}
</style>
</head>
<body style="font-size: inherit; -webkit-text-shadow: hsla(0,0%,100%,.01) 0 0 1px; font-family: "GitLab Sans",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Noto Sans",Ubuntu,Cantarell,"Helvetica Neue",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";">
<div class="content">
<p class="details" style="font-style: italic; color: #626168;">
<a href="https://gitlab.rtems.org/TheSamPrice">Sam Price</a> created a merge request: <a href="https://gitlab.rtems.org/rtems/pkg/rtems-lwip/-/merge_requests/56">!56</a>
</p>
<div class="branch">
Project:Branches: TheSamPrice/rtems-lwip:io-accept-and-semaphore to rtems/pkg/rtems-lwip:main
</div>
<div>
Author: Sam Price
</div>
<div class="md gl-mt-5" style="position: relative; z-index: 1; color: #3a383f; word-wrap: break-word; margin-top: 1rem;">
<h2 id="user-content-summary" dir="auto" style="margin-top: 0px; margin-bottom: 10px;" align="initial">Summary<a href="#summary" aria-label="Link to heading 'Summary'" data-heading-content="Summary" class="anchor" style="margin-top: 0px;"></a>
</h2>
<p dir="auto" style="color: #3a383f; margin: 0px 0px 1rem;" align="initial">rtems_lwip_io: Do not build a descriptor from a failed accept</p>
<p dir="auto" style="color: #3a383f; margin: 0px 0px 1rem;" align="initial">accept() passes lwip_accept()'s return straight to
rtems_lwip_make_sysfd_from_lwipfd() without checking it. When lwip_accept()
fails it returns -1, and a perfectly valid RTEMS descriptor is then built with
data0 = -1.</p>
<p dir="auto" style="color: #3a383f; margin: 0px 0px 1rem;" align="initial">That descriptor is worse than an error. rtems_lwip_iop_to_lwipfd() finds the
handlers match, so it returns data0 verbatim -- -1 -- and every call made on
the descriptor returns -1 having set no errno at all, because none of the
paths that do set errno was taken.</p>
<p dir="auto" style="color: #3a383f; margin: 0px 0px 1rem;" align="initial">On a non-blocking listener, which is what any event-driven server uses, an
accept with nothing pending is the ordinary case rather than an error. So a
server polling an idle listener is handed a fresh descriptor on every poll,
believes it has a connection each time, and leaks a descriptor each time.</p>
<p dir="auto" style="color: #3a383f; margin: 0px 0px 1rem;" align="initial">Observed on arm/xilinx_zynq_a9_qemu with ESPHome's API server: successive
accepts returning fds 4, 5, 6 with no client connected, each failing at</p>
<div class="gl-relative markdown-code-block js-markdown-code">
<pre class="code highlight js-syntax-highlight language-plaintext" v-pre="true" style="display: block; font-size: 14px; color: #3a383f; line-height: 1.6em; overflow-x: auto; border-radius: .25rem; position: relative; font-family: "GitLab Mono", "JetBrains Mono", "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas", "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace; font-variant-ligatures: none; word-break: break-all; word-wrap: break-word; background-color: #fbfafd; margin: 0px 0 1rem; padding: 12px; border: 1px solid #dcdcde;"><code style="font-size: inherit; color: inherit; word-wrap: normal; word-break: keep-all; background-color: inherit; border-radius: .25rem; white-space: pre; margin-top: 0px; font-family: "GitLab Mono", "JetBrains Mono", "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas", "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace; font-variant-ligatures: none; overflow-wrap: normal; padding: unset;"><span id="LC1" class="line" data-lang="plaintext" style="margin-top: 0px;">setsockopt(fd, IPPROTO_TCP, TCP_NODELAY) -> -1, errno unchanged</span></code></pre>
<copy-code></copy-code><insert-code-snippet></insert-code-snippet>
</div>
<p dir="auto" style="color: #3a383f; margin: 0px 0px 1rem;" align="initial">A blocking listener never sees it, which is why the ordinary tests do not.</p>
<p dir="auto" style="color: #3a383f; margin: 0px 0px 1rem;" align="initial">While in the same file: socket() returns on its error path without releasing
the semaphore it took. The mutex is recursive, so the task that took it is
unaffected and the next task to want it is not -- the deadlock lands somewhere
else entirely, which is the hardest kind to attribute.</p>
<p dir="auto" style="color: #3a383f; margin: 0px 0px 1rem;" align="initial">Signed-off-by: Samuel Price <a href="mailto:thesamprice@gmail.com" style="margin-top: 0px;">thesamprice@gmail.com</a>
Assisted-by: Claude Opus 5 (1M context) <a href="mailto:noreply@anthropic.com">noreply@anthropic.com</a></p>
<h2 id="user-content-generative-ai" dir="auto" style="margin-top: 20px; margin-bottom: 10px;" align="initial">Generative AI<a href="#generative-ai" aria-label="Link to heading 'Generative AI'" data-heading-content="Generative AI" class="anchor" style="margin-top: 0px;"></a>
</h2>
<p dir="auto" style="color: #3a383f; margin: 0px;" align="initial">Assisted-by: Claude Opus 5 (1M context) <a href="mailto:noreply@anthropic.com" style="margin-top: 0px;">noreply@anthropic.com</a></p>
</div>
</div>
<div class="footer" style="margin-top: 10px;">
<p style="font-size: small; color: #626168;">
—
<br>
<a href="https://gitlab.rtems.org/rtems/pkg/rtems-lwip/-/merge_requests/56">View it on GitLab</a>.
<br>
You're receiving this email because of your account on <a target="_blank" rel="noopener noreferrer" href="https://gitlab.rtems.org">gitlab.rtems.org</a>. <a href="https://gitlab.rtems.org/-/namespace/22/sent_notifications/5-etuw4t3fym88xz42z96lb4pim-m/unsubscribe" target="_blank" rel="noopener noreferrer">Unsubscribe</a> from this thread · <a href="https://gitlab.rtems.org/-/profile/notifications" target="_blank" rel="noopener noreferrer" class="mng-notif-link">Manage all notifications</a> · <a href="https://gitlab.rtems.org/help" target="_blank" rel="noopener noreferrer" class="help-link">Help</a>
<span style="color: transparent; font-size: 0; display: none; overflow: hidden; opacity: 0; width: 0; height: 0; max-width: 0; max-height: 0;">
Notification message regarding https://gitlab.rtems.org/rtems/pkg/rtems-lwip/-/merge_requests/56 at 1789149358
</span>
<script type="application/ld+json">{"@context":"http://schema.org","@type":"EmailMessage","action":{"@type":"ViewAction","name":"View Merge request","url":"https://gitlab.rtems.org/rtems/pkg/rtems-lwip/-/merge_requests/56"}}</script>
</p>
</div>
</body>
</html>