]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
build: use correct type for pid and similar types
authorEric Blake <eblake@redhat.com>
Fri, 10 Feb 2012 23:08:11 +0000 (16:08 -0700)
committerEric Blake <eblake@redhat.com>
Fri, 2 Mar 2012 13:57:43 +0000 (06:57 -0700)
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.

24 files changed:
cfg.mk
daemon/libvirtd.c
include/libvirt/libvirt-qemu.h
src/conf/domain_conf.h
src/conf/storage_conf.c
src/conf/storage_conf.h
src/driver.h
src/libvirt-qemu.c
src/probes.d
src/qemu/qemu_command.c
src/qemu/qemu_command.h
src/qemu/qemu_driver.c
src/qemu/qemu_process.c
src/qemu/qemu_process.h
src/qemu_protocol-structs
src/remote/qemu_protocol.x
src/security/security_dac.c
src/uml/uml_driver.c
src/util/cgroup.c
src/util/virnetdev.c
src/util/virnetdev.h
src/vmware/vmware_conf.c
tests/testutils.c
tools/virsh.c

diff --git a/cfg.mk b/cfg.mk
index 95994df1ec116368a050e917aca18a769e16fde9..24e6a698454dd57d2dde2b43189d451c628eb7b1 100644 (file)
--- a/cfg.mk
+++ b/cfg.mk
@@ -416,6 +416,12 @@ sc_prohibit_ctype_h:
        halt="don't use ctype.h; instead, use c-ctype.h"                \
          $(_sc_search_regexp)
 
+# Insist on correct types for [pug]id.
+sc_correct_id_types:
+       @prohibit='\<(int|long) *[pug]id\>'                             \
+       halt="use pid_t for pid, uid_t for uid, gid_t for gid"          \
+         $(_sc_search_regexp)
+
 # Ensure that no C source file, docs, or rng schema uses TABs for
 # indentation.  Also match *.h.in files, to get libvirt.h.in.  Exclude
 # files in gnulib, since they're imported.
index 1d17f20695a7d6422f95329909ad3827a92310ea..c1ab32d5212c904331925308810432f1df287644 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * libvirtd.c: daemon start of day, guest process & i/o management
  *
- * 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
@@ -187,7 +187,7 @@ static int daemonForkIntoBackground(const char *argv0)
     if (pipe(statuspipe) < 0)
         return -1;
 
-    int pid = fork();
+    pid_t pid = fork();
     switch (pid) {
     case 0:
         {
index 7f12e4f587a5a5657cac97bfa9461576dac12867..ba75ae33bf753b36269f89ff8b899a57fe352837 100644 (file)
@@ -4,7 +4,7 @@
  * Description: Provides the interfaces of the libvirt library to handle
  *              qemu specific methods
  *
- * Copy:  Copyright (C) 2010 Red Hat, Inc.
+ * Copy:  Copyright (C) 2010, 2012 Red Hat, Inc.
  *
  * See COPYING.LIB for the License of this software
  *
@@ -29,7 +29,7 @@ int virDomainQemuMonitorCommand(virDomainPtr domain, const char *cmd,
                                 char **result, unsigned int flags);
 
 virDomainPtr virDomainQemuAttach(virConnectPtr domain,
-                                 unsigned int pid,
+                                 unsigned int pid_value,
                                  unsigned int flags);
 
 # ifdef __cplusplus
index 596be4d8eb460bea755d311547279098aba51fd7..d98a5518183dcbd3d852e169a83440c4194d99b2 100644 (file)
@@ -1679,7 +1679,7 @@ struct _virDomainObj {
     virMutex lock;
     int refs;
 
-    int pid;
+    pid_t pid;
     virDomainStateReason state;
 
     unsigned int autostart : 1;
index dadc115afc3375897c1eac9f7318b24c4a0a232a..87f3d6a161ce0dbdfcd7a8e7079f26daf4e4889e 100644 (file)
@@ -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"));
index 19bbd2cdca42b819084a2cf86e2288c754f0959e..dfed0bfbc42164db63b4dcd300338d51c356f7f4 100644 (file)
@@ -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;
 };
 
index 40ff194f63a6901cf0e495fe4f16c59886430407..212d2f5e76975d4d50c243bf99007131a72030a7 100644 (file)
@@ -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
index 248cc33fe49afb3e84b9ff3971cc0d7228c9bccf..5267bba8cdee89222817ca87b18d94aff6f596e6 100644 (file)
@@ -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;
index 64abc57f9284ca9fc57f2cf3f9dce8875b5a9e57..9d70cc9726892b2ef02895ed777ac4214dcdfc43 100644 (file)
@@ -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);
index 5e0ca95286b5fcdfd7cdffcdc0a3cc20cf805a6f..170b01087eaae50ed1f9022a6d0ab15bd712ace6 100644 (file)
@@ -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);
index 6ace8f3f84da64b2d4541f8fc1c74088d291e608..1eafeb3cede1f4583021fa8d864cb4c2a5158567 100644 (file)
@@ -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);
index c6bdd299f74bd560211162fdc3f2333254b787ee..2afcc3fc2d5753ea2e55ea8c77241f8c6b9a9ea6 100644 (file)
@@ -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;
     }
