From d05175a17f175cc6cec2217662259a9835a4d21e Mon Sep 17 00:00:00 2001 From: michael Date: Sun, 4 Dec 2016 12:41:57 +0000 Subject: [PATCH] * FileOpen should not open directories (Windows compatible) Bug ID #30766 git-svn-id: trunk@35063 - --- rtl/unix/sysutils.pp | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/rtl/unix/sysutils.pp b/rtl/unix/sysutils.pp index 0242a8e0d5..7494f7c0de 100644 --- a/rtl/unix/sysutils.pp +++ b/rtl/unix/sysutils.pp @@ -443,9 +443,15 @@ end; Function FileOpenNoLocking (Const FileName : RawbyteString; Mode : Integer) : Longint; + Function IsHandleDirectory(Handle : Longint) : boolean; + Var Info : Stat; + begin + Result := (fpFStat(Handle, Info)<0) or fpS_ISDIR(info.st_mode); + end; + Var SystemFileName: RawByteString; - LinuxFlags : longint; + fd,LinuxFlags : longint; begin LinuxFlags:=0; case (Mode and (fmOpenRead or fmOpenWrite or fmOpenReadWrite)) of @@ -456,8 +462,18 @@ begin SystemFileName:=ToSingleByteFileSystemEncodedFileName(FileName); repeat - FileOpenNoLocking:=fpOpen (pointer(SystemFileName),LinuxFlags); - until (FileOpenNoLocking<>-1) or (fpgeterrno<>ESysEINTR); + fd:=fpOpen (pointer(SystemFileName),LinuxFlags); + until (fd<>-1) or (fpgeterrno<>ESysEINTR); + + { Do not allow to open directories with FileOpen. + This would cause weird behavior of TFileStream.Size, + TMemoryStream.LoadFromFile etc. } + if (fd<>-1) and IsHandleDirectory(fd) then + begin + fpClose(fd); + fd:=feInvalidHandle; + end; + FileOpenNoLocking:=fd; end;