Skip Menu |

This queue is for tickets about the DBD-mysql CPAN distribution.

Report information
The Basics
Id: 97625
Status: resolved
Priority: 0/
Queue: DBD-mysql

People
Owner: CAPTTOFU [...] cpan.org
Requestors: RURBAN [...] cpan.org
Cc:
AdminCc:

Bug Information
Severity: (no value)
Broken in: (no value)
Fixed in: (no value)



Subject: use-after-free in mysql_dr_error
On exceptions (usually dr_error) valgrind and -faddress-sanitizer find use-after-free in mysql_dr_error at sv_setpv(errstr, what) as errstr and errstate below was already freed. I'm working on a patch. repro with asan or valgrind, eg like this: perl5.14.4d-nt Makefile --testuser=nosuchuser make valgrind perl5.14.4d-nt -Iblib/arch -Iblib/lib t/30insertfetch.t valgrind sample: this one accesses MYSQL* sock in mysql_db_login after being freed in mysql_dr_connect ==13578== Invalid read of size 4 ==13578== at 0x6C1C9B5: mysql_errno (in /usr/lib/x86_64-linux-gnu/libmysqlclient.so.18.0.0) ==13578== by 0x69C8001: mysql_db_login (dbdimp.c:2099) ==13578== by 0x69D2E3F: XS_DBD__mysql__db__login (mysql.xsi:104) ==13578== by 0x57C4AB: Perl_pp_entersub (pp_hot.c:3046) ==13578== by 0x510BC2: Perl_runops_debug (dump.c:2266) ==13578== by 0x44CC3F: Perl_call_sv (perl.c:2648) ==13578== by 0x6165339: XS_DBI_dispatch (DBI.xs:3765) ==13578== by 0x57C4AB: Perl_pp_entersub (pp_hot.c:3046) ==13578== by 0x510BC2: Perl_runops_debug (dump.c:2266) ==13578== by 0x44BB39: S_run_body (perl.c:2366) ==13578== by 0x44AF02: perl_run (perl.c:2284) ==13578== by 0x41C4BC: main (perlmain.c:120) ==13578== Address 0x6833c10 is 144 bytes inside a block of size 1,272 free'd ==13578== at 0x40282F4: free (vg_replace_malloc.c:446) ==13578== by 0x51172F: Perl_safesysfree (util.c:284) ==13578== by 0x69C7AD0: mysql_dr_connect (dbdimp.c:1959) ==13578== by 0x69C7E9D: my_login (dbdimp.c:2046) ==13578== by 0x69C7FBE: mysql_db_login (dbdimp.c:2097) ==13578== by 0x69D2E3F: XS_DBD__mysql__db__login (mysql.xsi:104) ==13578== by 0x57C4AB: Perl_pp_entersub (pp_hot.c:3046) ==13578== by 0x510BC2: Perl_runops_debug (dump.c:2266) ==13578== by 0x44CC3F: Perl_call_sv (perl.c:2648) ==13578== by 0x6165339: XS_DBI_dispatch (DBI.xs:3765) ==13578== by 0x57C4AB: Perl_pp_entersub (pp_hot.c:3046) ==13578== by 0x510BC2: Perl_runops_debug (dump.c:2266) ==13578== this one accesses imp_xxh->com.attr.Errstr in mysql_db_login after being freed in mysql_dr_connect. ==13578== Invalid read of size 1 ==13578== at 0x402A062: strlen (mc_replace_strmem.c:399) ==13578== by 0x5B0F38: Perl_sv_setpv (sv.c:4568) ==13578== by 0x69C4C5C: mysql_dr_error (dbdimp.c:1441) ==13578== by 0x69C8015: mysql_db_login (dbdimp.c:2099) ==13578== by 0x69D2E3F: XS_DBD__mysql__db__login (mysql.xsi:104) ==13578== by 0x57C4AB: Perl_pp_entersub (pp_hot.c:3046) ==13578== by 0x510BC2: Perl_runops_debug (dump.c:2266) ==13578== by 0x44CC3F: Perl_call_sv (perl.c:2648) ==13578== by 0x6165339: XS_DBI_dispatch (DBI.xs:3765) ==13578== by 0x57C4AB: Perl_pp_entersub (pp_hot.c:3046) ==13578== by 0x510BC2: Perl_runops_debug (dump.c:2266) ==13578== by 0x44BB39: S_run_body (perl.c:2366) ==13578== Address 0x6833c17 is 151 bytes inside a block of size 1,272 free'd ==13578== at 0x40282F4: free (vg_replace_malloc.c:446) ==13578== by 0x51172F: Perl_safesysfree (util.c:284) ==13578== by 0x69C7AD0: mysql_dr_connect (dbdimp.c:1959) ==13578== by 0x69C7E9D: my_login (dbdimp.c:2046) ==13578== by 0x69C7FBE: mysql_db_login (dbdimp.c:2097) ==13578== by 0x69D2E3F: XS_DBD__mysql__db__login (mysql.xsi:104) ==13578== by 0x57C4AB: Perl_pp_entersub (pp_hot.c:3046) ==13578== by 0x510BC2: Perl_runops_debug (dump.c:2266) ==13578== by 0x44CC3F: Perl_call_sv (perl.c:2648) ==13578== by 0x6165339: XS_DBI_dispatch (DBI.xs:3765) ==13578== by 0x57C4AB: Perl_pp_entersub (pp_hot.c:3046) ==13578== by 0x510BC2: Perl_runops_debug (dump.c:2266) ... asan sample: ================================================================= ==19289==ERROR: AddressSanitizer: heap-use-after-free on address 0x61a000017517 at pc 0x4566a6 bp 0x7fffa3b3c6b0 sp 0x7fffa3b3c688 READ of size 69 at 0x61a000017517 thread T0 #0 0x4566a5 in __interceptor_strlen (/usr/local/bin/perl5.21.2d-nt-asan@ed9113fa+0x4566a5) #1 0x7fc292e0fbe1 in Perl_sv_setpv /home/rurban/Perl/src/build-5.21.2d-nt-asan@ed9113fa/sv.c:4772 #2 0x7fc28de0fe96 in mysql_dr_error /home/rurban/Perl/DBD-mysql/dbdimp.c:1441 #3 0x7fc28de2f2f6 in mysql_db_login /home/rurban/Perl/DBD-mysql/dbdimp.c:2099 #4 0x7fc28de91793 in XS_DBD__mysql__db__login /home/rurban/Perl/DBD-mysql/./mysql.xsi:104 #5 0x7fc292cbdf03 in Perl_pp_entersub /home/rurban/Perl/src/build-5.21.2d-nt-asan@ed9113fa/pp_hot.c:2784 #6 0x7fc2929b16ba in Perl_runops_debug /home/rurban/Perl/src/build-5.21.2d-nt-asan@ed9113fa/dump.c:2361 #7 0x7fc29230b117 in Perl_call_sv /home/rurban/Perl/src/build-5.21.2d-nt-asan@ed9113fa/perl.c:2707 #8 0x7fc28e406455 in XS_DBI_dispatch /home/rurban/.cpan/build/DBI-1.631-PzCBar/DBI.xs:3765 #9 0x7fc292cbdf03 in Perl_pp_entersub /home/rurban/Perl/src/build-5.21.2d-nt-asan@ed9113fa/pp_hot.c:2784 #10 0x7fc2929b16ba in Perl_runops_debug /home/rurban/Perl/src/build-5.21.2d-nt-asan@ed9113fa/dump.c:2361 #11 0x7fc292301a85 in S_run_body /home/rurban/Perl/src/build-5.21.2d-nt-asan@ed9113fa/perl.c:2408 #12 0x7fc2922fd5a2 in perl_run /home/rurban/Perl/src/build-5.21.2d-nt-asan@ed9113fa/perl.c:2331 #13 0x47b95f in main /usr/src/perl/build-5.21.2d-nt-asan@ed9113fa/perlmain.c:114 #14 0x7fc291147b44 (/lib/x86_64-linux-gnu/libc.so.6+0x21b44) #15 0x47b2dc in _start (/usr/local/bin/perl5.21.2d-nt-asan@ed9113fa+0x47b2dc) 0x61a000017517 is located 151 bytes inside of 1272-byte region [0x61a000017480,0x61a000017978) freed by thread T0 here: #0 0x465079 in __interceptor_free (/usr/local/bin/perl5.21.2d-nt-asan@ed9113fa+0x465079) previously allocated by thread T0 here: #0 0x4652c9 in calloc (/usr/local/bin/perl5.21.2d-nt-asan@ed9113fa+0x4652c9) SUMMARY: AddressSanitizer: heap-use-after-free ??:0 __interceptor_strlen Shadow bytes around the buggy address: 0x0c347fffae50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x0c347fffae60: 00 00 00 00 02 fa fa fa fa fa fa fa fa fa fa fa 0x0c347fffae70: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 0x0c347fffae80: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 0x0c347fffae90: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd =>0x0c347fffaea0: fd fd[fd]fd fd fd fd fd fd fd fd fd fd fd fd fd 0x0c347fffaeb0: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd 0x0c347fffaec0: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd 0x0c347fffaed0: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd 0x0c347fffaee0: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd 0x0c347fffaef0: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd Shadow byte legend (one shadow byte represents 8 application bytes): Addressable: 00 Partially addressable: 01 02 03 04 05 06 07 Heap left redzone: fa Heap right redzone: fb Freed heap region: fd Stack left redzone: f1 Stack mid redzone: f2 Stack right redzone: f3 Stack partial redzone: f4 Stack after return: f5 Stack use after scope: f8 Global redzone: f9 Global init order: f6 Poisoned by user: f7 ASan internal: fe ==19289==ABORTING -- Reini Urban
On Wed Jul 30 12:49:42 2014, RURBAN wrote: Show quoted text
> On exceptions (usually dr_error) valgrind and -faddress-sanitizer find > use-after-free in mysql_dr_error at > sv_setpv(errstr, what) > as errstr and errstate below was already freed. > > I'm working on a patch.
The problem was introduced with the premature Safefree(sock) in mysql_dr_connect() with RT #86153. We still need the sock structure for error handling. I'm checking now if we can defer this free call to mysql_dr_error()
On Wed Jul 30 13:02:12 2014, RURBAN wrote: Show quoted text
> On Wed Jul 30 12:49:42 2014, RURBAN wrote:
> > On exceptions (usually dr_error) valgrind and -faddress-sanitizer > > find > > use-after-free in mysql_dr_error at > > sv_setpv(errstr, what) > > as errstr and errstate below was already freed. > > > > I'm working on a patch.
> > The problem was introduced with the premature Safefree(sock) in > mysql_dr_connect() with RT #86153. > > We still need the sock structure for error handling. > I'm checking now if we can defer this free call to > mysql_dr_error()
Nope, imp_dbh->pmysql is freed seperately later in dbd_db_destroy(). The fail login free needs to happen at the end of my_login. The patch is on github as pull request #26 -- Reini Urban
Hi there! thank you very much! I need to see why it fails here: https://travis-ci.org/perl5-dbi/DBD-mysql/builds/31262431 I think it might be completely unrelated to your changes. I need to spin up a Docker container with perl 5.8 and see if I can reproduce the error. On Wed Jul 30 14:09:24 2014, RURBAN wrote: Show quoted text
> On Wed Jul 30 13:02:12 2014, RURBAN wrote:
> > On Wed Jul 30 12:49:42 2014, RURBAN wrote:
> > > On exceptions (usually dr_error) valgrind and -faddress-sanitizer > > > find > > > use-after-free in mysql_dr_error at > > > sv_setpv(errstr, what) > > > as errstr and errstate below was already freed. > > > > > > I'm working on a patch.
> > > > The problem was introduced with the premature Safefree(sock) in > > mysql_dr_connect() with RT #86153. > > > > We still need the sock structure for error handling. > > I'm checking now if we can defer this free call to > > mysql_dr_error()
> > Nope, imp_dbh->pmysql is freed seperately later in dbd_db_destroy(). > The fail login free needs to happen at the end of my_login. > > The patch is on github as pull request #26 >
On Fri Aug 01 09:29:10 2014, CAPTTOFU wrote: Show quoted text
> Hi there! > > thank you very much! > > I need to see why it fails here: https://travis-ci.org/perl5-dbi/DBD- > mysql/builds/31262431 > > I think it might be completely unrelated to your changes. I need to > spin up a Docker container with perl 5.8 and see if I can reproduce > the error.
It can be reproduced on every single perl version, and there are still remaining errors. My PR #26 only fixed one instance of the problem. travis fails here because of a bad test with failed login. This tests needs to be improved still. Another reproducer with mysql_auto_reconnect is this: system(qw(sudo service mysql start)); use DBI; my $dbh = DBI->connect("DBI:mysql:database=test:port=3306"); $dbh->{mysql_auto_reconnect} = 1; # without this is works my $select = sub { $dbh->do(q{SELECT 1}) for 1 .. 10; }; $select->(); system qw(sudo service mysql stop); $select->(); ok(1, "dbh did not crash on closed connection"); system(qw(sudo service mysql start)); restarting the service is of course system dependent. I could not repro it with a KILL me sub, like this: sub killme { my $dbh = shift; my $sth = $dbh->prepare("SHOW FULL PROCESSLIST"); $sth->execute(); while (my $ps = $sth->fetchrow_hashref()) { my $process_id = $ps->{Id}; if ($ENV{USER}) { if ($ps->{User} eq $ENV{USER} and $ps->{Time} < 20) { diag "killme $process_id"; $dbh->do("KILL $process_id"); } } else { if ($ps->{Time} < 20) { diag "killme $process_id"; $dbh->do("KILL $process_id"); } } } } because then DESTROY handles the cleanup properly. The big problem with lost connections is that business logic wants to keep reporting errors to a file in case of lost server connections. This is related to RT #85919, though the root cause is this use-after free here. With asan you e.g. see that's a heap-use-after-free: $ sudo service mysql start; pb -e'use DBI; my $dbh = DBI->connect("dbi:mysql:database=test:port=3306"); $dbh->{mysql_auto_reconnect} = 1; my $stmt = sub { $dbh->do(q{SELECT 1}) for 1 .. 10; }; $stmt->(); system qw(sudo service mysql stop); $stmt->()'; sudo service mysql start [ ok ] Starting MySQL database server: mysqld already running. [ ok ] Stopping MySQL database server: mysqld. ================================================================= ==4163== ERROR: AddressSanitizer: heap-use-after-free on address 0x7f339bc1a0d7 at pc 0x41549a bp 0x7fff42cbd490 sp 0x7fff42cbd470 READ of size 1 at 0x7f339bc1a0d7 thread T0 #0 0x415499 in strlen (/usr/local/bin/perl5.14.4d-nt-asan+0x415499) #1 0x7f339dc0d116 in Perl_sv_setpv /home/rurban/Perl/src/build-5.14.4d-nt-asan/sv.c:4568 #2 0x7f339a8f317d in mysql_dr_error /home/rurban/Perl/DBD-mysql/dbdimp.c:1441 #3 0x7f339a937d07 in mysql_db_reconnect /home/rurban/Perl/DBD-mysql/dbdimp.c:4911 #4 0x7f339a92f05d in mysql_st_internal_execute /home/rurban/Perl/DBD-mysql/dbdimp.c:3304 #5 0x7f339a9a3ab1 in XS_DBD__mysql__db_do /home/rurban/Perl/DBD-mysql/mysql.xs:532 #6 0x7f339b3e23e1 in XS_DBI_dispatch /home/rurban/.cpan/build/DBI-1.628-SjeX_f/DBI.xs:3715 #7 0x7f339da81566 in Perl_pp_entersub /home/rurban/Perl/src/build-5.14.4d-nt-asan/pp_hot.c:3046 #8 0x7f339d729357 in Perl_runops_debug /home/rurban/Perl/src/build-5.14.4d-nt-asan/dump.c:2266 #9 0x7f339d1807d4 in S_run_body /home/rurban/Perl/src/build-5.14.4d-nt-asan/perl.c:2366 #10 0x7f339d17c04e in perl_run /home/rurban/Perl/src/build-5.14.4d-nt-asan/perl.c:2284 #11 0x408916 in main /home/rurban/Perl/src/build-5.14.4d-nt-asan/perlmain.c:120 #12 0x7f339c087b44 (/lib/x86_64-linux-gnu/libc.so.6+0x21b44) 0x7f339bc1a0d7 is located 151 bytes inside of 1272-byte region [0x7f339bc1a040,0x7f339bc1a538) freed by thread T0 here: previously allocated by thread T0 here: Shadow byte and word: 0x1fe67378341a: fd 0x1fe673783418: fd fd fd fd fd fd fd fd More shadow bytes: 0x1fe6737833f8: fa fa fa fa fa fa fa fa 0x1fe673783400: fa fa fa fa fa fa fa fa 0x1fe673783408: fd fd fd fd fd fd fd fd 0x1fe673783410: fd fd fd fd fd fd fd fd =>0x1fe673783418: fd fd fd fd fd fd fd fd 0x1fe673783420: fd fd fd fd fd fd fd fd 0x1fe673783428: fd fd fd fd fd fd fd fd 0x1fe673783430: fd fd fd fd fd fd fd fd 0x1fe673783438: fd fd fd fd fd fd fd fd Stats: 4M malloced (6M for red zones) by 55806 calls Stats: 0M realloced by 2899 calls Stats: 1M freed by 26103 calls Stats: 0M really freed by 0 calls Stats: 14M (3593 full pages) mmaped in 28 calls mmaps by size class: 7:49140; 8:8188; 9:1023; 10:511; 1 valgrind reports the invalid free as: ==12942== Invalid free() / delete / delete[] / realloc() ==12942== at 0x40282F4: free (vg_replace_malloc.c:446) ==12942== by 0x51172F: Perl_safesysfree (util.c:284) ==12942== by 0x6BCBEB5: my_login (dbdimp.c:2052) ==12942== by 0x6BD458D: mysql_db_reconnect (dbdimp.c:4908) ==12942== by 0x6BD019F: mysql_st_internal_execute (dbdimp.c:3304) ==12942== by 0x6BDE922: XS_DBD__mysql__db_do (mysql.xs:532) ==12942== by 0x5F691FF: XS_DBI_dispatch (DBI.xs:3746) ==12942== by 0x57C4AB: Perl_pp_entersub (pp_hot.c:3046) ==12942== by 0x510BC2: Perl_runops_debug (dump.c:2266) ==12942== by 0x44BB39: S_run_body (perl.c:2366) ==12942== by 0x44AF02: perl_run (perl.c:2284) ==12942== by 0x41C4BC: main (perlmain.c:120) ==12942== Address 0x68557f0 is 0 bytes inside a block of size 1,272 free'd ==12942== at 0x40282F4: free (vg_replace_malloc.c:446) ==12942== by 0x51172F: Perl_safesysfree (util.c:284) ==12942== by 0x6BCBEB5: my_login (dbdimp.c:2052) ==12942== by 0x6BD458D: mysql_db_reconnect (dbdimp.c:4908) ==12942== by 0x6BD019F: mysql_st_internal_execute (dbdimp.c:3304) ==12942== by 0x6BDE922: XS_DBD__mysql__db_do (mysql.xs:532) ==12942== by 0x5F691FF: XS_DBI_dispatch (DBI.xs:3746) ==12942== by 0x57C4AB: Perl_pp_entersub (pp_hot.c:3046) ==12942== by 0x510BC2: Perl_runops_debug (dump.c:2266) ==12942== by 0x44BB39: S_run_body (perl.c:2366) ==12942== by 0x44AF02: perl_run (perl.c:2284) ==12942== by 0x41C4BC: main (perlmain.c:120) and more invalid writes as: ==12942== Invalid write of size 8 ==12942== at 0x6E1C4C6: ??? (in /usr/lib/x86_64-linux-gnu/libmysqlclient.so.18.0.0) ==12942== by 0x6E1F76C: mysql_real_connect (in /usr/lib/x86_64-linux-gnu/libmysqlclient.so.18.0.0) ==12942== by 0x6BCBA2F: mysql_dr_connect (dbdimp.c:1924) ==12942== by 0x6BCBE8C: my_login (dbdimp.c:2049) ==12942== by 0x6BD458D: mysql_db_reconnect (dbdimp.c:4908) ==12942== by 0x6BD019F: mysql_st_internal_execute (dbdimp.c:3304) ==12942== by 0x6BDE922: XS_DBD__mysql__db_do (mysql.xs:532) ==12942== by 0x5F691FF: XS_DBI_dispatch (DBI.xs:3746) ==12942== by 0x57C4AB: Perl_pp_entersub (pp_hot.c:3046) ==12942== by 0x510BC2: Perl_runops_debug (dump.c:2266) ==12942== by 0x44BB39: S_run_body (perl.c:2366) ==12942== by 0x44AF02: perl_run (perl.c:2284) ==12942== Address 0x6855b80 is 912 bytes inside a block of size 1,272 free'd ==12942== at 0x40282F4: free (vg_replace_malloc.c:446) ==12942== by 0x51172F: Perl_safesysfree (util.c:284) ==12942== by 0x6BCBEB5: my_login (dbdimp.c:2052) ==12942== by 0x6BD458D: mysql_db_reconnect (dbdimp.c:4908) ==12942== by 0x6BD019F: mysql_st_internal_execute (dbdimp.c:3304) ==12942== by 0x6BDE922: XS_DBD__mysql__db_do (mysql.xs:532) ==12942== by 0x5F691FF: XS_DBI_dispatch (DBI.xs:3746) ==12942== by 0x57C4AB: Perl_pp_entersub (pp_hot.c:3046) ==12942== by 0x510BC2: Perl_runops_debug (dump.c:2266) ==12942== by 0x44BB39: S_run_body (perl.c:2366) ==12942== by 0x44AF02: perl_run (perl.c:2284) ==12942== by 0x41C4BC: main (perlmain.c:120) So the my_login logic needs to be something like: --- dbdimp.c +++ dbdimp.c @@ -1995,7 +1995,7 @@ static int my_login(pTHX_ SV* dbh, imp_dbh_t *imp_dbh) char* user; char* password; char* mysql_socket; - int result; + int result, fresh; D_imp_xxh(dbh); /* TODO- resolve this so that it is set only if DBI is 1.607 */ @@ -2044,12 +2044,15 @@ static int my_login(pTHX_ SV* dbh, imp_dbh_t *imp_dbh) port ? port : "NULL"); if (!imp_dbh->pmysql) { + fresh = 1; Newz(908, imp_dbh->pmysql, 1, MYSQL); } result = mysql_dr_connect(dbh, imp_dbh->pmysql, mysql_socket, host, port, user, password, dbname, imp_dbh) ? TRUE : FALSE; - if (!result) + if (fresh && !result) { + /* Prevent leaks, but do not free in case of a reconnect. See #97625 */ Safefree(imp_dbh->pmysql); + } return result; } but this is still not good enough. Show quoted text
> On Wed Jul 30 14:09:24 2014, RURBAN wrote:
> > On Wed Jul 30 13:02:12 2014, RURBAN wrote:
> > > On Wed Jul 30 12:49:42 2014, RURBAN wrote:
> > > > On exceptions (usually dr_error) valgrind and -faddress-sanitizer > > > > find > > > > use-after-free in mysql_dr_error at > > > > sv_setpv(errstr, what) > > > > as errstr and errstate below was already freed. > > > > > > > > I'm working on a patch.
> > > > > > The problem was introduced with the premature Safefree(sock) in > > > mysql_dr_connect() with RT #86153. > > > > > > We still need the sock structure for error handling. > > > I'm checking now if we can defer this free call to > > > mysql_dr_error()
> > > > Nope, imp_dbh->pmysql is freed seperately later in dbd_db_destroy(). > > The fail login free needs to happen at the end of my_login. > > > > The patch is on github as pull request #26 > >
-- Reini Urban
On Fri Aug 01 10:31:12 2014, RURBAN wrote: Show quoted text
> On Fri Aug 01 09:29:10 2014, CAPTTOFU wrote:
> > Hi there! > > > > thank you very much! > > > > I need to see why it fails here: https://travis-ci.org/perl5-dbi/DBD- > > mysql/builds/31262431 > > > > I think it might be completely unrelated to your changes. I need to > > spin up a Docker container with perl 5.8 and see if I can reproduce > > the error.
> > It can be reproduced on every single perl version, > and there are still remaining errors. > My PR #26 only fixed one instance of the problem. > travis fails here because of a bad test with failed login. This tests > needs to be improved still.
finally fixed after finding the error in my first variant. fresh needs to be initialized properly. The final patch is on github as pull request #27. -- Reini Urban
4.029 release contains this fix - thank you!