Skip to content

Commit

Permalink
Merge pull request #267 from teppeis/fix-crc
Browse files Browse the repository at this point in the history
fix: CRC is unexpectedly changed after zip is re-created
  • Loading branch information
cthackers authored Feb 6, 2019
2 parents cb300c9 + ed5fd83 commit ff17ae8
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 28 deletions.
7 changes: 4 additions & 3 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
node_modules/
test/issue_*/unzipped/
node_modules
/test/issue_*/unzipped/
xxx
.idea
*.iml
*.iml
2 changes: 1 addition & 1 deletion headers/entryHeader.js
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,7 @@ module.exports = function () {
// modification time (2 bytes time, 2 bytes date)
data.writeUInt32LE(_time, Constants.CENTIM);
// uncompressed file crc-32 value
data.writeInt32LE(_crc & 0xFFFF, Constants.CENCRC, true);
data.writeUInt32LE(_crc, Constants.CENCRC);
// compressed size
data.writeUInt32LE(_compressedSize, Constants.CENSIZ);
// uncompressed size
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"version": "0.4.12",
"description": "Javascript implementation of zip for nodejs with support for electron original-fs. Allows user to create or extract zip files both in memory or to/from disk",
"scripts": {
"test": "mocha test/mocha.js"
"test": "mocha test/mocha.js test/crc/index.js"
},
"keywords": [
"zip",
Expand Down
59 changes: 36 additions & 23 deletions test/crc/index.js
Original file line number Diff line number Diff line change
@@ -1,44 +1,57 @@
;(function () {
var assert = require('assert');
var path = require('path');
var Zip = require('../../adm-zip');

testGoodCrc();
testBadCrc();

// Good CRC
function testGoodCrc() {
var goodZip = new Zip(path.join(__dirname, 'good_crc.zip'));
var entries = goodZip.getEntries();
const assert = require('assert');
const path = require('path');
const Zip = require('../../adm-zip');
const rimraf = require('rimraf')

describe('crc', () => {
const destination = __dirname + '/xxx'

beforeEach(done => rimraf(destination, done))

it('Good CRC', (done) => {
const goodZip = new Zip(path.join(__dirname, 'good_crc.zip'));
const entries = goodZip.getEntries();
assert(entries.length === 1, 'Good CRC: Test archive contains exactly 1 file');

var testFile = entries.filter(function (entry) {
const testFile = entries.filter(function (entry) {
return entry.entryName === 'lorem_ipsum.txt';
});
assert(testFile.length === 1, 'Good CRC: lorem_ipsum.txt file exists as archive entry');

var testFileEntryName = testFile[0].entryName;
const testFileEntryName = testFile[0].entryName;
goodZip.readAsTextAsync(testFileEntryName, function (data, err) {
assert(!err, 'Good CRC: error object not present');
assert(data && data.length, 'Good CRC: buffer not empty');
done();
});
}
});

// Bad CRC
function testBadCrc() {
var badZip = new Zip(path.join(__dirname, 'bad_crc.zip'));
var entries = badZip.getEntries();
it('Bad CRC', (done) => {
const badZip = new Zip(path.join(__dirname, 'bad_crc.zip'));
const entries = badZip.getEntries();
assert(entries.length === 1, 'Bad CRC: Test archive contains exactly 1 file');

var testFile = entries.filter(function (entry) {
const testFile = entries.filter(function (entry) {
return entry.entryName === 'lorem_ipsum.txt';
});
assert(testFile.length === 1, 'Bad CRC: lorem_ipsum.txt file exists as archive entry');

var testFileEntryName = testFile[0].entryName;
const testFileEntryName = testFile[0].entryName;
badZip.readAsTextAsync(testFileEntryName, function (data, err) {
assert(data && data.length, 'Bad CRC: buffer not empty');
assert(err, 'Bad CRC: error object present');
done();
});
}
})();
});

it('CRC is not changed after re-created', () => {
const goodZip = new Zip(path.join(__dirname, 'good_crc.zip'));
const original = goodZip.getEntries()[0].header.crc;
assert.equal(original, 3528145192);
const newZipPath = destination + '/good_crc_new.zip';
goodZip.writeZip(newZipPath);
const newZip = new Zip(newZipPath);
const actual = newZip.getEntries()[0].header.crc;
assert.equal(actual, original);
});
});

0 comments on commit ff17ae8

Please sign in to comment.