diff options
author | Eric Blake <eblake@redhat.com> | 2012-02-10 16:08:11 -0700 |
---|---|---|
committer | Eric Blake <eblake@redhat.com> | 2012-03-02 06:57:43 -0700 |
commit | 3e2c3d8f6d5ca4a6135101cda3e73c51304af683 (patch) | |
tree | e586d4a1a39ff74a95fdc3c08b1eb47833ae148e /src | |
parent | build: prohibit cross-inclusion (diff) | |
download | libvirt-3e2c3d8f6d5ca4a6135101cda3e73c51304af683.tar.gz libvirt-3e2c3d8f6d5ca4a6135101cda3e73c51304af683.tar.bz2 libvirt-3e2c3d8f6d5ca4a6135101cda3e73c51304af683.zip |
build: use correct type for pid and similar types
No thanks to 64-bit windows, with 64-bit pid_t, we have to avoid
constructs like 'int pid'. Our API in libvirt-qemu cannot be
changed without breaking ABI; but then again, libvirt-qemu can
only be used on systems that support UNIX sockets, which rules
out Windows (even if qemu could be compiled there) - so for all
points on the call chain that interact with this API decision,
we require a different variable name to make it clear that we
audited the use for safety.
Adding a syntax-check rule only solves half the battle; anywhere
that uses printf on a pid_t still needs to be converted, but that
will be a separate patch.
* cfg.mk (sc_correct_id_types): New syntax check.
* src/libvirt-qemu.c (virDomainQemuAttach): Document why we didn't
use pid_t for pid, and validate for overflow.
* include/libvirt/libvirt-qemu.h (virDomainQemuAttach): Tweak name
for syntax check.
* src/vmware/vmware_conf.c (vmwareExtractPid): Likewise.
* src/driver.h (virDrvDomainQemuAttach): Likewise.
* tools/virsh.c (cmdQemuAttach): Likewise.
* src/remote/qemu_protocol.x (qemu_domain_attach_args): Likewise.
* src/qemu_protocol-structs (qemu_domain_attach_args): Likewise.
* src/util/cgroup.c (virCgroupPidCode, virCgroupKillInternal):
Likewise.
* src/qemu/qemu_command.c(qemuParseProcFileStrings): Likewise.
(qemuParseCommandLinePid): Use pid_t for pid.
* daemon/libvirtd.c (daemonForkIntoBackground): Likewise.
* src/conf/domain_conf.h (_virDomainObj): Likewise.
* src/probes.d (rpc_socket_new): Likewise.
* src/qemu/qemu_command.h (qemuParseCommandLinePid): Likewise.
* src/qemu/qemu_driver.c (qemudGetProcessInfo, qemuDomainAttach):
Likewise.
* src/qemu/qemu_process.c (qemuProcessAttach): Likewise.
* src/qemu/qemu_process.h (qemuProcessAttach): Likewise.
* src/uml/uml_driver.c (umlGetProcessInfo): Likewise.
* src/util/virnetdev.h (virNetDevSetNamespace): Likewise.
* src/util/virnetdev.c (virNetDevSetNamespace): Likewise.
* tests/testutils.c (virtTestCaptureProgramOutput): Likewise.
* src/conf/storage_conf.h (_virStoragePerms): Use mode_t, uid_t,
and gid_t rather than int.
* src/security/security_dac.c (virSecurityDACSetOwnership): Likewise.
* src/conf/storage_conf.c (virStorageDefParsePerms): Avoid
compiler warning.
Diffstat (limited to 'src')
-rw-r--r-- | src/conf/domain_conf.h | 2 | ||||
-rw-r--r-- | src/conf/storage_conf.c | 2 | ||||
-rw-r--r-- | src/conf/storage_conf.h | 6 | ||||
-rw-r--r-- | src/driver.h | 3 | ||||
-rw-r--r-- | src/libvirt-qemu.c | 17 | ||||
-rw-r--r-- | src/probes.d | 2 | ||||
-rw-r--r-- | src/qemu/qemu_command.c | 15 | ||||
-rw-r--r-- | src/qemu/qemu_command.h | 4 | ||||
-rw-r--r-- | src/qemu/qemu_driver.c | 24 | ||||
-rw-r--r-- | src/qemu/qemu_process.c | 2 | ||||
-rw-r--r-- | src/qemu/qemu_process.h | 2 | ||||
-rw-r--r-- | src/qemu_protocol-structs | 2 | ||||
-rw-r--r-- | src/remote/qemu_protocol.x | 4 | ||||
-rw-r--r-- | src/security/security_dac.c | 27 | ||||
-rw-r--r-- | src/uml/uml_driver.c | 6 | ||||
-rw-r--r-- | src/util/cgroup.c | 17 | ||||
-rw-r--r-- | src/util/virnetdev.c | 4 | ||||
-rw-r--r-- | src/util/virnetdev.h | 2 | ||||
-rw-r--r-- | src/vmware/vmware_conf.c | 10 |
19 files changed, 86 insertions, 65 deletions
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 596be4d8e..d98a55181 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -1679,7 +1679,7 @@ struct _virDomainObj { virMutex lock; int refs; - int pid; + pid_t pid; virDomainStateReason state; unsigned int autostart : 1; diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c index dadc115af..87f3d6a16 100644 --- a/src/conf/storage_conf.c +++ b/src/conf/storage_conf.c @@ -572,7 +572,7 @@ virStorageDefParsePerms(xmlXPathContextPtr ctxt, } else { char *end = NULL; perms->mode = strtol(mode, &end, 8); - if (*end || perms->mode < 0 || perms->mode > 0777) { + if (*end || (perms->mode & ~0777)) { VIR_FREE(mode); virStorageReportError(VIR_ERR_XML_ERROR, "%s", _("malformed octal mode")); diff --git a/src/conf/storage_conf.h b/src/conf/storage_conf.h index 19bbd2cdc..dfed0bfbc 100644 --- a/src/conf/storage_conf.h +++ b/src/conf/storage_conf.h @@ -38,9 +38,9 @@ typedef struct _virStoragePerms virStoragePerms; typedef virStoragePerms *virStoragePermsPtr; struct _virStoragePerms { - int mode; - int uid; - int gid; + mode_t mode; + uid_t uid; + gid_t gid; char *label; }; diff --git a/src/driver.h b/src/driver.h index 40ff194f6..212d2f5e7 100644 --- a/src/driver.h +++ b/src/driver.h @@ -661,9 +661,10 @@ typedef int (*virDrvDomainQemuMonitorCommand)(virDomainPtr domain, const char *cmd, char **result, unsigned int flags); +/* Choice of unsigned int rather than pid_t is intentional. */ typedef virDomainPtr (*virDrvDomainQemuAttach)(virConnectPtr conn, - unsigned int pid, + unsigned int pid_value, unsigned int flags); typedef int diff --git a/src/libvirt-qemu.c b/src/libvirt-qemu.c index 248cc33fe..5267bba8c 100644 --- a/src/libvirt-qemu.c +++ b/src/libvirt-qemu.c @@ -2,7 +2,7 @@ * libvirt-qemu.c: Interfaces for the libvirt library to handle qemu-specific * APIs. * - * Copyright (C) 2010-2011 Red Hat, Inc. + * Copyright (C) 2010-2012 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -116,7 +116,7 @@ error: /** * virDomainQemuAttach: * @conn: pointer to a hypervisor connection - * @pid: the UNIX process ID of the external QEMU process + * @pid_value: the UNIX process ID of the external QEMU process * @flags: optional flags, currently unused * * This API is QEMU specific, so it will only work with hypervisor @@ -133,6 +133,10 @@ error: * - The '-name' and '-uuid' arguments should have been set (not * mandatory, but strongly recommended) * + * To date, the only platforms we know of where pid_t is larger than + * unsigned int (64-bit Windows) also lack UNIX sockets, so the choice + * of @pid_value as an unsigned int should not present any difficulties. + * * If successful, then the guest will appear in the list of running * domains for this connection, and other APIs should operate * normally (provided the above requirements were honored). @@ -141,10 +145,11 @@ error: */ virDomainPtr virDomainQemuAttach(virConnectPtr conn, - unsigned int pid, + unsigned int pid_value, unsigned int flags) { - VIR_DEBUG("conn=%p, pid=%u, flags=%x", conn, pid, flags); + pid_t pid = pid_value; + VIR_DEBUG("conn=%p, pid=%u, flags=%x", conn, pid_value, flags); virResetLastError(); @@ -154,7 +159,7 @@ virDomainQemuAttach(virConnectPtr conn, return NULL; } - if (pid <= 1) { + if (pid != pid_value || pid <= 1) { virLibDomainError(domain, VIR_ERR_INVALID_ARG, __FUNCTION__); goto error; } @@ -166,7 +171,7 @@ virDomainQemuAttach(virConnectPtr conn, if (conn->driver->qemuDomainAttach) { virDomainPtr ret; - ret = conn->driver->qemuDomainAttach(conn, pid, flags); + ret = conn->driver->qemuDomainAttach(conn, pid_value, flags); if (!ret) goto error; return ret; diff --git a/src/probes.d b/src/probes.d index 64abc57f9..9d70cc972 100644 --- a/src/probes.d +++ b/src/probes.d @@ -18,7 +18,7 @@ provider libvirt { # file: src/rpc/virnetsocket.c # prefix: rpc - probe rpc_socket_new(void *sock, int refs, int fd, int errfd, int pid, const char *localAddr, const char *remoteAddr); + probe rpc_socket_new(void *sock, int refs, int fd, int errfd, pid_t pid, const char *localAddr, const char *remoteAddr); probe rpc_socket_send_fd(void *sock, int fd); probe rpc_socket_recv_fd(void *sock, int fd); probe rpc_socket_ref(void *sock, int refs); diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 5e0ca9528..170b01087 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -7954,7 +7954,7 @@ cleanup: } -static int qemuParseProcFileStrings(unsigned int pid, +static int qemuParseProcFileStrings(int pid_value, const char *name, const char ***list) { @@ -7967,7 +7967,7 @@ static int qemuParseProcFileStrings(unsigned int pid, const char **str = NULL; int i; - if (virAsprintf(&path, "/proc/%u/%s", pid, name) < 0) { + if (virAsprintf(&path, "/proc/%d/%s", pid_value, name) < 0) { virReportOOMError(); goto cleanup; } @@ -8014,7 +8014,7 @@ cleanup: } virDomainDefPtr qemuParseCommandLinePid(virCapsPtr caps, - unsigned int pid, + pid_t pid, char **pidfile, virDomainChrSourceDefPtr *monConfig, bool *monJSON) @@ -8026,7 +8026,10 @@ virDomainDefPtr qemuParseCommandLinePid(virCapsPtr caps, char *emulator; int i; - if (qemuParseProcFileStrings(pid, "cmdline", &progargv) < 0 || + /* The parser requires /proc/pid, which only exists on platforms + * like Linux where pid_t fits in int. */ + if ((int) pid != pid || + qemuParseProcFileStrings(pid, "cmdline", &progargv) < 0 || qemuParseProcFileStrings(pid, "environ", &progenv) < 0) goto cleanup; @@ -8034,7 +8037,7 @@ virDomainDefPtr qemuParseCommandLinePid(virCapsPtr caps, pidfile, monConfig, monJSON))) goto cleanup; - if (virAsprintf(&exepath, "/proc/%u/exe", pid) < 0) { + if (virAsprintf(&exepath, "/proc/%d/exe", (int) pid) < 0) { virReportOOMError(); goto cleanup; } @@ -8042,7 +8045,7 @@ virDomainDefPtr qemuParseCommandLinePid(virCapsPtr caps, if (virFileResolveLink(exepath, &emulator) < 0) { virReportSystemError(errno, _("Unable to resolve %s for pid %u"), - exepath, pid); + exepath, (int) pid); goto cleanup; } VIR_FREE(def->emulator); diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h index 6ace8f3f8..1eafeb3ce 100644 --- a/src/qemu/qemu_command.h +++ b/src/qemu/qemu_command.h @@ -1,7 +1,7 @@ /* * qemu_command.h: QEMU command generation * - * Copyright (C) 2006-2011 Red Hat, Inc. + * Copyright (C) 2006-2012 Red Hat, Inc. * Copyright (C) 2006 Daniel P. Berrange * * This library is free software; you can redistribute it and/or @@ -170,7 +170,7 @@ virDomainDefPtr qemuParseCommandLineString(virCapsPtr caps, virDomainChrSourceDefPtr *monConfig, bool *monJSON); virDomainDefPtr qemuParseCommandLinePid(virCapsPtr caps, - unsigned int pid, + pid_t pid, char **pidfile, virDomainChrSourceDefPtr *monConfig, bool *monJSON); diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index c6bdd299f..2afcc3fc2 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -1056,7 +1056,7 @@ cleanup: static int qemudGetProcessInfo(unsigned long long *cpuTime, int *lastCpu, long *vm_rss, - int pid, int tid) + pid_t pid, int tid) { char *proc; FILE *pidinfo; @@ -1065,10 +1065,12 @@ qemudGetProcessInfo(unsigned long long *cpuTime, int *lastCpu, long *vm_rss, int cpu; int ret; + /* In general, we cannot assume pid_t fits in int; but /proc parsing + * is specific to Linux where int works fine. */ if (tid) - ret = virAsprintf(&proc, "/proc/%d/task/%d/stat", pid, tid); + ret = virAsprintf(&proc, "/proc/%d/task/%d/stat", (int) pid, tid); else - ret = virAsprintf(&proc, "/proc/%d/stat", pid); + ret = virAsprintf(&proc, "/proc/%d/stat", (int) pid); if (ret < 0) return -1; @@ -1120,7 +1122,7 @@ qemudGetProcessInfo(unsigned long long *cpuTime, int *lastCpu, long *vm_rss, VIR_DEBUG("Got status for %d/%d user=%llu sys=%llu cpu=%d rss=%ld", - pid, tid, usertime, systime, cpu, rss); + (int) pid, tid, usertime, systime, cpu, rss); VIR_FORCE_FCLOSE(pidinfo); @@ -11147,7 +11149,7 @@ cleanup: static virDomainPtr qemuDomainAttach(virConnectPtr conn, - unsigned int pid, + unsigned int pid_value, unsigned int flags) { struct qemud_driver *driver = conn->privateData; @@ -11156,6 +11158,7 @@ static virDomainPtr qemuDomainAttach(virConnectPtr conn, virDomainPtr dom = NULL; virDomainChrSourceDefPtr monConfig = NULL; bool monJSON = false; + pid_t pid = pid_value; char *pidfile = NULL; virCheckFlags(0, NULL); @@ -11168,19 +11171,20 @@ static virDomainPtr qemuDomainAttach(virConnectPtr conn, if (!monConfig) { qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("No monitor connection for pid %u"), - pid); + _("No monitor connection for pid %u"), pid_value); goto cleanup; } if (monConfig->type != VIR_DOMAIN_CHR_TYPE_UNIX) { qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Cannot connect to monitor connection of type '%s' for pid %u"), - virDomainChrTypeToString(monConfig->type), pid); + _("Cannot connect to monitor connection of type '%s' " + "for pid %u"), + virDomainChrTypeToString(monConfig->type), + pid_value); goto cleanup; } if (!(def->name) && - virAsprintf(&def->name, "attach-pid-%u", pid) < 0) { + virAsprintf(&def->name, "attach-pid-%u", pid_value) < 0) { virReportOOMError(); goto cleanup; } diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 36e5ce612..7b9981467 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -3844,7 +3844,7 @@ retry: int qemuProcessAttach(virConnectPtr conn ATTRIBUTE_UNUSED, struct qemud_driver *driver, virDomainObjPtr vm, - int pid, + pid_t pid, const char *pidfile, virDomainChrSourceDefPtr monConfig, bool monJSON) diff --git a/src/qemu/qemu_process.h b/src/qemu/qemu_process.h index 7a23fcc3a..2c1d0b582 100644 --- a/src/qemu/qemu_process.h +++ b/src/qemu/qemu_process.h @@ -63,7 +63,7 @@ void qemuProcessStop(struct qemud_driver *driver, int qemuProcessAttach(virConnectPtr conn, struct qemud_driver *driver, virDomainObjPtr vm, - int pid, + pid_t pid, const char *pidfile, virDomainChrSourceDefPtr monConfig, bool monJSON); diff --git a/src/qemu_protocol-structs b/src/qemu_protocol-structs index 039747157..67968eb7d 100644 --- a/src/qemu_protocol-structs +++ b/src/qemu_protocol-structs @@ -13,7 +13,7 @@ struct qemu_monitor_command_ret { remote_nonnull_string result; }; struct qemu_domain_attach_args { - u_int pid; + u_int pid_value; u_int flags; }; struct qemu_domain_attach_ret { diff --git a/src/remote/qemu_protocol.x b/src/remote/qemu_protocol.x index 39f9adfe1..5afe680ac 100644 --- a/src/remote/qemu_protocol.x +++ b/src/remote/qemu_protocol.x @@ -3,7 +3,7 @@ * remote_internal driver and libvirtd. This protocol is * internal and may change at any time. * - * Copyright (C) 2010-2011 Red Hat, Inc. + * Copyright (C) 2010-2012 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -39,7 +39,7 @@ struct qemu_monitor_command_ret { struct qemu_domain_attach_args { - unsigned int pid; + unsigned int pid_value; unsigned int flags; }; diff --git a/src/security/security_dac.c b/src/security/security_dac.c index 3e1a72f36..e71dc20d6 100644 --- a/src/security/security_dac.c +++ b/src/security/security_dac.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010-2011 Red Hat, Inc. + * Copyright (C) 2010-2012 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -94,9 +94,10 @@ static const char * virSecurityDACGetDOI(virSecurityManagerPtr mgr ATTRIBUTE_UNU } static int -virSecurityDACSetOwnership(const char *path, int uid, int gid) +virSecurityDACSetOwnership(const char *path, uid_t uid, gid_t gid) { - VIR_INFO("Setting DAC user and group on '%s' to '%d:%d'", path, uid, gid); + VIR_INFO("Setting DAC user and group on '%s' to '%ld:%ld'", + path, (long) uid, (long) gid); if (chown(path, uid, gid) < 0) { struct stat sb; @@ -111,18 +112,22 @@ virSecurityDACSetOwnership(const char *path, int uid, int gid) } if (chown_errno == EOPNOTSUPP || chown_errno == EINVAL) { - VIR_INFO("Setting user and group to '%d:%d' on '%s' not supported by filesystem", - uid, gid, path); + VIR_INFO("Setting user and group to '%ld:%ld' on '%s' not " + "supported by filesystem", + (long) uid, (long) gid, path); } else if (chown_errno == EPERM) { - VIR_INFO("Setting user and group to '%d:%d' on '%s' not permitted", - uid, gid, path); + VIR_INFO("Setting user and group to '%ld:%ld' on '%s' not " + "permitted", + (long) uid, (long) gid, path); } else if (chown_errno == EROFS) { - VIR_INFO("Setting user and group to '%d:%d' on '%s' not possible on readonly filesystem", - uid, gid, path); + VIR_INFO("Setting user and group to '%ld:%ld' on '%s' not " + "possible on readonly filesystem", + (long) uid, (long) gid, path); } else { virReportSystemError(chown_errno, - _("unable to set user and group to '%d:%d' on '%s'"), - uid, gid, path); + _("unable to set user and group to '%ld:%ld' " + "on '%s'"), + (long) uid, (long) gid, path); return -1; } } diff --git a/src/uml/uml_driver.c b/src/uml/uml_driver.c index cbb2c0ed4..378dffcc3 100644 --- a/src/uml/uml_driver.c +++ b/src/uml/uml_driver.c @@ -1,7 +1,7 @@ /* * uml_driver.c: core driver methods for managing UML guests * - * Copyright (C) 2006-2011 Red Hat, Inc. + * Copyright (C) 2006-2012 Red Hat, Inc. * Copyright (C) 2006-2008 Daniel P. Berrange * * This library is free software; you can redistribute it and/or @@ -1240,13 +1240,13 @@ static char *umlGetCapabilities(virConnectPtr conn) { -static int umlGetProcessInfo(unsigned long long *cpuTime, int pid) +static int umlGetProcessInfo(unsigned long long *cpuTime, pid_t pid) { char *proc; FILE *pidinfo; unsigned long long usertime, systime; - if (virAsprintf(&proc, "/proc/%d/stat", pid) < 0) { + if (virAsprintf(&proc, "/proc/%lld/stat", (long long) pid) < 0) { return -1; } diff --git a/src/util/cgroup.c b/src/util/cgroup.c index 15b870d84..00528c522 100644 --- a/src/util/cgroup.c +++ b/src/util/cgroup.c @@ -1598,19 +1598,20 @@ static int virCgroupKillInternal(virCgroupPtr group, int signum, virHashTablePtr goto cleanup; } else { while (!feof(fp)) { - unsigned long pid; - if (fscanf(fp, "%lu", &pid) != 1) { + unsigned long pid_value; + if (fscanf(fp, "%lu", &pid_value) != 1) { if (feof(fp)) break; rc = -errno; VIR_DEBUG("Failed to read %s: %m\n", keypath); goto cleanup; } - if (virHashLookup(pids, (void*)pid)) + if (virHashLookup(pids, (void*)pid_value)) continue; - VIR_DEBUG("pid=%lu", pid); - if (kill((pid_t)pid, signum) < 0) { + VIR_DEBUG("pid=%lu", pid_value); + /* Cgroups is a Linux concept, so this cast is safe. */ + if (kill((pid_t)pid_value, signum) < 0) { if (errno != ESRCH) { rc = -errno; goto cleanup; @@ -1621,7 +1622,7 @@ static int virCgroupKillInternal(virCgroupPtr group, int signum, virHashTablePtr done = false; } - ignore_value(virHashAddEntry(pids, (void*)pid, (void*)1)); + ignore_value(virHashAddEntry(pids, (void*)pid_value, (void*)1)); } VIR_FORCE_FCLOSE(fp); } @@ -1639,8 +1640,8 @@ cleanup: static uint32_t virCgroupPidCode(const void *name, uint32_t seed) { - unsigned long pid = (unsigned long)(intptr_t)name; - return virHashCodeGen(&pid, sizeof(pid), seed); + unsigned long pid_value = (unsigned long)(intptr_t)name; + return virHashCodeGen(&pid_value, sizeof(pid_value), seed); } static bool virCgroupPidEqual(const void *namea, const void *nameb) { diff --git a/src/util/virnetdev.c b/src/util/virnetdev.c index 9d76d471f..4aa763992 100644 --- a/src/util/virnetdev.c +++ b/src/util/virnetdev.c @@ -443,7 +443,7 @@ int virNetDevSetMTUFromDevice(const char *ifname, * * Returns 0 on success or -1 in case of error */ -int virNetDevSetNamespace(const char *ifname, int pidInNs) +int virNetDevSetNamespace(const char *ifname, pid_t pidInNs) { int rc; char *pid = NULL; @@ -451,7 +451,7 @@ int virNetDevSetNamespace(const char *ifname, int pidInNs) "ip", "link", "set", ifname, "netns", NULL, NULL }; - if (virAsprintf(&pid, "%d", pidInNs) == -1) { + if (virAsprintf(&pid, "%lld", (long long) pidInNs) == -1) { virReportOOMError(); return -1; } diff --git a/src/util/virnetdev.h b/src/util/virnetdev.h index 7845e251c..345611390 100644 --- a/src/util/virnetdev.h +++ b/src/util/virnetdev.h @@ -73,7 +73,7 @@ int virNetDevSetMTUFromDevice(const char *ifname, ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK; int virNetDevGetMTU(const char *ifname) ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK; -int virNetDevSetNamespace(const char *ifname, int pidInNs) +int virNetDevSetNamespace(const char *ifname, pid_t pidInNs) ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK; int virNetDevSetName(const char *ifname, const char *newifname) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK; diff --git a/src/vmware/vmware_conf.c b/src/vmware/vmware_conf.c index 3680ca0d4..847d14637 100644 --- a/src/vmware/vmware_conf.c +++ b/src/vmware/vmware_conf.c @@ -1,6 +1,6 @@ /*---------------------------------------------------------------------------*/ /* - * Copyright (C) 2011 Red Hat, Inc. + * Copyright (C) 2011-2012 Red Hat, Inc. * Copyright 2010, diateam (www.diateam.net) * * This library is free software; you can redistribute it and/or @@ -457,7 +457,7 @@ vmwareExtractPid(const char * vmxPath) FILE *logFile = NULL; char line[1024]; char *tmp = NULL; - int pid = -1; + int pid_value = -1; if ((vmxDir = mdir_name(vmxPath)) == NULL) goto cleanup; @@ -485,7 +485,9 @@ vmwareExtractPid(const char * vmxPath) tmp += strlen(" pid="); - if (virStrToLong_i(tmp, &tmp, 10, &pid) < 0 || *tmp != ' ') { + /* Although 64-bit windows allows 64-bit pid_t, a domain id has to be + * 32 bits. For now, we just reject pid values that overflow int. */ + if (virStrToLong_i(tmp, &tmp, 10, &pid_value) < 0 || *tmp != ' ') { vmwareError(VIR_ERR_INTERNAL_ERROR, "%s", _("cannot parse pid in vmware log file")); goto cleanup; @@ -495,7 +497,7 @@ cleanup: VIR_FREE(vmxDir); VIR_FREE(logFilePath); VIR_FORCE_FCLOSE(logFile); - return pid; + return pid_value; } char * |