aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEric Blake <eblake@redhat.com>2012-02-10 16:08:11 -0700
committerEric Blake <eblake@redhat.com>2012-03-02 06:57:43 -0700
commit3e2c3d8f6d5ca4a6135101cda3e73c51304af683 (patch)
treee586d4a1a39ff74a95fdc3c08b1eb47833ae148e /src
parentbuild: prohibit cross-inclusion (diff)
downloadlibvirt-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.h2
-rw-r--r--src/conf/storage_conf.c2
-rw-r--r--src/conf/storage_conf.h6
-rw-r--r--src/driver.h3
-rw-r--r--src/libvirt-qemu.c17
-rw-r--r--src/probes.d2
-rw-r--r--src/qemu/qemu_command.c15
-rw-r--r--src/qemu/qemu_command.h4
-rw-r--r--src/qemu/qemu_driver.c24
-rw-r--r--src/qemu/qemu_process.c2
-rw-r--r--src/qemu/qemu_process.h2
-rw-r--r--src/qemu_protocol-structs2
-rw-r--r--src/remote/qemu_protocol.x4
-rw-r--r--src/security/security_dac.c27
-rw-r--r--src/uml/uml_driver.c6
-rw-r--r--src/util/cgroup.c17
-rw-r--r--src/util/virnetdev.c4
-rw-r--r--src/util/virnetdev.h2
-rw-r--r--src/vmware/vmware_conf.c10
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 *