On Mon, Jun 04, 2018 at 10:23:14AM +0200, Martin Pieuchot wrote:
> On 04/06/18(Mon) 14:26, Helg wrote:
> > Hi Ports,
> >
> > I have an upcoming patch to FUSE that passes the current process tid,
> > uid, gid and umask to the file system. This has highlighted a bug in the
> > port where the groupmember() function in libntfs-3g/security.c assumes
> > it's runing on Linux where thread information is available in /proc.
> >
> > This diff adds an OpenBSD specific implementation of this function.
>
> We should refrain linking to libkvm. In this particular case you should
> be able to call the KERN_PROC sysctl(2) directly.
Let's try this again but with a REVISION bump. This version has no
dependency on kvm.
ok?
Index: Makefile
===================================================================
RCS file: /cvs/ports/sysutils/ntfs-3g/Makefile,v
retrieving revision 1.9
diff -u -p -r1.9 Makefile
--- Makefile 22 Jun 2016 09:51:33 -0000 1.9
+++ Makefile 14 Jun 2018 12:39:37 -0000
@@ -7,6 +7,7 @@ DISTNAME = ntfs-3g_ntfsprogs-${V}
PKGNAME = ntfs_3g-${V}
SHARED_LIBS += ntfs-3g 0.2 # .86
CATEGORIES = sysutils
+REVISION = 0
HOMEPAGE = http://www.tuxera.com/
Index: patches/patch-libntfs-3g_security_c
===================================================================
RCS file: patches/patch-libntfs-3g_security_c
diff -N patches/patch-libntfs-3g_security_c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ patches/patch-libntfs-3g_security_c 14 Jun 2018 12:39:37 -0000
@@ -0,0 +1,85 @@
+$OpenBSD$
+
+Index: libntfs-3g/security.c
+--- libntfs-3g/security.c.orig
++++ libntfs-3g/security.c
+@@ -47,6 +47,10 @@
+ #ifdef HAVE_SYS_STAT_H
+ #include <sys/stat.h>
+ #endif
++#ifdef __OpenBSD__
++#include <sys/sysctl.h>
++#include <sys/types.h>
++#endif
+
+ #include <unistd.h>
+ #include <pwd.h>
+@@ -1228,6 +1232,68 @@ static BOOL groupmember(struct SECURITY_CONTEXT *scx,
+ close(fd);
+ }
+ }
++ return (ismember);
++}
++
++#elif defined(__OpenBSD__)
++
++static BOOL groupmember(struct SECURITY_CONTEXT *scx, uid_t uid, gid_t gid)
++{
++ struct kinfo_proc *kp;
++ size_t size;
++ int mib[6];
++ int ip, ig;
++ int pcnt;
++ gid_t *g;
++ pid_t tid;
++ BOOL ismember;
++
++ if (scx->vol->secure_flags & (1 << SECURITY_STATICGRPS))
++ ismember = staticgroupmember(scx, uid, gid);
++ else {
++ ismember = FALSE; /* default return */
++ tid = scx->tid;
++ mib[0] = CTL_KERN;
++ mib[1] = KERN_PROC;
++ mib[2] = KERN_PROC_ALL | KERN_PROC_SHOW_THREADS;
++ mib[3] = 0;
++ mib[4] = sizeof(struct kinfo_proc);
++ mib[5] = 0;
++ if (sysctl(mib, 6, NULL, &size, NULL, 0) == -1)
++ ntfs_log_error("Could not get size of process table: "
++ "%s\n", strerror(errno));
++ else {
++ mib[5] = size / sizeof(struct kinfo_proc);
++ kp = malloc(size);
++ if ((kp == NULL) ||
++ (sysctl(mib, 6, kp, &size, NULL, 0) == -1))
++ ntfs_log_error("Could not get process table: "
++ "%s\n", strerror(errno));
++ else {
++ pcnt = size / sizeof(struct kinfo_proc);
++ ip = 0;
++ while ((kp[ip].p_tid != tid) && (ip < pcnt))
++ ip++;
++
++ if (ip < pcnt) {
++ if (kp[ip].p_gid == gid)
++ ismember = TRUE;
++ g = kp[ip].p_groups;
++ ig = 0;
++ while (!ismember
++ && (ig < kp[ip].p_ngroups)
++ && (*g != gid)) {
++ ig++;
++ g++;
++ }
++ if (ig < kp[ip].p_ngroups)
++ ismember = TRUE;
++ }
++ free(kp);
++ }
++ }
++ }
++
+ return (ismember);
+ }
+