Hi!

----

While doing some testing for ksh93-integration update2 on B111 I hit the
following "dbx -access" error in usr/src/lib/libshell/common/edit/edit.c
and I am not able to make heads or tails from this issue (or I am always
working at night and don't sot the error then):
-- snip --
<rtc> Read from uninitialized (rui):
Attempting to read 4 bytes at address 0x80472dc
    which is 40 bytes above the current stack pointer
=>[1] tty_get(fd = 0, tty = 0x80472dc), line 190 in "edit.c"
  [2] tty_check(fd = 0), line 165 in "edit.c"
  [3] sh_iocheckfd(shp = 0x82269f4, fd = 0), line 1817 in "io.c"
  [4] sh_iostream(shp = 0x82269f4, fd = 0), line 471 in "io.c"
  [5] sh_ioinit(shp = 0x82269f4), line 405 in "io.c"
  [6] sh_init(argc = 3, argv = 0x80479bc, userinit = (nil)), line 1087
in "init.c"
  [7] sh_main(ac = 3, av = 0x80479bc, userinit = (nil)), line 156 in
"main.c"
  [8] main(argc = 3, argv = 0x80479bc), line 46 in "pmain.c"
-- snip --

... but looking at the matching section of code in "edit.c" ...
-- snip --
   155  
   156  /*
   157   * This routine returns true if fd refers to a terminal
   158   * This should be equivalent to isatty
   159   */
   160  int tty_check(int fd)
   161  {
   162          register Edit_t *ep =
(Edit_t*)(sh_getinterp()->ed_context);
   163          struct termios tty;
   164          ep->e_savefd = -1;
   165          return(tty_get(fd,&tty)==0);
   166  }
   167  
   168  /*
   169   * Get the current terminal attributes
   170   * This routine remembers the attributes and just returns them
if it
   171   *   is called again without an intervening tty_set()
   172   */
   173  
   174  int tty_get(register int fd, register struct termios *tty)
   175  {
   176          register Edit_t *ep =
(Edit_t*)(sh_getinterp()->ed_context);
   177          if(fd == ep->e_savefd)
   178                  *tty = ep->e_savetty;
   179          else
   180          {
   181                  while(tcgetattr(fd,tty) == SYSERR)
   182                  {
   183                          if(errno !=EINTR)
   184                                  return(SYSERR);
   185                          errno = 0;
   186                  }
   187                  /* save terminal settings if in cannonical state
*/
   188                  if(ep->e_raw==0)
   189                  {
   190                          ep->e_savetty = *tty;
   191                          ep->e_savefd = fd;
   192                  }
   193          }
   194          return(0);
   195  }
   196  
   197  /*
   198   * Set the terminal attributes
   199   * If fd<0, then current attributes are invalidated
   200   */
-- snip --

... the loop in line 181 only loops for errors, if |tcgetattr()| returns
success (or better: A non-|-1| return code (|SYSERR| is a #define to
|-1|)) the code moves forward to line 190. Where is the error in this
case - is there any condition when |tcgetattr()| returns "success" but
doesn't fill-out the |struct termios| structure passed via |tty| ?

Compiler/dbx versions are (note I am using the Ceres dbx since SS12
dbx's "check -access" is broken in B111):
$ cc
-V                                                                              
                           
cc: Sun C 5.9 SunOS_i386 Patch 124868-07 2008/10/07
usage: cc [ options] files.  Use 'cc -flags' for details
$ /opt/SS_express200811v2/SUNWspro/bin/dbx -V  
Sun Ceres DBX Debugger 7.7 SunOS_i386 2008/10/22 

----

Bye,
Roland

-- 
  __ .  . __
 (o.\ \/ /.o) roland.mainz at nrubsig.org
  \__\/\/__/  MPEG specialist, C&&JAVA&&Sun&&Unix programmer
  /O /==\ O\  TEL +49 641 3992797
 (;O/ \/ \O;)

Reply via email to