Merge pull request #12412 from akallabeth/more-return-checks

More return checks
This commit is contained in:
akallabeth
2026-03-03 12:17:41 +01:00
committed by GitHub
3 changed files with 57 additions and 29 deletions

View File

@@ -444,9 +444,11 @@ static BOOL invalidate_inode(void* data, WINPR_ATTR_UNUSED size_t index, va_list
return res;
}
static void clear_selection(CliprdrFileContext* file_context, BOOL all_selections,
WINPR_ATTR_NODISCARD
static bool clear_selection(CliprdrFileContext* file_context, BOOL all_selections,
CliprdrFuseClipDataEntry* clip_data_entry)
{
bool res = true;
FuseFileClearContext clear_context = WINPR_C_ARRAY_INIT;
CliprdrFuseFile* clip_data_dir = nullptr;
@@ -483,8 +485,10 @@ static void clear_selection(CliprdrFileContext* file_context, BOOL all_selection
WLog_Print(file_context->log, WLOG_DEBUG, "Clearing selection%s",
all_selections ? "s" : "");
HashTable_Foreach(file_context->request_table, maybe_clear_fuse_request, &clear_context);
HashTable_Foreach(file_context->inode_table, maybe_steal_inode, &clear_context);
if (!HashTable_Foreach(file_context->request_table, maybe_clear_fuse_request, &clear_context))
res = false;
if (!HashTable_Foreach(file_context->inode_table, maybe_steal_inode, &clear_context))
res = false;
HashTable_Unlock(file_context->inode_table);
if (file_context->fuse_sess)
@@ -497,7 +501,8 @@ static void clear_selection(CliprdrFileContext* file_context, BOOL all_selection
* So, to avoid a deadlock here, unlock the mutex and reply all incoming
* operations with -ENOENT until the invalidation process is complete.
*/
ArrayList_ForEach(clear_context.fuse_files, invalidate_inode, file_context);
if (!ArrayList_ForEach(clear_context.fuse_files, invalidate_inode, file_context))
res = false;
CliprdrFuseFile* root_dir = get_fuse_file_by_ino(file_context, FUSE_ROOT_ID);
if (clip_data_dir && root_dir)
{
@@ -513,40 +518,44 @@ static void clear_selection(CliprdrFileContext* file_context, BOOL all_selection
clip_data_entry->clip_data_id);
else
WLog_Print(file_context->log, WLOG_DEBUG, "Selection%s cleared", all_selections ? "s" : "");
return res;
}
static void clear_entry_selection(CliprdrFuseClipDataEntry* clip_data_entry)
WINPR_ATTR_NODISCARD
static bool clear_entry_selection(CliprdrFuseClipDataEntry* clip_data_entry)
{
WINPR_ASSERT(clip_data_entry);
if (!clip_data_entry->clip_data_dir)
return;
return true;
clear_selection(clip_data_entry->file_context, FALSE, clip_data_entry);
return clear_selection(clip_data_entry->file_context, FALSE, clip_data_entry);
}
static void clear_no_cdi_entry(CliprdrFileContext* file_context)
WINPR_ATTR_NODISCARD
static bool clear_no_cdi_entry(CliprdrFileContext* file_context)
{
BOOL res = true;
WINPR_ASSERT(file_context);
WINPR_ASSERT(file_context->inode_table);
HashTable_Lock(file_context->inode_table);
if (file_context->clip_data_entry_without_id)
{
clear_entry_selection(file_context->clip_data_entry_without_id);
res = clear_entry_selection(file_context->clip_data_entry_without_id);
clip_data_entry_free(file_context->clip_data_entry_without_id);
file_context->clip_data_entry_without_id = nullptr;
}
HashTable_Unlock(file_context->inode_table);
return res;
}
WINPR_ATTR_NODISCARD
static BOOL clear_clip_data_entries(WINPR_ATTR_UNUSED const void* key, void* value,
WINPR_ATTR_UNUSED void* arg)
{
clear_entry_selection(value);
return TRUE;
return clear_entry_selection(value);
}
WINPR_ATTR_NODISCARD
@@ -619,7 +628,8 @@ UINT cliprdr_file_context_notify_new_server_format_list(CliprdrFileContext* file
WINPR_ASSERT(file_context->context);
#if defined(WITH_FUSE)
clear_no_cdi_entry(file_context);
if (!clear_no_cdi_entry(file_context))
return ERROR_INTERNAL_ERROR;
/* TODO: assign timeouts to old locks instead */
rc = clear_cdi_entries(file_context);
@@ -637,7 +647,8 @@ UINT cliprdr_file_context_notify_new_client_format_list(CliprdrFileContext* file
WINPR_ASSERT(file_context->context);
#if defined(WITH_FUSE)
clear_no_cdi_entry(file_context);
if (!clear_no_cdi_entry(file_context))
return ERROR_INTERNAL_ERROR;
/* TODO: assign timeouts to old locks instead */
return clear_cdi_entries(file_context);
#endif
@@ -1396,7 +1407,7 @@ static CliprdrLocalFile* file_info_for_request(CliprdrFileContext* file, UINT32
{
writelog(file->log, WLOG_WARN, __FILE__, __func__, __LINE__,
"missing entry for lockID %" PRIu32 ", index %" PRIu32, lockId, listIndex);
HashTable_Foreach(file->local_streams, dump_streams, file);
(void)HashTable_Foreach(file->local_streams, dump_streams, file);
}
return nullptr;
@@ -1651,16 +1662,18 @@ BOOL cliprdr_file_context_init(CliprdrFileContext* file, CliprdrClientContext* c
}
#if defined(WITH_FUSE)
static void clear_all_selections(CliprdrFileContext* file_context)
WINPR_ATTR_NODISCARD
static bool clear_all_selections(CliprdrFileContext* file_context)
{
WINPR_ASSERT(file_context);
WINPR_ASSERT(file_context->inode_table);
HashTable_Lock(file_context->inode_table);
clear_selection(file_context, TRUE, nullptr);
const bool rc = clear_selection(file_context, TRUE, nullptr);
HashTable_Clear(file_context->clip_data_table);
HashTable_Unlock(file_context->inode_table);
return rc;
}
#endif
@@ -1674,8 +1687,10 @@ BOOL cliprdr_file_context_uninit(CliprdrFileContext* file, CliprdrClientContext*
#if defined(WITH_FUSE)
if (file->inode_table)
{
clear_no_cdi_entry(file);
clear_all_selections(file);
if (!clear_no_cdi_entry(file))
return FALSE;
if (!clear_all_selections(file))
return FALSE;
}
#endif
@@ -1930,8 +1945,7 @@ end:
if (!crc)
{
fuse_file_free(fuse_file);
clear_entry_selection(clip_data_entry);
return FALSE;
return clear_entry_selection(clip_data_entry);
}
return TRUE;
}
@@ -2025,7 +2039,8 @@ BOOL cliprdr_file_context_update_server_data(CliprdrFileContext* file_context, w
WINPR_ASSERT(clip_data_entry);
clear_entry_selection(clip_data_entry);
if (!clear_entry_selection(clip_data_entry))
goto fail;
WINPR_ASSERT(!clip_data_entry->clip_data_dir);
clip_data_entry->clip_data_dir =

View File

@@ -170,7 +170,7 @@ static uint64_t expire_and_reschedule(FreeRDPTimer* timer)
uint64_t now = winpr_GetTickCount64NS();
ArrayList_Lock(timer->entries);
ArrayList_ForEach(timer->entries, runExpiredTimer, &now, &mainloop);
(void)ArrayList_ForEach(timer->entries, runExpiredTimer, &now, &mainloop);
if (mainloop)
(void)SetEvent(timer->mainevent);
@@ -339,10 +339,10 @@ bool freerdp_timer_poll(FreeRDPTimer* timer)
ArrayList_Lock(timer->entries);
(void)ResetEvent(timer->mainevent);
uint64_t now = winpr_GetTickCount64NS();
ArrayList_ForEach(timer->entries, runExpiredTimerOnMainloop, &now);
bool rc = ArrayList_ForEach(timer->entries, runExpiredTimerOnMainloop, &now);
(void)SetEvent(timer->event); // Trigger a wakeup of timer thread to reschedule
ArrayList_Unlock(timer->entries);
return true;
return rc;
}
HANDLE freerdp_timer_get_event(FreeRDPTimer* timer)

View File

@@ -49,17 +49,30 @@
#if defined(WITH_SMARTCARD_EMULATE)
#include <freerdp/emulate/scard/smartcard_emulate.h>
#define wrap(ctx, fkt, ...) \
#define wrap_raw(ctx, fkt, ...) \
ctx->useEmulatedCard ? Emulate_##fkt(ctx->emulation, ##__VA_ARGS__) \
: ctx->pWinSCardApi->pfn##fkt(__VA_ARGS__)
#define wrap_ptr(ctx, fkt, ...) wrap(ctx, fkt, ##__VA_ARGS__)
#define wrap_ptr(ctx, fkt, ...) wrap_raw(ctx, fkt, ##__VA_ARGS__)
#else
#define wrap(ctx, fkt, ...) \
#define wrap_raw(ctx, fkt, ...) \
ctx->useEmulatedCard ? SCARD_F_INTERNAL_ERROR : ctx->pWinSCardApi->pfn##fkt(__VA_ARGS__)
#define wrap_ptr(ctx, fkt, ...) \
ctx->useEmulatedCard ? nullptr : ctx->pWinSCardApi->pfn##fkt(__VA_ARGS__)
#endif
#if defined(_WIN32)
#define wrap(ctx, fkt, ...) wrap_raw(ctx, fkt, ##__VA_ARGS__)
#else
#define wrap(ctx, fkt, ...) \
__extension__({ \
LONG defstatus = wrap_raw(ctx, fkt, ##__VA_ARGS__); \
if (defstatus != SCARD_S_SUCCESS) \
WLog_Print(ctx->log, WLOG_TRACE, "[" #fkt "] failed with %s", \
SCardGetErrorString(defstatus)); \
defstatus; \
})
#endif
struct s_scard_call_context
{
BOOL useEmulatedCard;
@@ -1999,7 +2012,7 @@ void smartcard_call_context_free(scard_call_context* ctx)
if (ctx->StartedEvent)
{
WINPR_ASSERT(ctx->useEmulatedCard || ctx->pWinSCardApi);
wrap(ctx, SCardReleaseStartedEvent);
wrap_raw(ctx, SCardReleaseStartedEvent);
}
if (ctx->useEmulatedCard)