From 05d93d5137d3f2669f2f27d94fbc8f21c2e00ab81f339eb99554702c51028aba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Lie?= Date: Fri, 20 Jan 2017 22:37:28 +0000 Subject: [PATCH] Accepting request 451659 from home:mgorse:branches:GNOME:Factory - Add libgtop-bsc1020294-cpu-buffer.patch: dynamically allocate memory for buffer when reading /proc/cpuinfo (bsc#1020294 bgo#323354). OBS-URL: https://build.opensuse.org/request/show/451659 OBS-URL: https://build.opensuse.org/package/show/GNOME:Factory/libgtop?expand=0&rev=69 --- libgtop-bsc1020294-cpu-buffer.patch | 137 ++++++++++++++++++++++++++++ libgtop.changes | 7 ++ libgtop.spec | 3 + 3 files changed, 147 insertions(+) create mode 100644 libgtop-bsc1020294-cpu-buffer.patch diff --git a/libgtop-bsc1020294-cpu-buffer.patch b/libgtop-bsc1020294-cpu-buffer.patch new file mode 100644 index 0000000..26abf8a --- /dev/null +++ b/libgtop-bsc1020294-cpu-buffer.patch @@ -0,0 +1,137 @@ +From b22fddaaa5dc3d667f4b5168c7e95979cf8f7910 Mon Sep 17 00:00:00 2001 +From: Mike Gorse +Date: Wed, 18 Jan 2017 16:40:52 -0600 +Subject: [PATCH] linux: Dynamically allocate the buffer to parse /proc/cpuinfo + +On a server with many cores, /proc/cpuinfo might contain more than 64k of +data, so we weren't fully parsing it, meaning that we'd see fewer cores than +were present. + +https://bugzilla.gnome.org/show_bug.cgi?id=323354 +--- + sysdeps/linux/glibtop_private.c | 63 +++++++++++++++++++++++++++++++++++++++++ + sysdeps/linux/glibtop_private.h | 4 +++ + sysdeps/linux/sysinfo.c | 6 ++-- + 3 files changed, 71 insertions(+), 2 deletions(-) + +diff --git a/sysdeps/linux/glibtop_private.c b/sysdeps/linux/glibtop_private.c +index 52c3782..8c50723 100644 +--- a/sysdeps/linux/glibtop_private.c ++++ b/sysdeps/linux/glibtop_private.c +@@ -133,7 +133,70 @@ file_to_buffer(glibtop *server, char *buffer, size_t bufsiz, const char *filenam + } + } + ++char *file_to_buffer_alloc(const char *format, ...) ++{ ++ char path[4096]; ++ int fd; ++ char *buffer = NULL; ++ size_t len = 0; ++ size_t bufsiz = 16384; ++ ssize_t nread = 0; ++ va_list pa; ++ ++ va_start(pa, format); ++ ++ /* C99 also provides vsnprintf */ ++ g_vsnprintf(path, sizeof path, format, pa); + ++ va_end(pa); ++ ++ buffer = (char *)malloc(bufsiz); ++ if (!buffer) ++ return NULL; ++ ++ buffer [0] = '\0'; ++ ++ if((fd = open (path, O_RDONLY)) < 0) ++ return NULL; ++ ++ for (;;) { ++ nread = read (fd, buffer + len, bufsiz - len - 1); ++ ++ if (G_UNLIKELY(nread < 0)) { ++ if (errno == EINTR) ++ continue; ++ else ++ break; ++ } ++ ++ len += nread; ++ ++ if (nread == 0) ++ break; ++ ++ if (len >= bufsiz - 1) { ++ char *new; ++ bufsiz *= 2; ++ new = realloc (buffer, bufsiz); ++ if (!new) { ++ free (buffer); ++ return NULL; ++ } ++ buffer = new; ++ } ++ } ++ ++ close (fd); ++ ++ if (nread < 0) { ++ free (buffer); ++ return NULL; ++ } ++ ++ buffer [len] = '\0'; ++ ++ return buffer; ++} + + + static unsigned long +diff --git a/sysdeps/linux/glibtop_private.h b/sysdeps/linux/glibtop_private.h +index 149832a..0ff2ea0 100644 +--- a/sysdeps/linux/glibtop_private.h ++++ b/sysdeps/linux/glibtop_private.h +@@ -78,6 +78,10 @@ file_to_buffer(glibtop *server, char *buffer, size_t bufsiz, const char *filenam + int + try_file_to_buffer(char *buffer, size_t bufsiz, const char *format, ...) G_GNUC_PRINTF(3, 4); + ++/* Returns an allocated buffer to be freed with free(), or NULL on error */ ++char * ++file_to_buffer_alloc(const char *format, ...) G_GNUC_PRINTF(1, 2); ++ + + /* some inline functions that wrap proc path + * as fast as macros :) +diff --git a/sysdeps/linux/sysinfo.c b/sysdeps/linux/sysinfo.c +index bd80b0d..14bfd8b 100644 +--- a/sysdeps/linux/sysinfo.c ++++ b/sysdeps/linux/sysinfo.c +@@ -36,12 +36,13 @@ static glibtop_sysinfo sysinfo = { .flags = 0 }; + static void + init_sysinfo (glibtop *server) + { +- char buffer [65536]; ++ char *buffer; + gchar ** processors; + + if(G_LIKELY(sysinfo.flags)) return; + +- file_to_buffer(server, buffer, sizeof buffer, FILENAME); ++ buffer = file_to_buffer_alloc(FILENAME); ++ if (!buffer) return; + + /* cpuinfo records are seperated by a blank line */ + processors = g_strsplit(buffer, "\n\n", 0); +@@ -88,6 +89,7 @@ init_sysinfo (glibtop *server) + } + + g_strfreev(processors); ++ g_free(buffer); + + sysinfo.flags = _glibtop_sysdeps_sysinfo; + } +-- +2.6.6 + diff --git a/libgtop.changes b/libgtop.changes index c1a039a..37cd7a0 100644 --- a/libgtop.changes +++ b/libgtop.changes @@ -1,3 +1,10 @@ +------------------------------------------------------------------- +Thu Jan 19 17:29:25 UTC 2017 - mgorse@suse.com + +- Add libgtop-bsc1020294-cpu-buffer.patch: dynamically allocate + memory for buffer when reading /proc/cpuinfo (bsc#1020294 + bgo#323354). + ------------------------------------------------------------------- Mon Jan 16 20:39:12 UTC 2017 - zaitor@opensuse.org diff --git a/libgtop.spec b/libgtop.spec index f19c25b..38ba22c 100644 --- a/libgtop.spec +++ b/libgtop.spec @@ -26,6 +26,8 @@ Group: System/Libraries Url: https://developer.gnome.org/libgtop/stable/ Source: http://download.gnome.org/sources/libgtop/2.34/%{name}-%{version}.tar.xz Source99: baselibs.conf +# PATCH-FIX-UPSTREAM libgtop-bsc1020294-cpu-buffer.patch bsc#1020294 bgo#323354 mgorse@suse.com -- dynamically allocate buffer when reading /proc/cpuinfo. +Patch0: libgtop-bsc1020294-cpu-buffer.patch BuildRequires: fdupes BuildRequires: glib2-devel BuildRequires: gobject-introspection-devel @@ -112,6 +114,7 @@ from /dev/kmem. %lang_package %prep %setup -q +%patch0 -p1 %if !0%{?is_opensuse} translation-update-upstream po libgtop # rpmlint note: libgtop has a separate translation for both Bengali and Bengali India