Michael Kress wrote:
Timo Sirainen wrote:
v0.99.12 2004-12-05 Timo Sirainen
- IMAP and POP3 login processes may have sent each line in two IP packets, one with the data and another with CR+LF. Some clients didn't work because of this.
You could diff 0.99.11 and 0.99.12 sources and find the fix from that. http://dovecot.org/releases/ has the tarballs.
Hi, I did that diff and as version 1.0-3_48.rc25.at uses another coding style I tried to adopt to it, but somehow it failed. Have you got any idea, what's going wrong? Regards, Michael ================================ diff -Naur dovecot-1.0.rc25/src/pop3-login/client.c dovecot-1.0.rc25-patched/src/pop3-login/client.c --- dovecot-1.0.rc25/src/pop3-login/client.c 2006-11-24 10:27:04.000000000 +0100 +++ dovecot-1.0.rc25-patched/src/pop3-login/client.c 2007-03-05 15:32:31.660439938 +0100 @@ -438,16 +438,14 @@ void client_send_line(struct pop3_client *client, const char *line) { - struct const_iovec iov[2]; + struct const_iovec iov[1]; ssize_t ret; - iov[0].iov_base = line; - iov[0].iov_len = strlen(line); - iov[1].iov_base = "\r\n"; - iov[1].iov_len = 2; + iov[0].iov_base = strcat(line,"\r\n"); + iov[0].iov_len = strlen(line) + 2; - ret = o_stream_sendv(client->output, iov, 2); - if (ret < 0 || (size_t)ret != iov[0].iov_len + iov[1].iov_len) { + ret = o_stream_sendv(client->output, iov, 1); + if (ret < 0 || (size_t)ret != iov[0].iov_len) { /* either disconnection or buffer full. in either case we want this connection destroyed. however destroying it here might break things if client is still tried to be accessed ================================ Here's the output of a login session. Here, at least there's no CR+LF after each character typed: 16:10:14.820218 accept(0, {sa_family=AF_INET, sin_port=htons(2112), sin_addr=inet_addr("84.165.121.174")}, [4613937826831007760]) = 7 16:10:14.820400 getsockname(7, {sa_family=AF_INET, sin_port=htons(110), sin_addr=inet_addr("999.999.999.999")}, [7926335352762007568]) = 0 16:10:14.820523 fcntl(7, F_GETFL) = 0x2 (flags O_RDWR) 16:10:14.820618 fcntl(7, F_SETFL, O_RDWR|O_NONBLOCK) = 0 16:10:14.820691 fstat(7, {st_mode=S_IFSOCK|0777, st_size=0, ...}) = 0 16:10:14.820823 lseek(7, 0, SEEK_CUR) = -1 ESPIPE (Illegal seek) 16:10:14.820922 getsockname(7, {sa_family=AF_INET, sin_port=htons(110), sin_addr=inet_addr("999.999.999.999")}, [7926335352762007568]) = 0 16:10:14.821089 write(7, "+OK Dovecot ready.\r\n\0\0", 22) = 22 16:10:14.821193 gettimeofday({1173107414, 821220}, NULL) = 0 16:10:14.821272 poll([{fd=5, events=POLLIN|POLLPRI|POLLERR|POLLHUP|POLLNVAL}, {fd=8, events=POLLIN|POLLPRI|POLLERR|POLLHUP|POLLNVAL}, {fd=3, events=POLLIN|PO LLPRI|POLLERR|POLLHUP|POLLNVAL}, {fd=0, events=POLLIN|POLLPRI|POLLERR|POLLHUP|POLLNVAL}, {fd=7, events=POLLIN|POLLPRI|POLLERR|POLLHUP|POLLNVAL}], 5, 374) = 0 16:10:15.196255 gettimeofday({1173107415, 196288}, {0, 0}) = 0 16:10:15.196342 gettimeofday({1173107415, 196371}, NULL) = 0 16:10:15.196420 poll([{fd=5, events=POLLIN|POLLPRI|POLLERR|POLLHUP|POLLNVAL}, {fd=8, events=POLLIN|POLLPRI|POLLERR|POLLHUP|POLLNVAL}, {fd=3, events=POLLIN|PO LLPRI|POLLERR|POLLHUP|POLLNVAL}, {fd=0, events=POLLIN|POLLPRI|POLLERR|POLLHUP|POLLNVAL}, {fd=7, events=POLLIN|POLLPRI|POLLERR|POLLHUP|POLLNVAL}], 5, 0) = 0 16:10:15.196517 gettimeofday({1173107415, 196546}, {0, 0}) = 0 16:10:15.196603 gettimeofday({1173107415, 196631}, NULL) = 0 16:10:15.196680 poll([{fd=5, events=POLLIN|POLLPRI|POLLERR|POLLHUP|POLLNVAL}, {fd=8, events=POLLIN|POLLPRI|POLLERR|POLLHUP|POLLNVAL}, {fd=3, events=POLLIN|PO LLPRI|POLLERR|POLLHUP|POLLNVAL}, {fd=0, events=POLLIN|POLLPRI|POLLERR|POLLHUP|POLLNVAL}, {fd=7, events=POLLIN|POLLPRI|POLLERR|POLLHUP|POLLNVAL}], 5, 999) = 0 16:10:16.196320 gettimeofday({1173107416, 196369}, {0, 0}) = 0 16:10:16.196424 gettimeofday({1173107416, 196453}, NULL) = 0 16:10:16.196505 poll([{fd=5, events=POLLIN|POLLPRI|POLLERR|POLLHUP|POLLNVAL}, {fd=8, events=POLLIN|POLLPRI|POLLERR|POLLHUP|POLLNVAL}, {fd=3, events=POLLIN|PO LLPRI|POLLERR|POLLHUP|POLLNVAL}, {fd=0, events=POLLIN|POLLPRI|POLLERR|POLLHUP|POLLNVAL}, {fd=7, events=POLLIN|POLLPRI|POLLERR|POLLHUP|POLLNVAL}], 5, 0) = 0 16:10:16.196602 gettimeofday({1173107416, 196630}, {0, 0}) = 0 16:10:16.196690 gettimeofday({1173107416, 196718}, NULL) = 0 16:10:16.196767 poll([{fd=5, events=POLLIN|POLLPRI|POLLERR|POLLHUP|POLLNVAL}, {fd=8, events=POLLIN|POLLPRI|POLLERR|POLLHUP|POLLNVAL}, {fd=3, events=POLLIN|PO LLPRI|POLLERR|POLLHUP|POLLNVAL}, {fd=0, events=POLLIN|POLLPRI|POLLERR|POLLHUP|POLLNVAL}, {fd=7, events=POLLIN|POLLPRI|POLLERR|POLLHUP|POLLNVAL, revents=POLLI N}], 5, 999) = 1 16:10:17.174464 gettimeofday({1173107417, 174510}, {0, 0}) = 0 16:10:17.174570 brk(0x564000) = 0x564000 16:10:17.174659 read(7, "user kress\r\n", 4096) = 12 16:10:17.174766 setsockopt(7, SOL_TCP, TCP_CORK, [1], 4) = 0 16:10:17.174859 --- SIGSEGV (Segmentation fault) @ 0 (0) --- -- Michael Kress, kress@hal.saar.de http://www.michael-kress.de / http://kress.net P E N G U I N S A R E C O O L