Message ID | 20180823100437.10127-1-emil.l.velikov@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [libdrm] xf86drm: fallback to normal path when realpath fails | expand |
On 2018-08-23 12:04 p.m., Emil Velikov wrote: > From: Emil Velikov <emil.velikov@collabora.com> > > Earlier commit reworked our sysfs handling to use realpath. > Sadly that backfired since the Firefox sandboxing mechanism rejects > that. Despite the files/folders being in the allowed list, of the > sandboxing mechanism. From the Firefox bug report, the problem was stat on the top-level /sys directory. > Oddly enough, the Chromium sandboxing doesn't complain about any of > this. > > Since there are no Firefox releases with the fix, add a temporary > solution which falls back to the original handling. > > Sadly, this won't work for virgl. > > Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=107516 > Cc: Michel Dänzer <michel.daenzer@amd.com> > Cc: Mike <bugs.freedesktop.org@pm.port0.org> > Fixes: a02900133b3 ("xf86drm: introduce a get_real_pci_path() helper") > Signed-off-by: Emil Velikov <emil.velikov@collabora.com> Reviewed-by: Michel Dänzer <michel.daenzer@amd.com> Tested-by: Michel Dänzer <michel.daenzer@amd.com> Thanks Emil!
On Thu, 23 Aug 2018 at 11:38, Michel Dänzer <michel@daenzer.net> wrote: > > On 2018-08-23 12:04 p.m., Emil Velikov wrote: > > From: Emil Velikov <emil.velikov@collabora.com> > > > > Earlier commit reworked our sysfs handling to use realpath. > > Sadly that backfired since the Firefox sandboxing mechanism rejects > > that. Despite the files/folders being in the allowed list, of the > > sandboxing mechanism. > > From the Firefox bug report, the problem was stat on the top-level /sys > directory. > That's the part I didn't quite get. I don't see anything in libdrm that would do that. We do have fstat(open("/dev/dri/foo"), stat("/dev/dri/foo"). I guess the C runtime (compiler?) might be doing that one? Like the realpath call being translated to a series of stat() calls. > > > Oddly enough, the Chromium sandboxing doesn't complain about any of > > this. > > > > Since there are no Firefox releases with the fix, add a temporary > > solution which falls back to the original handling. > > > > Sadly, this won't work for virgl. > > > > Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=107516 > > Cc: Michel Dänzer <michel.daenzer@amd.com> > > Cc: Mike <bugs.freedesktop.org@pm.port0.org> > > Fixes: a02900133b3 ("xf86drm: introduce a get_real_pci_path() helper") > > Signed-off-by: Emil Velikov <emil.velikov@collabora.com> > > Reviewed-by: Michel Dänzer <michel.daenzer@amd.com> > Tested-by: Michel Dänzer <michel.daenzer@amd.com> > > > Thanks Emil! > Sorry for these experiences. I should really test things with Firefox, saying "it works with Chromium" doesn't quite cut it. Thanks Emil
On 2018-08-23 2:52 p.m., Emil Velikov wrote: > On Thu, 23 Aug 2018 at 11:38, Michel Dänzer <michel@daenzer.net> wrote: >> On 2018-08-23 12:04 p.m., Emil Velikov wrote: >>> From: Emil Velikov <emil.velikov@collabora.com> >>> >>> Earlier commit reworked our sysfs handling to use realpath. >>> Sadly that backfired since the Firefox sandboxing mechanism rejects >>> that. Despite the files/folders being in the allowed list, of the >>> sandboxing mechanism. >> >> From the Firefox bug report, the problem was stat on the top-level /sys >> directory. >> > That's the part I didn't quite get. I don't see anything in libdrm > that would do that. > We do have fstat(open("/dev/dri/foo"), stat("/dev/dri/foo"). > > I guess the C runtime (compiler?) might be doing that one? > Like the realpath call being translated to a series of stat() calls. Yeah, probably something like that. >>> Oddly enough, the Chromium sandboxing doesn't complain about any of >>> this. >>> >>> Since there are no Firefox releases with the fix, add a temporary >>> solution which falls back to the original handling. >>> >>> Sadly, this won't work for virgl. >>> >>> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=107516 >>> Cc: Michel Dänzer <michel.daenzer@amd.com> >>> Cc: Mike <bugs.freedesktop.org@pm.port0.org> >>> Fixes: a02900133b3 ("xf86drm: introduce a get_real_pci_path() helper") >>> Signed-off-by: Emil Velikov <emil.velikov@collabora.com> >> >> Reviewed-by: Michel Dänzer <michel.daenzer@amd.com> >> Tested-by: Michel Dänzer <michel.daenzer@amd.com> These are now also valid for v2, thanks again!
diff --git a/xf86drm.c b/xf86drm.c index 336d64de..964bedf9 100644 --- a/xf86drm.c +++ b/xf86drm.c @@ -3014,6 +3014,14 @@ get_real_pci_path(int maj, int min, char *real_path) return real_path; } +static char * +get_normal_pci_path(int maj, int min, char *normal_path) +{ + snprintf(normal_path, PATH_MAX, "/sys/dev/char/%d:%d/device", maj, min); + + return normal_path; +} + static int drmParsePciBusInfo(int maj, int min, drmPciBusInfoPtr info) { #ifdef __linux__ @@ -3021,7 +3029,8 @@ static int drmParsePciBusInfo(int maj, int min, drmPciBusInfoPtr info) char real_path[PATH_MAX + 1], *value; int num; - if (get_real_pci_path(maj, min, real_path) == NULL) + if (get_real_pci_path(maj, min, real_path) == NULL && + get_normal_pci_path(maj, min, real_path) == NULL) return -ENOENT; value = sysfs_uevent_get(real_path, "PCI_SLOT_NAME"); @@ -3142,7 +3151,8 @@ static int parse_separate_sysfs_files(int maj, int min, FILE *fp; int ret; - if (get_real_pci_path(maj, min, real_path) == NULL) + if (get_real_pci_path(maj, min, real_path) == NULL && + get_normal_pci_path(maj, min, real_path) == NULL) return -ENOENT; for (unsigned i = ignore_revision ? 1 : 0; i < ARRAY_SIZE(attrs); i++) { @@ -3174,7 +3184,8 @@ static int parse_config_sysfs_file(int maj, int min, unsigned char config[64]; int fd, ret; - if (get_real_pci_path(maj, min, real_path) == NULL) + if (get_real_pci_path(maj, min, real_path) == NULL && + get_normal_pci_path(maj, min, real_path) == NULL) return -ENOENT; snprintf(path, PATH_MAX, "%s/config", real_path);