platform: handle netlink failures properly
This commit is contained in:
@@ -775,23 +775,6 @@ announce_object (NMPlatform *platform, const struct nl_object *object, ObjectSta
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
|
||||||
process_nl_error (NMPlatform *platform, int nle)
|
|
||||||
{
|
|
||||||
/* NLE_EXIST is considered equivalent to success to avoid race conditions. You
|
|
||||||
* never know when something sends an identical object just before
|
|
||||||
* NetworkManager, e.g. from a dispatcher script.
|
|
||||||
*/
|
|
||||||
switch (nle) {
|
|
||||||
case -NLE_SUCCESS:
|
|
||||||
case -NLE_EXIST:
|
|
||||||
return FALSE;
|
|
||||||
default:
|
|
||||||
error ("Netlink error: %s", nl_geterror (nle));
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct nl_object * build_rtnl_link (int ifindex, const char *name, NMLinkType type);
|
static struct nl_object * build_rtnl_link (int ifindex, const char *name, NMLinkType type);
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
@@ -802,8 +785,18 @@ refresh_object (NMPlatform *platform, struct nl_object *object, int nle)
|
|||||||
auto_nl_object struct nl_object *kernel_object = NULL;
|
auto_nl_object struct nl_object *kernel_object = NULL;
|
||||||
struct nl_cache *cache;
|
struct nl_cache *cache;
|
||||||
|
|
||||||
if (process_nl_error (platform, nle))
|
/* NLE_EXIST is considered equivalent to success to avoid race conditions. You
|
||||||
|
* never know when something sends an identical object just before
|
||||||
|
* NetworkManager.
|
||||||
|
*/
|
||||||
|
switch (nle) {
|
||||||
|
case -NLE_SUCCESS:
|
||||||
|
case -NLE_EXIST:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
error ("Netlink error: %s", nl_geterror (nle));
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
cache = choose_cache (platform, object);
|
cache = choose_cache (platform, object);
|
||||||
cached_object = nl_cache_search (choose_cache (platform, object), object);
|
cached_object = nl_cache_search (choose_cache (platform, object), object);
|
||||||
@@ -893,12 +886,24 @@ delete_object (NMPlatform *platform, struct nl_object *obj)
|
|||||||
NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
|
NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
|
||||||
auto_nl_object struct nl_object *object = obj;
|
auto_nl_object struct nl_object *object = obj;
|
||||||
auto_nl_object struct nl_object *cached_object;
|
auto_nl_object struct nl_object *cached_object;
|
||||||
|
int nle;
|
||||||
|
|
||||||
cached_object = nl_cache_search (choose_cache (platform, object), object);
|
cached_object = nl_cache_search (choose_cache (platform, object), object);
|
||||||
g_assert (cached_object);
|
g_assert (cached_object);
|
||||||
|
|
||||||
if (process_nl_error (platform, delete_kernel_object (priv->nlh, cached_object)))
|
nle = delete_kernel_object (priv->nlh, cached_object);
|
||||||
|
|
||||||
|
/* NLE_OBJ_NOTFOUND is considered equivalent to success to avoid race conditions. You
|
||||||
|
* never know when something deletes the same object just before NetworkManager.
|
||||||
|
*/
|
||||||
|
switch (nle) {
|
||||||
|
case -NLE_SUCCESS:
|
||||||
|
case -NLE_OBJ_NOTFOUND:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
error ("Netlink error: %s", nl_geterror (nle));
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
nl_cache_remove (cached_object);
|
nl_cache_remove (cached_object);
|
||||||
if (object_type_from_nl_object (object) == LINK) {
|
if (object_type_from_nl_object (object) == LINK) {
|
||||||
|
Reference in New Issue
Block a user