mirror of
git://anongit.mindrot.org/openssh.git
synced 2025-04-11 03:51:57 +00:00
upstream: replace select() with ppoll(), including converting
timeval's to timespec's to make things easier. back and forth and ok; djm OpenBSD-Commit-ID: 89d3b23c60875da919e7820f9de6213286ffbec9
This commit is contained in:
parent
7c025c0055
commit
6582a31c38
8
misc.c
8
misc.c
@ -1,4 +1,4 @@
|
|||||||
/* $OpenBSD: misc.c,v 1.170 2021/09/26 14:01:03 djm Exp $ */
|
/* $OpenBSD: misc.c,v 1.171 2021/11/13 21:14:13 deraadt Exp $ */
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2000 Markus Friedl. All rights reserved.
|
* Copyright (c) 2000 Markus Friedl. All rights reserved.
|
||||||
* Copyright (c) 2005-2020 Damien Miller. All rights reserved.
|
* Copyright (c) 2005-2020 Damien Miller. All rights reserved.
|
||||||
@ -1616,12 +1616,12 @@ ms_subtract_diff(struct timeval *start, int *ms)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ms_to_timeval(struct timeval *tv, int ms)
|
ms_to_timespec(struct timespec *ts, int ms)
|
||||||
{
|
{
|
||||||
if (ms < 0)
|
if (ms < 0)
|
||||||
ms = 0;
|
ms = 0;
|
||||||
tv->tv_sec = ms / 1000;
|
ts->tv_sec = ms / 1000;
|
||||||
tv->tv_usec = (ms % 1000) * 1000;
|
ts->tv_nsec = (ms % 1000) * 1000 * 1000;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
4
misc.h
4
misc.h
@ -1,4 +1,4 @@
|
|||||||
/* $OpenBSD: misc.h,v 1.98 2021/08/09 23:47:44 djm Exp $ */
|
/* $OpenBSD: misc.h,v 1.99 2021/11/13 21:14:13 deraadt Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
||||||
@ -82,7 +82,7 @@ void xextendf(char **s, const char *sep, const char *fmt, ...)
|
|||||||
__attribute__((__format__ (printf, 3, 4))) __attribute__((__nonnull__ (3)));
|
__attribute__((__format__ (printf, 3, 4))) __attribute__((__nonnull__ (3)));
|
||||||
void sanitise_stdfd(void);
|
void sanitise_stdfd(void);
|
||||||
void ms_subtract_diff(struct timeval *, int *);
|
void ms_subtract_diff(struct timeval *, int *);
|
||||||
void ms_to_timeval(struct timeval *, int);
|
void ms_to_timespec(struct timespec *, int);
|
||||||
void monotime_ts(struct timespec *);
|
void monotime_ts(struct timespec *);
|
||||||
void monotime_tv(struct timeval *);
|
void monotime_tv(struct timeval *);
|
||||||
time_t monotime(void);
|
time_t monotime(void);
|
||||||
|
59
packet.c
59
packet.c
@ -1,4 +1,4 @@
|
|||||||
/* $OpenBSD: packet.c,v 1.301 2021/07/16 09:00:23 djm Exp $ */
|
/* $OpenBSD: packet.c,v 1.302 2021/11/13 21:14:13 deraadt Exp $ */
|
||||||
/*
|
/*
|
||||||
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
||||||
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
|
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
|
||||||
@ -1325,17 +1325,13 @@ ssh_packet_read_seqnr(struct ssh *ssh, u_char *typep, u_int32_t *seqnr_p)
|
|||||||
{
|
{
|
||||||
struct session_state *state = ssh->state;
|
struct session_state *state = ssh->state;
|
||||||
int len, r, ms_remain;
|
int len, r, ms_remain;
|
||||||
fd_set *setp;
|
struct pollfd pfd;
|
||||||
char buf[8192];
|
char buf[8192];
|
||||||
struct timeval timeout, start, *timeoutp = NULL;
|
struct timeval start;
|
||||||
|
struct timespec timespec, *timespecp = NULL;
|
||||||
|
|
||||||
DBG(debug("packet_read()"));
|
DBG(debug("packet_read()"));
|
||||||
|
|
||||||
setp = calloc(howmany(state->connection_in + 1,
|
|
||||||
NFDBITS), sizeof(fd_mask));
|
|
||||||
if (setp == NULL)
|
|
||||||
return SSH_ERR_ALLOC_FAIL;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Since we are blocking, ensure that all written packets have
|
* Since we are blocking, ensure that all written packets have
|
||||||
* been sent.
|
* been sent.
|
||||||
@ -1356,22 +1352,20 @@ ssh_packet_read_seqnr(struct ssh *ssh, u_char *typep, u_int32_t *seqnr_p)
|
|||||||
* Otherwise, wait for some data to arrive, add it to the
|
* Otherwise, wait for some data to arrive, add it to the
|
||||||
* buffer, and try again.
|
* buffer, and try again.
|
||||||
*/
|
*/
|
||||||
memset(setp, 0, howmany(state->connection_in + 1,
|
pfd.fd = state->connection_in;
|
||||||
NFDBITS) * sizeof(fd_mask));
|
pfd.events = POLLIN;
|
||||||
FD_SET(state->connection_in, setp);
|
|
||||||
|
|
||||||
if (state->packet_timeout_ms > 0) {
|
if (state->packet_timeout_ms > 0) {
|
||||||
ms_remain = state->packet_timeout_ms;
|
ms_remain = state->packet_timeout_ms;
|
||||||
timeoutp = &timeout;
|
timespecp = ×pec;
|
||||||
}
|
}
|
||||||
/* Wait for some data to arrive. */
|
/* Wait for some data to arrive. */
|
||||||
for (;;) {
|
for (;;) {
|
||||||
if (state->packet_timeout_ms > 0) {
|
if (state->packet_timeout_ms > 0) {
|
||||||
ms_to_timeval(&timeout, ms_remain);
|
ms_to_timespec(×pec, ms_remain);
|
||||||
monotime_tv(&start);
|
monotime_tv(&start);
|
||||||
}
|
}
|
||||||
if ((r = select(state->connection_in + 1, setp,
|
if ((r = ppoll(&pfd, 1, timespecp, NULL)) >= 0)
|
||||||
NULL, NULL, timeoutp)) >= 0)
|
|
||||||
break;
|
break;
|
||||||
if (errno != EAGAIN && errno != EINTR &&
|
if (errno != EAGAIN && errno != EINTR &&
|
||||||
errno != EWOULDBLOCK) {
|
errno != EWOULDBLOCK) {
|
||||||
@ -1406,7 +1400,6 @@ ssh_packet_read_seqnr(struct ssh *ssh, u_char *typep, u_int32_t *seqnr_p)
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
out:
|
out:
|
||||||
free(setp);
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1986,35 +1979,28 @@ ssh_packet_write_poll(struct ssh *ssh)
|
|||||||
int
|
int
|
||||||
ssh_packet_write_wait(struct ssh *ssh)
|
ssh_packet_write_wait(struct ssh *ssh)
|
||||||
{
|
{
|
||||||
fd_set *setp;
|
|
||||||
int ret, r, ms_remain = 0;
|
int ret, r, ms_remain = 0;
|
||||||
struct timeval start, timeout, *timeoutp = NULL;
|
struct timeval start;
|
||||||
|
struct timespec timespec, *timespecp = NULL;
|
||||||
struct session_state *state = ssh->state;
|
struct session_state *state = ssh->state;
|
||||||
|
struct pollfd pfd;
|
||||||
|
|
||||||
setp = calloc(howmany(state->connection_out + 1,
|
if ((r = ssh_packet_write_poll(ssh)) != 0)
|
||||||
NFDBITS), sizeof(fd_mask));
|
|
||||||
if (setp == NULL)
|
|
||||||
return SSH_ERR_ALLOC_FAIL;
|
|
||||||
if ((r = ssh_packet_write_poll(ssh)) != 0) {
|
|
||||||
free(setp);
|
|
||||||
return r;
|
return r;
|
||||||
}
|
|
||||||
while (ssh_packet_have_data_to_write(ssh)) {
|
while (ssh_packet_have_data_to_write(ssh)) {
|
||||||
memset(setp, 0, howmany(state->connection_out + 1,
|
pfd.fd = state->connection_out;
|
||||||
NFDBITS) * sizeof(fd_mask));
|
pfd.events = POLLOUT;
|
||||||
FD_SET(state->connection_out, setp);
|
|
||||||
|
|
||||||
if (state->packet_timeout_ms > 0) {
|
if (state->packet_timeout_ms > 0) {
|
||||||
ms_remain = state->packet_timeout_ms;
|
ms_remain = state->packet_timeout_ms;
|
||||||
timeoutp = &timeout;
|
timespecp = ×pec;
|
||||||
}
|
}
|
||||||
for (;;) {
|
for (;;) {
|
||||||
if (state->packet_timeout_ms > 0) {
|
if (state->packet_timeout_ms > 0) {
|
||||||
ms_to_timeval(&timeout, ms_remain);
|
ms_to_timespec(×pec, ms_remain);
|
||||||
monotime_tv(&start);
|
monotime_tv(&start);
|
||||||
}
|
}
|
||||||
if ((ret = select(state->connection_out + 1,
|
if ((ret = ppoll(&pfd, 1, timespecp, NULL)) >= 0)
|
||||||
NULL, setp, NULL, timeoutp)) >= 0)
|
|
||||||
break;
|
break;
|
||||||
if (errno != EAGAIN && errno != EINTR &&
|
if (errno != EAGAIN && errno != EINTR &&
|
||||||
errno != EWOULDBLOCK)
|
errno != EWOULDBLOCK)
|
||||||
@ -2027,16 +2013,11 @@ ssh_packet_write_wait(struct ssh *ssh)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (ret == 0) {
|
if (ret == 0)
|
||||||
free(setp);
|
|
||||||
return SSH_ERR_CONN_TIMEOUT;
|
return SSH_ERR_CONN_TIMEOUT;
|
||||||
}
|
if ((r = ssh_packet_write_poll(ssh)) != 0)
|
||||||
if ((r = ssh_packet_write_poll(ssh)) != 0) {
|
|
||||||
free(setp);
|
|
||||||
return r;
|
return r;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
free(setp);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user