NetBSD-Bugs archive

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

Re: PR/46935 CVS commit: src/lib/libedit



The following reply was made to PR lib/46935; it has been noted by GNATS.

From: Steffen "Daode" Nurpmeso <sdaoden%gmail.com@localhost>
To: christos%zoulas.com@localhost (Christos Zoulas)
Cc: netbsd-bugs%netbsd.org@localhost, lib-bug-people%netbsd.org@localhost,
 gnats-bugs%NetBSD.org@localhost, gnats-admin%netbsd.org@localhost
Subject: Re: PR/46935 CVS commit: src/lib/libedit
Date: Thu, 13 Sep 2012 19:54:56 +0200

 This is a multi-part message in MIME format.
 
 --=_50521df0.GUGyPhvl+wFO2fsogriKx2qrb0wBUv14DwebV0W/v0GtimcZ
 Content-Type: text/plain; charset=us-ascii
 Content-Transfer-Encoding: 7bit
 Content-Disposition: inline
 
 Replying to myself, Google has rejected my mail because of
 a libedit-test.tar.gz attachment:
 
   |smtp-server: 552-5.7.0 Our system detected an illegal attachment on your 
message. Please
   |smtp-server: 552-5.7.0 visit 
http://support.google.com/mail/bin/answer.py?answer=6590 to
   |smtp-server: 552 5.7.0 review our attachment guidelines.
 
 This time attaching the same stuff as a shell archive with
 compressed members.
 Thanks!
 
  |christos%zoulas.com@localhost (Christos Zoulas) wrote:
  |
  ||On Sep 11,  4:48pm, sdaoden%gmail.com@localhost (Steffen "Daode" Nurpmeso) 
