Fix `pkg_add -r' by backing out revs 1.34-1.38.
Revs 1.37-8 produce a bus error in some environments. Revs 1.34-6 do not bus error, but write corrupted files.
This commit is contained in:
parent
8758ef9b41
commit
b68fbebd5a
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=106137
@ -347,6 +347,8 @@ _fetch_read(conn_t *conn, char *buf, size_t len)
|
|||||||
ssize_t rlen, total;
|
ssize_t rlen, total;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
|
rlen = 0;
|
||||||
|
|
||||||
if (fetchTimeout) {
|
if (fetchTimeout) {
|
||||||
FD_ZERO(&readfds);
|
FD_ZERO(&readfds);
|
||||||
gettimeofday(&timeout, NULL);
|
gettimeofday(&timeout, NULL);
|
||||||
@ -364,17 +366,13 @@ _fetch_read(conn_t *conn, char *buf, size_t len)
|
|||||||
wait.tv_usec += 1000000;
|
wait.tv_usec += 1000000;
|
||||||
wait.tv_sec--;
|
wait.tv_sec--;
|
||||||
}
|
}
|
||||||
if (wait.tv_sec < 0) {
|
if (wait.tv_sec < 0)
|
||||||
errno = ETIMEDOUT;
|
return (rlen);
|
||||||
_fetch_syserr();
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
errno = 0;
|
errno = 0;
|
||||||
r = select(conn->sd + 1, &readfds, NULL, NULL, &wait);
|
r = select(conn->sd + 1, &readfds, NULL, NULL, &wait);
|
||||||
if (r == -1) {
|
if (r == -1) {
|
||||||
if (errno == EINTR && fetchRestartCalls)
|
if (errno == EINTR && fetchRestartCalls)
|
||||||
continue;
|
continue;
|
||||||
_fetch_syserr();
|
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -395,12 +393,6 @@ _fetch_read(conn_t *conn, char *buf, size_t len)
|
|||||||
buf += rlen;
|
buf += rlen;
|
||||||
total += rlen;
|
total += rlen;
|
||||||
}
|
}
|
||||||
if (total == 0 && len != 0) {
|
|
||||||
/* no data available at all */
|
|
||||||
errno = EPIPE;
|
|
||||||
_fetch_syserr();
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
return (total);
|
return (total);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -416,6 +408,7 @@ _fetch_getln(conn_t *conn)
|
|||||||
char *tmp;
|
char *tmp;
|
||||||
size_t tmpsize;
|
size_t tmpsize;
|
||||||
char c;
|
char c;
|
||||||
|
int error;
|
||||||
|
|
||||||
if (conn->buf == NULL) {
|
if (conn->buf == NULL) {
|
||||||
if ((conn->buf = malloc(MIN_BUF_SIZE)) == NULL) {
|
if ((conn->buf = malloc(MIN_BUF_SIZE)) == NULL) {
|
||||||
@ -429,8 +422,11 @@ _fetch_getln(conn_t *conn)
|
|||||||
conn->buflen = 0;
|
conn->buflen = 0;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if (_fetch_read(conn, &c, 1) == -1)
|
error = _fetch_read(conn, &c, 1);
|
||||||
|
if (error == -1)
|
||||||
return (-1);
|
return (-1);
|
||||||
|
else if (error == 0)
|
||||||
|
break;
|
||||||
conn->buf[conn->buflen++] = c;
|
conn->buf[conn->buflen++] = c;
|
||||||
if (conn->buflen == conn->bufsize) {
|
if (conn->buflen == conn->bufsize) {
|
||||||
tmp = conn->buf;
|
tmp = conn->buf;
|
||||||
@ -455,34 +451,21 @@ _fetch_getln(conn_t *conn)
|
|||||||
*/
|
*/
|
||||||
ssize_t
|
ssize_t
|
||||||
_fetch_write(conn_t *conn, const char *buf, size_t len)
|
_fetch_write(conn_t *conn, const char *buf, size_t len)
|
||||||
{
|
|
||||||
struct iovec iov;
|
|
||||||
|
|
||||||
iov.iov_base = __DECONST(char *, buf);
|
|
||||||
iov.iov_len = len;
|
|
||||||
return _fetch_writev(conn, &iov, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Write a vector to a connection w/ timeout
|
|
||||||
* Note: can modify the iovec.
|
|
||||||
*/
|
|
||||||
ssize_t
|
|
||||||
_fetch_writev(conn_t *conn, struct iovec *iov, int iovcnt)
|
|
||||||
{
|
{
|
||||||
struct timeval now, timeout, wait;
|
struct timeval now, timeout, wait;
|
||||||
fd_set writefds;
|
fd_set writefds;
|
||||||
ssize_t wlen, total;
|
ssize_t wlen, total;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
|
total = 0;
|
||||||
|
|
||||||
if (fetchTimeout) {
|
if (fetchTimeout) {
|
||||||
FD_ZERO(&writefds);
|
FD_ZERO(&writefds);
|
||||||
gettimeofday(&timeout, NULL);
|
gettimeofday(&timeout, NULL);
|
||||||
timeout.tv_sec += fetchTimeout;
|
timeout.tv_sec += fetchTimeout;
|
||||||
}
|
}
|
||||||
|
|
||||||
total = 0;
|
while (len > 0) {
|
||||||
while (iovcnt > 0) {
|
|
||||||
while (fetchTimeout && !FD_ISSET(conn->sd, &writefds)) {
|
while (fetchTimeout && !FD_ISSET(conn->sd, &writefds)) {
|
||||||
FD_SET(conn->sd, &writefds);
|
FD_SET(conn->sd, &writefds);
|
||||||
gettimeofday(&now, NULL);
|
gettimeofday(&now, NULL);
|
||||||
@ -494,7 +477,6 @@ _fetch_writev(conn_t *conn, struct iovec *iov, int iovcnt)
|
|||||||
}
|
}
|
||||||
if (wait.tv_sec < 0) {
|
if (wait.tv_sec < 0) {
|
||||||
errno = ETIMEDOUT;
|
errno = ETIMEDOUT;
|
||||||
_fetch_syserr();
|
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
errno = 0;
|
errno = 0;
|
||||||
@ -508,32 +490,21 @@ _fetch_writev(conn_t *conn, struct iovec *iov, int iovcnt)
|
|||||||
errno = 0;
|
errno = 0;
|
||||||
#ifdef WITH_SSL
|
#ifdef WITH_SSL
|
||||||
if (conn->ssl != NULL)
|
if (conn->ssl != NULL)
|
||||||
wlen = SSL_write(conn->ssl,
|
wlen = SSL_write(conn->ssl, buf, len);
|
||||||
iov->iov_base, iov->iov_len);
|
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
wlen = writev(conn->sd, iov, iovcnt);
|
wlen = write(conn->sd, buf, len);
|
||||||
if (wlen == 0) {
|
if (wlen == 0)
|
||||||
/* we consider a short write a failure */
|
/* we consider a short write a failure */
|
||||||
errno = EPIPE;
|
|
||||||
_fetch_syserr();
|
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
|
||||||
if (wlen < 0) {
|
if (wlen < 0) {
|
||||||
if (errno == EINTR && fetchRestartCalls)
|
if (errno == EINTR && fetchRestartCalls)
|
||||||
continue;
|
continue;
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
len -= wlen;
|
||||||
|
buf += wlen;
|
||||||
total += wlen;
|
total += wlen;
|
||||||
while (iovcnt > 0 && wlen >= (ssize_t)iov->iov_len) {
|
|
||||||
wlen -= iov->iov_len;
|
|
||||||
iov++;
|
|
||||||
iovcnt--;
|
|
||||||
}
|
|
||||||
if (iovcnt > 0) {
|
|
||||||
iov->iov_len -= wlen;
|
|
||||||
iov->iov_base = __DECONST(char *, iov->iov_base) + wlen;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return (total);
|
return (total);
|
||||||
}
|
}
|
||||||
@ -545,14 +516,10 @@ _fetch_writev(conn_t *conn, struct iovec *iov, int iovcnt)
|
|||||||
int
|
int
|
||||||
_fetch_putln(conn_t *conn, const char *str, size_t len)
|
_fetch_putln(conn_t *conn, const char *str, size_t len)
|
||||||
{
|
{
|
||||||
struct iovec iov[2];
|
|
||||||
|
|
||||||
DEBUG(fprintf(stderr, ">>> %s\n", str));
|
DEBUG(fprintf(stderr, ">>> %s\n", str));
|
||||||
iov[0].iov_base = __DECONST(char *, str);
|
if (_fetch_write(conn, str, len) == -1 ||
|
||||||
iov[0].iov_len = len;
|
_fetch_write(conn, ENDL, sizeof ENDL) == -1)
|
||||||
iov[1].iov_base = __DECONST(char *, ENDL);
|
|
||||||
iov[1].iov_len = sizeof ENDL;
|
|
||||||
if (_fetch_writev(conn, iov, 2) == -1)
|
|
||||||
return (-1);
|
return (-1);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user