mirror of
https://github.com/nextcloud/desktop.git
synced 2024-11-27 17:37:36 +03:00
Numoerous safe conversions implemented. Added additional Utility::convertSizeToDWORD for windows builds.
Signed-off-by: Dominique Fuchs <32204802+DominiqueFuchs@users.noreply.github.com>
This commit is contained in:
parent
82fa10c227
commit
d6af025a46
9 changed files with 43 additions and 17 deletions
|
@ -396,7 +396,7 @@ void Utility::crash()
|
|||
*a = 1;
|
||||
}
|
||||
|
||||
// Use this function to retrieve uint (often required by Qt and WIN32) from size_t
|
||||
// Use this functions to retrieve uint/int (often required by Qt and WIN32) from size_t
|
||||
// without compiler warnings about possible truncation
|
||||
uint Utility::convertSizeToUint(size_t &convertVar)
|
||||
{
|
||||
|
@ -407,6 +407,15 @@ uint Utility::convertSizeToUint(size_t &convertVar)
|
|||
return static_cast<uint>(convertVar);
|
||||
}
|
||||
|
||||
uint Utility::convertSizeToInt(size_t &convertVar)
|
||||
{
|
||||
if( convertVar > INT_MAX ) {
|
||||
//throw std::bad_cast();
|
||||
convertVar = INT_MAX; // intentionally default to wrong value here to not crash: exception handling TBD
|
||||
}
|
||||
return static_cast<int>(convertVar);
|
||||
}
|
||||
|
||||
// read the output of the owncloud --version command from the owncloud
|
||||
// version that is on disk. This works for most versions of the client,
|
||||
// because clients that do not yet know the --version flag return the
|
||||
|
|
|
@ -56,6 +56,8 @@ namespace Utility {
|
|||
OCSYNC_EXPORT bool hasLaunchOnStartup(const QString &appName);
|
||||
OCSYNC_EXPORT void setLaunchOnStartup(const QString &appName, const QString &guiName, bool launch);
|
||||
OCSYNC_EXPORT uint convertSizeToUint(size_t &convertVar);
|
||||
OCSYNC_EXPORT uint convertSizeToInt(size_t &convertVar);
|
||||
OCSYNC_EXPORT DWORD convertSizeToDWORD(size_t &convertVar);
|
||||
|
||||
/**
|
||||
* Return the amount of free space available.
|
||||
|
|
|
@ -283,4 +283,13 @@ bool Utility::registryWalkSubKeys(HKEY hRootKey, const QString &subKey, const st
|
|||
return retCode != ERROR_NO_MORE_ITEMS;
|
||||
}
|
||||
|
||||
DWORD Utility::convertSizeToDWORD(size_t &convertVar)
|
||||
{
|
||||
if( convertVar > UINT_MAX ) {
|
||||
//throw std::bad_cast();
|
||||
convertVar = UINT_MAX; // intentionally default to wrong value here to not crash: exception handling TBD
|
||||
}
|
||||
return static_cast<DWORD>(convertVar);
|
||||
}
|
||||
|
||||
} // namespace OCC
|
||||
|
|
|
@ -724,7 +724,8 @@ int csync_ftw(CSYNC *ctx, const char *uri, csync_walker_fn fn,
|
|||
if (ctx->current == LOCAL_REPLICA) {
|
||||
ASSERT(dirent->path.startsWith(ctx->local.uri)); // path is relative to uri
|
||||
// "len + 1" to include the slash in-between.
|
||||
dirent->path = dirent->path.mid(strlen(ctx->local.uri) + 1);
|
||||
size_t uriLength = strlen(ctx->local.uri);
|
||||
dirent->path = dirent->path.mid(OCC::Utility::convertSizeToInt(uriLength) + 1);
|
||||
}
|
||||
|
||||
previous_fs = ctx->current_fs;
|
||||
|
|
|
@ -38,6 +38,7 @@
|
|||
#include "c_alloc.h"
|
||||
#include "c_string.h"
|
||||
#include "common/filesystembase.h"
|
||||
#include "common/utility.h"
|
||||
|
||||
/* Convert a locale String to UTF8 */
|
||||
QByteArray c_utf8_from_locale(const mbchar_t *wstr)
|
||||
|
@ -52,10 +53,10 @@ QByteArray c_utf8_from_locale(const mbchar_t *wstr)
|
|||
size_t len;
|
||||
len = wcslen(wstr);
|
||||
/* Call once to get the required size. */
|
||||
size_needed = WideCharToMultiByte(CP_UTF8, 0, wstr, len, NULL, 0, NULL, NULL);
|
||||
size_needed = WideCharToMultiByte(CP_UTF8, 0, wstr, OCC::Utility::convertSizeToInt(len), NULL, 0, NULL, NULL);
|
||||
if (size_needed > 0) {
|
||||
dst.resize(size_needed);
|
||||
WideCharToMultiByte(CP_UTF8, 0, wstr, len, dst.data(), size_needed, NULL, NULL);
|
||||
WideCharToMultiByte(CP_UTF8, 0, wstr, OCC::Utility::convertSizeToInt(len), dst.data(), size_needed, NULL, NULL);
|
||||
}
|
||||
return dst;
|
||||
#else
|
||||
|
@ -95,7 +96,7 @@ mbchar_t* c_utf8_string_to_locale(const char *str)
|
|||
int size_needed;
|
||||
|
||||
len = strlen(str);
|
||||
size_needed = MultiByteToWideChar(CP_UTF8, 0, str, len, NULL, 0);
|
||||
size_needed = MultiByteToWideChar(CP_UTF8, 0, str, OCC::Utility::convertSizeToInt(len), NULL, 0);
|
||||
if (size_needed > 0) {
|
||||
int size_char = (size_needed + 1) * sizeof(mbchar_t);
|
||||
dst = (mbchar_t*)c_malloc(size_char);
|
||||
|
@ -114,7 +115,8 @@ mbchar_t* c_utf8_string_to_locale(const char *str)
|
|||
return NULL;
|
||||
} else {
|
||||
#ifdef _WIN32
|
||||
QByteArray unc_str = OCC::FileSystem::pathtoUNC(QByteArray::fromRawData(str, strlen(str)));
|
||||
size_t strLength = strlen(str);
|
||||
QByteArray unc_str = OCC::FileSystem::pathtoUNC(QByteArray::fromRawData(str, OCC::Utility::convertSizeToInt(strLength)));
|
||||
mbchar_t *dst = c_utf8_string_to_locale(unc_str);
|
||||
return dst;
|
||||
#else
|
||||
|
|
|
@ -57,7 +57,7 @@ csync_vio_handle_t *csync_vio_local_opendir(const char *name) {
|
|||
handle = (dhandle_t*)c_malloc(sizeof(dhandle_t));
|
||||
|
||||
// the file wildcard has to be attached
|
||||
int len_name = strlen(name);
|
||||
size_t len_name = strlen(name);
|
||||
if( len_name ) {
|
||||
char *h = NULL;
|
||||
|
||||
|
|
|
@ -19,6 +19,8 @@
|
|||
#include "folderwatcher.h"
|
||||
#include "folderwatcher_win.h"
|
||||
|
||||
#include "common/utility.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <tchar.h>
|
||||
|
@ -52,7 +54,7 @@ void WatcherThread::watchChanges(size_t fileNotifyBufferSize,
|
|||
|
||||
// QVarLengthArray ensures the stack-buffer is aligned like double and qint64.
|
||||
QVarLengthArray<char, 4096 * 10> fileNotifyBuffer;
|
||||
fileNotifyBuffer.resize(fileNotifyBufferSize);
|
||||
fileNotifyBuffer.resize(OCC::Utility::convertSizeToInt(fileNotifyBufferSize));
|
||||
|
||||
const size_t fileNameBufferSize = 4096;
|
||||
TCHAR fileNameBuffer[fileNameBufferSize];
|
||||
|
@ -66,7 +68,7 @@ void WatcherThread::watchChanges(size_t fileNotifyBufferSize,
|
|||
DWORD dwBytesReturned = 0;
|
||||
SecureZeroMemory(pFileNotifyBuffer, fileNotifyBufferSize);
|
||||
if (!ReadDirectoryChangesW(_directory, (LPVOID)pFileNotifyBuffer,
|
||||
fileNotifyBufferSize, true,
|
||||
OCC::Utility::convertSizeToDWORD(fileNotifyBufferSize), true,
|
||||
FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME | FILE_NOTIFY_CHANGE_LAST_WRITE,
|
||||
&dwBytesReturned,
|
||||
&overlapped,
|
||||
|
@ -113,7 +115,7 @@ void WatcherThread::watchChanges(size_t fileNotifyBufferSize,
|
|||
FILE_NOTIFY_INFORMATION *curEntry = pFileNotifyBuffer;
|
||||
forever {
|
||||
size_t len = curEntry->FileNameLength / 2;
|
||||
QString file = _path + "\\" + QString::fromWCharArray(curEntry->FileName, len);
|
||||
QString file = _path + "\\" + QString::fromWCharArray(curEntry->FileName, OCC::Utility::convertSizeToInt(len));
|
||||
|
||||
// Unless the file was removed or renamed, get its full long name
|
||||
// TODO: We could still try expanding the path in the tricky cases...
|
||||
|
@ -122,7 +124,7 @@ void WatcherThread::watchChanges(size_t fileNotifyBufferSize,
|
|||
&& curEntry->Action != FILE_ACTION_RENAMED_OLD_NAME) {
|
||||
size_t longNameSize = GetLongPathNameW(reinterpret_cast<LPCWSTR>(file.utf16()), fileNameBuffer, fileNameBufferSize);
|
||||
if (longNameSize > 0) {
|
||||
longfile = QString::fromUtf16(reinterpret_cast<const ushort *>(fileNameBuffer), longNameSize);
|
||||
longfile = QString::fromUtf16(reinterpret_cast<const ushort *>(fileNameBuffer), OCC::Utility::convertSizeToInt(longNameSize));
|
||||
} else {
|
||||
qCWarning(lcFolderWatcher) << "Error converting file name to full length, keeping original name.";
|
||||
}
|
||||
|
|
|
@ -48,7 +48,7 @@ const char TOOLBAR_CSS[] =
|
|||
"QToolBar QToolBarExtension { padding:0; } "
|
||||
"QToolBar QToolButton:checked { background: %3; color: %4; }";
|
||||
|
||||
static const float buttonSizeRatio = 1.618; // golden ratio
|
||||
static const float buttonSizeRatio = 1.618f; // golden ratio
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
#include <QUuid>
|
||||
|
||||
#include <keychain.h>
|
||||
#include "common/utility.h"
|
||||
|
||||
#include "wordlist.h"
|
||||
|
||||
|
@ -62,11 +63,11 @@ namespace {
|
|||
|
||||
namespace {
|
||||
QByteArray BIO2ByteArray(BIO *b) {
|
||||
int pending = BIO_ctrl_pending(b);
|
||||
size_t pending = BIO_ctrl_pending(b);
|
||||
char *tmp = (char *)calloc(pending+1, sizeof(char));
|
||||
BIO_read(b, tmp, pending);
|
||||
BIO_read(b, tmp, OCC::Utility::convertSizeToInt(pending));
|
||||
|
||||
QByteArray res(tmp, pending);
|
||||
QByteArray res(tmp, OCC::Utility::convertSizeToInt(pending));
|
||||
free(tmp);
|
||||
|
||||
return res;
|
||||
|
@ -549,7 +550,7 @@ QByteArray decryptStringAsymmetric(EVP_PKEY *privateKey, const QByteArray& data)
|
|||
}
|
||||
|
||||
const auto ret = std::string((char*) out, outlen);
|
||||
QByteArray raw((const char*) out, outlen);
|
||||
QByteArray raw((const char*) out, OCC::Utility::convertSizeToInt(outlen));
|
||||
qCInfo(lcCse()) << raw;
|
||||
return raw;
|
||||
}
|
||||
|
@ -603,7 +604,7 @@ QByteArray encryptStringAsymmetric(EVP_PKEY *publicKey, const QByteArray& data)
|
|||
}
|
||||
|
||||
// Transform the encrypted data into base64.
|
||||
QByteArray raw((const char*) out, outLen);
|
||||
QByteArray raw((const char*) out, OCC::Utility::convertSizeToInt(outLen));
|
||||
qCInfo(lcCse()) << raw.toBase64();
|
||||
return raw.toBase64();
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue