summaryrefslogtreecommitdiffstats
path: root/sal/osl/unx
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-15 09:44:47 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-15 09:44:47 +0000
commit91fe6b97952aa6f7cef58327fd085a17db38ad95 (patch)
tree7a4412295bfb80e15a4936fe67d4bd7b96458ce8 /sal/osl/unx
parentReleasing progress-linux version 4:24.2.1-4~progress7.99u1. (diff)
downloadlibreoffice-91fe6b97952aa6f7cef58327fd085a17db38ad95.tar.xz
libreoffice-91fe6b97952aa6f7cef58327fd085a17db38ad95.zip
Merging upstream version 4:24.2.2.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'sal/osl/unx')
-rw-r--r--sal/osl/unx/file.cxx54
-rw-r--r--sal/osl/unx/system.cxx26
2 files changed, 61 insertions, 19 deletions
diff --git a/sal/osl/unx/file.cxx b/sal/osl/unx/file.cxx
index eeee7c803f..ee7412dd10 100644
--- a/sal/osl/unx/file.cxx
+++ b/sal/osl/unx/file.cxx
@@ -64,6 +64,14 @@
#include <vector>
#endif
+#ifdef LINUX
+#include <sys/vfs.h>
+// As documented by the kernel
+#define SMB_SUPER_MAGIC static_cast<__fsword_t>(0x517B)
+#define CIFS_SUPER_MAGIC static_cast<__fsword_t>(0xFF534D42)
+#define SMB2_SUPER_MAGIC static_cast<__fsword_t>(0xFE534D42)
+#endif
+
namespace {
enum class State
@@ -736,9 +744,11 @@ oslFileHandle osl::detail::createFileHandleFromFD(int fd)
return static_cast<oslFileHandle>(pImpl);
}
-static int osl_file_adjustLockFlags(const OString& path, int flags)
+static void osl_file_adjustLockFlags(const OString& path, int *flags, sal_uInt32 *uFlags)
{
#ifdef MACOSX
+ (void) uFlags;
+
/*
* The AFP implementation of MacOS X 10.4 treats O_EXLOCK in a way
* that makes it impossible for OOo to create a backup copy of the
@@ -751,20 +761,50 @@ static int osl_file_adjustLockFlags(const OString& path, int flags)
{
if(strncmp("afpfs", s.f_fstypename, 5) == 0)
{
- flags &= ~O_EXLOCK;
- flags |= O_SHLOCK;
+ *flags &= ~O_EXLOCK;
+ *flags |= O_SHLOCK;
}
else
{
/* Needed flags to allow opening a webdav file */
- flags &= ~(O_EXLOCK | O_SHLOCK | O_NONBLOCK);
+ *flags &= ~(O_EXLOCK | O_SHLOCK | O_NONBLOCK);
+ }
+ }
+#elif defined(LINUX)
+ (void) flags;
+
+ /* get filesystem info */
+ struct statfs aFileStatFs;
+ if (statfs(path.getStr(), &aFileStatFs) < 0)
+ {
+ int e = errno;
+ SAL_INFO("sal.file", "statfs(" << path << "): " << UnixErrnoString(e));
+ }
+ else
+ {
+ SAL_INFO("sal.file", "statfs(" << path << "): OK");
+
+ // We avoid locking if on a Linux CIFS mount otherwise this
+ // fill fail later on when opening the file for reading
+ // during backup creation at save time (even though this is a
+ // write lock and not a read lock).
+ // Fixes the following bug:
+ // https://bugs.documentfoundation.org/show_bug.cgi?id=55004
+ switch (aFileStatFs.f_type) {
+ case SMB_SUPER_MAGIC:
+ case CIFS_SUPER_MAGIC:
+ case SMB2_SUPER_MAGIC:
+ *uFlags |= osl_File_OpenFlag_NoLock;
+ break;
+ default:
+ break;
}
}
#else
(void) path;
+ (void) flags;
+ (void) uFlags;
#endif
-
- return flags;
}
static bool osl_file_queryLocking(sal_uInt32 uFlags)
@@ -981,7 +1021,7 @@ oslFileError openFilePath(const OString& filePath, oslFileHandle* pHandle,
}
else
{
- flags = osl_file_adjustLockFlags (filePath, flags);
+ osl_file_adjustLockFlags (filePath, &flags, &uFlags);
}
// O_EXCL can be set only when O_CREAT is set
diff --git a/sal/osl/unx/system.cxx b/sal/osl/unx/system.cxx
index f19bd70531..eba4fe01c6 100644
--- a/sal/osl/unx/system.cxx
+++ b/sal/osl/unx/system.cxx
@@ -48,11 +48,6 @@ int macxp_resolveAlias(char *path, int buflen)
(void) buflen;
return 0;
#else
- CFStringRef cfpath;
- CFURLRef cfurl;
- CFErrorRef cferror;
- CFDataRef cfbookmark;
-
// Don't even try anything for files inside the app bundle. Just a
// waste of time.
@@ -74,12 +69,19 @@ int macxp_resolveAlias(char *path, int buflen)
if ( unprocessedPath )
*unprocessedPath = '\0';
- cfpath = CFStringCreateWithCString( nullptr, path, kCFStringEncodingUTF8 );
- cfurl = CFURLCreateWithFileSystemPath( nullptr, cfpath, kCFURLPOSIXPathStyle, false );
- CFRelease( cfpath );
- cferror = nullptr;
- cfbookmark = CFURLCreateBookmarkDataFromFile( nullptr, cfurl, &cferror );
- CFRelease( cfurl );
+ // tdf#155710 handle conversion failures due to non-UTF8 strings
+ // Windows and Linux paths can be passed as parameters to this function
+ // and those paths may not always be UTF8 encoded like macOS paths.
+ CFStringRef cfpath = CFStringCreateWithCString( nullptr, path, kCFStringEncodingUTF8 );
+ CFErrorRef cferror = nullptr;
+ CFDataRef cfbookmark = nullptr;
+ if (cfpath)
+ {
+ CFURLRef cfurl = CFURLCreateWithFileSystemPath( nullptr, cfpath, kCFURLPOSIXPathStyle, false );
+ CFRelease( cfpath );
+ cfbookmark = CFURLCreateBookmarkDataFromFile( nullptr, cfurl, &cferror );
+ CFRelease( cfurl );
+ }
if ( cfbookmark == nullptr )
{
@@ -91,7 +93,7 @@ int macxp_resolveAlias(char *path, int buflen)
else
{
Boolean isStale;
- cfurl = CFURLCreateByResolvingBookmarkData( nullptr, cfbookmark, kCFBookmarkResolutionWithoutUIMask,
+ CFURLRef cfurl = CFURLCreateByResolvingBookmarkData( nullptr, cfbookmark, kCFBookmarkResolutionWithoutUIMask,
nullptr, nullptr, &isStale, &cferror );
CFRelease( cfbookmark );
if ( cfurl == nullptr )