I have no interest in tracing through libshell code, but if you think RTC has a bug, and if you care to create a test case, I'd be glad to verify the bug and file a CR for you.
--chris Roland Mainz wrote: > 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 >