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 <[email protected]>
> ---
> 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
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/sigrok-devel
_______________________________________________
sigrok-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/sigrok-devel