<!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: rgba(255,255,255,.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: rgba(255,255,255,.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 style="color: #777777;">
<a href="https://gitlab.rtems.org/allanhessenflow">Allan Hessenflow</a>
<a href="https://gitlab.rtems.org/rtems/rtos/rtems/-/issues/5411#note_138880">commented</a>:
</p>
<div class="md" style="position: relative; z-index: 1; color: #3a383f; word-wrap: break-word;">
<p dir="auto" style="color: #3a383f; margin: 0 0 1rem;" align="initial">I'm testing in main, not a 6.x branch, but newlib01 is also broken for the efm32gg11 bsp and it runs okay if I revert the referenced IOP changes. It seems likely to be the same issue seen with the zynqmp_qemu. Here's what I've found and a possible fix:</p>
<p dir="auto" style="color: #3a383f; margin: 0 0 1rem;" align="initial">This call chain occurs (omitting some irrelevant stuff) exit() -> fatal_extension() -> fstat() -> rtems_libio_get_iop().</p>
<p dir="auto" style="color: #3a383f; margin: 0 0 1rem;" align="initial">That calls rtems_libio_iop_hold() followed by rtems_libio_iop_drop() because the descriptor is closed.</p>
<p dir="auto" style="color: #3a383f; margin: 0 0 1rem;" align="initial">Then rtems_libio_iop_drop() -> rtems_libio_free() -> rtems_libio_free_iop(). However the referenced iop is already on the free list. So I added an additional check below before calling rtems_libio_free_iop(), which appears to fix the problem. However I don't feel I have a good understanding of how all this IOP stuff is intended to work so hopefully someone who does will evaluate and comment.</p>
<p dir="auto" style="color: #3a383f; margin: 0 0 1rem;" align="initial">I'll also note that spintrcritical24 was failing as well on the efm32gg11 and it appears to be fixed with this change as well. It had been ending up in an infinite loop trying to count free iops because rtems_libio_iop_free_head->data1 == rtems_libio_iop_free_head. That state is consistent with an iop being appended to the free list twice.</p>
<div class="gl-relative markdown-code-block js-markdown-code" style="margin-bottom: 0;">
<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: 0 0 1rem; padding: 12px; border: 1px solid #dcdcde;'><code style='font-size: inherit; color: inherit; word-wrap: normal; word-break: keep-all; border-radius: .25rem; background-color: inherit; white-space: pre; margin-top: 0; 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" lang="plaintext" style="margin-top: 0;">diff --git a/cpukit/include/rtems/libio_.h b/cpukit/include/rtems/libio_.h</span>
<span id="LC2" class="line" lang="plaintext">index 21a57cdc4f..0bd088d498 100644</span>
<span id="LC3" class="line" lang="plaintext">--- a/cpukit/include/rtems/libio_.h</span>
<span id="LC4" class="line" lang="plaintext">+++ b/cpukit/include/rtems/libio_.h</span>
<span id="LC5" class="line" lang="plaintext">@@ -150,12 +150,13 @@ static inline void rtems_libio_free(</span>
<span id="LC6" class="line" lang="plaintext">    * the iop so consider it an indirect reference. We cannot return</span>
<span id="LC7" class="line" lang="plaintext">    * the iop to the free list while the user owns the fd.</span>
<span id="LC8" class="line" lang="plaintext">    *</span>
<span id="LC9" class="line" lang="plaintext">-   * Read the flags once as it is an atomic and we need to test 2</span>
<span id="LC10" class="line" lang="plaintext">+   * Read the flags once as it is an atomic and we need to test 3</span>
<span id="LC11" class="line" lang="plaintext">    * flags. No convenience call as this is the only case we have.</span>
<span id="LC12" class="line" lang="plaintext">    */</span>
<span id="LC13" class="line" lang="plaintext">   const unsigned int flags = rtems_libio_iop_flags( iop );</span>
<span id="LC14" class="line" lang="plaintext">   if ( ( ( flags & LIBIO_FLAGS_OPEN ) == 0 )</span>
<span id="LC15" class="line" lang="plaintext">-       && ( ( flags & LIBIO_FLAGS_REFERENCE_MASK ) == 0 ) ) {</span>
<span id="LC16" class="line" lang="plaintext">+       && ( ( flags & LIBIO_FLAGS_REFERENCE_MASK ) == 0 )</span>
<span id="LC17" class="line" lang="plaintext">+       && ( ( flags & LIBIO_FLAGS_FREE ) == 0 ) ) {</span>
<span id="LC18" class="line" lang="plaintext">     rtems_libio_free_iop( iop );</span>
<span id="LC19" class="line" lang="plaintext">   }</span>
<span id="LC20" class="line" lang="plaintext"> }</span></code></pre>
<copy-code></copy-code><insert-code-snippet></insert-code-snippet>
</div>
</div>


</div>
<div class="footer" style="margin-top: 10px;">
<p style="font-size: small; color: #626168;">

<br>
<a href="https://gitlab.rtems.org/rtems/rtos/rtems/-/issues/5411#note_138880">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/-/sent_notifications/1-2ldabt8j1porxzmpjo0440mq0/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/rtos/rtems/-/issues/5411#note_138880 at 1768535436
</span>
<script type="application/ld+json">{"@context":"http://schema.org","@type":"EmailMessage","action":{"@type":"ViewAction","name":"View Issue","url":"https://gitlab.rtems.org/rtems/rtos/rtems/-/issues/5411#note_138880"}}</script>


</p>
</div>
</body>
</html>