On Montag, 29. Oktober 2018 17:53:19 CET Guido Trentalancia wrote:
> Correctly set the length of the buffer used to hold the SCPI response
> from the device containing the binary acquisition data.
> 
> Signed-off-by: Guido Trentalancia <gu...@trentalancia.com>
> ---
>  src/scpi/scpi.c |   36 +++++++++++++++++-------------------
>  1 file changed, 17 insertions(+), 19 deletions(-)
> 
> diff -pru libsigrok-git-20102018-orig/src/scpi/scpi.c libsigrok-git-
> 20102018-fix-scpi-response-buffer-length/src/scpi/scpi.c
> --- libsigrok-git-20102018-orig/src/scpi/scpi.c       2018-10-20
> 13:12:30.983966965 +0200
> +++ libsigrok-git-20102018-fix-scpi-response-buffer-
> length/src/scpi/scpi.c        2018-10-29 17:45:33.251699570 +0100
> @@ -974,14 +974,14 @@ SR_PRIV int sr_scpi_get_block(struct sr_
>       *scpi_response = NULL;
> 
>       /* Get (the first chunk of) the response. */
> -     while (response->len < 2) {
> +     do {
>               ret = scpi_read_response(scpi, response, timeout);
>               if (ret < 0) {
>                       g_mutex_unlock(&scpi->scpi_mutex);
>                       g_string_free(response, TRUE);
>                       return ret;
>               }
> -     }
> +     } while (response->len < 2);
> 
>       /*
>        * SCPI protocol data blocks are preceeded with a length spec.
> @@ -1028,25 +1028,23 @@ SR_PRIV int sr_scpi_get_block(struct sr_
>       g_string_erase(response, 0, 2 + llen);
> 
>       /*
> -      * If the initially assumed length does not cover the data
> block
> -      * length, then re-allocate the buffer size to the now known
> -      * length, and keep reading more chunks of response data.
> +      * Re-allocate the buffer size to the now known length
> +      * and keep reading more chunks of response data.
>        */
> -     if (response->len < (unsigned long)(datalen)) {
> -             int oldlen = response->len;
> -             g_string_set_size(response, datalen);
> -             g_string_set_size(response, oldlen);
> -     }
> +     int oldlen = response->len;
> +     g_string_set_size(response, datalen);

NAK!

The above is a reservation call. If you skip the g_string_set_size(response, 
oldlen);, any new data will be appended at offset datalen, not oldlen.


> 
> -     while (response->len < (unsigned long)(datalen)) {
> -             ret = scpi_read_response(scpi, response, timeout);
> -             if (ret < 0) {
> -                     g_mutex_unlock(&scpi->scpi_mutex);
> -                     g_string_free(response, TRUE);
> -                     return ret;
> -             }
> -             if (ret > 0)
> -                     timeout = g_get_monotonic_time() + scpi-
> 
> >read_timeout_us;
> 
> +     if (oldlen < datalen) {
> +             do {
> +                     ret = scpi_read_response(scpi, response,
> timeout);
> +                     if (ret < 0) {
> +                             g_mutex_unlock(&scpi->scpi_mutex);
> +                             g_string_free(response, TRUE);
> +                             return ret;
> +                     }
> +                     if (ret > 0)
> +                             timeout = g_get_monotonic_time() +
> scpi->read_timeout_us;
> +             } while (response->len < (unsigned long)(datalen));
>       }
> 
>       g_mutex_unlock(&scpi->scpi_mutex);
> 
> 
> _______________________________________________
> sigrok-devel mailing list
> sigrok-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/sigrok-devel



_______________________________________________
sigrok-devel mailing list
sigrok-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sigrok-devel

Reply via email to