[tpop3d-discuss]Corrupted TOP response with PIPELINING and tpop3d 1.5.3

Martin Blapp mb at imp.ch
Wed, 2 Feb 2005 01:16:10 +0100 (CET)


Hi,

Since one week we are useing tpop3d as pop3 server for our webmail
backend, which has the ability to use PIPELINING, as you can see here:

Everything works until a user has ~500 or more messages in his box.
tpop3d does truncate then parts of the input and does respond with a error
message instead of the correct output.

Qpopper, the server we used before, did not show this truncation with
PIPELINEING, but was rather slow so we need to switch to tpop3d.

OS:		FreeBSD 5.3
tpop3d:		1.5.3 and also latest cvs version (same problem)
Compiler:	gcc version 3.4.2 [FreeBSD] 20040728

The problem happens with or without --enable-mbox-bsd-save-indices.

Compile optimizations have been all removed and are not responsable
for the bug.

The "\r\n" after each command line are missing here in the output, but
they are there.

Anybody has some ideas ?

-> QUIT
<- +OK Done.
<- +OK <8fee23884e8acf78f25dd219b692821b@attic.ch>
-> USER mb@attic.ch
<- +OK Tell me your password.
-> PASS ****
<- +OK Welcome aboard! You have 1217 messages.
-> LIST
<- +OK Scan list follows:
1 28636
2 3939
3 4102
4 6555
5 19015

[...]

