-
Notifications
You must be signed in to change notification settings - Fork 19
posix: implement missing directory functions #433
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Summary of Changes
Hello @R4ken, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!
This pull request introduces three essential POSIX directory functions: fdopendir, seekdir, and telldir. These additions are crucial for improving the system's compatibility with POSIX standards, thereby simplifying the porting of various applications that rely on these common directory operations. The changes enhance the system's file system interaction capabilities without altering existing functionality.
Highlights
- New POSIX Directory Functions: Implemented
fdopendir,seekdir, andtelldirfunctions to provide more comprehensive POSIX-compliant directory manipulation capabilities. - Header Updates: Added declarations for the new directory functions in
include/dirent.h. - Core Logic Implementation: Provided the full implementation for
fdopendir,seekdir, andtelldirwithinunistd/dir.c, including necessary error handling and file descriptor management.
Using Gemini Code Assist
The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.
Invoking Gemini
You can request assistance from Gemini at any point in your pull request via creating an issue comment (i.e. comment on the pull request page) using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands.
| Feature | Command | Description |
|---|---|---|
| Code Review | /gemini review |
Performs a code review for the current pull request in its current state. |
| Pull Request Summary | /gemini summary |
Provides a summary of the current pull request in its current state. |
| Comment | @gemini-code-assist | Responds in comments when explicitly tagged, both in issue comments and review comments. |
| Help | /gemini help |
Displays a list of available commands. |
Customization
To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.
Limitations & Feedback
Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.
You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.
Footnotes
-
Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution. ↩
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Code Review
This pull request implements the missing POSIX directory functions fdopendir, seekdir, and telldir. The implementations are a good start, but I've identified a few high-severity issues related to null pointer dereferences and error handling that could lead to crashes or undefined behavior. I've provided detailed comments and code suggestions to address these points, which also include a small efficiency improvement in fdopendir.
|
|
||
| void seekdir(DIR *dirp, long loc) | ||
| { | ||
| dirp->pos = loc; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Other libphoenix functions don't validate whether dirp is non NULL pointer
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, you are right, although I think that this might be a good opportunity to introduce those checks here.
Linux's behaviour in these calls is not unreasonable and helping the programmer by making this deterministic is IMO good
|
|
||
| long telldir(DIR *dirp) | ||
| { | ||
| return dirp->pos; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
No, this behavior exists in Linux, POSIX does not specify it
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
As above
Unit Test Results9 462 tests +185 8 872 ✅ +185 51m 13s ⏱️ - 3m 22s For more details on these failures, see this check. Results for commit ca26bd4. ± Comparison against base commit ebfb737. ♻️ This comment has been updated with latest results. |
| free(s); | ||
| return NULL; | ||
| } | ||
| if ((fd_flags & O_RDONLY) == 0) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What if O_RDWR is set, so O_RDONLY is not? I think a file descriptor open for reading can be as well open for writing, as long as it is still readable
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
open from libphoenix sets EISDIR on errno while opening directory with either O_WRONLY or O_RDWR flag.
Thus opening directory with O_RDWR is not possible
Fragment of open function from libphoenix
if (oflag & (O_WRONLY | O_RDWR)) {
if ((err = stat(filename, &st)) < 0) {
if (errno != ENOENT)
return err;
}
else if (S_ISDIR(st.st_mode)) {
return SET_ERRNO(-EISDIR);
}
}There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This behaviour seems common, I can replicate it on both Linux and one of the BSD's, I think we can keep it like that for the sake of compatibility.
Implement missing POSIX functions (fdopendir,seekdir, telldir) working on DIR structs JIRA: RTOS-1088
oI0ck
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'd be good to introduce NULL checks while we are at it.
|
|
||
| void seekdir(DIR *dirp, long loc) | ||
| { | ||
| dirp->pos = loc; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, you are right, although I think that this might be a good opportunity to introduce those checks here.
Linux's behaviour in these calls is not unreasonable and helping the programmer by making this deterministic is IMO good
|
|
||
| long telldir(DIR *dirp) | ||
| { | ||
| return dirp->pos; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
As above
| free(s); | ||
| return NULL; | ||
| } | ||
| if ((fd_flags & O_RDONLY) == 0) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This behaviour seems common, I can replicate it on both Linux and one of the BSD's, I think we can keep it like that for the sake of compatibility.
Implement missing POSIX functions (fdopendir,seekdir, telldir) working on DIR structs
JIRA: RTOS-1088
Description
Implemented fdopendir,seekdir and telldir functions.
Motivation and Context
Missing POSIX functions useful in porting applications
Types of changes
How Has This Been Tested?
Checklist:
Special treatment