<!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/rtos/rtems/-/merge_requests/1444">!1444</a>
</p>
<div class="branch">
Project:Branches: TheSamPrice/rtems:libcsupport/realpath-upstream-fixes to rtems/rtos/rtems:main
</div>
<div class="author">
Author: Sam Price
</div>
<div class="assignee">
Assignees:
</div>
<div class="reviewer">
Reviewers:
</div>
<div class="md gl-mt-5" style="position: relative; z-index: 1; color: #3a383f; word-wrap: break-word; margin-top: 1rem;">
<p dir="auto" style="color: #3a383f; margin: 0px 0px 1rem;" align="initial">RTEMS copied realpath() from FreeBSD in 2012 and has not updated it since.
The file still records where it came from, in its __FBSDID line:
release/9.1.0 rev 240647, 2012-09-18. FreeBSD has fixed two bugs in it
since then. This takes both fixes, in the form upstream uses.</p>
<p dir="auto" style="color: #3a383f; margin: 0px 0px 1rem;" align="initial">Where these come from:</p>
<p dir="auto" style="color: #3a383f; margin: 0px 0px 1rem;" align="initial">fix <a href="https://cgit.freebsd.org/src/tree/lib/libc/stdlib/realpath.c" rel="nofollow noreferrer noopener" target="_blank" style="margin-top: 0px;">https://cgit.freebsd.org/src/tree/lib/libc/stdlib/realpath.c</a>
test <a href="https://cgit.freebsd.org/src/tree/lib/libc/tests/gen/realpath2_test.c" rel="nofollow noreferrer noopener" target="_blank">https://cgit.freebsd.org/src/tree/lib/libc/tests/gen/realpath2_test.c</a></p>
<p dir="auto" style="color: #3a383f; margin: 0px 0px 1rem;" align="initial">First bug, a symlink pointing at the empty string. readlink() returns
how many bytes it wrote, so an empty target returns 0. The code then read
symlink[slen - 1], which is symlink[-1]: one byte before the buffer
starts. Upstream returns ENOENT before anything reads the buffer.</p>
<p dir="auto" style="color: #3a383f; margin: 0px 0px 1rem;" align="initial">Second bug, a symlink whose target is too long. The code asked
readlink() for one byte less than the buffer holds, so a longer target
came back quietly cut short. realpath() then followed the shortened path
as though it were the real target and could return a path the symlink does
not point to. That matters because callers use realpath() to find out
what a path really refers to. Upstream returns ENAMETOOLONG.</p>
<p dir="auto" style="color: #3a383f; margin: 0px 0px 1rem;" align="initial">Neither symlink is hard to create. symlink() does not inspect the target
and IMFS stores whatever it is handed.</p>
<p dir="auto" style="color: #3a383f; margin: 0px 0px 1rem;" align="initial">The test is upstream's realpath_empty_symlink from realpath2_test.c,
rewritten for this test suite: RTEMS imports no ATF tests, so upstream's
cannot be dropped in as they are. It goes in fssymlink, which already
covers symlink behaviour and runs against five file systems, rather than
in a test of its own. Upstream's other four cases, realpath_null,
realpath_empty, realpath_buffer_overflow and realpath_partial, are not
about symlinks and are not brought over here.</p>
<p dir="auto" style="color: #3a383f; margin: 0px 0px 1rem;" align="initial">The over-long case is new. Upstream has the fix but no test for it.</p>
<p dir="auto" style="color: #3a383f; margin: 0px 0px 1rem;" align="initial">Each case is skipped when the file system will not create that link. That
is not hypothetical: JFFS2 rejects a target longer than PATH_MAX outright,
with ENAMETOOLONG, so the case cannot be reached there.</p>
<p dir="auto" style="color: #3a383f; margin: 0px 0px 1rem;" align="initial">Measured on riscv/mbv over IMFS, JFFS2 and RFS. The over-long case used
to return errno 2, ENOENT, from resolving the truncated path, and now
returns errno 91, ENAMETOOLONG.</p>
<p dir="auto" style="color: #3a383f; margin: 0px;" 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>
</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/-/merge_requests/1444">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/5-6wit5xs5m7va79a8nb3lxalof-1d/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/-/merge_requests/1444 at 1787279460
</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/rtos/rtems/-/merge_requests/1444"}}</script>
</p>
</div>
</body>
</html>