Browse Source

Allow reading empty file from asar archive

deepak1556 10 years ago
parent
commit
fdc10e4e5f
3 changed files with 40 additions and 15 deletions
  1. 27 15
      atom/common/lib/asar.coffee
  2. 13 0
      spec/asar-spec.coffee
  3. BIN
      spec/fixtures/asar/empty.asar

+ 27 - 15
atom/common/lib/asar.coffee

@@ -3,6 +3,8 @@ child_process = require 'child_process'
 path = require 'path'
 util = require 'util'
 
+kEmptyBufferLength = 0
+
 # Cache asar archive objects.
 cachedArchives = {}
 getOrCreateArchive = (p) ->
@@ -228,12 +230,17 @@ exports.wrapFsWithAsar = (fs) ->
     flag = options.flag || 'r'
     encoding = options.encoding
 
-    buffer = new Buffer(info.size)
-    open archive.path, flag, (error, fd) ->
-      return callback error if error
-      fs.read fd, buffer, 0, info.size, info.offset, (error) ->
-        fs.close fd, ->
-          callback error, if encoding then buffer.toString encoding else buffer
+    bufferLength = info.size || kEmptyBufferLength
+    buffer = new Buffer(bufferLength)
+
+    if info.size
+      open archive.path, flag, (error, fd) ->
+        return callback error if error
+        fs.read fd, buffer, 0, info.size, info.offset, (error, bytesRead, buf) ->
+          fs.close fd, ->
+            callback error, if encoding then buf.toString encoding, 0 ,bytesRead else buf
+    else
+      callback null, buffer
 
   openSync = fs.openSync
   readFileSync = fs.readFileSync
@@ -257,15 +264,20 @@ exports.wrapFsWithAsar = (fs) ->
     flag = options.flag || 'r'
     encoding = options.encoding
 
-    buffer = new Buffer(info.size)
-    fd = openSync archive.path, flag
-    try
-      fs.readSync fd, buffer, 0, info.size, info.offset
-    catch e
-      throw e
-    finally
-      fs.closeSync fd
-    if encoding then buffer.toString encoding else buffer
+    bufferLength = info.size || kEmptyBufferLength
+    buffer = new Buffer(bufferLength)
+
+    if info.size
+      fd = openSync archive.path, flag
+      try
+        bytesRead = fs.readSync fd, buffer, 0, info.size, info.offset
+      catch e
+        throw e
+      finally
+        fs.closeSync fd
+      if encoding then buffer.toString encoding, 0, bytesRead else buffer
+    else
+      buffer
 
   readdir = fs.readdir
   fs.readdir = (p, callback) ->

+ 13 - 0
spec/asar-spec.coffee

@@ -15,6 +15,12 @@ describe 'asar package', ->
         file3 = path.join fixtures, 'asar', 'a.asar', 'file3'
         assert.equal fs.readFileSync(file3).toString(), 'file3\n'
 
+      it 'reads from a empty file', ->
+        file = path.join fixtures, 'asar', 'empty.asar', 'file1'
+        buffer = fs.readFileSync(file)
+        assert.equal buffer.length, 0
+        assert.equal buffer.toString(), ''
+
       it 'reads a linked file', ->
         p = path.join fixtures, 'asar', 'a.asar', 'link1'
         assert.equal fs.readFileSync(p).toString(), 'file1\n'
@@ -38,6 +44,13 @@ describe 'asar package', ->
           assert.equal String(content), 'file1\n'
           done()
 
+      it 'reads from a empty file', (done) ->
+        p = path.join fixtures, 'asar', 'empty.asar', 'file1'
+        fs.readFile p, (err, content) ->
+          assert.equal err, null
+          assert.equal String(content), ''
+          done()
+
       it 'reads a linked file', (done) ->
         p = path.join fixtures, 'asar', 'a.asar', 'link1'
         fs.readFile p, (err, content) ->

BIN
spec/fixtures/asar/empty.asar