1
0
mirror of https://gitlab.com/libvirt/libvirt.git synced 2025-03-20 06:50:22 +03:00

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.
This commit is contained in:
Eric Blake 2012-02-10 16:08:11 -07:00
parent 5c3a15647d
commit 3e2c3d8f6d
24 changed files with 102 additions and 75 deletions

6
cfg.mk
View File

@ -416,6 +416,12 @@ sc_prohibit_ctype_h:
halt="don't use ctype.h; instead, use c-ctype.h" \ halt="don't use ctype.h; instead, use c-ctype.h" \
$(_sc_search_regexp) $(_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 # 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 # indentation. Also match *.h.in files, to get libvirt.h.in. Exclude
# files in gnulib, since they're imported. # files in gnulib, since they're imported.

View File

@ -1,7 +1,7 @@
/* /*
* libvirtd.c: daemon start of day, guest process & i/o management * 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 * Copyright (C) 2006 Daniel P. Berrange
* *
* This library is free software; you can redistribute it and/or * 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) if (pipe(statuspipe) < 0)
return -1; return -1;
int pid = fork(); pid_t pid = fork();
switch (pid) { switch (pid) {
case 0: case 0:
{ {

View File

@ -4,7 +4,7 @@
* Description: Provides the interfaces of the libvirt library to handle * Description: Provides the interfaces of the libvirt library to handle
* qemu specific methods * 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 * 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); char **result, unsigned int flags);
virDomainPtr virDomainQemuAttach(virConnectPtr domain, virDomainPtr virDomainQemuAttach(virConnectPtr domain,
unsigned int pid, unsigned int pid_value,
unsigned int flags); unsigned int flags);
# ifdef __cplusplus # ifdef __cplusplus

View File

@ -1679,7 +1679,7 @@ struct _virDomainObj {
virMutex lock; virMutex lock;
int refs; int refs;
int pid; pid_t pid;
virDomainStateReason state; virDomainStateReason state;
unsigned int autostart : 1; unsigned int autostart : 1;

View File

@ -572,7 +572,7 @@ virStorageDefParsePerms(xmlXPathContextPtr ctxt,
} else { } else {
char *end = NULL; char *end = NULL;
perms->mode = strtol(mode, &end, 8); perms->mode = strtol(mode, &end, 8);
if (*end || perms->mode < 0 || perms->mode > 0777) { if (*end || (perms->mode & ~0777)) {
VIR_FREE(mode); VIR_FREE(mode);
virStorageReportError(VIR_ERR_XML_ERROR, virStorageReportError(VIR_ERR_XML_ERROR,
"%s", _("malformed octal mode")); "%s", _("malformed octal mode"));

View File

@ -38,9 +38,9 @@
typedef struct _virStoragePerms virStoragePerms; typedef struct _virStoragePerms virStoragePerms;
typedef virStoragePerms *virStoragePermsPtr; typedef virStoragePerms *virStoragePermsPtr;
struct _virStoragePerms { struct _virStoragePerms {
int mode; mode_t mode;
int uid; uid_t uid;
int gid; gid_t gid;
char *label; char *label;
}; };

View File

@ -661,9 +661,10 @@ typedef int
(*virDrvDomainQemuMonitorCommand)(virDomainPtr domain, const char *cmd, (*virDrvDomainQemuMonitorCommand)(virDomainPtr domain, const char *cmd,
char **result, unsigned int flags); char **result, unsigned int flags);
/* Choice of unsigned int rather than pid_t is intentional. */
typedef virDomainPtr typedef virDomainPtr
(*virDrvDomainQemuAttach)(virConnectPtr conn, (*virDrvDomainQemuAttach)(virConnectPtr conn,
unsigned int pid, unsigned int pid_value,
unsigned int flags); unsigned int flags);
typedef int typedef int

View File

@ -2,7 +2,7 @@
* libvirt-qemu.c: Interfaces for the libvirt library to handle qemu-specific * libvirt-qemu.c: Interfaces for the libvirt library to handle qemu-specific
* APIs. * 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 * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public * modify it under the terms of the GNU Lesser General Public
@ -116,7 +116,7 @@ error:
/** /**
* virDomainQemuAttach: * virDomainQemuAttach:
* @conn: pointer to a hypervisor connection * @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 * @flags: optional flags, currently unused
* *
* This API is QEMU specific, so it will only work with hypervisor * 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 * - The '-name' and '-uuid' arguments should have been set (not
* mandatory, but strongly recommended) * 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 * If successful, then the guest will appear in the list of running
* domains for this connection, and other APIs should operate * domains for this connection, and other APIs should operate
* normally (provided the above requirements were honored). * normally (provided the above requirements were honored).
@ -141,10 +145,11 @@ error:
*/ */
virDomainPtr virDomainPtr
virDomainQemuAttach(virConnectPtr conn, virDomainQemuAttach(virConnectPtr conn,
unsigned int pid, unsigned int pid_value,
unsigned int flags) 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(); virResetLastError();
@ -154,7 +159,7 @@ virDomainQemuAttach(virConnectPtr conn,
return NULL; return NULL;
} }
if (pid <= 1) { if (pid != pid_value || pid <= 1) {
virLibDomainError(domain, VIR_ERR_INVALID_ARG, __FUNCTION__); virLibDomainError(domain, VIR_ERR_INVALID_ARG, __FUNCTION__);
goto error; goto error;
} }
@ -166,7 +171,7 @@ virDomainQemuAttach(virConnectPtr conn,
if (conn->driver->qemuDomainAttach) { if (conn->driver->qemuDomainAttach) {
virDomainPtr ret; virDomainPtr ret;
ret = conn->driver->qemuDomainAttach(conn, pid, flags); ret = conn->driver->qemuDomainAttach(conn, pid_value, flags);
if (!ret) if (!ret)
goto error; goto error;
return ret; return ret;

View File

@ -18,7 +18,7 @@ provider libvirt {
# file: src/rpc/virnetsocket.c # file: src/rpc/virnetsocket.c
# prefix: rpc # 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_send_fd(void *sock, int fd);
probe rpc_socket_recv_fd(void *sock, int fd); probe rpc_socket_recv_fd(void *sock, int fd);
probe rpc_socket_ref(void *sock, int refs); probe rpc_socket_ref(void *sock, int refs);

View File

@ -7954,7 +7954,7 @@ cleanup:
} }
static int qemuParseProcFileStrings(unsigned int pid, static int qemuParseProcFileStrings(int pid_value,
const char *name, const char *name,
const char ***list) const char ***list)
{ {
@ -7967,7 +7967,7 @@ static int qemuParseProcFileStrings(unsigned int pid,
const char **str = NULL; const char **str = NULL;
int i; int i;
if (virAsprintf(&path, "/proc/%u/%s", pid, name) < 0) { if (virAsprintf(&path, "/proc/%d/%s", pid_value, name) < 0) {
virReportOOMError(); virReportOOMError();
goto cleanup; goto cleanup;
} }
@ -8014,7 +8014,7 @@ cleanup:
} }
virDomainDefPtr qemuParseCommandLinePid(virCapsPtr caps, virDomainDefPtr qemuParseCommandLinePid(virCapsPtr caps,
unsigned int pid, pid_t pid,
char **pidfile, char **pidfile,
virDomainChrSourceDefPtr *monConfig, virDomainChrSourceDefPtr *monConfig,
bool *monJSON) bool *monJSON)
@ -8026,7 +8026,10 @@ virDomainDefPtr qemuParseCommandLinePid(virCapsPtr caps,
char *emulator; char *emulator;
int i; 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) qemuParseProcFileStrings(pid, "environ", &progenv) < 0)
goto cleanup; goto cleanup;
@ -8034,7 +8037,7 @@ virDomainDefPtr qemuParseCommandLinePid(virCapsPtr caps,
pidfile, monConfig, monJSON))) pidfile, monConfig, monJSON)))
goto cleanup; goto cleanup;
if (virAsprintf(&exepath, "/proc/%u/exe", pid) < 0) { if (virAsprintf(&exepath, "/proc/%d/exe", (int) pid) < 0) {
virReportOOMError(); virReportOOMError();
goto cleanup; goto cleanup;
} }
@ -8042,7 +8045,7 @@ virDomainDefPtr qemuParseCommandLinePid(virCapsPtr caps,
if (virFileResolveLink(exepath, &emulator) < 0) { if (virFileResolveLink(exepath, &emulator) < 0) {
virReportSystemError(errno, virReportSystemError(errno,
_("Unable to resolve %s for pid %u"), _("Unable to resolve %s for pid %u"),
exepath, pid); exepath, (int) pid);
goto cleanup; goto cleanup;
} }
VIR_FREE(def->emulator); VIR_FREE(def->emulator);

View File

@ -1,7 +1,7 @@
/* /*
* qemu_command.h: QEMU command generation * 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 * Copyright (C) 2006 Daniel P. Berrange
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
@ -170,7 +170,7 @@ virDomainDefPtr qemuParseCommandLineString(virCapsPtr caps,
virDomainChrSourceDefPtr *monConfig, virDomainChrSourceDefPtr *monConfig,
bool *monJSON); bool *monJSON);
virDomainDefPtr qemuParseCommandLinePid(virCapsPtr caps, virDomainDefPtr qemuParseCommandLinePid(virCapsPtr caps,
unsigned int pid, pid_t pid,
char **pidfile, char **pidfile,
virDomainChrSourceDefPtr *monConfig, virDomainChrSourceDefPtr *monConfig,
bool *monJSON); bool *monJSON);

View File

@ -1056,7 +1056,7 @@ cleanup:
static int static int
qemudGetProcessInfo(unsigned long long *cpuTime, int *lastCpu, long *vm_rss, qemudGetProcessInfo(unsigned long long *cpuTime, int *lastCpu, long *vm_rss,
int pid, int tid) pid_t pid, int tid)
{ {
char *proc; char *proc;
FILE *pidinfo; FILE *pidinfo;
@ -1065,10 +1065,12 @@ qemudGetProcessInfo(unsigned long long *cpuTime, int *lastCpu, long *vm_rss,
int cpu; int cpu;
int ret; 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) if (tid)
ret = virAsprintf(&proc, "/proc/%d/task/%d/stat", pid, tid); ret = virAsprintf(&proc, "/proc/%d/task/%d/stat", (int) pid, tid);
else else
ret = virAsprintf(&proc, "/proc/%d/stat", pid); ret = virAsprintf(&proc, "/proc/%d/stat", (int) pid);
if (ret < 0) if (ret < 0)
return -1; 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", 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); VIR_FORCE_FCLOSE(pidinfo);
@ -11147,7 +11149,7 @@ cleanup:
static virDomainPtr qemuDomainAttach(virConnectPtr conn, static virDomainPtr qemuDomainAttach(virConnectPtr conn,
unsigned int pid, unsigned int pid_value,
unsigned int flags) unsigned int flags)
{ {
struct qemud_driver *driver = conn->privateData; struct qemud_driver *driver = conn->privateData;
@ -11156,6 +11158,7 @@ static virDomainPtr qemuDomainAttach(virConnectPtr conn,
virDomainPtr dom = NULL; virDomainPtr dom = NULL;
virDomainChrSourceDefPtr monConfig = NULL; virDomainChrSourceDefPtr monConfig = NULL;
bool monJSON = false; bool monJSON = false;
pid_t pid = pid_value;
char *pidfile = NULL; char *pidfile = NULL;
virCheckFlags(0, NULL); virCheckFlags(0, NULL);
@ -11168,19 +11171,20 @@ static virDomainPtr qemuDomainAttach(virConnectPtr conn,
if (!monConfig) { if (!monConfig) {
qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("No monitor connection for pid %u"), _("No monitor connection for pid %u"), pid_value);
pid);
goto cleanup; goto cleanup;
} }
if (monConfig->type != VIR_DOMAIN_CHR_TYPE_UNIX) { if (monConfig->type != VIR_DOMAIN_CHR_TYPE_UNIX) {
qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("Cannot connect to monitor connection of type '%s' for pid %u"), _("Cannot connect to monitor connection of type '%s' "
virDomainChrTypeToString(monConfig->type), pid); "for pid %u"),
virDomainChrTypeToString(monConfig->type),
pid_value);
goto cleanup; goto cleanup;
} }
if (!(def->name) && if (!(def->name) &&
virAsprintf(&def->name, "attach-pid-%u", pid) < 0) { virAsprintf(&def->name, "attach-pid-%u", pid_value) < 0) {
virReportOOMError(); virReportOOMError();
goto cleanup; goto cleanup;
} }

View File

@ -3844,7 +3844,7 @@ retry:
int qemuProcessAttach(virConnectPtr conn ATTRIBUTE_UNUSED, int qemuProcessAttach(virConnectPtr conn ATTRIBUTE_UNUSED,
struct qemud_driver *driver, struct qemud_driver *driver,
virDomainObjPtr vm, virDomainObjPtr vm,
int pid, pid_t pid,
const char *pidfile, const char *pidfile,
virDomainChrSourceDefPtr monConfig, virDomainChrSourceDefPtr monConfig,
bool monJSON) bool monJSON)

View File

@ -63,7 +63,7 @@ void qemuProcessStop(struct qemud_driver *driver,
int qemuProcessAttach(virConnectPtr conn, int qemuProcessAttach(virConnectPtr conn,
struct qemud_driver *driver, struct qemud_driver *driver,
virDomainObjPtr vm, virDomainObjPtr vm,
int pid, pid_t pid,
const char *pidfile, const char *pidfile,
virDomainChrSourceDefPtr monConfig, virDomainChrSourceDefPtr monConfig,
bool monJSON); bool monJSON);

View File

@ -13,7 +13,7 @@ struct qemu_monitor_command_ret {
remote_nonnull_string result; remote_nonnull_string result;
}; };
struct qemu_domain_attach_args { struct qemu_domain_attach_args {
u_int pid; u_int pid_value;
u_int flags; u_int flags;
}; };
struct qemu_domain_attach_ret { struct qemu_domain_attach_ret {

View File

@ -3,7 +3,7 @@
* remote_internal driver and libvirtd. This protocol is * remote_internal driver and libvirtd. This protocol is
* internal and may change at any time. * 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 * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public * 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 { struct qemu_domain_attach_args {
unsigned int pid; unsigned int pid_value;
unsigned int flags; unsigned int flags;
}; };

View 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 * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public * 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 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) { if (chown(path, uid, gid) < 0) {
struct stat sb; struct stat sb;
@ -111,18 +112,22 @@ virSecurityDACSetOwnership(const char *path, int uid, int gid)
} }
if (chown_errno == EOPNOTSUPP || chown_errno == EINVAL) { if (chown_errno == EOPNOTSUPP || chown_errno == EINVAL) {
VIR_INFO("Setting user and group to '%d:%d' on '%s' not supported by filesystem", VIR_INFO("Setting user and group to '%ld:%ld' on '%s' not "
uid, gid, path); "supported by filesystem",
(long) uid, (long) gid, path);
} else if (chown_errno == EPERM) { } else if (chown_errno == EPERM) {
VIR_INFO("Setting user and group to '%d:%d' on '%s' not permitted", VIR_INFO("Setting user and group to '%ld:%ld' on '%s' not "
uid, gid, path); "permitted",
(long) uid, (long) gid, path);
} else if (chown_errno == EROFS) { } else if (chown_errno == EROFS) {
VIR_INFO("Setting user and group to '%d:%d' on '%s' not possible on readonly filesystem", VIR_INFO("Setting user and group to '%ld:%ld' on '%s' not "
uid, gid, path); "possible on readonly filesystem",
(long) uid, (long) gid, path);
} else { } else {
virReportSystemError(chown_errno, virReportSystemError(chown_errno,
_("unable to set user and group to '%d:%d' on '%s'"), _("unable to set user and group to '%ld:%ld' "
uid, gid, path); "on '%s'"),
(long) uid, (long) gid, path);
return -1; return -1;
} }
} }

View File

@ -1,7 +1,7 @@
/* /*
* uml_driver.c: core driver methods for managing UML guests * 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 * Copyright (C) 2006-2008 Daniel P. Berrange
* *
* This library is free software; you can redistribute it and/or * 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; char *proc;
FILE *pidinfo; FILE *pidinfo;
unsigned long long usertime, systime; 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; return -1;
} }

View File

@ -1598,19 +1598,20 @@ static int virCgroupKillInternal(virCgroupPtr group, int signum, virHashTablePtr
goto cleanup; goto cleanup;
} else { } else {
while (!feof(fp)) { while (!feof(fp)) {
unsigned long pid; unsigned long pid_value;
if (fscanf(fp, "%lu", &pid) != 1) { if (fscanf(fp, "%lu", &pid_value) != 1) {
if (feof(fp)) if (feof(fp))
break; break;
rc = -errno; rc = -errno;
VIR_DEBUG("Failed to read %s: %m\n", keypath); VIR_DEBUG("Failed to read %s: %m\n", keypath);
goto cleanup; goto cleanup;
} }
if (virHashLookup(pids, (void*)pid)) if (virHashLookup(pids, (void*)pid_value))
continue; continue;
VIR_DEBUG("pid=%lu", pid); VIR_DEBUG("pid=%lu", pid_value);
if (kill((pid_t)pid, signum) < 0) { /* Cgroups is a Linux concept, so this cast is safe. */
if (kill((pid_t)pid_value, signum) < 0) {
if (errno != ESRCH) { if (errno != ESRCH) {
rc = -errno; rc = -errno;
goto cleanup; goto cleanup;
@ -1621,7 +1622,7 @@ static int virCgroupKillInternal(virCgroupPtr group, int signum, virHashTablePtr
done = false; done = false;
} }
ignore_value(virHashAddEntry(pids, (void*)pid, (void*)1)); ignore_value(virHashAddEntry(pids, (void*)pid_value, (void*)1));
} }
VIR_FORCE_FCLOSE(fp); VIR_FORCE_FCLOSE(fp);
} }
@ -1639,8 +1640,8 @@ cleanup:
static uint32_t virCgroupPidCode(const void *name, uint32_t seed) static uint32_t virCgroupPidCode(const void *name, uint32_t seed)
{ {
unsigned long pid = (unsigned long)(intptr_t)name; unsigned long pid_value = (unsigned long)(intptr_t)name;
return virHashCodeGen(&pid, sizeof(pid), seed); return virHashCodeGen(&pid_value, sizeof(pid_value), seed);
} }
static bool virCgroupPidEqual(const void *namea, const void *nameb) static bool virCgroupPidEqual(const void *namea, const void *nameb)
{ {

View File

@ -443,7 +443,7 @@ int virNetDevSetMTUFromDevice(const char *ifname,
* *
* Returns 0 on success or -1 in case of error * 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; int rc;
char *pid = NULL; char *pid = NULL;
@ -451,7 +451,7 @@ int virNetDevSetNamespace(const char *ifname, int pidInNs)
"ip", "link", "set", ifname, "netns", NULL, NULL "ip", "link", "set", ifname, "netns", NULL, NULL
}; };
if (virAsprintf(&pid, "%d", pidInNs) == -1) { if (virAsprintf(&pid, "%lld", (long long) pidInNs) == -1) {
virReportOOMError(); virReportOOMError();
return -1; return -1;
} }

View File

@ -73,7 +73,7 @@ int virNetDevSetMTUFromDevice(const char *ifname,
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK; ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
int virNetDevGetMTU(const char *ifname) int virNetDevGetMTU(const char *ifname)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK; 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; ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;
int virNetDevSetName(const char *ifname, const char *newifname) int virNetDevSetName(const char *ifname, const char *newifname)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK; ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;

View File

@ -1,6 +1,6 @@
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
/* /*
* Copyright (C) 2011 Red Hat, Inc. * Copyright (C) 2011-2012 Red Hat, Inc.
* Copyright 2010, diateam (www.diateam.net) * Copyright 2010, diateam (www.diateam.net)
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
@ -457,7 +457,7 @@ vmwareExtractPid(const char * vmxPath)
FILE *logFile = NULL; FILE *logFile = NULL;
char line[1024]; char line[1024];
char *tmp = NULL; char *tmp = NULL;
int pid = -1; int pid_value = -1;
if ((vmxDir = mdir_name(vmxPath)) == NULL) if ((vmxDir = mdir_name(vmxPath)) == NULL)
goto cleanup; goto cleanup;
@ -485,7 +485,9 @@ vmwareExtractPid(const char * vmxPath)
tmp += strlen(" pid="); 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", vmwareError(VIR_ERR_INTERNAL_ERROR, "%s",
_("cannot parse pid in vmware log file")); _("cannot parse pid in vmware log file"));
goto cleanup; goto cleanup;
@ -495,7 +497,7 @@ cleanup:
VIR_FREE(vmxDir); VIR_FREE(vmxDir);
VIR_FREE(logFilePath); VIR_FREE(logFilePath);
VIR_FORCE_FCLOSE(logFile); VIR_FORCE_FCLOSE(logFile);
return pid; return pid_value;
} }
char * char *

View File

@ -294,7 +294,7 @@ virtTestCaptureProgramOutput(const char *const argv[], char **buf, int maxlen)
if (pipe(pipefd) < 0) if (pipe(pipefd) < 0)
return -1; return -1;
int pid = fork(); pid_t pid = fork();
switch (pid) { switch (pid) {
case 0: case 0:
VIR_FORCE_CLOSE(pipefd[0]); VIR_FORCE_CLOSE(pipefd[0]);

View File

@ -16865,26 +16865,26 @@ cmdQemuAttach(vshControl *ctl, const vshCmd *cmd)
virDomainPtr dom = NULL; virDomainPtr dom = NULL;
bool ret = false; bool ret = false;
unsigned int flags = 0; unsigned int flags = 0;
unsigned int pid; unsigned int pid_value; /* API uses unsigned int, not pid_t */
if (!vshConnectionUsability(ctl, ctl->conn)) if (!vshConnectionUsability(ctl, ctl->conn))
goto cleanup; goto cleanup;
if (vshCommandOptUInt(cmd, "pid", &pid) <= 0) { if (vshCommandOptUInt(cmd, "pid", &pid_value) <= 0) {
vshError(ctl, "%s", _("missing pid value")); vshError(ctl, "%s", _("missing pid value"));
goto cleanup; goto cleanup;
} }
if (!(dom = virDomainQemuAttach(ctl->conn, pid, flags))) if (!(dom = virDomainQemuAttach(ctl->conn, pid_value, flags)))
goto cleanup; goto cleanup;
if (dom != NULL) { if (dom != NULL) {
vshPrint(ctl, _("Domain %s attached to pid %u\n"), vshPrint(ctl, _("Domain %s attached to pid %u\n"),
virDomainGetName(dom), pid); virDomainGetName(dom), pid_value);
virDomainFree(dom); virDomainFree(dom);
ret = true; ret = true;
} else { } else {
vshError(ctl, _("Failed to attach to pid %u"), pid); vshError(ctl, _("Failed to attach to pid %u"), pid_value);
} }
cleanup: cleanup: