Current libvirt can only handle up to 1024 thread siblings when it reads Linux sysfs topology/thread_siblings. This isn't enough for Linux distributions that support a large value. This patch fixes the problem by using VIR_ALLOC()/VIR_FREE(), instead of using a fixed-size (1024) local char array. In the meanwhile SYSFS_THREAD_SIBLINGS_LIST_LENGTH_MAX is increased to 8192 which should be large enough for a foreseeable future. Signed-off-by: Wei Huang <wei@xxxxxxxxxx> --- src/nodeinfo.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/nodeinfo.c b/src/nodeinfo.c index 34d27a6..66dc7ef 100644 --- a/src/nodeinfo.c +++ b/src/nodeinfo.c @@ -287,7 +287,7 @@ freebsdNodeGetMemoryStats(virNodeMemoryStatsPtr params, # define PROCSTAT_PATH "/proc/stat" # define MEMINFO_PATH "/proc/meminfo" # define SYSFS_MEMORY_SHARED_PATH "/sys/kernel/mm/ksm" -# define SYSFS_THREAD_SIBLINGS_LIST_LENGTH_MAX 1024 +# define SYSFS_THREAD_SIBLINGS_LIST_LENGTH_MAX 8192 # define LINUX_NB_CPU_STATS 4 # define LINUX_NB_MEMORY_STATS_ALL 4 @@ -345,7 +345,7 @@ virNodeCountThreadSiblings(const char *dir, unsigned int cpu) unsigned long ret = 0; char *path; FILE *pathfp; - char str[1024]; + char *str = NULL; size_t i; if (virAsprintf(&path, "%s/cpu%u/topology/thread_siblings", @@ -365,7 +365,10 @@ virNodeCountThreadSiblings(const char *dir, unsigned int cpu) return 0; } - if (fgets(str, sizeof(str), pathfp) == NULL) { + if (VIR_ALLOC_N(str, SYSFS_THREAD_SIBLINGS_LIST_LENGTH_MAX) < 0) + goto cleanup; + + if (fgets(str, SYSFS_THREAD_SIBLINGS_LIST_LENGTH_MAX, pathfp) == NULL) { virReportSystemError(errno, _("cannot read from %s"), path); goto cleanup; } @@ -382,6 +385,7 @@ virNodeCountThreadSiblings(const char *dir, unsigned int cpu) } cleanup: + VIR_FREE(str); VIR_FORCE_FCLOSE(pathfp); VIR_FREE(path); -- 1.8.3.1 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list