From: Emmanuel D. <ma...@ne...> - 2011-12-15 09:21:19
Attachments:
getgroups_sysctl.patch
|
Hello Since no consensus was reached to send secondary groups in the FUSE header, I fallback to the attached patch that implements asynchronous secondary group fetching for NetBSD using sysctl(2), just like Linux does using /proc -- Emmanuel Dreyfus ma...@ne... |
From: Emmanuel D. <ma...@ne...> - 2011-12-19 14:50:27
|
Hello I got no feedbaack on that one. Any comment? On Thu, Dec 15, 2011 at 09:21:08AM +0000, Emmanuel Dreyfus wrote: > Hello > > Since no consensus was reached to send secondary groups in the FUSE header, > I fallback to the attached patch that implements asynchronous secondary > group fetching for NetBSD using sysctl(2), just like Linux does using /proc > > -- > Emmanuel Dreyfus > ma...@ne... > diff --git a/lib/fuse_lowlevel.c b/lib/fuse_lowlevel.c > index b1c7a24..e5a5b2c 100644 > --- a/lib/fuse_lowlevel.c > +++ b/lib/fuse_lowlevel.c > @@ -23,6 +23,9 @@ > #include <limits.h> > #include <errno.h> > #include <assert.h> > +#ifdef __NetBSD__ > +#include <sys/sysctl.h> > +#endif /* __NetBSD__ */ > > #ifndef F_LINUX_SPECIFIC_BASE > #define F_LINUX_SPECIFIC_BASE 1024 > @@ -2792,7 +2795,7 @@ struct fuse_session *fuse_lowlevel_new(struct fuse_args *args, > } > > #ifdef linux > -int fuse_req_getgroups(fuse_req_t req, int size, gid_t list[]) > +static int fuse_req_getgroups_proc(fuse_req_t req, int size, gid_t list[]) > { > char *buf; > size_t bufsize = 1024; > @@ -2850,15 +2853,43 @@ out_free: > free(buf); > return ret; > } > -#else /* linux */ > +#endif /* linux */ > + > +#ifdef __NetBSD__ > +static int fuse_req_getgroups_sysctl(fuse_req_t req, int size, gid_t list[]) > +{ > + int name[] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, req->ctx.pid }; > + size_t namelen = sizeof(name) / sizeof(*name); > + struct kinfo_proc kp; > + size_t kplen = sizeof(kp); > + int i; > + > + if (sysctl(name, namelen, &kp, &kplen, NULL, 0) != 0) > + return -errno; > + > + for (i = 0; i < MIN(kp.kp_eproc.e_ucred.cr_ngroups, size); i++) > + list[i] = (gid_t)kp.kp_eproc.e_ucred.cr_groups[i]; > + > + return i; > +} > +#endif /* __NetBSD__ */ > + > /* > - * This is currently not implemented on other than Linux... > + * Unfortunately there is no portable way of doing this. > + * XXX Asynchronous fetching of group list is a security hazard, > + * since credentials can be changed by another thread, or during > + * an asynchronous I/O. > */ > int fuse_req_getgroups(fuse_req_t req, int size, gid_t list[]) > { > +#if defined(linux) > + return fuse_req_getgroups_proc(req, size, list); > +#elif defined(__NetBSD__) > + return fuse_req_getgroups_sysctl(req, size, list); > +#else > return -ENOSYS; > -} > #endif > +} > > #if !defined(__FreeBSD__) && !defined(__NetBSD__) > > ------------------------------------------------------------------------------ > 10 Tips for Better Server Consolidation > Server virtualization is being driven by many needs. > But none more important than the need to reduce IT complexity > while improving strategic productivity. Learn More! > http://www.accelacomm.com/jaw/sdnl/114/51507609/ > _______________________________________________ > fuse-devel mailing list > fus...@li... > https://lists.sourceforge.net/lists/listinfo/fuse-devel -- Emmanuel Dreyfus ma...@ne... |
From: Miklos S. <mi...@sz...> - 2011-12-19 16:39:13
|
Emmanuel Dreyfus <ma...@ne...> writes: > Hello > > I got no feedbaack on that one. Any comment? > > On Thu, Dec 15, 2011 at 09:21:08AM +0000, Emmanuel Dreyfus wrote: >> Hello >> >> Since no consensus was reached to send secondary groups in the FUSE header, >> I fallback to the attached patch that implements asynchronous secondary >> group fetching for NetBSD using sysctl(2), just like Linux does using >> /proc I cannot verify the patch, but otherwise it looks fine. If you say you tested it on NetBSD, then I'll commit it. Thanks, Miklos >> >> -- >> Emmanuel Dreyfus >> ma...@ne... > >> diff --git a/lib/fuse_lowlevel.c b/lib/fuse_lowlevel.c >> index b1c7a24..e5a5b2c 100644 >> --- a/lib/fuse_lowlevel.c >> +++ b/lib/fuse_lowlevel.c >> @@ -23,6 +23,9 @@ >> #include <limits.h> >> #include <errno.h> >> #include <assert.h> >> +#ifdef __NetBSD__ >> +#include <sys/sysctl.h> >> +#endif /* __NetBSD__ */ >> >> #ifndef F_LINUX_SPECIFIC_BASE >> #define F_LINUX_SPECIFIC_BASE 1024 >> @@ -2792,7 +2795,7 @@ struct fuse_session *fuse_lowlevel_new(struct fuse_args *args, >> } >> >> #ifdef linux >> -int fuse_req_getgroups(fuse_req_t req, int size, gid_t list[]) >> +static int fuse_req_getgroups_proc(fuse_req_t req, int size, gid_t list[]) >> { >> char *buf; >> size_t bufsize = 1024; >> @@ -2850,15 +2853,43 @@ out_free: >> free(buf); >> return ret; >> } >> -#else /* linux */ >> +#endif /* linux */ >> + >> +#ifdef __NetBSD__ >> +static int fuse_req_getgroups_sysctl(fuse_req_t req, int size, gid_t list[]) >> +{ >> + int name[] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, req->ctx.pid }; >> + size_t namelen = sizeof(name) / sizeof(*name); >> + struct kinfo_proc kp; >> + size_t kplen = sizeof(kp); >> + int i; >> + >> + if (sysctl(name, namelen, &kp, &kplen, NULL, 0) != 0) >> + return -errno; >> + >> + for (i = 0; i < MIN(kp.kp_eproc.e_ucred.cr_ngroups, size); i++) >> + list[i] = (gid_t)kp.kp_eproc.e_ucred.cr_groups[i]; >> + >> + return i; >> +} >> +#endif /* __NetBSD__ */ >> + >> /* >> - * This is currently not implemented on other than Linux... >> + * Unfortunately there is no portable way of doing this. >> + * XXX Asynchronous fetching of group list is a security hazard, >> + * since credentials can be changed by another thread, or during >> + * an asynchronous I/O. >> */ >> int fuse_req_getgroups(fuse_req_t req, int size, gid_t list[]) >> { >> +#if defined(linux) >> + return fuse_req_getgroups_proc(req, size, list); >> +#elif defined(__NetBSD__) >> + return fuse_req_getgroups_sysctl(req, size, list); >> +#else >> return -ENOSYS; >> -} >> #endif >> +} >> >> #if !defined(__FreeBSD__) && !defined(__NetBSD__) >> > >> ------------------------------------------------------------------------------ >> 10 Tips for Better Server Consolidation >> Server virtualization is being driven by many needs. >> But none more important than the need to reduce IT complexity >> while improving strategic productivity. Learn More! >> http://www.accelacomm.com/jaw/sdnl/114/51507609/ > >> _______________________________________________ >> fuse-devel mailing list >> fus...@li... >> https://lists.sourceforge.net/lists/listinfo/fuse-devel |
From: Emmanuel D. <ma...@ne...> - 2011-12-19 20:30:03
|
On Mon, Dec 19, 2011 at 05:38:16PM +0100, Miklos Szeredi wrote: > If you say you tested it on NetBSD, then I'll commit it. I tested it and it works, please commit it. -- Emmanuel Dreyfus ma...@ne... |