wrote:
  ||-- Subject: Re: PR/46935 CVS commit: src/lib/libedit
  ||
  | [.]
  ||| What do you think about that?
  |
  |First i have to say that i hope i have finally encapsulated
  |el_errno=0 in el_getc() properly.
  |
  |And that this iteration was entirely done on NetBSD 6 RC1 using
  |a libedit from HEAD (and terminfo from 6).
  |
  ||I like the enum clarity[.]
  |
  |I've chosen a different name for the enum -- here there was
  |a "rcmd" name clash.
  |
  ||[.], but I am not sure about removing the EINTR
  |
  |Now that read_getcmd() fails with ERRCMD on error only EINTR can
  |only be tested inside that conditional.  Otherwise my patch would
  |still not be complete.
  |
  ||code. I also have to check the EOF logic too. Test it some more, and
  |
  |I'm pretty sure now that removing the ==-1 case was correct.
  |I don't know what it was there for, but effectively it tests
  |==OKCMD until now, which is of course wrong (since always true).
  |
  ||I need to find some time here to test it myself. I bit busy since I
  |
  |I'll attach the super simple test i've used (simply copying over
  |FreeBSD sh(1) code less proper buffer handling), including
  |a read.c.debug file which pimps up regular read.c by an immense
  |amount of debug fprintf(3) statements, which makes it easier to
  |prove that this patch is now really correct.  (What i hope).
 
 [This is libedit-test.shar now..]
 
  ||just came back from vacation...
  |
  |AH - for us i hope we can go down south soon, and finally finally
  |finally..
  |And also to were you came from -- i love this fantastic light in
  |Greece, and the colours, through it..  It's so beautiful.
  |Unbelievable that you left that by choice!!
  |[Flabbergasted for a moment]
  |
  |Hmm.  Different to the Colossus of Rhodes the Colossa of New York
  |is still standing; even without Norah Jones actually being
  |around!!; that that can happen..  But i don't know, i never left
  |Europe myself..  An american uncle, that's all.  Traffic pollutes
  |right..  Solar airplanes maybe, but they are too slow for the
  |people.
  |
  |Anyway.  Good to hear that you are recuperated, because i have
  |founf two more problems in editline(3) :-)
  |
  |- UNBUFFERED always appends to the buffer.
  |  That behaviour is not documented, and i was surprised to detect
  |  that during testing.  Is this really the desired behaviour?
  |
  |- There is no safety-belt against overflowing the line buffer.
  |  Wether UNBUFFERED or not, nothing prevents you from that (though
  |  of course el_gets() reset it upon entry except in the UNBUFFERED
  |  case), and it is only detected if DEBUG_EDIT is #define'd.
  |  However, the .limit is actively set in some files which i have
  |  not looked at yet, so i left that off.
  |  Maybe a different PR?  And how to solve?
  |
  ||christos
  |
  |'Hope this patch does it!
  |Ciao,
  |
  |--steffen
 
 --=_50521df0.GUGyPhvl+wFO2fsogriKx2qrb0wBUv14DwebV0W/v0GtimcZ
 Content-Type: text/plain;
  charset=us-ascii
 Content-Transfer-Encoding: 7bit
 Content-Disposition: attachment;
  filename="libedit-read.diff"
 
 --- read.c.orig        2012-09-12 23:33:16.000000000 +0200
 +++ read.c     2012-09-13 18:47:12.000000000 +0200
 @@ -52,13 +52,23 @@ __RCSID("$NetBSD: read.c,v 1.69 2012/09/
  #include <limits.h>
  #include "el.h"
  
 -#define OKCMD -1      /* must be -1! */
 +#ifdef WIDECHAR
 +# define SCNV "%ls"
 +#else
 +# define SCNV "%s"
 +#endif
  
 -private int   read__fixio(int, int);
 -private int   read_preread(EditLine *);
 -private int   read_char(EditLine *, Char *);
 -private int   read_getcmd(EditLine *, el_action_t *, Char *);
 -private void  read_pop(c_macro_t *);
 +enum cmdstate {
 +      OKCMD   = -1,
 +      EOFCMD  = 0,
 +      ERRCMD  = 1
 +};
 +
 +private int           read__fixio(int, int);
 +private int           read_preread(EditLine *);
 +private int           read_char(EditLine *, Char *);
 +private enum cmdstate read_getcmd(EditLine *, el_action_t *, Char *);
 +private void          read_pop(c_macro_t *);
  
  /* read_init():
   *    Initialize the read stuff
 @@ -172,9 +182,6 @@ read__fixio(int fd __attribute__((__unus
  #endif /* TRY_AGAIN */
                return e ? 0 : -1;
  
 -      case EINTR:
 -              return 0;
 -
        default:
                return -1;
        }
 @@ -233,20 +240,18 @@ FUN(el,push)(EditLine *el, const Char *s
  
  
  /* read_getcmd():
 - *    Get next command from the input stream, return OKCMD on success.
 + *    Get next command from the input stream.
   *    Character values > 255 are not looked up in the map, but inserted.
   */
 -private int
 +private enum cmdstate
  read_getcmd(EditLine *el, el_action_t *cmdnum, Char *ch)
  {
        el_action_t cmd;
        int num;
  
 -      el->el_errno = 0;
        do {
                if ((num = FUN(el,getc)(el, ch)) != 1) {/* if EOF or error */
 -                      el->el_errno = num == 0 ? 0 : errno;
 -                      return 0;       /* not OKCMD */
 +                      return (num < 0 ? ERRCMD : EOFCMD);
                }
  
  #ifdef        KANJI
 @@ -318,27 +323,27 @@ read_char(EditLine *el, Char *cp)
        size_t cbp = 0;
        int bytes = 0;
  
 - again:
        el->el_signal->sig_no = 0;
 + again:
        while ((num_read = read(el->el_infd, cbuf + cbp, (size_t)1)) == -1) {
                int e = errno;
 -              switch (el->el_signal->sig_no) {
 -              case SIGCONT:
 -                      FUN(el,set)(el, EL_REFRESH);
 -                      /*FALLTHROUGH*/
 -              case SIGWINCH:
 -                      sig_set(el);
 +              if (e == EINTR) {
 +                      switch (el->el_signal->sig_no) {
 +                      case SIGCONT:
 +                              FUN(el,set)(el, EL_REFRESH);
 +                              /*FALLTHROUGH*/
 +                      case SIGWINCH:
 +                              sig_set(el);
 +                              el->el_signal->sig_no = 0;
 +                              goto again;
 +                      default:
 +                              break;
 +                      }
 +              } else if (! tried++ && read__fixio(el->el_infd, e) == 0)
                        goto again;
 -              default:
 -                      break;
 -              }
 -              if (!tried && read__fixio(el->el_infd, e) == 0)
 -                      tried = 1;
 -              else {
 -                      errno = e;
 -                      *cp = '\0';
 -                      return -1;
 -              }
 +              errno = e;
 +              *cp = '\0';
 +              return -1;
        }
  
  #ifdef WIDECHAR
 @@ -394,6 +399,7 @@ FUN(el,getc)(EditLine *el, Char *cp)
  {
        int num_read;
        c_macro_t *ma = &el->el_chared.c_macro;
 +      el->el_errno = 0;
  
        terminal__flush(el);
        for (;;) {
 @@ -437,7 +443,7 @@ FUN(el,getc)(EditLine *el, Char *cp)
                *cp = *(char *)(void *)cp;
  #endif
  #ifdef DEBUG_READ
 -      (void) fprintf(el->el_errfile, "Got it %c\n", *cp);
 +      (void) fprintf(el->el_errfile, "Got <%c> (return %d)\n", *cp, num_read);
  #endif /* DEBUG_READ */
        return num_read;
  }
 @@ -570,26 +576,33 @@ FUN(el,gets)(EditLine *el, int *nread)
                goto noedit;
        }
  
 -      for (num = OKCMD; num == OKCMD;) {      /* while still editing this
 -                                               * line */
 +      /* The command drive input loop */
 +      for (num = 0;;) {
 +              enum cmdstate cmdstate;
  #ifdef DEBUG_EDIT
                read_debug(el);
  #endif /* DEBUG_EDIT */
 -              /* if EOF or error */
 -              if ((num = read_getcmd(el, &cmdnum, &ch)) != OKCMD) {
 -                      num = -1;
 +              if ((cmdstate = read_getcmd(el, &cmdnum, &ch)) != OKCMD) {
 +                      if (cmdstate == ERRCMD) {
 +                              num = -1;
 +                              if (el->el_errno == EINTR) {
 +#ifdef DEBUG_READ
 +                                      (void) fprintf(el->el_errfile,
 +                                          "Return from el_gets due EINTR\n");
 +#endif /* DEBUG_READ */
 +                                      el->el_line.buffer[0] = '\0';
 +                                      el->el_line.lastchar =
 +                                          el->el_line.cursor =
 +                                          el->el_line.buffer;
 +                                      break;
 +                              }
 +                      }
  #ifdef DEBUG_READ
                        (void) fprintf(el->el_errfile,
                            "Returning from el_gets %d\n", num);
  #endif /* DEBUG_READ */
                        break;
                }
 -              if (el->el_errno == EINTR) {
 -                      el->el_line.buffer[0] = '\0';
 -                      el->el_line.lastchar =
 -                          el->el_line.cursor = el->el_line.buffer;
 -                      break;
 -              }
                if ((unsigned int)cmdnum >= (unsigned int)el->el_map.nfunc) {   
/* BUG CHECK command */
  #ifdef DEBUG_EDIT
                        (void) fprintf(el->el_errfile,
 @@ -606,7 +619,7 @@ FUN(el,gets)(EditLine *el, int *nread)
                                        break;
                        if (b->name)
                                (void) fprintf(el->el_errfile,
 -                                  "Executing %s\n", b->name);
 +                                  "Executing " SCNV "\n", b->name);
                        else
                                (void) fprintf(el->el_errfile,
                                    "Error command = %d\n", cmdnum);
 @@ -662,16 +675,17 @@ FUN(el,gets)(EditLine *el, int *nread)
                        continue;       /* keep going... */
  
                case CC_EOF:    /* end of file typed */
 +                      cmdstate = EOFCMD;
                        if ((el->el_flags & UNBUFFERED) == 0)
                                num = 0;
 -                      else if (num == -1) {
 +                      else {
                                *el->el_line.lastchar++ = CONTROL('d');
                                el->el_line.cursor = el->el_line.lastchar;
 -                              num = 1;
                        }
                        break;
  
                case CC_NEWLINE:        /* normal end of line */
 +                      cmdstate = EOFCMD;
                        num = (int)(el->el_line.lastchar - el->el_line.buffer);
                        break;
  
 @@ -701,6 +715,8 @@ FUN(el,gets)(EditLine *el, int *nread)
                el->el_chared.c_vcmd.action = NOP;
                if (el->el_flags & UNBUFFERED)
                        break;
 +              if (cmdstate != OKCMD)
 +                      break;
        }
  
        terminal__flush(el);            /* flush any buffered output */
 
 --=_50521df0.GUGyPhvl+wFO2fsogriKx2qrb0wBUv14DwebV0W/v0GtimcZ
 Content-Type: text/plain;
  charset=us-ascii
 Content-Transfer-Encoding: 7bit
 Content-Disposition: attachment;
  filename="libedit-test.shar"
 
 # This is a shell archive.  Save it in a file, remove anything before
 # this line, and then unpack it by entering "sh file".  Note, it may
 # create directories; files and directories will be owned by you and
 # have default permissions.
 #
 # Archives produced using this implementation of shar may be easily
 # examined with the command:
 #      $ grep '^[^X#]' shell-archive
 #
 # This archive contains:
 #      test.c
 #      read.c.debug
 #
 echo xx - test.c
 sed 's/^X//' << \! | uudecode | gunzip -c -f > "test.c"
 Xbegin-base64 664 /dev/stdout
 XH4sIAEQKUlAAA3VTXU/bQBB8tn/FNlWQbQwEVX3BSapSAkJyg5SQl1IUXe1LcpJzju7OiFLx37u7
 Xlw+XtpEi27Oze7Oze+F7pYuqKSX0pTGnq2F4AKxaalG9wVyp6reQUXpJWAtstELqG3CFmCyVYzgI
 XzpIhXBspL6dXkJwhYJ1wqoBiJQxshLFSy2dXPFzOrqe33x6zFqPW1nleYqp5sWnFlHYgq3kldcZn
 X9NtnhAdSICph1vOibrTL9oGnWpUhNr4qq4gq4Wsc/gqD4+M/6EFExBijWfgahsRcC6U5RZhlkW7F
 XJfjxxAXQpabgeqJwqtZgBZYhvjb4MkJbcqUlJLKCATWgtHIRpT/0HlMg3zU/6sbxE8cVU4UFRJQy
 XgPEsz2NsGQPP0XkKnW2Rzo5GwmAI50yq5lY6zExhlM9nY/T4ejQZXaUYRjeCHy/S1NGRFXiWepH1
 XIrIipkJWnFoxXwldVtKg0iNvFkV2rUXT25vP+eRrCpzPuqjmojYQZVkMaIcXdLAU+vCBdPmpRB85
 X4e8NoSweeLvhYIuQa0vpLHd15HeAJP8nSxufgizCe/AJ/xdwcp6xP1ayzjaNAlwMsSH4teRSnuQB
 XJq3lutj8jA5LnAILSHHacbvMu11t7woPhgSdDPxe7Ls73gOvQOJaId8TxV7/sfFBsNjgBXU4QV4a
 XXIwB/b7rDtXo3I+m9/Dlbnw/ucsvvMpBF4V6IYNuSZrxcQH97mlih5iX7k3f0YiTckN96MVbJwk6
 XOMBt7wT3vMd8An/gJaJvqUucHlGNdI3REPViumG/AUVu08qnBAAA
 X====
 !
 echo xx - read.c.debug
 sed 's/^X//' << \! | uudecode | gunzip -c -f > "read.c.debug"
 Xbegin-base64 664 /dev/stdout
 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
 X====
 !
 exit
 
 
 --=_50521df0.GUGyPhvl+wFO2fsogriKx2qrb0wBUv14DwebV0W/v0GtimcZ--
 


Home | Main Index | Thread Index | Old Index