summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrancesco Giudici <fgiudici@redhat.com>2016-04-13 18:51:28 +0200
committerFrancesco Giudici <fgiudici@redhat.com>2016-04-13 18:51:28 +0200
commita5dc355d4d7a85c72cd072bbc9b3c56056ae329a (patch)
treee75af10656b5dc7eb41a6b5f62df4d51eb5009da
parent70c0defe753bc98ac75725cc32a84b36f32258e4 (diff)
parenta08b23ec3599bd3cde907fd34dd82dd08eee1865 (diff)
wifi: merge branch 'fg/nm-1-0_wifi_segfault_rh1325631'
https://bugzilla.redhat.com/show_bug.cgi?id=1325631
-rw-r--r--include/nm-macros-internal.h9
-rw-r--r--src/devices/nm-device-factory.c21
-rw-r--r--src/nm-manager.c6
3 files changed, 33 insertions, 3 deletions
diff --git a/include/nm-macros-internal.h b/include/nm-macros-internal.h
index 123c49bbc6..d5a8ec5228 100644
--- a/include/nm-macros-internal.h
+++ b/include/nm-macros-internal.h
@@ -111,6 +111,15 @@
/* macro to return strlen() of a compile time string. */
#define STRLEN(str) ( sizeof ("" str) - 1 )
+#define NM_SET_OUT(out_val, value) \
+ G_STMT_START { \
+ typeof(*(out_val)) *_out_val = (out_val); \
+ \
+ if (_out_val) { \
+ *_out_val = (value); \
+ } \
+ } G_STMT_END
+
/********************************************************/
#define _NM_IN_SET_EVAL_1(op, x, y1) \
diff --git a/src/devices/nm-device-factory.c b/src/devices/nm-device-factory.c
index 1303480857..b8edb9d102 100644
--- a/src/devices/nm-device-factory.c
+++ b/src/devices/nm-device-factory.c
@@ -88,12 +88,17 @@ nm_device_factory_new_link (NMDeviceFactory *factory,
const NMLinkType *link_types = NULL;
const char **setting_types = NULL;
int i;
+ NMDevice *device;
+ gboolean ignore = FALSE;
g_return_val_if_fail (factory != NULL, NULL);
g_return_val_if_fail (plink != NULL, NULL);
/* Ensure the factory can create interfaces for this connection */
nm_device_factory_get_supported_types (factory, &link_types, &setting_types);
+
+ NM_SET_OUT (out_ignore, FALSE);
+
for (i = 0; link_types[i] > NM_LINK_TYPE_UNKNOWN; i++) {
if (plink->type == link_types[i])
break;
@@ -115,7 +120,21 @@ nm_device_factory_new_link (NMDeviceFactory *factory,
return NULL;
}
- return interface->new_link (factory, plink, out_ignore, error);
+ device = interface->new_link (factory, plink, &ignore, error);
+ NM_SET_OUT (out_ignore, ignore);
+
+ if (!device && error && !*error) {
+ if (ignore) {
+ g_set_error (error, NM_MANAGER_ERROR, NM_MANAGER_ERROR_FAILED,
+ "Device factory %s ignores device",
+ G_OBJECT_TYPE_NAME (factory));
+ } else {
+ g_set_error (error, NM_MANAGER_ERROR, NM_MANAGER_ERROR_FAILED,
+ "Device factory %s failed to create device",
+ G_OBJECT_TYPE_NAME (factory));
+ }
+ }
+ return device;
}
NMDevice *
diff --git a/src/nm-manager.c b/src/nm-manager.c
index 082b7ef908..991cbb85ed 100644
--- a/src/nm-manager.c
+++ b/src/nm-manager.c
@@ -1936,7 +1936,6 @@ platform_link_added (NMManager *self,
{
NMDeviceFactory *factory;
NMDevice *device = NULL;
- GError *error = NULL;
g_return_if_fail (ifindex > 0);
@@ -1947,13 +1946,16 @@ platform_link_added (NMManager *self,
factory = nm_device_factory_manager_find_factory_for_link_type (plink->type);
if (factory) {
gboolean ignore = FALSE;
+ gs_free_error GError *error = NULL;
device = nm_device_factory_new_link (factory, plink, &ignore, &error);
if (!device) {
if (!ignore) {
nm_log_warn (LOGD_HW, "%s: factory failed to create device: %s",
plink->name, error->message);
- g_clear_error (&error);
+ } else {
+ nm_log_dbg (LOGD_HW, "%s: factory failed to create device: %s",
+ plink->name, error->message);
}
return;
}