From 9ad8fadcbbb02492eddf752f1160446b572e8155 Mon Sep 17 00:00:00 2001 From: Lin Yang Date: Thu, 23 Sep 2021 22:33:48 -0700 Subject: [PATCH] Fix bug #81472: Support large device major/minor number Latest linux kernel use large number (12 bits for major device, 20 bits for minor device). Current code only supports previous standard (5 chars), which means 8 bits for major and 8 bits for minor device. It will fail if device number is out of that range. So this patch increases device number read from /proc/self/maps file. Closes GH-7512. --- NEWS | 4 ++++ ext/opcache/ZendAccelerator.c | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index 55989b8f400..e91c8646b70 100644 --- a/NEWS +++ b/NEWS @@ -21,6 +21,10 @@ PHP NEWS . Fixed bug #61700 (FILTER_FLAG_IPV6/FILTER_FLAG_NO_PRIV|RES_RANGE failing). (cmb, Nikita) +- Opcache: + . Fixed bug #81472 (Cannot support large linux major/minor device number when + read /proc/self/maps). (Lin Yang) + - PCRE: . Fixed bug #81424 (PCRE2 10.35 JIT performance regression). (cmb) diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index 6dd109e6c3a..16a77fb3326 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -2803,11 +2803,11 @@ static void accel_move_code_to_huge_pages(void) f = fopen("/proc/self/maps", "r"); if (f) { long unsigned int start, end, offset, inode; - char perm[5], dev[6], name[MAXPATHLEN]; + char perm[5], dev[10], name[MAXPATHLEN]; int ret; while (1) { - ret = fscanf(f, "%lx-%lx %4s %lx %5s %ld %s\n", &start, &end, perm, &offset, dev, &inode, name); + ret = fscanf(f, "%lx-%lx %4s %lx %9s %ld %s\n", &start, &end, perm, &offset, dev, &inode, name); if (ret == 7) { if (perm[0] == 'r' && perm[1] == '-' && perm[2] == 'x' && name[0] == '/') { long unsigned int seg_start = ZEND_MM_ALIGNED_SIZE_EX(start, huge_page_size);