Package: kdelibs Version: 4:3.5.10.dfsg.1-0lenny3 Severity: grave Tags: patch Justification: causes non-serious data loss
kgpg and all other applications that are creating zip files via kzip are producing corrupted zip files if a filename includes e.g. a german umlaut like 'รถ'. This is caused by an wrong encoding in KZip::doneWriting(int). To reproduce this behaviour create a folder with an umlaut and drop it to the kgpg trayicon. In the upcoming dialog zip as compression method has to be chosen. After encrypting and saving the zip file it must be decrypted to get the plain zip file. In case of having a umlaut in a foldername this file is corruped. This bug leads to important data loss if a user wants to backup folders securely with kgpg. In an extreme case the user deletes the folder before he checks the integrity of the encrypted zip file. -- System Information: Debian Release: 5.0.3 APT prefers stable APT policy: (500, 'stable') Architecture: i386 (i686) Kernel: Linux 2.6.29.4-id1-k8-9 (SMP w/4 CPU cores) Locale: LANG=de_DE.UTF-8, LC_CTYPE=de_DE.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/bash Versions of packages kdelibs depends on: ii kdelibs-data 4:3.5.10.dfsg.1-0lenny3 core shared data for all KDE appli ii kdelibs4c2a 4:3.5.10.dfsg.1-0lenny3 core libraries and binaries for al kdelibs recommends no packages. kdelibs suggests no packages. -- no debconf information
Index: kio/kio/kzip.cpp =================================================================== --- kio/kio/kzip.cpp (revision 1065516) +++ kio/kio/kzip.cpp (revision 1065517) @@ -954,8 +954,8 @@ buffer[ 26 ] = char(mysize >> 16); buffer[ 27 ] = char(mysize >> 24); - buffer[ 28 ] = char(it.current()->path().length()); // filename length - buffer[ 29 ] = char(it.current()->path().length() >> 8); + buffer[ 28 ] = char(path.length()); // filename length + buffer[ 29 ] = char(path.length() >> 8); buffer[ 30 ] = char(extra_field_len); buffer[ 31 ] = char(extra_field_len >> 8); @@ -1294,9 +1294,10 @@ if ( d->m_extraField == ModificationTime ) extra_field_len = 17; // value also used in doneWriting() + const QCString encodedName = QFile::encodeName(d->m_currentFile->path()); int csize = device()->at() - d->m_currentFile->headerStart() - 30 - - d->m_currentFile->path().length() - extra_field_len; + encodedName.length() - extra_field_len; d->m_currentFile->setCompressedSize(csize); //kdDebug(7040) << "usize: " << d->m_currentFile->size() << endl; //kdDebug(7040) << "csize: " << d->m_currentFile->compressedSize() << endl;