Mailing List Archive

Re: Patch: OpenSSH 2.1.0 under Solaris 8, Solaris 7 and other sys tems, too
> -----Ursprüngliche Nachricht-----
> Von: Andre Lucas [SMTP:andre.lucas@dial.pipex.com]
> Gesendet am: Freitag, 12. Mai 2000 16:37
> An: Bladt Norbert
> Cc: 'Karsten Thygesen'; 'openssh-unix-dev@mindrot.org';
> 'carl@bl.echidna.id.au'
> Betreff: Re: Patch: OpenSSH 2.1.0 under Solaris 8, Solaris 7 and
> other systems, too
>
> Well spotted. Doh.
No problem. I had to use the debug mode to find out why the
X11 forwarding didn't work. Finally, the problem was in the client,
though.

> I think an even better way to fix this would be to save the string as
> parsed from ssh_prng_cmds in the command's entropy_source_t, and print
> that in debug messages. It's a tiny amount of memory for what is, as you
> say, useful debugging info.
Sure. I did look at the sources for the first time and
do not know a lot of OpenSSH, yet.
So, just go ahead and apply your suggested fix for the next release
and we are all happy.

> So useful, in fact, that the bug occurred when I added the second
> parameter to Damien's prng code, likely as a temporary measure, and left
> it in...
It was easy to spot and temporarily fixed, anyway.

Norbert.
Re: Patch: OpenSSH 2.1.0 under Solaris 8, Solaris 7 and other sys tems, too [ In reply to ]
Because Norbert's patch didn't fix all the core dumps here's a minimal
minimal patch that implements Andre's suggestion:

*** entropy.c.orig Tue May 2 01:56:41 2000
--- entropy.c Mon May 15 16:18:22 2000
***************
*** 129,134 ****
--- 129,136 ----
unsigned int badness;
/* Increases by factor of two each timeout */
unsigned int sticky_badness;
+ /* Unparsed copy of cmd field in control file */
+ char *cmd;
/* Path to executable */
char *path;
/* argv to pass to executable */
***************
*** 211,218 ****

/* FIXME: turn this off later */
#if 1
! debug("Got %0.2f bytes of entropy from %s",
entropy_estimate,
! entropy_sources[c].path);
#endif

total_entropy_estimate += entropy_estimate;
--- 213,220 ----

/* FIXME: turn this off later */
#if 1
! debug("Got %0.2f bytes of entropy from
'%s'", entropy_estimate,
! entropy_sources[c].cmd);
#endif

total_entropy_estimate += entropy_estimate;
***************
*** 225,233 ****
} else {
/* FIXME: turn this off later */
#if 1
! debug("Command '%s %s %s' disabled (badness
%d)",
! entropy_sources[c].path,
entropy_sources[c].args[1],
! entropy_sources[c].args[2],
entropy_sources[c].badness);
#endif