index 36e5ce61240fcf785c0df1b8c670f40430a7fe3c..7b99814679268163ddff1f265b1129aaf93be392 100644 (file)
@@ -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)
index 7a23fcc3a9ed1b26f461691fb06a0b0682f4af63..2c1d0b5824a37ab2ef4f809b5087c132a8d71fbe 100644 (file)
@@ -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);
index 039747157ed38dea5421bad417d4ccf3344d137f..67968eb7dfdbb8d4a632ec334ce07cffe7c00f54 100644 (file)
@@ -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 {
index 39f9adfe1b1671b0f97e3ef790ab8f0110b2f6af..5afe680ac5bf065b53978c0bdb5629ee0be367c4 100644 (file)
@@ -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;
 };
 
index 3e1a72f361271738f7d52b3d878353377681d9f8..e71dc20d604e7b3bee114f15d52349bae9fa3a47 100644 (file)
@@ -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;
         }
     }
index cbb2c0ed4191e2c5bff476cb9f9a83a942f6ed02..378dffcc3e73b80d5814280bf1127d1660442d22 100644 (file)
@@ -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;
     }
 
index 15b870d842cf2f4d41877009b6ef81022d0309a8..00528c522547ad85cc9a4079709cb0aa60094f09 100644 (file)
@@ -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)
 {
index 9d76d471fad155d3a0fbdb9d68c1a449835b8add..4aa7639925807317d456fae7fc1dbd8922649884 100644 (file)
@@ -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;
     }
index 7845e251ca83980139d1c584dc96a446dfbd7e2f..345611390710ebf3f457273f948af23a9abd2c30 100644 (file)
@@ -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;
index 3680ca0d4f61d11b47bc34c186f6bed65c070790..847d1463715a8546117b0545bf07d1ad74b0c62b 100644 (file)
@@ -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 *
index 8678546504e2de0d313717027355d4e4cdda6fd9..4b224ee07a5d1acabc1bc3ee88f3b1308917c2ec 100644 (file)
@@ -294,7 +294,7 @@ virtTestCaptureProgramOutput(const char *const argv[], char **buf, int maxlen)
     if (pipe(pipefd) < 0)
         return -1;
 
-    int pid = fork();
+    pid_t pid = fork();
     switch (pid) {
     case 0:
         VIR_FORCE_CLOSE(pipefd[0]);
index dc362dcebdf814f04684800a87b7e31382bd02e6..aef050f2b321e5ea2cdb19dcaba4e517457af3a2 100644 (file)
@@ -16865,26 +16865,26 @@ cmdQemuAttach(vshControl *ctl, const vshCmd *cmd)
     virDomainPtr dom = NULL;
     bool ret = false;
     unsigned int flags = 0;
-    unsigned int pid;
+    unsigned int pid_value; /* API uses unsigned int, not pid_t */
 
     if (!vshConnectionUsability(ctl, ctl->conn))
         goto cleanup;
 
-    if (vshCommandOptUInt(cmd, "pid", &pid) <= 0) {
+    if (vshCommandOptUInt(cmd, "pid", &pid_value) <= 0) {
         vshError(ctl, "%s", _("missing pid value"));
         goto cleanup;
     }
 
-    if (!(dom = virDomainQemuAttach(ctl->conn, pid, flags)))
+    if (!(dom = virDomainQemuAttach(ctl->conn, pid_value, flags)))
         goto cleanup;
 
     if (dom != NULL) {
         vshPrint(ctl, _("Domain %s attached to pid %u\n"),
-                 virDomainGetName(dom), pid);
+                 virDomainGetName(dom), pid_value);
         virDomainFree(dom);
         ret = true;
     } else {
-        vshError(ctl, _("Failed to attach to pid %u"), pid);
+        vshError(ctl, _("Failed to attach to pid %u"), pid_value);
     }
 
 cleanup: