1
0
Fork 0
mirror of https://github.com/DarkMatterCore/nxdumptool.git synced 2024-12-22 16:42:11 +00:00

utils: fix memchr usage in char repl / escaping

Other changes include:

* devoptab: minor codestyle changes.

* gamecard: update gamecardGetCertificate() to reflect latest libnx changes.
This commit is contained in:
Pablo Curiel 2024-12-12 11:00:23 +01:00
parent ca61151662
commit a070ad7c1d
5 changed files with 17 additions and 15 deletions

View file

@ -36,14 +36,14 @@ extern "C" {
#define DEVOPTAB_MOUNT_NAME_LENGTH 32 // Including NULL terminator. #define DEVOPTAB_MOUNT_NAME_LENGTH 32 // Including NULL terminator.
#define DEVOPTAB_INIT_ERROR_STATE r->_errno = 0 #define DEVOPTAB_INIT_ERROR_STATE r->_errno = 0
#define DEVOPTAB_SET_ERROR(x) r->_errno = (x)
#define DEVOPTAB_IS_ERROR_SET (r->_errno != 0)
#define DEVOPTAB_DECL_DEV_CTX DevoptabDeviceContext *dev_ctx = (DevoptabDeviceContext*)r->deviceData #define DEVOPTAB_DECL_DEV_CTX DevoptabDeviceContext *dev_ctx = (DevoptabDeviceContext*)r->deviceData
#define DEVOPTAB_DECL_FS_CTX(type) type *fs_ctx = (type*)dev_ctx->fs_ctx #define DEVOPTAB_DECL_FS_CTX(type) type *fs_ctx = (type*)dev_ctx->fs_ctx
#define DEVOPTAB_DECL_FILE_STATE(type) type *file = (type*)fd #define DEVOPTAB_DECL_FILE_STATE(type) type *file = (type*)fd
#define DEVOPTAB_DECL_DIR_STATE(type) type *dir = (type*)dirState->dirStruct #define DEVOPTAB_DECL_DIR_STATE(type) type *dir = (type*)dirState->dirStruct
#define DEVOPTAB_SET_ERROR(x) r->_errno = (x)
#define DEVOPTAB_IS_ERROR_SET (r->_errno != 0)
#define DEVOPTAB_EXIT goto end #define DEVOPTAB_EXIT goto end
#define DEVOPTAB_SET_ERROR_AND_EXIT(x) \ #define DEVOPTAB_SET_ERROR_AND_EXIT(x) \
do { \ do { \

View file

@ -133,9 +133,9 @@ __attribute__((format(printf, 3, 4))) bool utilsAppendFormattedStringToBuffer(ch
/// Furthermore, if multiple, consecutive illegal characters are found, they will all get replaced by a single underscore. /// Furthermore, if multiple, consecutive illegal characters are found, they will all get replaced by a single underscore.
void utilsReplaceIllegalCharacters(char *str, bool ascii_only); void utilsReplaceIllegalCharacters(char *str, bool ascii_only);
/// Returns a pointer to a dynamically allocated copy of the provided string with all required characters escaped using another specific character. /// Returns a pointer to a dynamically allocated copy of the provided UTF-8 string with all required characters escaped using another specific character.
/// 'chars_to_escape' must represent a NULL-terminated character string with all characters that need to be escaped. /// 'chars_to_escape' must represent a NULL-terminated character string with all ASCII characters that need to be escaped.
/// Furthermore, 'escape_char' must represent an ASCII character within the [0x20,0x7E] range, and it must also not be part of 'chars_to_escape'. /// Furthermore, 'escape_char' must represent an ASCII character within the [0x20,0x7E] range.
/// Returns NULL if an error occurs. /// Returns NULL if an error occurs.
char *utilsEscapeCharacters(const char *str, const char *chars_to_escape, const char escape_char); char *utilsEscapeCharacters(const char *str, const char *chars_to_escape, const char escape_char);

View file

@ -225,7 +225,7 @@ static int fatdev_stat(struct _reent *r, const char *file, struct stat *st)
FAT_DEV_INIT_FS_ACCESS; FAT_DEV_INIT_FS_ACCESS;
/* Sanity check. */ /* Sanity check. */
if (!file || !st) DEVOPTAB_SET_ERROR_AND_EXIT(EINVAL); if (!st) DEVOPTAB_SET_ERROR_AND_EXIT(EINVAL);
/* Get fixed path. */ /* Get fixed path. */
if (!(file = fatdev_get_fixed_path(r, file, fs_ctx))) DEVOPTAB_EXIT; if (!(file = fatdev_get_fixed_path(r, file, fs_ctx))) DEVOPTAB_EXIT;
@ -421,7 +421,7 @@ static const char *fatdev_get_fixed_path(struct _reent *r, const char *path, FAT
/* Generate fixed path. */ /* Generate fixed path. */
#pragma GCC diagnostic push #pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wformat-truncation" #pragma GCC diagnostic ignored "-Wformat-truncation"
snprintf(g_fatDevicePathBuffer, sizeof(g_fatDevicePathBuffer), "%s%s", name, path); snprintf(g_fatDevicePathBuffer, MAX_ELEMENTS(g_fatDevicePathBuffer), "%s%s", name, path);
#pragma GCC diagnostic pop #pragma GCC diagnostic pop
//LOG_MSG_DEBUG("Fixed path: \"%s\".", g_fatDevicePathBuffer); //LOG_MSG_DEBUG("Fixed path: \"%s\".", g_fatDevicePathBuffer);

View file

@ -377,8 +377,9 @@ bool gamecardGetCertificate(FsGameCardCertificate *out)
if (!g_gameCardInterfaceInit || atomic_load(&g_gameCardStatus) != GameCardStatus_InsertedAndInfoLoaded || !g_gameCardHandle.value || !out) break; if (!g_gameCardInterfaceInit || atomic_load(&g_gameCardStatus) != GameCardStatus_InsertedAndInfoLoaded || !g_gameCardHandle.value || !out) break;
/* Read the gamecard certificate using the official IPC call. */ /* Read the gamecard certificate using the official IPC call. */
Result rc = fsDeviceOperatorGetGameCardDeviceCertificate(&g_deviceOperator, &g_gameCardHandle, out, sizeof(FsGameCardCertificate), (s64)sizeof(FsGameCardCertificate)); size_t out_size = 0;
if (R_FAILED(rc)) LOG_MSG_ERROR("fsDeviceOperatorGetGameCardDeviceCertificate failed! (0x%X)", rc); Result rc = fsDeviceOperatorGetGameCardDeviceCertificate(&g_deviceOperator, &g_gameCardHandle, out, sizeof(FsGameCardCertificate), (s64*)&out_size, (s64)sizeof(FsGameCardCertificate));
if (R_FAILED(rc) || out_size != sizeof(FsGameCardCertificate)) LOG_MSG_ERROR("fsDeviceOperatorGetGameCardDeviceCertificate failed! (0x%X, 0x%lX).", rc, out_size);
ret = R_SUCCEEDED(rc); ret = R_SUCCEEDED(rc);
} }

View file

@ -593,7 +593,8 @@ void utilsReplaceIllegalCharacters(char *str, bool ascii_only)
units = decode_utf8(&code, ptr1); units = decode_utf8(&code, ptr1);
if (units < 0) break; if (units < 0) break;
if (memchr(g_illegalFileSystemChars, (int)code, g_illegalFileSystemCharsLength) || code < 0x20 || (!ascii_only && code == 0x7F) || (ascii_only && code >= 0x7F)) if (code < 0x20 || (!ascii_only && code == 0x7F) || (ascii_only && code >= 0x7F) || \
(units == 1 && memchr(g_illegalFileSystemChars, (int)code, g_illegalFileSystemCharsLength)))
{ {
if (!repl) if (!repl)
{ {
@ -618,7 +619,7 @@ char *utilsEscapeCharacters(const char *str, const char *chars_to_escape, const
size_t str_size = 0, chars_to_escape_size = 0; size_t str_size = 0, chars_to_escape_size = 0;
if (!str || !(str_size = strlen(str)) || !chars_to_escape || !(chars_to_escape_size = strlen(chars_to_escape)) || \ if (!str || !(str_size = strlen(str)) || !chars_to_escape || !(chars_to_escape_size = strlen(chars_to_escape)) || \
escape_char < 0x20 || escape_char >= 0x7F || memchr(chars_to_escape, (int)escape_char, chars_to_escape_size)) escape_char < 0x20 || escape_char >= 0x7F)
{ {
LOG_MSG_ERROR("Invalid parameters!"); LOG_MSG_ERROR("Invalid parameters!");
return NULL; return NULL;
@ -630,13 +631,13 @@ char *utilsEscapeCharacters(const char *str, const char *chars_to_escape, const
size_t cur_pos = 0, escaped_str_size = 0; size_t cur_pos = 0, escaped_str_size = 0;
char *ret = NULL; char *ret = NULL;
/* Determine the number of character we need to escape. */ /* Determine the number of characters we need to escape. */
while(cur_pos < str_size) while(cur_pos < str_size)
{ {
units = decode_utf8(&code, ptr); units = decode_utf8(&code, ptr);
if (units < 0) break; if (units < 0) break;
if (memchr(chars_to_escape, (int)code, chars_to_escape_size)) escape_cnt++; if (units == 1 && memchr(chars_to_escape, (int)code, chars_to_escape_size)) escape_cnt++;
ptr += units; ptr += units;
cur_pos += (size_t)units; cur_pos += (size_t)units;
@ -671,7 +672,7 @@ char *utilsEscapeCharacters(const char *str, const char *chars_to_escape, const
units = decode_utf8(&code, ptr); units = decode_utf8(&code, ptr);
if (units < 0) break; if (units < 0) break;
if (memchr(chars_to_escape, (int)code, chars_to_escape_size)) ret[cur_pos++] = escape_char; if (units == 1 && memchr(chars_to_escape, (int)code, chars_to_escape_size)) ret[cur_pos++] = escape_char;
for(ssize_t i = 0; i < units; i++) ret[cur_pos + (size_t)i] = ptr[i]; for(ssize_t i = 0; i < units; i++) ret[cur_pos + (size_t)i] = ptr[i];