On 03/09/2010 12:30 PM, Chris Lalancette wrote:
1) Do more work at compile time instead of runtime (minor)
2) Properly handle the hex digits that come from
/sys/devices/system/cpu/cpu*/topology/thread_siblings
3) Fix up some error paths that could cause SEGV
4) Used unsigned's for the cpu numbers (cpu -1 doesn't
make any sense)
Kudos for catching some that I missed.
-static int parse_socket(int cpu)
+static int parse_socket(unsigned int cpu)
{
- char *path = NULL;
+ char *path;
FILE *pathfp;
char socket_str[1024];
char *tmp;
- int socket;
+ int socket = -1;
- if (virAsprintf(&path, "%s/cpu%d/topology/physical_package_id",
- CPU_SYS_PATH, cpu) < 0) {
+ if (virAsprintf(&path, CPU_SYS_PATH
"/cpu%u/topology/physical_package_id",
+ cpu) < 0) {
virReportOOMError();
return -1;
}
@@ -120,7 +124,8 @@ static int parse_socket(int cpu)
pathfp = fopen(path, "r");
if (pathfp == NULL) {
virReportSystemError(errno, _("cannot open %s"), path);
- goto cleanup;
+ VIR_FREE(path);
+ return -1;
}
Definitely some SEGV avoidance factors.
@@ -244,6 +249,18 @@ int linuxNodeInfoCPUPopulate(virConnectPtr conn,
FILE *cpuinfo,
closedir(cpudir);
+ /* there should always be at least one socket and one thread */
+ if (nodeinfo->sockets == 0) {
+ nodeReportError(conn, VIR_ERR_INTERNAL_ERROR,
+ "%s", _("no sockets found"));
+ return -1;
+ }
+ if (nodeinfo->threads == 0) {
+ nodeReportError(conn, VIR_ERR_INTERNAL_ERROR,
+ "%s", _("no threads found"));
+ return -1;
+ }
I didn't see this mentioned in the commit log, but it's a good change.
Overall: ACK.
--
Eric Blake eblake(a)redhat.com +1-801-349-2682
Libvirt virtualization library
http://libvirt.org