Skip to contentSkip to conversation

ports/linux: wrap faccessat()

PATCH Superseded Max Kellermann 3 participants 6 messages Aug 1, 2019

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 ports/linux: wrap faccessat()

From: Max Kellermann <[email protected]>

---
 ports/linux/guts/faccessat.c | 33 +++++++++++++++++++++++++++++++++
 ports/linux/wrapfuncs.in     |  1 +
 2 files changed, 34 insertions(+)
 create mode 100644 ports/linux/guts/faccessat.c
ports/linux/guts/faccessat.c new file +33 -0
new file mode 100644
index 0000000..be13bbc
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2019 Max Kellermann <[email protected]>
+ * guts/COPYRIGHT for information.
+ *
+ * SPDX-License-Identifier: LGPL-2.1-only
+ *
+ * static int
+ * wrap_access(int dirfd, const char *path, int mode, int flags) {
+ *	int rc = -1;
+ */
+	struct stat64 buf;
+
+	/* note:  no attempt to handle the case where user isn't
+	 * root.
+	 */
+	rc = real___fxstatat64(_STAT_VER, dirfd, path, &buf, AT_SYMLINK_NOFOLLOW);
+	if (rc == -1)
+		return rc;
+
+	if (mode & X_OK) {
+		if (buf.st_mode & 0111) {
+			return 0;
+		} else {
+			errno = EPERM;
+			return -1;
+		}
+	} else {
+		return 0;
+	}
+
+/*	return rc;
+ * }
+ */
ports/linux/wrapfuncs.in +1 -0
index a129eba..2a118fc 100644
@@ -56,3 +56,4 @@ int getgrent_r(struct group *gbuf, char *buf, size_t buflen, struct group **gbuf
 int capset(cap_user_header_t hdrp, const cap_user_data_t datap); /* real_func=pseudo_capset */
 long syscall(long nr, ...); /* hand_wrapped=1 */
 int renameat2(int olddirfd, const char *oldpath, int newdirfd, const char *newpath, unsigned int flags); /* flags=AT_SYMLINK_NOFOLLOW */
+int faccessat(int dirfd, const char *path, int mode, int flags);
Signature · 1 line
2.20.1
#1 lore raw
Quoted 1 line · On Thu, 1 Aug 2019 18:02:06 +0200 Max Kellermann <[email protected]>…

+ * wrap_access(int dirfd, const char *path, int mode, int flags) {

This should probably say "faccessat". I know it's just a comment, but I try to be consistent about these.

ports/linux/guts/faccessat.c line 16

Quoted 1 line
ports/linux/guts/faccessat.c new file +1 -0
+	rc = real___fxstatat64(_STAT_VER, dirfd, path, &buf, AT_SYMLINK_NOFOLLOW);

We should probably be using flags here, not AT_SYMLINK_NOFOLLOW. Or possibly (flags & AT_SYMLINK_NOFOLLOW). Otherwise, we'll get the wrong results if called with flags not including AT_SYMLINK_NOFOLLOW.

-s

#2 lore raw
Quoted 5 lines · Seebs

ports/linux/guts/faccessat.c line 16

Quoted 1 line
ports/linux/guts/faccessat.c new file +1 -0
+	rc = real___fxstatat64(_STAT_VER, dirfd, path, &buf, AT_SYMLINK_NOFOLLOW);

We should probably be using flags here, not AT_SYMLINK_NOFOLLOW. Or possibly (flags & AT_SYMLINK_NOFOLLOW). Otherwise, we'll get the wrong results if called with flags not including AT_SYMLINK_NOFOLLOW.

Thanks, I missed that there was indeed a "flags" parameter which can be forwarded. Will resend the patch.

#3 lore raw

PATCH v2 1/1 ports/linux: wrap faccessat()

In reply to Seebs

From: Max Kellermann <[email protected]>

---
 ports/linux/guts/faccessat.c | 33 +++++++++++++++++++++++++++++++++
 ports/linux/wrapfuncs.in     |  1 +
 2 files changed, 34 insertions(+)
 create mode 100644 ports/linux/guts/faccessat.c
ports/linux/guts/faccessat.c new file +33 -0
new file mode 100644
index 0000000..64189fa
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2019 Max Kellermann <[email protected]>
+ * guts/COPYRIGHT for information.
+ *
+ * SPDX-License-Identifier: LGPL-2.1-only
+ *
+ * static int
+ * wrap_faccessat(int dirfd, const char *path, int mode, int flags) {
+ *	int rc = -1;
+ */
+	struct stat64 buf;
+
+	/* note:  no attempt to handle the case where user isn't
+	 * root.
+	 */
+	rc = real___fxstatat64(_STAT_VER, dirfd, path, &buf, flags);
+	if (rc == -1)
+		return rc;
+
+	if (mode & X_OK) {
+		if (buf.st_mode & 0111) {
+			return 0;
+		} else {
+			errno = EPERM;
+			return -1;
+		}
+	} else {
+		return 0;
+	}
+
+/*	return rc;
+ * }
+ */
ports/linux/wrapfuncs.in +1 -0
index a129eba..2a118fc 100644
@@ -56,3 +56,4 @@ int getgrent_r(struct group *gbuf, char *buf, size_t buflen, struct group **gbuf
 int capset(cap_user_header_t hdrp, const cap_user_data_t datap); /* real_func=pseudo_capset */
 long syscall(long nr, ...); /* hand_wrapped=1 */
 int renameat2(int olddirfd, const char *oldpath, int newdirfd, const char *newpath, unsigned int flags); /* flags=AT_SYMLINK_NOFOLLOW */
+int faccessat(int dirfd, const char *path, int mode, int flags);
Signature · 1 line
2.20.1
#4 lore raw

✗ patchtest: failure for ports/linux: wrap faccessat() (rev2)

In reply to Seebs

== Series Details ==

Series: ports/linux: wrap faccessat() (rev2)
Revision: 2
URL : https://patchwork.openembedded.org/series/19012/
State : failure

== Summary ==

Thank you for submitting this patch series to OpenEmbedded Core. This is an automated response. Several tests have been executed on the proposed series by patchtest resulting in the following failures:

* Issue Series does not apply on top of target branch [test_series_merge_on_head]
Suggested fix Rebase your series on top of targeted branch
Targeted branch master (currently at fc634c41e4)

If you believe any of these test results are incorrect, please reply to the mailing list ([email protected]) raising your concerns. Otherwise we would appreciate you correcting the issues and submitting a new version of the patchset if applicable. Please ensure you add/increment the version number when sending the new version (i.e. [PATCH] -> [PATCH v2] -> [PATCH v3] -> ...).

---

Guidelines:     https://www.openembedded.org/wiki/Commit_Patch_Message_Guidelines
Test framework: http://git.yoctoproject.org/cgit/cgit.cgi/patchtest
Test suite:     http://git.yoctoproject.org/cgit/cgit.cgi/patchtest-oe
#5 lore raw

✗ patchtest: failure for ports/linux: wrap faccessat()

In reply to Max Kellermann

== Series Details ==

Series: ports/linux: wrap faccessat()
Revision: 1
URL : https://patchwork.openembedded.org/series/19012/
State : failure

== Summary ==

Thank you for submitting this patch series to OpenEmbedded Core. This is an automated response. Several tests have been executed on the proposed series by patchtest resulting in the following failures:

* Issue Series does not apply on top of target branch [test_series_merge_on_head]
Suggested fix Rebase your series on top of targeted branch
Targeted branch master (currently at fc634c41e4)

If you believe any of these test results are incorrect, please reply to the mailing list ([email protected]) raising your concerns. Otherwise we would appreciate you correcting the issues and submitting a new version of the patchset if applicable. Please ensure you add/increment the version number when sending the new version (i.e. [PATCH] -> [PATCH v2] -> [PATCH v3] -> ...).

---

Guidelines:     https://www.openembedded.org/wiki/Commit_Patch_Message_Guidelines
Test framework: http://git.yoctoproject.org/cgit/cgit.cgi/patchtest
Test suite:     http://git.yoctoproject.org/cgit/cgit.cgi/patchtest-oe