mirror of
https://github.com/Atmosphere-NX/Atmosphere
synced 2024-12-22 20:31:14 +00:00
Fix logic in ldr_ro_manager
Fix argument type for isdigit/isxdigit
This commit is contained in:
parent
b0a66a63ba
commit
e561919a52
9 changed files with 34 additions and 33 deletions
|
@ -1577,10 +1577,10 @@ int vsscanf(const char *buf, const char *fmt, va_list args)
|
||||||
digit = *(str + 1);
|
digit = *(str + 1);
|
||||||
|
|
||||||
if (!digit
|
if (!digit
|
||||||
|| (base == 16 && !isxdigit(digit))
|
|| (base == 16 && !isxdigit((unsigned char)digit))
|
||||||
|| (base == 10 && !isdigit(digit))
|
|| (base == 10 && !isdigit((unsigned char)digit))
|
||||||
|| (base == 8 && (!isdigit(digit) || digit > '7'))
|
|| (base == 8 && (!isdigit((unsigned char)digit) || digit > '7'))
|
||||||
|| (base == 0 && !isdigit(digit)))
|
|| (base == 0 && !isdigit((unsigned char)digit)))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
switch (qualifier) {
|
switch (qualifier) {
|
||||||
|
|
|
@ -176,7 +176,7 @@ static inline uint8_t hex_nybble_to_u8(const char nybble) {
|
||||||
static bool name_matches_hash(const char *name, size_t name_len, const void *hash, size_t hash_size) {
|
static bool name_matches_hash(const char *name, size_t name_len, const void *hash, size_t hash_size) {
|
||||||
/* Validate name is hex build id. */
|
/* Validate name is hex build id. */
|
||||||
for (unsigned int i = 0; i < name_len - 4; i++) {
|
for (unsigned int i = 0; i < name_len - 4; i++) {
|
||||||
if (isxdigit(name[i]) == 0) {
|
if (isxdigit((unsigned char)name[i]) == 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -83,7 +83,7 @@ static char *skip_spaces(const char *str)
|
||||||
static unsigned int simple_guess_base(const char *cp)
|
static unsigned int simple_guess_base(const char *cp)
|
||||||
{
|
{
|
||||||
if (cp[0] == '0') {
|
if (cp[0] == '0') {
|
||||||
if (TOLOWER(cp[1]) == 'x' && isxdigit(cp[2]))
|
if (TOLOWER(cp[1]) == 'x' && isxdigit((unsigned char)cp[2]))
|
||||||
return 16;
|
return 16;
|
||||||
else
|
else
|
||||||
return 8;
|
return 8;
|
||||||
|
@ -108,10 +108,10 @@ unsigned long long simple_strtoull(const char *cp, char **endp, unsigned int bas
|
||||||
if (base == 16 && cp[0] == '0' && TOLOWER(cp[1]) == 'x')
|
if (base == 16 && cp[0] == '0' && TOLOWER(cp[1]) == 'x')
|
||||||
cp += 2;
|
cp += 2;
|
||||||
|
|
||||||
while (isxdigit(*cp)) {
|
while (isxdigit((unsigned char)*cp)) {
|
||||||
unsigned int value;
|
unsigned int value;
|
||||||
|
|
||||||
value = isdigit(*cp) ? *cp - '0' : TOLOWER(*cp) - 'a' + 10;
|
value = isdigit((unsigned char)*cp) ? *cp - '0' : TOLOWER(*cp) - 'a' + 10;
|
||||||
if (value >= base)
|
if (value >= base)
|
||||||
break;
|
break;
|
||||||
result = result * base + value;
|
result = result * base + value;
|
||||||
|
@ -167,7 +167,7 @@ int skip_atoi(const char **s)
|
||||||
{
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
while (isdigit(**s))
|
while (isdigit((unsigned char)**s))
|
||||||
i = i*10 + *((*s)++) - '0';
|
i = i*10 + *((*s)++) - '0';
|
||||||
|
|
||||||
return i;
|
return i;
|
||||||
|
@ -654,7 +654,7 @@ int format_decode(const char *fmt, struct printf_spec *spec)
|
||||||
/* get field width */
|
/* get field width */
|
||||||
spec->field_width = -1;
|
spec->field_width = -1;
|
||||||
|
|
||||||
if (isdigit(*fmt))
|
if (isdigit((unsigned char)*fmt))
|
||||||
spec->field_width = skip_atoi(&fmt);
|
spec->field_width = skip_atoi(&fmt);
|
||||||
else if (*fmt == '*') {
|
else if (*fmt == '*') {
|
||||||
/* it's the next argument */
|
/* it's the next argument */
|
||||||
|
@ -667,7 +667,7 @@ precision:
|
||||||
spec->precision = -1;
|
spec->precision = -1;
|
||||||
if (*fmt == '.') {
|
if (*fmt == '.') {
|
||||||
++fmt;
|
++fmt;
|
||||||
if (isdigit(*fmt)) {
|
if (isdigit((unsigned char)*fmt)) {
|
||||||
spec->precision = skip_atoi(&fmt);
|
spec->precision = skip_atoi(&fmt);
|
||||||
if (spec->precision < 0)
|
if (spec->precision < 0)
|
||||||
spec->precision = 0;
|
spec->precision = 0;
|
||||||
|
@ -1485,7 +1485,7 @@ int vsscanf(const char *buf, const char *fmt, va_list args)
|
||||||
|
|
||||||
/* get field width */
|
/* get field width */
|
||||||
field_width = -1;
|
field_width = -1;
|
||||||
if (isdigit(*fmt))
|
if (isdigit((unsigned char)*fmt))
|
||||||
field_width = skip_atoi(&fmt);
|
field_width = skip_atoi(&fmt);
|
||||||
|
|
||||||
/* get conversion qualifier */
|
/* get conversion qualifier */
|
||||||
|
@ -1577,10 +1577,10 @@ int vsscanf(const char *buf, const char *fmt, va_list args)
|
||||||
digit = *(str + 1);
|
digit = *(str + 1);
|
||||||
|
|
||||||
if (!digit
|
if (!digit
|
||||||
|| (base == 16 && !isxdigit(digit))
|
|| (base == 16 && !isxdigit((unsigned char)digit))
|
||||||
|| (base == 10 && !isdigit(digit))
|
|| (base == 10 && !isdigit((unsigned char)digit))
|
||||||
|| (base == 8 && (!isdigit(digit) || digit > '7'))
|
|| (base == 8 && (!isdigit((unsigned char)digit) || digit > '7'))
|
||||||
|| (base == 0 && !isdigit(digit)))
|
|| (base == 0 && !isdigit((unsigned char)digit)))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
switch (qualifier) {
|
switch (qualifier) {
|
||||||
|
|
|
@ -116,7 +116,7 @@ Result SettingsItemManager::ValidateKey(const char *key) {
|
||||||
|
|
||||||
static bool IsHexadecimal(const char *str) {
|
static bool IsHexadecimal(const char *str) {
|
||||||
while (*str) {
|
while (*str) {
|
||||||
if (isxdigit(*str)) {
|
if (isxdigit((unsigned char)*str)) {
|
||||||
str++;
|
str++;
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -70,7 +70,7 @@ static FsFile g_emummc_file = {0};
|
||||||
|
|
||||||
static bool IsHexadecimal(const char *str) {
|
static bool IsHexadecimal(const char *str) {
|
||||||
while (*str) {
|
while (*str) {
|
||||||
if (isxdigit(*str)) {
|
if (isxdigit((unsigned char)*str)) {
|
||||||
str++;
|
str++;
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -349,7 +349,7 @@ bool DmntCheatManager::ParseCheats(const char *s, size_t len) {
|
||||||
|
|
||||||
/* Skip onwards. */
|
/* Skip onwards. */
|
||||||
i = j + 1;
|
i = j + 1;
|
||||||
} else if (isxdigit(s[i])) {
|
} else if (isxdigit((unsigned char)s[i])) {
|
||||||
/* Make sure that we have a cheat open. */
|
/* Make sure that we have a cheat open. */
|
||||||
if (cur_entry == NULL) {
|
if (cur_entry == NULL) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -363,7 +363,7 @@ bool DmntCheatManager::ParseCheats(const char *s, size_t len) {
|
||||||
/* We're parsing an instruction, so validate it's 8 hex digits. */
|
/* We're parsing an instruction, so validate it's 8 hex digits. */
|
||||||
for (size_t j = 1; j < 8; j++) {
|
for (size_t j = 1; j < 8; j++) {
|
||||||
/* Validate 8 hex chars. */
|
/* Validate 8 hex chars. */
|
||||||
if (i + j >= len || !isxdigit(s[i+j])) {
|
if (i + j >= len || !isxdigit((unsigned char)s[i+j])) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -136,13 +136,14 @@ namespace sts::ldr::ro {
|
||||||
/* Nintendo doesn't actually care about successful allocation. */
|
/* Nintendo doesn't actually care about successful allocation. */
|
||||||
for (size_t i = 0; i < ModuleCountMax; i++) {
|
for (size_t i = 0; i < ModuleCountMax; i++) {
|
||||||
ModuleInfo *module = &info->modules[i];
|
ModuleInfo *module = &info->modules[i];
|
||||||
if (!module->in_use) {
|
if (module->in_use) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::memcpy(module->info.build_id, build_id, sizeof(module->info.build_id));
|
std::memcpy(module->info.build_id, build_id, sizeof(module->info.build_id));
|
||||||
module->info.base_address = address;
|
module->info.base_address = address;
|
||||||
module->info.size = size;
|
module->info.size = size;
|
||||||
|
module->in_use = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
|
|
||||||
static bool IsHexadecimal(const char *str) {
|
static bool IsHexadecimal(const char *str) {
|
||||||
while (*str) {
|
while (*str) {
|
||||||
if (isxdigit(*str)) {
|
if (isxdigit((unsigned char)*str)) {
|
||||||
str++;
|
str++;
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -83,7 +83,7 @@ static char *skip_spaces(const char *str)
|
||||||
static unsigned int simple_guess_base(const char *cp)
|
static unsigned int simple_guess_base(const char *cp)
|
||||||
{
|
{
|
||||||
if (cp[0] == '0') {
|
if (cp[0] == '0') {
|
||||||
if (TOLOWER(cp[1]) == 'x' && isxdigit(cp[2]))
|
if (TOLOWER(cp[1]) == 'x' && isxdigit((unsigned char)cp[2]))
|
||||||
return 16;
|
return 16;
|
||||||
else
|
else
|
||||||
return 8;
|
return 8;
|
||||||
|
@ -108,10 +108,10 @@ unsigned long long simple_strtoull(const char *cp, char **endp, unsigned int bas
|
||||||
if (base == 16 && cp[0] == '0' && TOLOWER(cp[1]) == 'x')
|
if (base == 16 && cp[0] == '0' && TOLOWER(cp[1]) == 'x')
|
||||||
cp += 2;
|
cp += 2;
|
||||||
|
|
||||||
while (isxdigit(*cp)) {
|
while (isxdigit((unsigned char)*cp)) {
|
||||||
unsigned int value;
|
unsigned int value;
|
||||||
|
|
||||||
value = isdigit(*cp) ? *cp - '0' : TOLOWER(*cp) - 'a' + 10;
|
value = isdigit((unsigned char)*cp) ? *cp - '0' : TOLOWER(*cp) - 'a' + 10;
|
||||||
if (value >= base)
|
if (value >= base)
|
||||||
break;
|
break;
|
||||||
result = result * base + value;
|
result = result * base + value;
|
||||||
|
@ -167,7 +167,7 @@ int skip_atoi(const char **s)
|
||||||
{
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
while (isdigit(**s))
|
while (isdigit((unsigned char)**s))
|
||||||
i = i*10 + *((*s)++) - '0';
|
i = i*10 + *((*s)++) - '0';
|
||||||
|
|
||||||
return i;
|
return i;
|
||||||
|
@ -654,7 +654,7 @@ int format_decode(const char *fmt, struct printf_spec *spec)
|
||||||
/* get field width */
|
/* get field width */
|
||||||
spec->field_width = -1;
|
spec->field_width = -1;
|
||||||
|
|
||||||
if (isdigit(*fmt))
|
if (isdigit((unsigned char)*fmt))
|
||||||
spec->field_width = skip_atoi(&fmt);
|
spec->field_width = skip_atoi(&fmt);
|
||||||
else if (*fmt == '*') {
|
else if (*fmt == '*') {
|
||||||
/* it's the next argument */
|
/* it's the next argument */
|
||||||
|
@ -667,7 +667,7 @@ precision:
|
||||||
spec->precision = -1;
|
spec->precision = -1;
|
||||||
if (*fmt == '.') {
|
if (*fmt == '.') {
|
||||||
++fmt;
|
++fmt;
|
||||||
if (isdigit(*fmt)) {
|
if (isdigit((unsigned char)*fmt)) {
|
||||||
spec->precision = skip_atoi(&fmt);
|
spec->precision = skip_atoi(&fmt);
|
||||||
if (spec->precision < 0)
|
if (spec->precision < 0)
|
||||||
spec->precision = 0;
|
spec->precision = 0;
|
||||||
|
@ -1485,7 +1485,7 @@ int vsscanf(const char *buf, const char *fmt, va_list args)
|
||||||
|
|
||||||
/* get field width */
|
/* get field width */
|
||||||
field_width = -1;
|
field_width = -1;
|
||||||
if (isdigit(*fmt))
|
if (isdigit((unsigned char)*fmt))
|
||||||
field_width = skip_atoi(&fmt);
|
field_width = skip_atoi(&fmt);
|
||||||
|
|
||||||
/* get conversion qualifier */
|
/* get conversion qualifier */
|
||||||
|
@ -1577,10 +1577,10 @@ int vsscanf(const char *buf, const char *fmt, va_list args)
|
||||||
digit = *(str + 1);
|
digit = *(str + 1);
|
||||||
|
|
||||||
if (!digit
|
if (!digit
|
||||||
|| (base == 16 && !isxdigit(digit))
|
|| (base == 16 && !isxdigit((unsigned char)digit))
|
||||||
|| (base == 10 && !isdigit(digit))
|
|| (base == 10 && !isdigit((unsigned char)digit))
|
||||||
|| (base == 8 && (!isdigit(digit) || digit > '7'))
|
|| (base == 8 && (!isdigit((unsigned char)digit) || digit > '7'))
|
||||||
|| (base == 0 && !isdigit(digit)))
|
|| (base == 0 && !isdigit((unsigned char)digit)))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
switch (qualifier) {
|
switch (qualifier) {
|
||||||
|
|
Loading…
Reference in a new issue