Hello Stefan,

thanks very much for reviewing the patch !

I have now improved it by following your comments, please see the new
version (v2) in the next message...

Regards,

Guido

On Mon, 29/10/2018 at 19.17 +0000, Brüns, Stefan wrote:
> 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