class: FileStream
changed: #newTemporaryIn:nameTemplate:
Fix (do not loop forever) tempfile creation if
directory is not writable.
--- a/FileStream.st Mon Jul 29 10:09:49 2013 +0200
+++ b/FileStream.st Mon Jul 29 10:11:37 2013 +0200
@@ -445,48 +445,48 @@
|nameString random prevRandom prevNameString newTempFilename stream|
[
- prevRandom := random.
- prevNameString := nameString.
+ prevRandom := random.
+ prevNameString := nameString.
- "Use random numbers in order to improve the security
- by making the generated names less predictable"
- [
- random := RandomGenerator new nextInteger.
- ] doWhile:[random = prevRandom].
+ "Use random numbers in order to improve the security
+ by making the generated names less predictable"
+ [
+ random := RandomGenerator new nextInteger.
+ ] doWhile:[random = prevRandom].
- nameString := template bindWith:(OperatingSystem getProcessId) with:random.
+ nameString := template bindWith:(OperatingSystem getProcessId) with:random.
- aDirectoryOrNil isNil ifTrue:[
- newTempFilename := nameString.
- ] ifFalse:[
- newTempFilename := aDirectoryOrNil asFilename constructString:nameString.
- ].
+ aDirectoryOrNil isNil ifTrue:[
+ newTempFilename := nameString.
+ ] ifFalse:[
+ newTempFilename := aDirectoryOrNil asFilename constructString:nameString.
+ ].
- [
- stream := self open:newTempFilename withMode:#(CREATE_NEW GENERIC_READ_WRITE).
- ] on:OpenError do:[:ex|
- (OperatingSystem errorHolderForNumber:ex errorCode) errorCategory ~~ #existingReferentSignal ifFalse:[
- "some fundamental error, raise exception"
- ex reject.
- ].
- prevNameString = nameString ifTrue:[
- "no more names - probably a bad template"
- ex reject.
- ].
- "file exists, retry another one"
- ].
+ [
+ stream := self open:newTempFilename withMode:#(CREATE_NEW GENERIC_READ_WRITE).
+ ] on:OpenError do:[:ex|
+ ex errorCategory ~~ #existingReferentSignal ifTrue:[
+ "some fundamental error, raise exception"
+ ex reject.
+ ].
+ prevNameString = nameString ifTrue:[
+ "no more names - probably a bad template"
+ ex reject.
+ ].
+ "file exists, retry another one"
+ ].
] doWhile:[
- stream isNil and:[prevNameString ~= nameString] "/ if namestring didn't change, the template is bad
+ stream isNil and:[prevNameString ~= nameString] "/ if namestring didn't change, the template is bad
].
^ stream
"temp files in '/tmp':
- FileStream newTemporaryIn:'/tmp' asFilename nameTemplate:'foo%1_%2'
+ FileStream newTemporaryIn:'/tmp' asFilename nameTemplate:'foo%1_%2'
This must fail on the second try:
- FileStream newTemporaryIn:'/tmp' asFilename nameTemplate:'foo'
- FileStream newTemporaryIn:'c:\temp' asFilename nameTemplate:'foo'
+ FileStream newTemporaryIn:'/tmp' asFilename nameTemplate:'foo'
+ FileStream newTemporaryIn:'c:\temp' asFilename nameTemplate:'foo'
"
"temp files somewhere
@@ -1998,11 +1998,11 @@
!FileStream class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libbasic/FileStream.st,v 1.167 2013-07-24 19:56:49 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libbasic/FileStream.st,v 1.168 2013-07-29 08:11:37 stefan Exp $'
!
version_CVS
- ^ '$Header: /cvs/stx/stx/libbasic/FileStream.st,v 1.167 2013-07-24 19:56:49 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libbasic/FileStream.st,v 1.168 2013-07-29 08:11:37 stefan Exp $'
! !