diff --git a/modules/libjar/zipwriter/src/nsDeflateConverter.cpp b/modules/libjar/zipwriter/src/nsDeflateConverter.cpp index 42e1649045c..9975a8bccfa 100644 --- a/modules/libjar/zipwriter/src/nsDeflateConverter.cpp +++ b/modules/libjar/zipwriter/src/nsDeflateConverter.cpp @@ -206,12 +206,16 @@ NS_IMETHODIMP nsDeflateConverter::OnStopRequest(nsIRequest *aRequest, nsresult nsDeflateConverter::PushAvailableData(nsIRequest *aRequest, nsISupports *aContext) { + PRUint32 bytesToWrite = sizeof(mWriteBuffer) - mZstream.avail_out; + // We don't need to do anything if there isn't any data + if (bytesToWrite == 0) + return NS_OK; + nsresult rv; nsCOMPtr stream = do_CreateInstance("@mozilla.org/io/string-input-stream;1", &rv); NS_ENSURE_SUCCESS(rv, rv); - PRUint32 bytesToWrite = ZIP_BUFLEN - mZstream.avail_out; stream->ShareData((char*)mWriteBuffer, bytesToWrite); rv = mListener->OnDataAvailable(aRequest, mContext, stream, mOffset, bytesToWrite); diff --git a/modules/libjar/zipwriter/test/unit/data/test_bug446708/thumbs/st14-1.tiff b/modules/libjar/zipwriter/test/unit/data/test_bug446708/thumbs/st14-1.tiff new file mode 100644 index 00000000000..6b046575804 Binary files /dev/null and b/modules/libjar/zipwriter/test/unit/data/test_bug446708/thumbs/st14-1.tiff differ diff --git a/modules/libjar/zipwriter/test/unit/test_bug446708.js b/modules/libjar/zipwriter/test/unit/test_bug446708.js new file mode 100644 index 00000000000..fb1ec59fc04 --- /dev/null +++ b/modules/libjar/zipwriter/test/unit/test_bug446708.js @@ -0,0 +1,52 @@ +function run_test() { + var testBundle = do_get_file("modules/libjar/zipwriter/test/unit/data/test_bug446708"); + + RecursivelyZipDirectory(testBundle); +} + +// Add |file| to the zip. |path| is the current path for the file. +function AddToZip(zipWriter, path, file) +{ + var currentPath = path + file.leafName; + + if (file.isDirectory()) { + currentPath += "/"; + } + + // THIS IS WHERE THE ERROR OCCURS, FOR THE FILE "st14-1.tiff" IN "test_bug446708" + zipWriter.addEntryFile(currentPath, Ci.nsIZipWriter.COMPRESSION_DEFAULT, file, false); + + // if it's a dir, continue adding its contents recursively... + if (file.isDirectory()) { + var entries = file.QueryInterface(Components.interfaces.nsIFile).directoryEntries; + while (entries.hasMoreElements()) { + var entry = entries.getNext().QueryInterface(Components.interfaces.nsIFile); + AddToZip(zipWriter, currentPath, entry); + } + } + + // ...otherwise, we're done +} + +function RecursivelyZipDirectory(bundle) +{ + // create directory service + var dirUtils = Components.classes["@mozilla.org/file/directory_service;1"] + .createInstance(Components.interfaces.nsIProperties); + + // get the temp dir, where our temporary zip attachments can be stored + var tempFile = dirUtils.get("TmpD", Components.interfaces.nsIFile).clone(); + + // create unique file there + tempFile.append(bundle.leafName + ".zip"); + tempFile.createUnique(Components.interfaces.nsIFile.NORMAL_FILE_TYPE, + 0600); + + zipW.open(tempFile, PR_RDWR | PR_CREATE_FILE | PR_TRUNCATE); + + AddToZip(zipW, "", bundle); + + // we're done. + zipW.close(); +} +