]> sigrok.org Git - libsigrok.git/blobdiff - hardware/openbench-logic-sniffer/ols.c
Fix two small warnings.
[libsigrok.git] / hardware / openbench-logic-sniffer / ols.c
index ccdd8a03e3a59c72f434a4f7cf3d571d9b1d9026..d4d17688c92bf72f298fe03057b857a11fb17630 100644 (file)
@@ -46,7 +46,6 @@
 #define O_NONBLOCK FIONBIO
 #endif
 
-
 static int capabilities[] = {
        SR_HWCAP_LOGIC_ANALYZER,
        SR_HWCAP_SAMPLERATE,
@@ -66,8 +65,6 @@ static struct sr_samplerates samplerates = {
 /* List of struct sr_serial_device_instance */
 static GSList *device_instances = NULL;
 
-
-
 static int send_shortcommand(int fd, uint8_t command)
 {
        char buf[1];
@@ -174,7 +171,12 @@ static struct ols_device *ols_device_new(void)
 {
        struct ols_device *ols;
 
-       ols = g_malloc0(sizeof(struct ols_device));
+       /* TODO: Is 'ols' ever g_free()'d? */
+       if (!(ols = g_try_malloc0(sizeof(struct ols_device)))) {
+               sr_err("ols: %s: ols malloc failed", __func__);
+               return NULL;
+       }
+
        ols->trigger_at = -1;
        ols->probe_mask = 0xffffffff;
        ols->cur_samplerate = SR_KHZ(200);
@@ -307,7 +309,6 @@ static struct sr_device_instance *get_metadata(int fd)
        return sdi;
 }
 
-
 static int hw_init(const char *deviceinfo)
 {
        struct sr_device_instance *sdi;
@@ -317,6 +318,8 @@ static int hw_init(const char *deviceinfo)
        int devcnt, final_devcnt, num_ports, fd, ret, i;
        char buf[8], **device_names, **serial_params;
 
+       final_devcnt = 0;
+
        if (deviceinfo)
                ports = g_slist_append(NULL, strdup(deviceinfo));
        else
@@ -324,9 +327,22 @@ static int hw_init(const char *deviceinfo)
                ports = list_serial_ports();
 
        num_ports = g_slist_length(ports);
-       fds = calloc(1, num_ports * sizeof(GPollFD));
-       device_names = malloc(num_ports * sizeof(char *));
-       serial_params = malloc(num_ports * sizeof(char *));
+
+       if (!(fds = g_try_malloc0(num_ports * sizeof(GPollFD)))) {
+               sr_err("ols: %s: fds malloc failed", __func__);
+               goto hw_init_free_ports; /* TODO: SR_ERR_MALLOC. */
+       }
+
+       if (!(device_names = g_try_malloc(num_ports * sizeof(char *)))) {
+               sr_err("ols: %s: device_names malloc failed", __func__);
+               goto hw_init_free_fds; /* TODO: SR_ERR_MALLOC. */
+       }
+
+       if (!(serial_params = g_try_malloc(num_ports * sizeof(char *)))) {
+               sr_err("ols: %s: serial_params malloc failed", __func__);
+               goto hw_init_free_device_names; /* TODO: SR_ERR_MALLOC. */
+       }
+
        devcnt = 0;
        for (l = ports; l; l = l->next) {
                /* The discovery procedure is like this: first send the Reset
@@ -370,7 +386,6 @@ static int hw_init(const char *deviceinfo)
        /* 2ms isn't enough for reliable transfer with pl2303, let's try 10 */
        usleep(10000);
 
-       final_devcnt = 0;
        g_poll(fds, devcnt, 1);
 
        for (i = 0; i < devcnt; i++) {
@@ -404,7 +419,6 @@ static int hw_init(const char *deviceinfo)
                final_devcnt++;
                serial_close(fds[i].fd);
                fds[i].fd = 0;
-
        }
 
        /* clean up after all the probing */
@@ -417,9 +431,12 @@ static int hw_init(const char *deviceinfo)
                free(device_names[i]);
        }
 
-       free(fds);
-       free(device_names);
-       free(serial_params);
+       g_free(serial_params);
+hw_init_free_device_names:
+       g_free(device_names);
+hw_init_free_fds:
+       g_free(fds);
+hw_init_free_ports:
        g_slist_free(ports);
 
        return final_devcnt;
@@ -619,7 +636,12 @@ static int receive_data(int fd, int revents, void *user_data)
                 */
                sr_source_remove(fd);
                sr_source_add(fd, G_IO_IN, 30, receive_data, user_data);
-               ols->raw_sample_buf = malloc(ols->limit_samples * 4);
+               ols->raw_sample_buf = g_try_malloc(ols->limit_samples * 4);
+               if (!ols->raw_sample_buf) {
+                       sr_err("ols: %s: ols->raw_sample_buf malloc failed",
+                              __func__);
+                       return FALSE;
+               }
                /* fill with 1010... for debugging */
                memset(ols->raw_sample_buf, 0x82, ols->limit_samples * 4);
        }
@@ -651,7 +673,12 @@ static int receive_data(int fd, int revents, void *user_data)
                                if (ols->sample[0] & 0x80
                                    && !(ols->last_sample[0] & 0x80)) {
                                        count = (int)(*ols->sample) & 0x7fffffff;
-                                       buffer = g_malloc(count);
+                                       if (!(buffer = g_try_malloc(count))) {
+                                               sr_err("ols: %s: buffer malloc "
+                                                      "failed", __func__);
+                                               return FALSE;
+                                       }
+
                                        buflen = 0;
                                        for (i = 0; i < count; i++) {
                                                memcpy(buffer + buflen, ols->last_sample, 4);
@@ -749,7 +776,7 @@ static int receive_data(int fd, int revents, void *user_data)
                        packet.payload = ols->raw_sample_buf;
                        sr_session_bus(user_data, &packet);
                }
-               free(ols->raw_sample_buf);
+               g_free(ols->raw_sample_buf);
 
                serial_flush(fd);
                serial_close(fd);
@@ -775,6 +802,7 @@ static int hw_start_acquisition(int device_index, gpointer session_device_id)
 
        if (!(sdi = sr_get_device_instance(device_instances, device_index)))
                return SR_ERR;
+
        ols = sdi->priv;
 
        if (sdi->status != SR_ST_ACTIVE)
@@ -877,11 +905,18 @@ static int hw_start_acquisition(int device_index, gpointer session_device_id)
        sr_source_add(sdi->serial->fd, G_IO_IN, -1, receive_data,
                      session_device_id);
 
+       if (!(packet = g_try_malloc(sizeof(struct sr_datafeed_packet)))) {
+               sr_err("ols: %s: packet malloc failed", __func__);
+               return SR_ERR_MALLOC;
+       }
+
+       if (!(header = g_try_malloc(sizeof(struct sr_datafeed_header)))) {
+               sr_err("ols: %s: header malloc failed", __func__);
+               g_free(packet);
+               return SR_ERR_MALLOC;
+       }
+
        /* Send header packet to the session bus. */
-       packet = g_malloc(sizeof(struct sr_datafeed_packet));
-       header = g_malloc(sizeof(struct sr_datafeed_header));
-       if (!packet || !header)
-               return SR_ERR;
        packet->type = SR_DF_HEADER;
        packet->length = sizeof(struct sr_datafeed_header);
        packet->payload = (unsigned char *)header;
@@ -892,6 +927,7 @@ static int hw_start_acquisition(int device_index, gpointer session_device_id)
        header->num_logic_probes = NUM_PROBES;
        header->num_analog_probes = 0;
        sr_session_bus(session_device_id, packet);
+
        g_free(header);
        g_free(packet);
 
@@ -911,17 +947,17 @@ static void hw_stop_acquisition(int device_index, gpointer session_device_id)
 }
 
 struct sr_device_plugin ols_plugin_info = {
-       "ols",
-       "Openbench Logic Sniffer",
-       1,
-       hw_init,
-       hw_cleanup,
-       hw_opendev,
-       hw_closedev,
-       hw_get_device_info,
-       hw_get_status,
-       hw_get_capabilities,
-       hw_set_configuration,
-       hw_start_acquisition,
-       hw_stop_acquisition,
+       .name = "ols",
+       .longname = "Openbench Logic Sniffer",
+       .api_version = 1,
+       .init = hw_init,
+       .cleanup = hw_cleanup,
+       .open = hw_opendev,
+       .close = hw_closedev,
+       .get_device_info = hw_get_device_info,
+       .get_status = hw_get_status,
+       .get_capabilities = hw_get_capabilities,
+       .set_configuration = hw_set_configuration,
+       .start_acquisition = hw_start_acquisition,
+       .stop_acquisition = hw_stop_acquisition,
 };