[Libreoffice-commits] core.git: comphelper/source sal/osl ucb/source

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Wed Jan 23 20:06:58 UTC 2019


 comphelper/source/misc/stillreadwriteinteraction.cxx |    4 ++++
 sal/osl/unx/file_error_transl.cxx                    |    4 ++++
 ucb/source/ucp/file/filglob.cxx                      |    4 +++-
 3 files changed, 11 insertions(+), 1 deletion(-)

New commits:
commit bcb1969f961874ccbcef7fc042b3cc164c8d2325
Author:     Stephan Bergmann <sbergman at redhat.com>
AuthorDate: Wed Jan 23 17:40:29 2019 +0100
Commit:     Stephan Bergmann <sbergman at redhat.com>
CommitDate: Wed Jan 23 21:06:31 2019 +0100

    rhbz#1667364 Open doc as R/O for which open(...,O_RDWR) returns EOPNOTSUPP
    
    Map that EOPNOTSUPP to osl_File_E_NOSYS (and intercept it in
    StillReadWriteInteraction, as used by MediaDescriptor::impl_openStreamWithURL in
    unotools/source/misc/mediadescriptor.cxx, which will retry opening it read-only
    then), instead of to osl_File_E_invalidError (which lead to the "General
    input/output error" box).
    
    Instead of "silently" opening the doc as read-only, this still pops up a box
    claiming that the doc is locked by somebody else, asking whether to open it
    read-only or to open a copy.  That's probably because of the
    
      rDescriptor.erase( utl::MediaDescriptor::PROP_READONLY() );
    
    in TypeDetection::impl_openStream (filter/source/config/cache/typedetection.cxx)
    where the comment already hints at the confusion among the different read-only
    and locking concepts.  Changing that looks like it would easily cause
    regressions, so is left for a follow-up commit.  (And ultimately LO wouldn't
    need to treat the doc as read-only at all; it would just need to not attempt to
    open it O_RDWR upfront, and save it via copy+rename, like other apps appear to
    commonly do.)
    
    Change-Id: I56e18f1864084ba222acaf0e38a604082edaf4c6
    Reviewed-on: https://gerrit.libreoffice.org/66805
    Tested-by: Jenkins
    Reviewed-by: Stephan Bergmann <sbergman at redhat.com>

diff --git a/comphelper/source/misc/stillreadwriteinteraction.cxx b/comphelper/source/misc/stillreadwriteinteraction.cxx
index bf0ecc3fa3e2..0efec31b160b 100644
--- a/comphelper/source/misc/stillreadwriteinteraction.cxx
+++ b/comphelper/source/misc/stillreadwriteinteraction.cxx
@@ -96,6 +96,10 @@ ucbhelper::InterceptedInteraction::EInterceptionState StillReadWriteInteraction:
                 (exIO.Code == css::ucb::IOErrorCode_ACCESS_DENIED     )
                 || (exIO.Code == css::ucb::IOErrorCode_LOCKING_VIOLATION )
                 || (exIO.Code == css::ucb::IOErrorCode_NOT_EXISTING )
+                // At least on Linux, a request to open some fuse-mounted file O_RDWR may fail with
+                // EOPNOTSUPP (mapped to osl_File_E_NOSYS to IOErrorCode_NOT_SUPPORTED) when opening
+                // it O_RDONLY would succeed:
+                || (exIO.Code == css::ucb::IOErrorCode_NOT_SUPPORTED )
 #ifdef MACOSX
                 // this is a workaround for MAC, on this platform if the file is locked
                 // the returned error code looks to be wrong
diff --git a/sal/osl/unx/file_error_transl.cxx b/sal/osl/unx/file_error_transl.cxx
index f8910289456b..60824f71ed34 100644
--- a/sal/osl/unx/file_error_transl.cxx
+++ b/sal/osl/unx/file_error_transl.cxx
@@ -134,6 +134,10 @@ oslFileError oslTranslateFileError(int Errno)
             return osl_File_E_NOLCK;
 
         case ENOSYS:
+        case ENOTSUP:
+#if EOPNOTSUPP != ENOTSUP
+        case EOPNOTSUPP:
+#endif
            return osl_File_E_NOSYS;
 
 #if !defined(AIX) || !(defined(_ALL_SOURCE) && !defined(_LINUX_SOURCE_COMPAT))
diff --git a/ucb/source/ucp/file/filglob.cxx b/ucb/source/ucp/file/filglob.cxx
index c7d3e60fe515..e19be3458919 100644
--- a/ucb/source/ucp/file/filglob.cxx
+++ b/ucb/source/ucp/file/filglob.cxx
@@ -344,7 +344,9 @@ namespace fileaccess {
                 case FileBase::E_NOLCK:  // No record locks available
                     ioErrorCode = IOErrorCode_LOCKING_VIOLATION;
                     break;
-
+                case FileBase::E_NOSYS:
+                    ioErrorCode = IOErrorCode_NOT_SUPPORTED;
+                    break;
                 case FileBase::E_FAULT: // Bad address
                 case FileBase::E_LOOP:  // Too many symbolic links encountered
                 case FileBase::E_NOSPC: // No space left on device


More information about the Libreoffice-commits mailing list