if (entropy_sources[c].badness > 0)
--- 227,235 ----
} else {
/* FIXME: turn this off later */
#if 1
! debug("Command '%s' disabled (badness %d)",
! entropy_sources[c].cmd,
! entropy_sources[c].badness);
#endif

if (entropy_sources[c].badness > 0)
***************
*** 324,331 ****
close(devnull);

execv(src->path, (char**)(src->args));
! debug("(child) Couldn't exec '%s %s %s': %s",
src->path,
! src->args[1], src->args[2],
strerror(errno));
src->badness = src->sticky_badness = 128;
_exit(-1);
default: /* Parent */
--- 326,333 ----
close(devnull);

execv(src->path, (char**)(src->args));
! debug("(child) Couldn't exec '%s': %s", src->cmd,
! strerror(errno));
src->badness = src->sticky_badness = 128;
_exit(-1);
default: /* Parent */
***************
*** 372,378 ****

case -1:
default:
! error("Command '%s %s': select() failed: %s",
src->path, src->args[1],
strerror(errno));
error_abort = 1;
break;
--- 374,380 ----

case -1:
default:
! error("Command '%s': select() failed: %s", src->cmd,
strerror(errno));
error_abort = 1;
break;
***************
*** 386,393 ****
close(p[0]);

if (waitpid(pid, &status, 0) == -1) {
! error("Couldn't wait for child '%s %s' completion: %s",
src->path,
! src->args[1], strerror(errno));
/* return(-1); */ /* FIXME: (ATL) this doesn't feel right */
return(0.0);
}
--- 388,395 ----
close(p[0]);

if (waitpid(pid, &status, 0) == -1) {
! error("Couldn't wait for child '%s' completion: %s",
src->cmd,
! strerror(errno));
/* return(-1); */ /* FIXME: (ATL) this doesn't feel right */
return(0.0);
}
***************
*** 398,404 ****
/* closing p[0] on timeout causes the entropy command to
* SIGPIPE. Take whatever output we got, and mark this
command
* as slow */
! debug("Command %s %s timed out", src->path, src->args[1]);
src->sticky_badness *= 2;
src->badness = src->sticky_badness;
return(total_bytes_read);
--- 400,406 ----
/* closing p[0] on timeout causes the entropy command to
* SIGPIPE. Take whatever output we got, and mark this
command
* as slow */
! debug("Command '%s' timed out", src->cmd);
src->sticky_badness *= 2;
src->badness = src->sticky_badness;
return(total_bytes_read);
***************
*** 408,419 ****
if (WEXITSTATUS(status)==0) {
return(total_bytes_read);
} else {
! debug("Exit status was %d", WEXITSTATUS(status));
src->badness = src->sticky_badness = 128;
return (0.0);
}
} else if (WIFSIGNALED(status)) {
! debug("Returned on uncaught signal %d !", status);
src->badness = src->sticky_badness = 128;
return(0.0);
} else
--- 410,422 ----
if (WEXITSTATUS(status)==0) {
return(total_bytes_read);
} else {
! debug("Exit status of '%s' was %d", src->cmd,
! WEXITSTATUS(status));
src->badness = src->sticky_badness = 128;
return (0.0);
}
} else if (WIFSIGNALED(status)) {
! debug("Returned on uncaught signal %d for '%s'!", status,
src->cmd);
src->badness = src->sticky_badness = 128;
return(0.0);
} else
***************
*** 614,619 ****
--- 617,627 ----
linenum, cmdfilename);
continue;
}
+
+ /* save copy of command args for use in debug() */
+ cp = (char*)xmalloc(strlen(cmd)+1);
+ strcpy(cp, cmd);
+ entcmd[cur_cmd].cmd = cp;

/* split the command args */
cp = strtok(cmd, WHITESPACE);
Re: Patch: OpenSSH 2.1.0 under Solaris 8, Solaris 7 and other sys tems, too [ In reply to ]
does this replace, or work over top of, Norbert's patch?

On Mon, 15 May 2000, Badura, Christoph wrote:

