pspp-dev
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: scanner / lexer problem in GUI


From: John Darrington
Subject: Re: scanner / lexer problem in GUI
Date: Sun, 6 May 2012 07:14:27 +0000
User-agent: Mutt/1.5.18 (2008-05-17)

OK.  I like your solution better.

Please push it when you're ready.

J'

On Sun, May 06, 2012 at 05:34:48AM +0000, John Darrington wrote:
     As it happened, I had a prepared a similar patch.  Attached.
     Perhaps we could compare patches.
     
     J'
     
     On Sat, May 05, 2012 at 10:14:57PM -0700, Ben Pfaff wrote:
          John Darrington <address@hidden> writes:
          
          > Looking at the bug recently reported on bug-gnu-pspp I notice the 
following.
          >
          > Valgrind reports:
          
          I sent out a 2-patch series that fixes the problem that I see,
          with and without valgrind.  Does it fix the problem you see too?
          
          Thanks,
          
          Ben.
     
     -- 
     PGP Public key ID: 1024D/2DE827B3 
     fingerprint = 8797 A26D 0854 2EAB 0285  A290 8A67 719C 2DE8 27B3
     See http://keys.gnupg.net or any PGP keyserver for public key.
     

     diff --git a/src/language/lexer/lexer.c b/src/language/lexer/lexer.c
     index e72a3e4..7048d8a 100644
     --- a/src/language/lexer/lexer.c
     +++ b/src/language/lexer/lexer.c
     @@ -1217,6 +1217,9 @@ lex_source_read__ (struct lex_source *src)
            n = src->reader->class->read (src->reader, &src->buffer[head_ofs],
                                          src->allocated - head_ofs,
                                          segmenter_get_prompt 
(&src->segmenter));
     +
     +      assert (n <= src->allocated - head_ofs);
     +
            if (n == 0)
              {
                /* End of input.
     diff --git a/src/ui/gui/psppire-lex-reader.c 
b/src/ui/gui/psppire-lex-reader.c
     index ae043b0..6351094 100644
     --- a/src/ui/gui/psppire-lex-reader.c
     +++ b/src/ui/gui/psppire-lex-reader.c
     @@ -66,26 +66,47 @@ lex_gtk_text_buffer_read (struct lex_reader *r_, char 
*buf, size_t n,
                       enum prompt_style prompt_style UNUSED)
      {
        struct lex_gtk_text_buffer_reader *r = lex_gtk_text_buffer_reader_cast 
(r_);
     -  int n_chars = n;
        char *s;
      
        GtkTextIter iter = r->start ;
        
     -  int offset = gtk_text_iter_get_offset (&iter);
     -  int end_offset = gtk_text_iter_get_offset (&r->stop);
     -
     -  if ( end_offset - offset < n)
     -    n_chars = end_offset - offset;
     -  
     -  gtk_text_iter_set_offset (&iter, offset + n_chars);
     -
     -  s = gtk_text_iter_get_text (&r->start, &iter);
     -
     -  strncpy (buf, s, n_chars);
     +  const gint offset = gtk_text_iter_get_offset (&iter);
     +  const gint end_offset = gtk_text_iter_get_offset (&r->stop);
     +  const gint n_bytes = (end_offset - offset < n) ? end_offset - offset : 
n;
     +
     +  /* We want to get no more than n_bytes from the buffer.
     +     However, since gtk_text_iter deals in chars, not bytes, we cannot 
possibly
     +     set an iter which we know will not fetch too many bytes.  Thus, we 
start
     +     by assuming that n_chars == n_bytes and step backwards if we end up 
fetching
     +     too many.
     +   */
     +  gint n_chars = n_bytes;
     +  gint backstep = 4;
     +  gint bytes_read = 0;
     +  do
     +    {
     +      gtk_text_iter_set_offset (&iter, offset + n_chars);
     +
     +      s = gtk_text_iter_get_text (&r->start, &iter);
     +      bytes_read = strlen (s);
     +      if ( n_chars == 1 && bytes_read > n_bytes)
     +  {
     +    g_critical ("Reading a single character returned %d bytes, but only 
%d bytes"
     +                " were requested", bytes_read, n_bytes);
     +    return 0;
     +  }
     +      n_chars -= backstep;
     +      if ( n_chars < 1)
     +  n_chars = 1;
     +      backstep *= 2;
     +    }
     +  while (bytes_read > n_bytes);
     +
     +  strncpy (buf, s, bytes_read);
      
        r->start = iter;
      
     -  return strlen (s);
     +  return bytes_read;
      }
      
      




-- 
PGP Public key ID: 1024D/2DE827B3 
fingerprint = 8797 A26D 0854 2EAB 0285  A290 8A67 719C 2DE8 27B3
See http://keys.gnupg.net or any PGP keyserver for public key.

Attachment: signature.asc
Description: Digital signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]