-> TOP 1 0 TOP 2 0 TOP 3 0 TOP 4 0 TOP 5 0 TOP 6 0 TOP 7 0 TOP 8 0 TOP 9 0 TOP
10 0 TOP 11 0 TOP 12 0 TOP 13 0 TOP 14 0 TOP 15 0 TOP 16 0 TOP 17 0 TOP 18 0 TOP
19 0 TOP 20 0 TOP 21 0 TOP 22 0 TOP 23 0 TOP 24 0 TOP 25 0 TOP 26 0 TOP 27 0 TOP
28 0 TOP 29 0 TOP 30 0 TOP 31 0 TOP 32 0 TOP 33 0 TOP 34 0 TOP 35 0 TOP 36 0 TOP
37 0 TOP 38 0 TOP 39 0 TOP 40 0 TOP 41 0 TOP 42 0 TOP 43 0 TOP 44 0 TOP 45 0 TOP
46 0 TOP 47 0 TOP 48 0 TOP 49 0 TOP 50 0 TOP 51 0 TOP 52 0 TOP 53 0 TOP 54 0 TOP
55 0 TOP 56 0 TOP 57 0 TOP 58 0 TOP 59 0 TOP 60 0 TOP 61 0 TOP 62 0 TOP 63 0 TOP
64 0 TOP 65 0 TOP 66 0 TOP 67 0 TOP 68 0 TOP 69 0 TOP 70 0 TOP 71 0 TOP 72 0 TOP
73 0 TOP 74 0 TOP 75 0 TOP 76 0 TOP 77 0 TOP 78 0 TOP 79 0 TOP 80 0 TOP 81 0 TOP
82 0 TOP 83 0 TOP 84 0 TOP 85 0 TOP 86 0 TOP 87 0 TOP 88 0 TOP 89 0 TOP 90 0 TOP
91 0 TOP 92 0 TOP 93 0 TOP 94 0 TOP 95 0 TOP 96 0 TOP 97 0 TOP 98 0 TOP 99 0 TOP
100 0 TOP 101 0 TOP 102 0 TOP 103 0 TOP 104 0 TOP 105 0 TOP 106 0 TOP 107 0 TOP
108 0 TOP 109 0 TOP 110 0 TOP 111 0 TOP 112 0 TOP 113 0 TOP 114 0 TOP 115 0 TOP
116 0 TOP 117 0 TOP 118 0 TOP 119 0 TOP 120 0 TOP 121 0 TOP 122 0 TOP 123 0 TOP
124 0 TOP 125 0 TOP 126 0 TOP 127 0 TOP 128 0 TOP 129 0 TOP 130 0 TOP 131 0 TOP
132 0 TOP 133 0 TOP 134 0 TOP 135 0 TOP 136 0 TOP 137 0 TOP 138 0 TOP 139 0 TOP
140 0 TOP 141 0 TOP 142 0 TOP 143 0 TOP 144 0 TOP 145 0 TOP 146 0 TOP 147 0 TOP
148 0 TOP 149 0 TOP 150 0 TOP 151 0 TOP 152 0 TOP 153 0 TOP 154 0 TOP 155 0 TOP
156 0 TOP 157 0 TOP 158 0 TOP 159 0 TOP 160 0 TOP 161 0 TOP 162 0 TOP 163 0 TOP
164 0 TOP 165 0 TOP 166 0 TOP 167 0 TOP 168 0 TOP 169 0 TOP 170 0 TOP 171 0 TOP
172 0 TOP 173 0 TOP 174 0 TOP 175 0 TOP 176 0 TOP 177 0 TOP 178 0 TOP 179 0 TOP
180 0 TOP 181 0 TOP 182 0 TOP 183 0 TOP 184 0 TOP 185 0 TOP 186 0 TOP 187 0 TOP
188 0 TOP 189 0 TOP 190 0 TOP 191 0 TOP 192 0 TOP 193 0 TOP 194 0 TOP 195 0 TOP
196 0 TOP 197 0 TOP 198 0 TOP 199 0 TOP 200 0 TOP 201 0 TOP 202 0 TOP 203 0 TOP
204 0 TOP 205 0 TOP 206 0 TOP 207 0 TOP 208 0 TOP 209 0 TOP 210 0 TOP 211 0 TOP
212 0 TOP 213 0 TOP 214 0 TOP 215 0 TOP 216 0 TOP 217 0 TOP 218 0 TOP 219 0 TOP
220 0 TOP 221 0 TOP 222 0 TOP 223 0 TOP 224 0 TOP 225 0 TOP 226 0 TOP 227 0 TOP
228 0 TOP 229 0 TOP 230 0 TOP 231 0 TOP 232 0 TOP 233 0 TOP 234 0 TOP 235 0 TOP
236 0 TOP 237 0 TOP 238 0 TOP 239 0 TOP 240 0 TOP 241 0 TOP 242 0 TOP 243 0 TOP
244 0 TOP 245 0 TOP 246 0 TOP 247 0 TOP 248 0 TOP 249 0 TOP 250 0 TOP 251 0 TOP
252 0 TOP 253 0 TOP 254 0 TOP 255 0 TOP 256 0 TOP 257 0 TOP 258 0 TOP 259 0 TOP
260 0 TOP 261 0 TOP 262 0 TOP 263 0 TOP 264 0 TOP 265 0 TOP 266 0 TOP 267 0 TOP
268 0 TOP 269 0 TOP 270 0 TOP 271 0 TOP 272 0 TOP 273 0 TOP 274 0 TOP 275 0 TOP
276 0 TOP 277 0 TOP 278 0 TOP 279 0 TOP 280 0 TOP 281 0 TOP 282 0 TOP 283 0 TOP
284 0 TOP 285 0 TOP 286 0 TOP 287 0 TOP 288 0 TOP 289 0 TOP 290 0 TOP 291 0 TOP
292 0 TOP 293 0 TOP 294 0 TOP 295 0 TOP 296 0 TOP 297 0 TOP 298 0 TOP 299 0 TOP
300 0 TOP 301 0 TOP 302 0 TOP 303 0 TOP 304 0 TOP 305 0 TOP 306 0 TOP 307 0 TOP
308 0 TOP 309 0 TOP 310 0 TOP 311 0 TOP 312 0 TOP 313 0 TOP 314 0 TOP 315 0 TOP
316 0 TOP 317 0 TOP 318 0 TOP 319 0 TOP 320 0 TOP 321 0 TOP 322 0 TOP 323 0 TOP
324 0 TOP 325 0 TOP 326 0 TOP 327 0 TOP 328 0 TOP 329 0 TOP 330 0 TOP 331 0 TOP
332 0 TOP 333 0 TOP 334 0 TOP 335 0 TOP 336 0 TOP 337 0 TOP 338 0 TOP 339 0 TOP
340 0 TOP 341 0 TOP 342 0 TOP 343 0 TOP 344 0 TOP 345 0 TOP 346 0 TOP 347 0 TOP
348 0 TOP 349 0 TOP 350 0 TOP 351 0 TOP 352 0 TOP 353 0 TOP 354 0 TOP 355 0 TOP
356 0 TOP 357 0 TOP 358 0 TOP 359 0 TOP 360 0 TOP 361 0 TOP 362 0 TOP 363 0 TOP
364 0 TOP 365 0 TOP 366 0 TOP 367 0 TOP 368 0 TOP 369 0 TOP 370 0 TOP 371 0 TOP
372 0 TOP 373 0 TOP 374 0 TOP 375 0 TOP 376 0 TOP 377 0 TOP 378 0 TOP 379 0 TOP
380 0 TOP 381 0 TOP 382 0 TOP 383 0 TOP 384 0 TOP 385 0 TOP 386 0 TOP 387 0 TOP
388 0 TOP 389 0 TOP 390 0 TOP 391 0 TOP 392 0 TOP 393 0 TOP 394 0 TOP 395 0 TOP
396 0 TOP 397 0 TOP 398 0 TOP 399 0 TOP 400 0 TOP 401 0 TOP 402 0 TOP 403 0 TOP
404 0 TOP 405 0 TOP 406 0 TOP 407 0 TOP 408 0 TOP 409 0 TOP 410 0 TOP 411 0 TOP
412 0 TOP 413 0 TOP 414 0 TOP 415 0 TOP 416 0 TOP 417 0 TOP 418 0 TOP 419 0 TOP
420 0 TOP 421 0 TOP 422 0 TOP 423 0 TOP 424 0 TOP 425 0 TOP 426 0 TOP 427 0 TOP
428 0 TOP 429 0 TOP 430 0 TOP 431 0 TOP 432 0 TOP 433 0 TOP 434 0 TOP 435 0 TOP
436 0 TOP 437 0 TOP 438 0 TOP 439 0 TOP 440 0 TOP 441 0 TOP 442 0 TOP 443 0 TOP
444 0 TOP 445 0 TOP 446 0 TOP 447 0 TOP 448 0 TOP 449 0 TOP 450 0 TOP 451 0 TOP
452 0 TOP 453 0 TOP 454 0 TOP 455 0 TOP 456 0 TOP 457 0 TOP 458 0 TOP 459 0 TOP
460 0 TOP 461 0 TOP 462 0 TOP 463 0 TOP 464 0 TOP 465 0 TOP 466 0 TOP 467 0 TOP
468 0 TOP 469 0 TOP 470 0 TOP 471 0 TOP 472 0 TOP 473 0 TOP 474 0 TOP 475 0 TOP
476 0 TOP 477 0 TOP 478 0 TOP 479 0 TOP 480 0 TOP 481 0 TOP 482 0 TOP 483 0 TOP
484 0 TOP 485 0 TOP 486 0 TOP 487 0 TOP 488 0 TOP 489 0 TOP 490 0 TOP 491 0 TOP
492 0 TOP 493 0 TOP 494 0 TOP 495 0 TOP 496 0 TOP 497 0 TOP 498 0 TOP 499 0 TOP
500 0 TOP 501 0 TOP 502 0 TOP 503 0 TOP 504 0 TOP 505 0 TOP 506 0 TOP 507 0 TOP
508 0 TOP 509 0 TOP 510 0 TOP 511 0 TOP 512 0 TOP 513 0 TOP 514 0 TOP 515 0 TOP
516 0 TOP 517 0 TOP 518 0 TOP 519 0 TOP 520 0 TOP 521 0 TOP 522 0 TOP 523 0 TOP
524 0 TOP 525 0 TOP 526 0 TOP 527 0 TOP 528 0 TOP 529 0 TOP 530 0 TOP 531 0 TOP
532 0 TO 0 TOP 554 0 TOP 555 0 TOP 556 0 TOP 557 0 TOP 558 0 TOP 559 0 TOP 560 0
TOP 561 0 TOP 562 0 TOP 563TOP 731 0 TOP 732 0 TOP 733 0 TOP 734 0 TOP 735 0 TOP
736 0 TOP 737 0 TOP 738 0 TOP 739 0 TOP 740 0 TOP 754 0 TOP 755 0 TOP 756 0 TOP
757 0 TOP 758 0 TOP 759 0 TOP 760 0 TOP 761 0 TOP 762 0 TOP 763 0 0 TOP 821 0
TOP 822 0 TOP 823 0 TOP 824 0 TOP 825 0 TOP 826 0 TOP 827 0 TOP 828 0 TOP 829 0
TOP 830 0 TOP 851 0 TOP 852 0 TOP 853 0 TOP 854 0 TOP 855 0 TOP 856 0 TOP 857 0
TOP 858 0 TOP 859 0 TOP 860  0 TOP 935 0 TOP 936 0 TOP 937 0 TOP 938 0 TOP 939 0
TOP 940 0 TOP 941 0 TOP 942 0 TOP 943 0 TOP 944P 973 0 TOP 974 0 TOP 975 0 TOP
976 0 TOP 977 0 TOP 978 0 TOP 979 0 TOP 980 0 TOP 981 0 TOP 982 0 TO 1113 0 TOP
1114 0 TOP 1115 0 TOP 1116 0 TOP 1117 0 TOP 1118 0 TOP 1119 0 TOP 1120 0 TOP
1121 0 TOP P 1140 0 TOP 1141 0 TOP 1142 0 TOP 1143 0 TOP 1144 0 TOP 1145 0 TOP
1146 0 TOP 1147 0 TOP 1148 0 TOP

 <- -ERR Command argument should be numeric.
