-
Notifications
You must be signed in to change notification settings - Fork 13.6k
[libc] Change fcntl cmd when only fcntl64 is available #99675
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
Conversation
@llvm/pr-subscribers-libc Author: Mikhail R. Gadelha (mikhailramalho) ChangesIn some systems like rv32, only fcntl64 is available and it employs a different structure for file locking and the correspoding F_GETLK64, F_SETLK64, and F_SETLKW64 commands. So if we use fcntl64, the F_GETLK, F_SETLK, and F_SETLKW commands need to be changed to their 64 versions. This patch adds new cases to the swich(cmd) in our implementation of fcntl to do that. The default case was moved to outside the switch, so we don't need to change anything, the F_GETLK, F_SETLK, and F_SETLKW commands will just go through the old implementation. Full diff: https://github.com/llvm/llvm-project/pull/99675.diff 1 Files Affected:
diff --git a/libc/src/__support/OSUtil/linux/fcntl.cpp b/libc/src/__support/OSUtil/linux/fcntl.cpp
index e11013121b04b..44f10b6c59766 100644
--- a/libc/src/__support/OSUtil/linux/fcntl.cpp
+++ b/libc/src/__support/OSUtil/linux/fcntl.cpp
@@ -86,17 +86,37 @@ int fcntl(int fd, int cmd, void *arg) {
libc_errno = -ret;
return -1;
}
+ case F_GETLK: {
+#if defined(SYS_fcntl64)
+ if constexpr (FCNTL_SYSCALL_ID == SYS_fcntl64)
+ return fcntl(fd, F_GETLK64, arg);
+#endif
+ break;
+ }
+ case F_SETLK: {
+#if defined(SYS_fcntl64)
+ if constexpr (FCNTL_SYSCALL_ID == SYS_fcntl64)
+ return fcntl(fd, F_SETLK64, arg);
+#endif
+ break;
+ }
+ case F_SETLKW: {
+#if defined(SYS_fcntl64)
+ if constexpr (FCNTL_SYSCALL_ID == SYS_fcntl64)
+ return fcntl(fd, F_SETLKW64, arg);
+#endif
+ break;
+ }
// The general case
- default: {
- int retVal = LIBC_NAMESPACE::syscall_impl<int>(
- FCNTL_SYSCALL_ID, fd, cmd, reinterpret_cast<void *>(arg));
- if (retVal >= 0) {
- return retVal;
- }
- libc_errno = -retVal;
- return -1;
+ default:;
}
+ int retVal = LIBC_NAMESPACE::syscall_impl<int>(FCNTL_SYSCALL_ID, fd, cmd,
+ reinterpret_cast<void *>(arg));
+ if (retVal >= 0) {
+ return retVal;
}
+ libc_errno = -retVal;
+ return -1;
}
} // namespace internal
|
In some systems like rv32, only fcntl64 is available and it employs a different structure for file locking and the correspoding F_GETLK64, F_SETLK64, and F_SETLKW64 commands. So if we use fcntl64, the F_GETLK, F_SETLK, and F_SETLKW commands need to be changed to their 64 versions. This patch adds new cases to the swich(cmd) in our implementation of fcntl to do that. The default case was moved to outside the switch, so we don't need to change anything, the F_GETLK, F_SETLK, and F_SETLKW commands will just go through the old implementation.
95e01ff
to
19776b1
Compare
ping |
This patch removes the recursion in fcntl introduced by PR #99675 as it is not required and may be dangerous in some cases: some toolchains define F_GETLK == F_GETLK64 causing infinite recursion.
Summary: In some systems like rv32, only fcntl64 is available and it employs a different structure for file locking and the correspoding F_GETLK64, F_SETLK64, and F_SETLKW64 commands. So if we use fcntl64, the F_GETLK, F_SETLK, and F_SETLKW commands need to be changed to their 64 versions. This patch adds new cases to the swich(cmd) in our implementation of fcntl to do that. The default case was moved to outside the switch, so we don't need to change anything, the F_GETLK, F_SETLK, and F_SETLKW commands will just go through the old implementation. Test Plan: Reviewers: Subscribers: Tasks: Tags: Differential Revision: https://phabricator.intern.facebook.com/D60251108
This patch removes the recursion in fcntl introduced by PR #99675 as it is not required and may be dangerous in some cases: some toolchains define F_GETLK == F_GETLK64 causing infinite recursion.
In some systems like rv32, only fcntl64 is available and it employs a different structure for file locking and the correspoding F_GETLK64, F_SETLK64, and F_SETLKW64 commands.
So if we use fcntl64, the F_GETLK, F_SETLK, and F_SETLKW commands need to be changed to their 64 versions. This patch adds new cases to the swich(cmd) in our implementation of fcntl to do that.
The default case was moved to outside the switch, so we don't need to change anything, the F_GETLK, F_SETLK, and F_SETLKW commands will just go through the old implementation.