Merge pull request #5086 from atom/ks-deserialize-buffer-error

Check if files are accessible during deserialization
This commit is contained in:
Kevin Sawicki
2015-01-16 09:47:01 -08:00
3 changed files with 37 additions and 5 deletions

View File

@@ -46,7 +46,7 @@
"nslog": "^1.0.1",
"oniguruma": "^3.0.6",
"optimist": "0.4.0",
"pathwatcher": "^2.6.0",
"pathwatcher": "^2.6.1",
"property-accessors": "^1",
"q": "^1.0.1",
"random-words": "0.0.1",

View File

@@ -37,6 +37,32 @@ describe "Project", ->
deserializedProject.getBuffers()[0].destroy()
expect(deserializedProject.getBuffers().length).toBe 0
it "does not deserialize buffers when their path is a directory that exists", ->
pathToOpen = path.join(temp.mkdirSync(), 'file.txt')
waitsForPromise ->
atom.project.open(pathToOpen)
runs ->
expect(atom.project.getBuffers().length).toBe 1
fs.mkdirSync(pathToOpen)
deserializedProject = atom.project.testSerialization()
expect(deserializedProject.getBuffers().length).toBe 0
it "does not deserialize buffers when their path is inaccessible", ->
pathToOpen = path.join(temp.mkdirSync(), 'file.txt')
fs.writeFileSync(pathToOpen, '')
waitsForPromise ->
atom.project.open(pathToOpen)
runs ->
expect(atom.project.getBuffers().length).toBe 1
fs.chmodSync(pathToOpen, '000')
deserializedProject = atom.project.testSerialization()
expect(deserializedProject.getBuffers().length).toBe 0
describe "when an editor is saved and the project has no path", ->
it "sets the project's path to the saved file's parent directory", ->
tempFile = temp.openSync().path

View File

@@ -66,9 +66,16 @@ class Project extends Model
buffers: _.compact(@buffers.map (buffer) -> buffer.serialize() if buffer.isRetained())
deserializeParams: (params) ->
params.buffers = params.buffers.map (bufferState) -> atom.deserializers.deserialize(bufferState)
params
params.buffers = _.compact params.buffers.map (bufferState) ->
# Check that buffer's file path is accessible
if bufferState.filePath
try
fs.closeSync(fs.openSync(bufferState.filePath, 'r+'))
catch error
return unless error.code is 'ENOENT'
atom.deserializers.deserialize(bufferState)
params
###
Section: Event Subscription
@@ -219,8 +226,7 @@ class Project extends Model
if filePath?
try
fileDescriptor = fs.openSync(filePath, 'r+')
fs.closeSync(fileDescriptor)
fs.closeSync(fs.openSync(filePath, 'r+'))
catch error
# allow ENOENT errors to create an editor for paths that dont exist
throw error unless error.code is 'ENOENT'