-> QUIT
<- +OK Message follows

A workaround we currently use is a fresh introduced command called ATOP
which sends all needed headers.

+/* do_atop CONNECTION MSGNUM NUM
+ * ATOP command; send headers from MSGNUM to NUM */
+static enum connection_action do_atop(connection c, int msg_num, const int
msg_end) {
+       int i, n = 0;
+
+       log_print(LOG_DEBUG, _("do_atop: %d %d"), msg_num, msg_end);
+       for ( i = msg_num; i < msg_end; i++) {
+               if (msg_num == msg_end)
+                       break;
+               if ((n = c->m->sendmessage(c->m, c, i, 0)) == -2)
+               return close_connection;
+       }
+       /* That might have taken a long time. */
+       c->idlesince = time(NULL);
+       if (verbose) {
+           if (n >= 0)
+               log_print(LOG_DEBUG, _("do_atop: client %s: sent headers up to id %d lines of message %d"), c->idstr, msg_end, msg_num + 1);
+           else
+               log_print(LOG_DEBUG, _("do_atop: client %s: failed to send message %d"), c->idstr, msg_num +
1);
+       }
+
+    return do_nothing;
+}


Martin Blapp, <mb@imp.ch> <mbr@FreeBSD.org>
------------------------------------------------------------------
ImproWare AG, UNIXSP & ISP, Zurlindenstrasse 29, 4133 Pratteln, CH
Phone: +41 61 826 93 00 Fax: +41 61 826 93 01
PGP: <finger -l mbr@freebsd.org>
PGP Fingerprint: B434 53FC C87C FE7B 0A18 B84C 8686 EF22 D300 551E
------------------------------------------------------------------