Commit ee6e80c7 authored by Wayne Davison's avatar Wayne Davison

Fix two iconv problems that Lennart Lövstrand pointed out in bug 5075.

parent ce72de30
...@@ -468,41 +468,38 @@ static void mplex_write(int fd, enum msgcode code, const char *buf, size_t len, ...@@ -468,41 +468,38 @@ static void mplex_write(int fd, enum msgcode code, const char *buf, size_t len,
char buffer[BIGPATHBUFLEN]; /* Oversized for use by iconv code. */ char buffer[BIGPATHBUFLEN]; /* Oversized for use by iconv code. */
size_t n = len; size_t n = len;
SIVAL(buffer, 0, ((MPLEX_BASE + (int)code)<<24) + len);
#ifdef ICONV_OPTION
if (convert && ic_send == (iconv_t)-1)
#endif
convert = 0;
if (convert || n > 1024 - 4) /* BIGPATHBUFLEN can handle 1024 bytes */
n = 0;
else
memcpy(buffer + 4, buf, n);
defer_forwarding_keep = 1; /* defer_forwarding_messages++ on return */
writefd_unbuffered(fd, buffer, n+4);
defer_forwarding_keep = 0;
len -= n;
buf += n;
#ifdef ICONV_OPTION #ifdef ICONV_OPTION
if (convert) { /* We need to convert buf before doing anything else so that we
* can include the (converted) byte length in the message header. */
if (convert && ic_send != (iconv_t)-1) {
xbuf outbuf, inbuf; xbuf outbuf, inbuf;
INIT_CONST_XBUF(outbuf, buffer); INIT_XBUF(outbuf, buffer + 4, 0, sizeof buffer - 4);
INIT_XBUF(inbuf, (char*)buf, len, -1); INIT_XBUF(inbuf, (char*)buf, len, -1);
do {
iconvbufs(ic_send, &inbuf, &outbuf, iconvbufs(ic_send, &inbuf, &outbuf,
ICB_INCLUDE_BAD | ICB_INCLUDE_INCOMPLETE); ICB_INCLUDE_BAD | ICB_INCLUDE_INCOMPLETE);
writefd_unbuffered(fd, outbuf.buf, outbuf.len); if (inbuf.len > 0) {
} while (inbuf.len); rprintf(FERROR, "overflowed conversion buffer in mplex_write");
exit_cleanup(RERR_UNSUPPORTED);
}
n = len = outbuf.len;
} else } else
#endif #endif
if (len) if (n > 1024 - 4) /* BIGPATHBUFLEN can handle 1024 bytes */
writefd_unbuffered(fd, buf, len); n = 0; /* We'd rather do 2 writes than too much memcpy(). */
else
memcpy(buffer + 4, buf, n);
SIVAL(buffer, 0, ((MPLEX_BASE + (int)code)<<24) + len);
defer_forwarding_keep = 1; /* defer_forwarding_messages++ on return */
writefd_unbuffered(fd, buffer, n+4);
defer_forwarding_keep = 0;
if (len > n)
writefd_unbuffered(fd, buf+n, len-n);
if (!--defer_forwarding_messages && !no_flush) if (!--defer_forwarding_messages && !no_flush)
msg_flush(); msg_flush();
...@@ -1060,7 +1057,7 @@ static int readfd_unbuffered(int fd, char *buf, size_t len) ...@@ -1060,7 +1057,7 @@ static int readfd_unbuffered(int fd, char *buf, size_t len)
int pos = 0; int pos = 0;
INIT_CONST_XBUF(outbuf, line); INIT_CONST_XBUF(outbuf, line);
inbuf.buf = ibuf; INIT_XBUF(inbuf, ibuf, 0, -1);
while (msg_bytes) { while (msg_bytes) {
inbuf.len = msg_bytes > sizeof ibuf inbuf.len = msg_bytes > sizeof ibuf
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment