Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 9 Jul 1997 01:05:33 +0200 (MET DST)
From:      Wolfgang Helbig <helbig@MX.BA-Stuttgart.De>
To:        FreeBSD-gnats-submit@FreeBSD.ORG
Subject:   bin/4064: libedit's history search is broken
Message-ID:  <199707082305.BAA14379@helbig.informatik.ba-stuttgart.de>
Resent-Message-ID: <199707082310.QAA15126@hub.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         4064
>Category:       bin
>Synopsis:       libedit's history search is broken
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Tue Jul  8 16:10:01 PDT 1997
>Last-Modified:
>Originator:     Wolfgang Helbig
>Organization:
>Release:        FreeBSD 3.0-CURRENT i386
>Environment:

	

>Description:

	The error shows up e. g. in sh(1), which uses the libedit.
	Do a ``set -o vi'' to enable vi style line editing.
	If you search for `ls' in the history, the shell will either
	show all commands that contain a `l', or will beep at you,
	even if there are commands that contain `ls' in the past.

>How-To-Repeat:

	Enter the following commands to get a history.
	# sh
	# set -o vi
	# lll
	# llll

	Now hit the escape key to enter the vi commands, enter
	/llll, to search for the last occurence of the string `llll'
	in the history. Depending on whatever, the shell will show
	you the command `llll', which is correct, or beep at you,
	which is wrong.  Hit the `N'-key to repeat the search, the
	shell might show you `lll', which is wrong, it should beep
	at you instead.

>Fix:

Index: search.c
===================================================================
RCS file: /usr/cvsroot/src/lib/libedit/search.c,v
retrieving revision 1.5
diff -c -r1.5 search.c
*** search.c	1997/06/25 08:14:17	1.5
--- search.c	1997/07/08 21:39:09
***************
*** 464,471 ****
  	    (void)strncpy(tmpbuf, el->el_search.patbuf, sizeof(tmpbuf) - 1);
  	    el->el_search.patbuf[0] = '.';
  	    el->el_search.patbuf[1] = '*';
! 	    (void)strncpy(&el->el_search.patbuf[2], tmpbuf,
! 			   sizeof(el->el_search.patbuf) - 3);
  	    el->el_search.patlen++;
  	    el->el_search.patbuf[el->el_search.patlen++] = '.';
  	    el->el_search.patbuf[el->el_search.patlen++] = '*';
--- 464,470 ----
  	    (void)strncpy(tmpbuf, el->el_search.patbuf, sizeof(tmpbuf) - 1);
  	    el->el_search.patbuf[0] = '.';
  	    el->el_search.patbuf[1] = '*';
! 	    (void)strncpy(&el->el_search.patbuf[2], tmpbuf, EL_BUFSIZ - 3);
  	    el->el_search.patlen++;
  	    el->el_search.patbuf[el->el_search.patlen++] = '.';
  	    el->el_search.patbuf[el->el_search.patlen++] = '*';
***************
*** 479,486 ****
  	tmpbuf[tmplen++] = '*';
  #endif
  	tmpbuf[tmplen] = '\0';
! 	(void)strncpy(el->el_search.patbuf, tmpbuf,
! 		       sizeof(el->el_search.patbuf) - 1);
  	el->el_search.patlen = tmplen;
      }
      el->el_state.lastcmd = (el_action_t) dir; /* avoid c_setpat */
--- 478,484 ----
  	tmpbuf[tmplen++] = '*';
  #endif
  	tmpbuf[tmplen] = '\0';
! 	(void)strncpy(el->el_search.patbuf, tmpbuf, EL_BUFSIZ - 1);
  	el->el_search.patlen = tmplen;
      }
      el->el_state.lastcmd = (el_action_t) dir; /* avoid c_setpat */
>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199707082305.BAA14379>