---
WARNING: THIS PATCH IS NOT COMPLETE !!!
For full patch see the cover letter. I've trimmed the patch and left only
interesting parts.
HACKING | 5 ++
cfg.mk | 8 ++
daemon/libvirtd-config.c | 24 ++---
daemon/libvirtd.c | 14 +--
daemon/remote.c | 72 +++++++--------
docs/hacking.html.in | 8 ++
src/conf/capabilities.c | 28 +++---
src/conf/cpu_conf.c | 12 +--
src/conf/domain_conf.c | 52 +++++------
src/conf/domain_event.c | 35 ++++----
src/conf/node_device_conf.c | 11 +--
src/conf/nwfilter_conf.c | 4 +-
src/conf/nwfilter_params.c | 8 +-
src/conf/snapshot_conf.c | 6 +-
src/conf/storage_conf.c | 6 +-
src/conf/virchrdev.c | 4 +-
src/cpu/cpu_generic.c | 10 +--
src/cpu/cpu_map.c | 7 +-
src/cpu/cpu_powerpc.c | 16 ++--
src/cpu/cpu_x86.c | 6 +-
src/datatypes.c | 27 +++---
src/esx/esx_device_monitor.c | 1 -
src/esx/esx_device_monitor.h | 1 -
src/esx/esx_driver.c | 15 ++--
src/esx/esx_driver.h | 1 -
src/esx/esx_interface_driver.c | 20 ++---
src/esx/esx_interface_driver.h | 1 -
src/esx/esx_network_driver.c | 24 ++---
src/esx/esx_network_driver.h | 1 -
src/esx/esx_nwfilter_driver.c | 1 -
src/esx/esx_nwfilter_driver.h | 1 -
src/esx/esx_private.h | 1 -
src/esx/esx_secret_driver.c | 1 -
src/esx/esx_secret_driver.h | 1 -
src/esx/esx_storage_backend_iscsi.c | 8 +-
src/esx/esx_storage_backend_iscsi.h | 1 -
src/esx/esx_storage_backend_vmfs.c | 5 +-
src/esx/esx_storage_backend_vmfs.h | 1 -
src/esx/esx_storage_driver.c | 1 -
src/esx/esx_storage_driver.h | 1 -
src/esx/esx_util.c | 13 ++-
src/esx/esx_vi.c | 25 +++---
src/esx/esx_vi.h | 1 -
src/esx/esx_vi_methods.c | 1 -
src/esx/esx_vi_methods.h | 1 -
src/esx/esx_vi_types.c | 9 +-
src/esx/esx_vi_types.h | 1 -
src/hyperv/hyperv_device_monitor.c | 3 -
src/hyperv/hyperv_device_monitor.h | 1 -
src/hyperv/hyperv_driver.c | 17 ++--
src/hyperv/hyperv_driver.h | 1 -
src/hyperv/hyperv_interface_driver.c | 3 -
src/hyperv/hyperv_interface_driver.h | 1 -
src/hyperv/hyperv_network_driver.c | 3 -
src/hyperv/hyperv_network_driver.h | 1 -
src/hyperv/hyperv_nwfilter_driver.c | 3 -
src/hyperv/hyperv_nwfilter_driver.h | 1 -
src/hyperv/hyperv_private.h | 1 -
src/hyperv/hyperv_secret_driver.c | 3 -
src/hyperv/hyperv_secret_driver.h | 1 -
src/hyperv/hyperv_storage_driver.c | 3 -
src/hyperv/hyperv_storage_driver.h | 1 -
src/hyperv/hyperv_util.c | 14 ++-
src/hyperv/hyperv_util.h | 1 -
src/hyperv/hyperv_wmi.c | 1 -
src/hyperv/hyperv_wmi.h | 3 -
src/hyperv/hyperv_wmi_classes.c | 1 -
src/hyperv/hyperv_wmi_classes.h | 1 -
src/hyperv/openwsman.h | 1 -
src/interface/interface_backend_udev.c | 14 +--
src/libvirt.c | 6 +-
src/libvirt_private.syms | 1 +
src/libxl/libxl_conf.c | 36 ++++----
src/libxl/libxl_driver.c | 10 +--
src/locking/lock_daemon.c | 12 +--
src/locking/lock_daemon_config.c | 8 +-
src/locking/lock_daemon_dispatch.c | 3 +-
src/locking/lock_driver_lockd.c | 22 ++---
src/locking/lock_driver_sanlock.c | 8 +-
src/locking/lock_manager.c | 2 +-
src/lxc/lxc_conf.c | 28 +++---
src/lxc/lxc_container.c | 14 +--
src/lxc/lxc_controller.c | 6 +-
src/lxc/lxc_driver.c | 4 +-
src/network/bridge_driver.c | 14 +--
src/node_device/node_device_driver.c | 20 ++---
src/node_device/node_device_hal.c | 6 +-
src/node_device/node_device_udev.c | 48 +++++-----
src/nodeinfo.c | 2 +-
src/nwfilter/nwfilter_dhcpsnoop.c | 8 +-
src/nwfilter/nwfilter_driver.c | 4 +-
src/nwfilter/nwfilter_ebiptables_driver.c | 2 +-
src/nwfilter/nwfilter_gentech_driver.c | 18 ++--
src/nwfilter/nwfilter_learnipaddr.c | 2 +-
src/openvz/openvz_conf.c | 16 ++--
src/openvz/openvz_driver.c | 10 +--
src/parallels/parallels_driver.c | 34 +++----
src/parallels/parallels_network.c | 12 +--
src/parallels/parallels_storage.c | 26 +++---
src/phyp/phyp_driver.c | 20 ++---
src/qemu/qemu_capabilities.c | 22 ++---
src/qemu/qemu_command.c | 142 +++++++++++++++---------------
src/qemu/qemu_conf.c | 28 +++---
src/qemu/qemu_driver.c | 44 ++++-----
src/qemu/qemu_hotplug.c | 6 +-
src/qemu/qemu_migration.c | 12 +--
src/qemu/qemu_monitor_json.c | 24 ++---
src/qemu/qemu_monitor_text.c | 4 +-
src/qemu/qemu_process.c | 34 +++----
src/remote/remote_driver.c | 52 +++++------
src/rpc/gendispatch.pl | 10 +--
src/rpc/virnetclient.c | 7 +-
src/rpc/virnetmessage.c | 11 +--
src/rpc/virnetsaslcontext.c | 7 +-
src/rpc/virnetserver.c | 3 +-
src/rpc/virnetserverclient.c | 4 +-
src/rpc/virnetservermdns.c | 4 +-
src/rpc/virnetsocket.c | 4 +-
src/rpc/virnetsshsession.c | 22 ++---
src/rpc/virnettlscontext.c | 12 +--
src/secret/secret_driver.c | 2 +-
src/security/security_apparmor.c | 4 +-
src/security/security_dac.c | 4 +-
src/security/security_nop.c | 4 +-
src/security/security_selinux.c | 32 +++----
src/security/virt-aa-helper.c | 4 +-
src/storage/storage_backend.c | 16 ++--
src/storage/storage_backend_disk.c | 12 +--
src/storage/storage_backend_fs.c | 16 ++--
src/storage/storage_backend_iscsi.c | 4 +-
src/storage/storage_backend_logical.c | 10 +--
src/storage/storage_backend_mpath.c | 2 +-
src/storage/storage_backend_rbd.c | 2 +-
src/storage/storage_backend_scsi.c | 6 +-
src/storage/storage_driver.c | 10 +--
src/test/test_driver.c | 54 ++++++------
src/uml/uml_conf.c | 4 +-
src/uml/uml_driver.c | 6 +-
src/util/virauth.c | 8 +-
src/util/virauthconfig.c | 4 +-
src/util/virbitmap.c | 3 +-
src/util/vircgroup.c | 8 +-
src/util/vircommand.c | 20 ++---
src/util/virconf.c | 3 +-
src/util/virdnsmasq.c | 4 +-
src/util/virebtables.c | 27 +++---
src/util/virhash.c | 7 +-
src/util/viridentity.c | 5 +-
src/util/virinitctl.c | 2 +-
src/util/viriptables.c | 4 +-
src/util/virjson.c | 8 +-
src/util/virlockspace.c | 12 +--
src/util/virlog.c | 6 +-
src/util/virnetdevmacvlan.c | 13 +--
src/util/virnetdevtap.c | 2 +-
src/util/virnetdevvportprofile.c | 2 +-
src/util/virobject.c | 7 +-
src/util/virpci.c | 4 +-
src/util/virsexpr.c | 6 +-
src/util/virsocketaddr.c | 4 +-
src/util/virstoragefile.c | 6 +-
src/util/virstring.c | 20 ++++-
src/util/virstring.h | 8 ++
src/util/virsysinfo.c | 2 +-
src/util/virtypedparam.c | 6 +-
src/util/viruri.c | 18 ++--
src/util/virutil.c | 34 +++----
src/util/virxml.c | 2 +-
src/vbox/vbox_XPCOMCGlue.c | 2 +-
src/vbox/vbox_tmpl.c | 106 +++++++++++-----------
src/vmware/vmware_conf.c | 10 +--
src/vmware/vmware_driver.c | 15 ++--
src/vmx/vmx.c | 10 +--
src/xen/xen_driver.c | 2 +-
src/xen/xen_hypervisor.c | 8 +-
src/xen/xen_inotify.c | 19 ++--
src/xen/xend_internal.c | 30 +++----
src/xen/xm_internal.c | 6 +-
src/xen/xs_internal.c | 17 ++--
src/xenapi/xenapi_driver.c | 30 +++----
src/xenapi/xenapi_utils.c | 20 ++---
src/xenxs/xen_sxpr.c | 68 +++++++-------
src/xenxs/xen_xm.c | 38 ++++----
183 files changed, 1133 insertions(+), 1128 deletions(-)
diff --git a/HACKING b/HACKING
index c8833c0..6230ffd 100644
--- a/HACKING
+++ b/HACKING
@@ -719,6 +719,11 @@ sizeof(dest) returns something meaningful). Note that this is a
macro, so
arguments could be evaluated more than once. This is equivalent to
virStrncpy(dest, src, strlen(src), sizeof(dest)).
+ VIR_STRDUP(char *c)
+
+You should avoid using strdup directly as it does not report OOM error. Use
+VIR_STRDUP(c) macro instead (@c is type of char *).
+
Variable length string buffer
=============================
diff --git a/cfg.mk b/cfg.mk
index 7a2c69f..8cc67a5 100644
--- a/cfg.mk
+++ b/cfg.mk
@@ -383,6 +383,11 @@ sc_prohibit_asprintf:
halt='use virAsprintf, not as'printf \
$(_sc_search_regexp)
+sc_prohibit_strdup:
+ @prohibit='\<strdup\>' \
+ halt='use VIR_STRUP, not strdup' \
+ $(_sc_search_regexp)
+
# Prefer virSetUIDGID.
sc_prohibit_setuid:
@prohibit='\<set(re)?[ug]id\> *\(' \
@@ -814,6 +819,9 @@ exclude_file_name_regexp--sc_prohibit_always_true_header_tests = \
exclude_file_name_regexp--sc_prohibit_asprintf = \
^(bootstrap.conf$$|src/util/virstring\.c$$|examples/domain-events/events-c/event-test\.c$$)
+exclude_file_name_regexp--sc_prohibit_strdup = \
+
^(bootstrap.conf$$|cfg.mk$$|docs/|examples/|python/|src/storage/parthelper.c$$|src/util/virerror.c$$|src/util/virstring.c$$|tests/|tools/)
+
exclude_file_name_regexp--sc_prohibit_close = \
(\.p[yl]$$|^docs/|^(src/util/virfile\.c|src/libvirt\.c)$$)
diff --git a/daemon/libvirtd-config.c b/daemon/libvirtd-config.c
index cc60098..915c7f3 100644
--- a/daemon/libvirtd-config.c
+++ b/daemon/libvirtd-config.c
@@ -59,7 +59,7 @@ remoteConfigGetStringList(virConfPtr conf, const char *key, char
***list_arg,
key);
return -1;
}
- list[0] = strdup(p->str);
+ list[0] = VIR_STRDUP(p->str);
list[1] = NULL;
if (list[0] == NULL) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
@@ -90,7 +90,7 @@ remoteConfigGetStringList(virConfPtr conf, const char *key, char
***list_arg,
VIR_FREE(list);
return -1;
}
- list[i] = strdup(pp->str);
+ list[i] = VIR_STRDUP(pp->str);
if (list[i] == NULL) {
int j;
for (j = 0 ; j < i ; j++)
@@ -136,8 +136,8 @@ checkType(virConfValuePtr p, const char *filename,
}
/* If there is no config data for the key, #var_name, then do nothing.
- If there is valid data of type VIR_CONF_STRING, and strdup succeeds,
- store the result in var_name. Otherwise, (i.e. invalid type, or strdup
+ If there is valid data of type VIR_CONF_STRING, and VIR_STRDUP succeeds,
+ store the result in var_name. Otherwise, (i.e. invalid type, or VIR_STRDUP
failure), give a diagnostic and "goto" the cleanup-and-fail label. */
#define GET_CONF_STR(conf, filename, var_name) \
do { \
@@ -146,7 +146,7 @@ checkType(virConfValuePtr p, const char *filename,
if (checkType(p, filename, #var_name, VIR_CONF_STRING) < 0) \
goto error; \
VIR_FREE(data->var_name); \
- if (!(data->var_name = strdup(p->str))) { \
+ if (!(data->var_name = VIR_STRDUP(p->str))) { \
virReportOOMError(); \
goto error; \
} \
@@ -200,7 +200,7 @@ int
daemonConfigFilePath(bool privileged, char **configfile)
{
if (privileged) {
- if (!(*configfile = strdup(SYSCONFDIR "/libvirt/libvirtd.conf")))
+ if (!(*configfile = VIR_STRDUP(SYSCONFDIR "/libvirt/libvirtd.conf")))
goto no_memory;
} else {
char *configdir = NULL;
@@ -238,9 +238,9 @@ daemonConfigNew(bool privileged ATTRIBUTE_UNUSED)
data->listen_tls = 1;
data->listen_tcp = 0;
- if (!(data->tls_port = strdup(LIBVIRTD_TLS_PORT)))
+ if (!(data->tls_port = VIR_STRDUP(LIBVIRTD_TLS_PORT)))
goto no_memory;
- if (!(data->tcp_port = strdup(LIBVIRTD_TCP_PORT)))
+ if (!(data->tcp_port = VIR_STRDUP(LIBVIRTD_TCP_PORT)))
goto no_memory;
/* Only default to PolicyKit if running as root */
@@ -257,10 +257,10 @@ daemonConfigNew(bool privileged ATTRIBUTE_UNUSED)
#endif
if (data->auth_unix_rw == REMOTE_AUTH_POLKIT)
- data->unix_sock_rw_perms = strdup("0777"); /* Allow world */
+ data->unix_sock_rw_perms = VIR_STRDUP("0777"); /* Allow world */
else
- data->unix_sock_rw_perms = strdup("0700"); /* Allow user only */
- data->unix_sock_ro_perms = strdup("0777"); /* Always allow world */
+ data->unix_sock_rw_perms = VIR_STRDUP("0700"); /* Allow user only
*/
+ data->unix_sock_ro_perms = VIR_STRDUP("0777"); /* Always allow world */
if (!data->unix_sock_ro_perms ||
!data->unix_sock_rw_perms)
goto no_memory;
@@ -382,7 +382,7 @@ daemonConfigLoadOptions(struct daemonConfig *data,
*/
if (data->auth_unix_rw == REMOTE_AUTH_POLKIT) {
VIR_FREE(data->unix_sock_rw_perms);
- if (!(data->unix_sock_rw_perms = strdup("0777"))) {
+ if (!(data->unix_sock_rw_perms = VIR_STRDUP("0777"))) {
virReportOOMError();
goto error;
}
diff --git a/docs/hacking.html.in b/docs/hacking.html.in
index 7ef826c..0fbb500 100644
--- a/docs/hacking.html.in
+++ b/docs/hacking.html.in
@@ -853,6 +853,14 @@
virStrncpy(dest, src, strlen(src), sizeof(dest)).
</p>
+<pre>
+ VIR_STRDUP(char *c)
+</pre>
+ <p>
+ You should avoid using strdup directly as it does not report OOM error.
+ Use VIR_STRDUP(c) macro instead (@c is type of char *).
+ </p>
+
<h2><a name="strbuf">Variable length string
buffer</a></h2>
<p>
--
1.8.1.5