Package: kaya
Version: 0.4.2-2
Severity: grave
Tags: patch
Justification: causes non-serious data loss
0.4.2 contains a few data loss / data corruption bugs that are fixed
upstream in 0.4.3. The attached patch fixes these bugs, as well as a
compiler error where valid code would not compile. In order from
most serious to least, the bugs are:
rts/VMState.cc: fixes memory allocation bug which can cause
hard-to-trace crashes.
libs/my_inter.cc: fixes data corruption bug where values returned from
prepared queries in MySQL contain NULLs
stdlib/Mime.k: fixes bug with processing of form fields in file upload
forms
stdlib/Regex.k: fixes bug with Regex splitting of strings where the
delimiter terminates the string
compiler/LambdaLift.hs: fixes bug with for loops and lambda functions
Thanks
-- System Information:
Debian Release: lenny/sid
APT prefers unstable
APT policy: (500, 'unstable')
Architecture: i386 (i686)
Kernel: Linux 2.6.18 (SMP w/1 CPU core)
Locale: LANG=en_GB.UTF-8, LC_CTYPE=en_GB.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/bash
Versions of packages kaya depends on:
ii g++-4.2 4.2.3-2 The GNU C++ compiler
ii libc6 2.7-9 GNU C Library: Shared libraries
ii libgc-dev 1:6.8-1.1 conservative garbage collector for
ii libgc1c2 1:6.8-1.1 conservative garbage collector for
ii libgcc1 1:4.3-20080227-1 GCC support library
ii libgcrypt11 1.4.0-3 LGPL Crypto library - runtime libr
ii libgcrypt11-dev 1.4.0-3 LGPL Crypto library - development
ii libgmp3c2 2:4.2.1+dfsg-5 Multiprecision arithmetic library
ii libgnutls-dev 2.2.2-1 the GNU TLS library - development
ii libncurses5 5.6+20080203-1 Shared libraries for terminal hand
ii libpcre3 7.6-2 Perl 5 Compatible Regular Expressi
ii libpcre3-dev 7.6-2 Perl 5 Compatible Regular Expressi
ii libreadline5 5.2-3 GNU readline and history libraries
ii libstdc++6 4.3-20080227-1 The GNU Standard C++ Library v3
ii zlib1g 1:1.2.3.3.dfsg-11 compression library - runtime
ii zlib1g-dev 1:1.2.3.3.dfsg-11 compression library - development
kaya recommends no packages.
-- no debconf information
diff -rN -u old-kaya/compiler/LambdaLift.hs new-kaya/compiler/LambdaLift.hs
--- old-kaya/compiler/LambdaLift.hs 2008-08-18 10:04:38.000000000 +0100
+++ new-kaya/compiler/LambdaLift.hs 2008-08-18 10:04:38.000000000 +0100
@@ -83,7 +83,7 @@
let (defs'',e2') = lift' defs' locs e2 in
(defs'',DoWhile e1' e2')
lift' defs locs (For i nm j lval e1 e2) =
- let (defs',e1') = lift' defs locs e1 in
+ let (defs',e1') = lift' defs (fakevars++locs) e1 in
let (defs'',e2') = lift' defs' (fakevars++locs) e2 in
let (defs''',lval') = liftlval defs'' locs lval in
(defs''',For i nm j lval' e1' e2')
diff -rN -u old-kaya/libs/my_inter.cc new-kaya/libs/my_inter.cc
--- old-kaya/libs/my_inter.cc 2008-08-18 10:04:38.000000000 +0100
+++ new-kaya/libs/my_inter.cc 2008-08-18 10:04:38.000000000 +0100
@@ -289,7 +289,11 @@
for(int j = 0; j<numflds; j++) {
KayaValue pv,fld;
- pv = KayaString(KSTRING((char*)rbind[i].buffer));
+ if (rnull[j]) {
+ pv = KayaString(L"");
+ } else {
+ pv = KayaString(KSTRING((char*)rbind[j].buffer));
+ }
fld = KayaUnion(0,1);
KayaUnionSetArg(fld,0,pv);
KayaArrayPush(row,fld);
diff -rN -u old-kaya/rts/VMState.cc new-kaya/rts/VMState.cc
--- old-kaya/rts/VMState.cc 2008-08-18 10:04:38.000000000 +0100
+++ new-kaya/rts/VMState.cc 2008-08-18 10:04:38.000000000 +0100
@@ -28,7 +28,7 @@
void initFunMap(kint sz, kint fmhash)
{
- func* funcs = (func*)malloc(sizeof(func)*sz);
+ func* funcs = (func*)GC_MALLOC_UNCOLLECTABLE(sizeof(func)*sz);
m_funmap[0] = funcs;
m_funmapsize = sz;
m_funmaphash = fmhash;
diff -rN -u old-kaya/stdlib/Mime.k new-kaya/stdlib/Mime.k
--- old-kaya/stdlib/Mime.k 2008-08-18 10:04:38.000000000 +0100
+++ new-kaya/stdlib/Mime.k 2008-08-18 10:04:38.000000000 +0100
@@ -135,7 +135,13 @@
pop(bstack);
}
if (fname == "") {
- push(mimeobjs,Mime(copy(blockname),copy(ctype),MimeString(copy(content))));
+ if (substr(content,-2,2) == "\r\n") {
+ push(mimeobjs,Mime(copy(blockname),copy(ctype),MimeString(substr(content,0,length(content)-2))));
+ } else if (substr(content,-1,1) == "\n" || substr(content,-1,1) == "\r") {
+ push(mimeobjs,Mime(copy(blockname),copy(ctype),MimeString(substr(content,0,length(content)-1))));
+ } else {
+ push(mimeobjs,Mime(copy(blockname),copy(ctype),MimeString(copy(content))));
+ }
} else {
push(mimeobjs,Mime(copy(blockname),copy(ctype),MimeFile(copy(fname),copy(tmpname))));
close(mfh);
@@ -148,7 +154,7 @@
leavestate = DecodeBody;
} else {
if (fname == "") {
- trim(line);
+ // trim(line);
content += line;
} else {
// binary safe (last \r\n is a delimiter, not content... complicated)
diff -rN -u old-kaya/stdlib/Regex.k new-kaya/stdlib/Regex.k
--- old-kaya/stdlib/Regex.k 2008-08-18 10:04:38.000000000 +0100
+++ new-kaya/stdlib/Regex.k 2008-08-18 10:04:38.000000000 +0100
@@ -317,10 +317,14 @@
}
limit--;
if (limit == 0) {
- push(strs,str);
+ if (allowempty || str != "") {
+ push(strs,str);
+ }
break;
} // stop matching
- | noMatch() -> push(strs,str);
+ | noMatch() -> if (allowempty || str != "") {
+ push(strs,str);
+ }
break; // Stop matching
}
return strs;