diff options
author | Dan Williams <dcbw@redhat.com> | 2011-10-18 13:13:21 -0500 |
---|---|---|
committer | Dan Williams <dcbw@redhat.com> | 2011-10-18 13:17:39 -0500 |
commit | d40e0436234b625d3856841ba53f7b03aa59bd15 (patch) | |
tree | c95cb7d655e401150a465f6ac4667ff05b3d12b9 /src/mm-plugin-base.c | |
parent | 3bcbc7b644d51ef846d621e97674f903368f6a30 (diff) |
core: better handle NULL spew from serial ports during probing
Observed on a generic ZTE device.
Diffstat (limited to 'src/mm-plugin-base.c')
-rw-r--r-- | src/mm-plugin-base.c | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/src/mm-plugin-base.c b/src/mm-plugin-base.c index 01fe9c5d..e4ebed6f 100644 --- a/src/mm-plugin-base.c +++ b/src/mm-plugin-base.c @@ -515,6 +515,11 @@ static const char *dq_strings[] = { NULL }; +static guint8 zerobuf[32] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + static void probed_info_free (MMPluginBaseProbedInfo *info) { @@ -535,6 +540,13 @@ port_buffer_full (MMSerialPort *port, GByteArray *buffer, gpointer user_data) size_t iter_len; int i; + /* Some devices (observed on a ZTE branded "QUALCOMM INCORPORATED" model + * "154") spew NULLs from some ports. + */ + if ( (buffer->len >= sizeof (zerobuf)) + && (memcmp (buffer->data, zerobuf, sizeof (zerobuf)) == 0)) + goto stop_probing; + /* Check for an immediate disqualification response. There are some * ports (Option Icera-based chipsets have them, as do Qualcomm Gobi * devices before their firmware is loaded) that just shouldn't be @@ -551,15 +563,18 @@ port_buffer_full (MMSerialPort *port, GByteArray *buffer, gpointer user_data) for (i = 0; i < buffer->len - iter_len; i++) { if (!memcmp (&buffer->data[i], *iter, iter_len)) { /* Immediately close the port and complete probing */ - priv->probed_caps = 0; - priv->probed_vendor = NULL; - priv->probed_product = NULL; - mm_serial_port_close (MM_SERIAL_PORT (priv->probe_port)); - probe_complete (task); - return; + goto stop_probing; } } } + return; + +stop_probing: + priv->probed_caps = 0; + priv->probed_vendor = NULL; + priv->probed_product = NULL; + mm_serial_port_close (MM_SERIAL_PORT (priv->probe_port)); + probe_complete (task); } static gboolean |