> Because Norbert's patch didn't fix all the core dumps here's a minimal
> minimal patch that implements Andre's suggestion:
>
> *** entropy.c.orig Tue May 2 01:56:41 2000
> --- entropy.c Mon May 15 16:18:22 2000
> ***************
> *** 129,134 ****
> --- 129,136 ----
> unsigned int badness;
> /* Increases by factor of two each timeout */
> unsigned int sticky_badness;
> + /* Unparsed copy of cmd field in control file */
> + char *cmd;
> /* Path to executable */
> char *path;
> /* argv to pass to executable */
> ***************
> *** 211,218 ****
>
> /* FIXME: turn this off later */
> #if 1
> ! debug("Got %0.2f bytes of entropy from %s",
> entropy_estimate,
> ! entropy_sources[c].path);
> #endif
>
> total_entropy_estimate += entropy_estimate;
> --- 213,220 ----
>
> /* FIXME: turn this off later */
> #if 1
> ! debug("Got %0.2f bytes of entropy from
> '%s'", entropy_estimate,
> ! entropy_sources[c].cmd);
> #endif
>
> total_entropy_estimate += entropy_estimate;
> ***************
> *** 225,233 ****
> } else {
> /* FIXME: turn this off later */
> #if 1
> ! debug("Command '%s %s %s' disabled (badness
> %d)",
> ! entropy_sources[c].path,
> entropy_sources[c].args[1],
> ! entropy_sources[c].args[2],
> entropy_sources[c].badness);
> #endif
>
> if (entropy_sources[c].badness > 0)
> --- 227,235 ----
> } else {
> /* FIXME: turn this off later */
> #if 1
> ! debug("Command '%s' disabled (badness %d)",
> ! entropy_sources[c].cmd,
> ! entropy_sources[c].badness);
> #endif
>
> if (entropy_sources[c].badness > 0)
> ***************
> *** 324,331 ****
> close(devnull);
>
> execv(src->path, (char**)(src->args));
> ! debug("(child) Couldn't exec '%s %s %s': %s",
> src->path,
> ! src->args[1], src->args[2],
> strerror(errno));
> src->badness = src->sticky_badness = 128;
> _exit(-1);
> default: /* Parent */
> --- 326,333 ----
> close(devnull);
>
> execv(src->path, (char**)(src->args));
> ! debug("(child) Couldn't exec '%s': %s", src->cmd,
> ! strerror(errno));
> src->badness = src->sticky_badness = 128;
> _exit(-1);
> default: /* Parent */
> ***************
> *** 372,378 ****
>
> case -1:
> default:
> ! error("Command '%s %s': select() failed: %s",
> src->path, src->args[1],
> strerror(errno));
> error_abort = 1;
> break;
> --- 374,380 ----
>
> case -1:
> default:
> ! error("Command '%s': select() failed: %s", src->cmd,
> strerror(errno));
> error_abort = 1;
> break;
> ***************
> *** 386,393 ****
> close(p[0]);
>
> if (waitpid(pid, &status, 0) == -1) {
> ! error("Couldn't wait for child '%s %s' completion: %s",
> src->path,
> ! src->args[1], strerror(errno));
> /* return(-1); */ /* FIXME: (ATL) this doesn't feel right */
> return(0.0);
> }
> --- 388,395 ----
> close(p[0]);
>
> if (waitpid(pid, &status, 0) == -1) {
> ! error("Couldn't wait for child '%s' completion: %s",
> src->cmd,
> ! strerror(errno));
> /* return(-1); */ /* FIXME: (ATL) this doesn't feel right */
> return(0.0);
> }
> ***************
> *** 398,404 ****
> /* closing p[0] on timeout causes the entropy command to
> * SIGPIPE. Take whatever output we got, and mark this
> command
> * as slow */
> ! debug("Command %s %s timed out", src->path, src->args[1]);
> src->sticky_badness *= 2;
> src->badness = src->sticky_badness;
> return(total_bytes_read);
> --- 400,406 ----
> /* closing p[0] on timeout causes the entropy command to
> * SIGPIPE. Take whatever output we got, and mark this
> command
> * as slow */
> ! debug("Command '%s' timed out", src->cmd);
> src->sticky_badness *= 2;
> src->badness = src->sticky_badness;
> return(total_bytes_read);
> ***************
> *** 408,419 ****
> if (WEXITSTATUS(status)==0) {
> return(total_bytes_read);
> } else {
> ! debug("Exit status was %d", WEXITSTATUS(status));
> src->badness = src->sticky_badness = 128;
> return (0.0);
> }
> } else if (WIFSIGNALED(status)) {
> ! debug("Returned on uncaught signal %d !", status);
> src->badness = src->sticky_badness = 128;
> return(0.0);
> } else
> --- 410,422 ----
> if (WEXITSTATUS(status)==0) {
> return(total_bytes_read);
> } else {
> ! debug("Exit status of '%s' was %d", src->cmd,
> ! WEXITSTATUS(status));
> src->badness = src->sticky_badness = 128;
> return (0.0);
> }
> } else if (WIFSIGNALED(status)) {
> ! debug("Returned on uncaught signal %d for '%s'!", status,
> src->cmd);
> src->badness = src->sticky_badness = 128;
> return(0.0);
> } else
> ***************
> *** 614,619 ****
> --- 617,627 ----
> linenum, cmdfilename);
> continue;
> }
> +
> + /* save copy of command args for use in debug() */
> + cp = (char*)xmalloc(strlen(cmd)+1);
> + strcpy(cp, cmd);
> + entcmd[cur_cmd].cmd = cp;
>
> /* split the command args */
> cp = strtok(cmd, WHITESPACE);
>
>
>

Marc G. Fournier marc.fournier@acadiau.ca
Senior Systems Administrator Acadia University

"These are my opinions, which are not necessarily shared by my employer"