提交 f06d55da 编写于 作者: E Eric Blake

maint: reset error on entrance to public API

We document that calling any public API wipes out all prior
libvirt errors in the same thread; but weren't obeying this
style in a few functions.

There are a couple of nested uses of virConnectRef (in lxc
and qemu reboot paths), but they should not be affected by
this change in semantics since there should not be any
previous error getting nuked (a later patch will clean up
the nested calls, along with abuse of virConnectClose on
cleanup paths which DOES nuke errors).

* src/libvirt.c (virGetVersion, virConnectRef, virDomainRef)
(virDomainGetSecurityLabel, virDomainGetSecurityLabelList)
(virDomainSetMetadata, virDomainGetMetadata)
(virNodeGetSecurityModel, virNetworkRef, virInterfaceRef)
(virStoragePoolRef, virStorageVolRef, virNodeDeviceGetName)
(virNodeDeviceRef, virSecretRef, virStreamRef, virNWFilterRef)
(virDomainSnapshotRef): Reset error on entrance.
(do_open): Drop redundant error reset.
* src/libvirt-qemu.c (virDomainQemuAgentCommand): Likewise.
* src/libvirt-lxc.c (virDomainLxcEnterNamespace)
(virDomainLxcEnterSecurityLabel): Likewise.
Signed-off-by: NEric Blake <eblake@redhat.com>
上级 ca0ea2a9
...@@ -142,6 +142,8 @@ virDomainLxcEnterNamespace(virDomainPtr domain, ...@@ -142,6 +142,8 @@ virDomainLxcEnterNamespace(virDomainPtr domain,
"noldfdlist=%p, oldfdlist=%p, flags=%x", "noldfdlist=%p, oldfdlist=%p, flags=%x",
nfdlist, fdlist, noldfdlist, oldfdlist, flags); nfdlist, fdlist, noldfdlist, oldfdlist, flags);
virResetLastError();
virCheckFlagsGoto(0, error); virCheckFlagsGoto(0, error);
if (noldfdlist && oldfdlist) { if (noldfdlist && oldfdlist) {
...@@ -203,6 +205,8 @@ virDomainLxcEnterSecurityLabel(virSecurityModelPtr model, ...@@ -203,6 +205,8 @@ virDomainLxcEnterSecurityLabel(virSecurityModelPtr model,
VIR_DEBUG("model=%p, label=%p, oldlabel=%p, flags=%x", VIR_DEBUG("model=%p, label=%p, oldlabel=%p, flags=%x",
model, label, oldlabel, flags); model, label, oldlabel, flags);
virResetLastError();
virCheckFlagsGoto(0, error); virCheckFlagsGoto(0, error);
virCheckNonNullArgGoto(model, error); virCheckNonNullArgGoto(model, error);
......
...@@ -112,6 +112,7 @@ error: ...@@ -112,6 +112,7 @@ error:
return -1; return -1;
} }
/** /**
* virDomainQemuAttach: * virDomainQemuAttach:
* @conn: pointer to a hypervisor connection * @conn: pointer to a hypervisor connection
...@@ -186,6 +187,7 @@ error: ...@@ -186,6 +187,7 @@ error:
return NULL; return NULL;
} }
/** /**
* virDomainQemuAgentCommand: * virDomainQemuAgentCommand:
* @domain: a domain object * @domain: a domain object
...@@ -217,6 +219,8 @@ virDomainQemuAgentCommand(virDomainPtr domain, ...@@ -217,6 +219,8 @@ virDomainQemuAgentCommand(virDomainPtr domain,
VIR_DOMAIN_DEBUG(domain, "cmd=%s, timeout=%d, flags=%x", VIR_DOMAIN_DEBUG(domain, "cmd=%s, timeout=%d, flags=%x",
cmd, timeout, flags); cmd, timeout, flags);
virResetLastError();
if (!VIR_IS_CONNECTED_DOMAIN(domain)) { if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__); virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
virDispatchError(NULL); virDispatchError(NULL);
......
...@@ -929,6 +929,7 @@ virGetVersion(unsigned long *libVer, const char *type ATTRIBUTE_UNUSED, ...@@ -929,6 +929,7 @@ virGetVersion(unsigned long *libVer, const char *type ATTRIBUTE_UNUSED,
goto error; goto error;
VIR_DEBUG("libVir=%p, type=%s, typeVer=%p", libVer, type, typeVer); VIR_DEBUG("libVir=%p, type=%s, typeVer=%p", libVer, type, typeVer);
virResetLastError();
if (libVer == NULL) if (libVer == NULL)
goto error; goto error;
*libVer = LIBVIR_VERSION_NUMBER; *libVer = LIBVIR_VERSION_NUMBER;
...@@ -1109,8 +1110,6 @@ do_open(const char *name, ...@@ -1109,8 +1110,6 @@ do_open(const char *name,
virConnectPtr ret; virConnectPtr ret;
virConfPtr conf = NULL; virConfPtr conf = NULL;
virResetLastError();
ret = virGetConnect(); ret = virGetConnect();
if (ret == NULL) if (ret == NULL)
return NULL; return NULL;
...@@ -1543,6 +1542,8 @@ virConnectRef(virConnectPtr conn) ...@@ -1543,6 +1542,8 @@ virConnectRef(virConnectPtr conn)
{ {
VIR_DEBUG("conn=%p refs=%d", conn, conn ? conn->object.u.s.refs : 0); VIR_DEBUG("conn=%p refs=%d", conn, conn ? conn->object.u.s.refs : 0);
virResetLastError();
if ((!VIR_IS_CONNECT(conn))) { if ((!VIR_IS_CONNECT(conn))) {
virLibConnError(VIR_ERR_INVALID_CONN, __FUNCTION__); virLibConnError(VIR_ERR_INVALID_CONN, __FUNCTION__);
virDispatchError(NULL); virDispatchError(NULL);
...@@ -2471,6 +2472,8 @@ virDomainRef(virDomainPtr domain) ...@@ -2471,6 +2472,8 @@ virDomainRef(virDomainPtr domain)
{ {
VIR_DOMAIN_DEBUG(domain, "refs=%d", domain ? domain->object.u.s.refs : 0); VIR_DOMAIN_DEBUG(domain, "refs=%d", domain ? domain->object.u.s.refs : 0);
virResetLastError();
if ((!VIR_IS_CONNECTED_DOMAIN(domain))) { if ((!VIR_IS_CONNECTED_DOMAIN(domain))) {
virLibConnError(VIR_ERR_INVALID_DOMAIN, __FUNCTION__); virLibConnError(VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
virDispatchError(NULL); virDispatchError(NULL);
...@@ -10731,6 +10734,8 @@ virDomainGetSecurityLabel(virDomainPtr domain, virSecurityLabelPtr seclabel) ...@@ -10731,6 +10734,8 @@ virDomainGetSecurityLabel(virDomainPtr domain, virSecurityLabelPtr seclabel)
VIR_DOMAIN_DEBUG(domain, "seclabel=%p", seclabel); VIR_DOMAIN_DEBUG(domain, "seclabel=%p", seclabel);
virResetLastError();
if (!VIR_IS_CONNECTED_DOMAIN(domain)) { if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
virLibDomainError(VIR_ERR_INVALID_DOMAIN, __FUNCTION__); virLibDomainError(VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
virDispatchError(NULL); virDispatchError(NULL);
...@@ -10777,6 +10782,8 @@ virDomainGetSecurityLabelList(virDomainPtr domain, ...@@ -10777,6 +10782,8 @@ virDomainGetSecurityLabelList(virDomainPtr domain,
VIR_DOMAIN_DEBUG(domain, "seclabels=%p", seclabels); VIR_DOMAIN_DEBUG(domain, "seclabels=%p", seclabels);
virResetLastError();
if (!VIR_IS_CONNECTED_DOMAIN(domain)) { if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
virLibDomainError(VIR_ERR_INVALID_DOMAIN, __FUNCTION__); virLibDomainError(VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
virDispatchError(NULL); virDispatchError(NULL);
...@@ -10846,6 +10853,8 @@ virDomainSetMetadata(virDomainPtr domain, ...@@ -10846,6 +10853,8 @@ virDomainSetMetadata(virDomainPtr domain,
type, NULLSTR(metadata), NULLSTR(key), NULLSTR(uri), type, NULLSTR(metadata), NULLSTR(key), NULLSTR(uri),
flags); flags);
virResetLastError();
if (!VIR_IS_CONNECTED_DOMAIN(domain)) { if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
virLibDomainError(VIR_ERR_INVALID_DOMAIN, __FUNCTION__); virLibDomainError(VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
goto error; goto error;
...@@ -10933,6 +10942,8 @@ virDomainGetMetadata(virDomainPtr domain, ...@@ -10933,6 +10942,8 @@ virDomainGetMetadata(virDomainPtr domain,
VIR_DOMAIN_DEBUG(domain, "type=%d, uri='%s', flags=%x", VIR_DOMAIN_DEBUG(domain, "type=%d, uri='%s', flags=%x",
type, NULLSTR(uri), flags); type, NULLSTR(uri), flags);
virResetLastError();
if (!VIR_IS_CONNECTED_DOMAIN(domain)) { if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
virLibDomainError(VIR_ERR_INVALID_DOMAIN, __FUNCTION__); virLibDomainError(VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
goto error; goto error;
...@@ -10993,6 +11004,8 @@ virNodeGetSecurityModel(virConnectPtr conn, virSecurityModelPtr secmodel) ...@@ -10993,6 +11004,8 @@ virNodeGetSecurityModel(virConnectPtr conn, virSecurityModelPtr secmodel)
{ {
VIR_DEBUG("conn=%p secmodel=%p", conn, secmodel); VIR_DEBUG("conn=%p secmodel=%p", conn, secmodel);
virResetLastError();
if (!VIR_IS_CONNECT(conn)) { if (!VIR_IS_CONNECT(conn)) {
virLibConnError(VIR_ERR_INVALID_CONN, __FUNCTION__); virLibConnError(VIR_ERR_INVALID_CONN, __FUNCTION__);
virDispatchError(NULL); virDispatchError(NULL);
...@@ -12106,6 +12119,8 @@ virNetworkRef(virNetworkPtr network) ...@@ -12106,6 +12119,8 @@ virNetworkRef(virNetworkPtr network)
VIR_DEBUG("network=%p refs=%d", network, VIR_DEBUG("network=%p refs=%d", network,
network ? network->object.u.s.refs : 0); network ? network->object.u.s.refs : 0);
virResetLastError();
if ((!VIR_IS_CONNECTED_NETWORK(network))) { if ((!VIR_IS_CONNECTED_NETWORK(network))) {
virLibConnError(VIR_ERR_INVALID_NETWORK, __FUNCTION__); virLibConnError(VIR_ERR_INVALID_NETWORK, __FUNCTION__);
virDispatchError(NULL); virDispatchError(NULL);
...@@ -13075,6 +13090,8 @@ virInterfaceRef(virInterfacePtr iface) ...@@ -13075,6 +13090,8 @@ virInterfaceRef(virInterfacePtr iface)
{ {
VIR_DEBUG("iface=%p refs=%d", iface, iface ? iface->object.u.s.refs : 0); VIR_DEBUG("iface=%p refs=%d", iface, iface ? iface->object.u.s.refs : 0);
virResetLastError();
if ((!VIR_IS_CONNECTED_INTERFACE(iface))) { if ((!VIR_IS_CONNECTED_INTERFACE(iface))) {
virLibConnError(VIR_ERR_INVALID_INTERFACE, __FUNCTION__); virLibConnError(VIR_ERR_INVALID_INTERFACE, __FUNCTION__);
virDispatchError(NULL); virDispatchError(NULL);
...@@ -14146,6 +14163,8 @@ virStoragePoolRef(virStoragePoolPtr pool) ...@@ -14146,6 +14163,8 @@ virStoragePoolRef(virStoragePoolPtr pool)
{ {
VIR_DEBUG("pool=%p refs=%d", pool, pool ? pool->object.u.s.refs : 0); VIR_DEBUG("pool=%p refs=%d", pool, pool ? pool->object.u.s.refs : 0);
virResetLastError();
if ((!VIR_IS_CONNECTED_STORAGE_POOL(pool))) { if ((!VIR_IS_CONNECTED_STORAGE_POOL(pool))) {
virLibConnError(VIR_ERR_INVALID_STORAGE_POOL, __FUNCTION__); virLibConnError(VIR_ERR_INVALID_STORAGE_POOL, __FUNCTION__);
virDispatchError(NULL); virDispatchError(NULL);
...@@ -15273,6 +15292,8 @@ virStorageVolRef(virStorageVolPtr vol) ...@@ -15273,6 +15292,8 @@ virStorageVolRef(virStorageVolPtr vol)
{ {
VIR_DEBUG("vol=%p refs=%d", vol, vol ? vol->object.u.s.refs : 0); VIR_DEBUG("vol=%p refs=%d", vol, vol ? vol->object.u.s.refs : 0);
virResetLastError();
if ((!VIR_IS_CONNECTED_STORAGE_VOL(vol))) { if ((!VIR_IS_CONNECTED_STORAGE_VOL(vol))) {
virLibConnError(VIR_ERR_INVALID_STORAGE_VOL, __FUNCTION__); virLibConnError(VIR_ERR_INVALID_STORAGE_VOL, __FUNCTION__);
virDispatchError(NULL); virDispatchError(NULL);
...@@ -15808,6 +15829,8 @@ virNodeDeviceGetName(virNodeDevicePtr dev) ...@@ -15808,6 +15829,8 @@ virNodeDeviceGetName(virNodeDevicePtr dev)
{ {
VIR_DEBUG("dev=%p, conn=%p", dev, dev ? dev->conn : NULL); VIR_DEBUG("dev=%p, conn=%p", dev, dev ? dev->conn : NULL);
virResetLastError();
if (!VIR_IS_CONNECTED_NODE_DEVICE(dev)) { if (!VIR_IS_CONNECTED_NODE_DEVICE(dev)) {
virLibNodeDeviceError(VIR_ERR_INVALID_NODE_DEVICE, __FUNCTION__); virLibNodeDeviceError(VIR_ERR_INVALID_NODE_DEVICE, __FUNCTION__);
virDispatchError(NULL); virDispatchError(NULL);
...@@ -15983,6 +16006,8 @@ virNodeDeviceRef(virNodeDevicePtr dev) ...@@ -15983,6 +16006,8 @@ virNodeDeviceRef(virNodeDevicePtr dev)
{ {
VIR_DEBUG("dev=%p refs=%d", dev, dev ? dev->object.u.s.refs : 0); VIR_DEBUG("dev=%p refs=%d", dev, dev ? dev->object.u.s.refs : 0);
virResetLastError();
if ((!VIR_IS_CONNECTED_NODE_DEVICE(dev))) { if ((!VIR_IS_CONNECTED_NODE_DEVICE(dev))) {
virLibConnError(VIR_ERR_INVALID_NODE_DEVICE, __FUNCTION__); virLibConnError(VIR_ERR_INVALID_NODE_DEVICE, __FUNCTION__);
virDispatchError(NULL); virDispatchError(NULL);
...@@ -17114,6 +17139,8 @@ virSecretRef(virSecretPtr secret) ...@@ -17114,6 +17139,8 @@ virSecretRef(virSecretPtr secret)
VIR_DEBUG("secret=%p refs=%d", secret, VIR_DEBUG("secret=%p refs=%d", secret,
secret ? secret->object.u.s.refs : 0); secret ? secret->object.u.s.refs : 0);
virResetLastError();
if (!VIR_IS_CONNECTED_SECRET(secret)) { if (!VIR_IS_CONNECTED_SECRET(secret)) {
virLibSecretError(VIR_ERR_INVALID_SECRET, __FUNCTION__); virLibSecretError(VIR_ERR_INVALID_SECRET, __FUNCTION__);
virDispatchError(NULL); virDispatchError(NULL);
...@@ -17211,6 +17238,8 @@ virStreamRef(virStreamPtr stream) ...@@ -17211,6 +17238,8 @@ virStreamRef(virStreamPtr stream)
VIR_DEBUG("stream=%p refs=%d", stream, VIR_DEBUG("stream=%p refs=%d", stream,
stream ? stream->object.u.s.refs : 0); stream ? stream->object.u.s.refs : 0);
virResetLastError();
if ((!VIR_IS_CONNECTED_STREAM(stream))) { if ((!VIR_IS_CONNECTED_STREAM(stream))) {
virLibConnError(VIR_ERR_INVALID_STREAM, __FUNCTION__); virLibConnError(VIR_ERR_INVALID_STREAM, __FUNCTION__);
virDispatchError(NULL); virDispatchError(NULL);
...@@ -18651,6 +18680,8 @@ virNWFilterRef(virNWFilterPtr nwfilter) ...@@ -18651,6 +18680,8 @@ virNWFilterRef(virNWFilterPtr nwfilter)
VIR_DEBUG("nwfilter=%p refs=%d", nwfilter, VIR_DEBUG("nwfilter=%p refs=%d", nwfilter,
nwfilter ? nwfilter->object.u.s.refs : 0); nwfilter ? nwfilter->object.u.s.refs : 0);
virResetLastError();
if ((!VIR_IS_CONNECTED_NWFILTER(nwfilter))) { if ((!VIR_IS_CONNECTED_NWFILTER(nwfilter))) {
virLibConnError(VIR_ERR_INVALID_NWFILTER, __FUNCTION__); virLibConnError(VIR_ERR_INVALID_NWFILTER, __FUNCTION__);
virDispatchError(NULL); virDispatchError(NULL);
...@@ -21000,6 +21031,8 @@ virDomainSnapshotRef(virDomainSnapshotPtr snapshot) ...@@ -21000,6 +21031,8 @@ virDomainSnapshotRef(virDomainSnapshotPtr snapshot)
VIR_DEBUG("snapshot=%p, refs=%d", snapshot, VIR_DEBUG("snapshot=%p, refs=%d", snapshot,
snapshot ? snapshot->object.u.s.refs : 0); snapshot ? snapshot->object.u.s.refs : 0);
virResetLastError();
if ((!VIR_IS_DOMAIN_SNAPSHOT(snapshot))) { if ((!VIR_IS_DOMAIN_SNAPSHOT(snapshot))) {
virLibDomainSnapshotError(VIR_ERR_INVALID_DOMAIN_SNAPSHOT, virLibDomainSnapshotError(VIR_ERR_INVALID_DOMAIN_SNAPSHOT,
__FUNCTION__); __FUNCTION__);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册