mirror of
https://github.com/Atmosphere-NX/Atmosphere
synced 2024-11-10 07:06:34 +00:00
memcpy(x, NULL, 0) is undefined behavior
This commit is contained in:
parent
3d8ff446ad
commit
b35c418558
7 changed files with 31 additions and 13 deletions
|
@ -131,7 +131,9 @@ bool i2c_query(unsigned int id, uint8_t device, uint8_t r, void *dst, size_t dst
|
||||||
/* Writes a value to a register over I2C. */
|
/* Writes a value to a register over I2C. */
|
||||||
bool i2c_send(unsigned int id, uint8_t device, uint8_t r, void *src, size_t src_size) {
|
bool i2c_send(unsigned int id, uint8_t device, uint8_t r, void *src, size_t src_size) {
|
||||||
uint32_t val = r;
|
uint32_t val = r;
|
||||||
if (src_size <= 3) {
|
if (src_size == 0) {
|
||||||
|
return true;
|
||||||
|
} else if (src_size <= 3) {
|
||||||
memcpy(((uint8_t *)&val) + 1, src, src_size);
|
memcpy(((uint8_t *)&val) + 1, src, src_size);
|
||||||
return i2c_write(i2c_get_registers_from_id(id), device, &val, src_size + 1);
|
return i2c_write(i2c_get_registers_from_id(id), device, &val, src_size + 1);
|
||||||
} else {
|
} else {
|
||||||
|
@ -143,6 +145,8 @@ bool i2c_send(unsigned int id, uint8_t device, uint8_t r, void *src, size_t src_
|
||||||
bool i2c_write(volatile i2c_registers_t *regs, uint8_t device, void *src, size_t src_size) {
|
bool i2c_write(volatile i2c_registers_t *regs, uint8_t device, void *src, size_t src_size) {
|
||||||
if (src_size > 4) {
|
if (src_size > 4) {
|
||||||
return false;
|
return false;
|
||||||
|
} else if (src_size == 0) {
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set device for 7-bit write mode. */
|
/* Set device for 7-bit write mode. */
|
||||||
|
@ -172,6 +176,8 @@ bool i2c_write(volatile i2c_registers_t *regs, uint8_t device, void *src, size_t
|
||||||
bool i2c_read(volatile i2c_registers_t *regs, uint8_t device, void *dst, size_t dst_size) {
|
bool i2c_read(volatile i2c_registers_t *regs, uint8_t device, void *dst, size_t dst_size) {
|
||||||
if (dst_size > 4) {
|
if (dst_size > 4) {
|
||||||
return false;
|
return false;
|
||||||
|
} else if (dst_size == 0) {
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set device for 7-bit read mode. */
|
/* Set device for 7-bit read mode. */
|
||||||
|
|
|
@ -323,9 +323,9 @@ static void load_package2_sections(package2_meta_t *metadata, uint32_t master_ke
|
||||||
void *src_start = load_buf + sizeof(package2_header_t) + cur_section_offset;
|
void *src_start = load_buf + sizeof(package2_header_t) + cur_section_offset;
|
||||||
size_t size = (size_t)metadata->section_sizes[section];
|
size_t size = (size_t)metadata->section_sizes[section];
|
||||||
|
|
||||||
if (bootconfig_is_package2_plaintext()) {
|
if (bootconfig_is_package2_plaintext() && size != 0) {
|
||||||
memcpy(dst_start, src_start, size);
|
memcpy(dst_start, src_start, size);
|
||||||
} else {
|
} else if (size != 0) {
|
||||||
package2_crypt_ctr(master_key_rev, dst_start, size, src_start, size, metadata->section_ctrs[section], 0x10);
|
package2_crypt_ctr(master_key_rev, dst_start, size, src_start, size, metadata->section_ctrs[section], 0x10);
|
||||||
}
|
}
|
||||||
cur_section_offset += size;
|
cur_section_offset += size;
|
||||||
|
|
|
@ -61,7 +61,9 @@ void randomcache_refill(void) {
|
||||||
|
|
||||||
void randomcache_getbytes(void *dst, size_t num_bytes) {
|
void randomcache_getbytes(void *dst, size_t num_bytes) {
|
||||||
unsigned int low = g_random_cache_low;
|
unsigned int low = g_random_cache_low;
|
||||||
|
if (num_bytes == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
memcpy(dst, &g_random_cache[low], num_bytes);
|
memcpy(dst, &g_random_cache[low], num_bytes);
|
||||||
|
|
||||||
unsigned int new_low = low + num_bytes;
|
unsigned int new_low = low + num_bytes;
|
||||||
|
|
|
@ -476,7 +476,9 @@ void se_perform_aes_block_operation(void *dst, size_t dst_size, const void *src,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Load src data into block. */
|
/* Load src data into block. */
|
||||||
|
if (src_size != 0) {
|
||||||
memcpy(block, src, src_size);
|
memcpy(block, src, src_size);
|
||||||
|
}
|
||||||
flush_dcache_range(block, block + sizeof(block));
|
flush_dcache_range(block, block + sizeof(block));
|
||||||
|
|
||||||
/* Trigger AES operation. */
|
/* Trigger AES operation. */
|
||||||
|
@ -485,8 +487,10 @@ void se_perform_aes_block_operation(void *dst, size_t dst_size, const void *src,
|
||||||
|
|
||||||
/* Copy output data into dst. */
|
/* Copy output data into dst. */
|
||||||
flush_dcache_range(block, block + sizeof(block));
|
flush_dcache_range(block, block + sizeof(block));
|
||||||
|
if (dst_size != 0) {
|
||||||
memcpy(dst, block, dst_size);
|
memcpy(dst, block, dst_size);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void se_aes_ctr_crypt(unsigned int keyslot, void *dst, size_t dst_size, const void *src, size_t src_size, const void *ctr, size_t ctr_size) {
|
void se_aes_ctr_crypt(unsigned int keyslot, void *dst, size_t dst_size, const void *src, size_t src_size, const void *ctr, size_t ctr_size) {
|
||||||
if (keyslot >= KEYSLOT_AES_MAX || ctr_size != 0x10) {
|
if (keyslot >= KEYSLOT_AES_MAX || ctr_size != 0x10) {
|
||||||
|
@ -602,7 +606,6 @@ void se_compute_aes_cmac(unsigned int keyslot, void *cmac, size_t cmac_size, con
|
||||||
uint8_t last_block[0x10];
|
uint8_t last_block[0x10];
|
||||||
memset(last_block, 0, sizeof(last_block));
|
memset(last_block, 0, sizeof(last_block));
|
||||||
if (data_size & 0xF) {
|
if (data_size & 0xF) {
|
||||||
|
|
||||||
memcpy(last_block, data + (data_size & ~0xF), data_size & 0xF);
|
memcpy(last_block, data + (data_size & ~0xF), data_size & 0xF);
|
||||||
last_block[data_size & 0xF] = 0x80; /* Last block = data || 100...0 */
|
last_block[data_size & 0xF] = 0x80; /* Last block = data || 100...0 */
|
||||||
} else if (data_size >= 0x10) {
|
} else if (data_size >= 0x10) {
|
||||||
|
|
|
@ -91,7 +91,9 @@ uint32_t user_get_random_bytes(smc_args_t *args) {
|
||||||
se_generate_random(KEYSLOT_SWITCH_RNGKEY, random_bytes, size);
|
se_generate_random(KEYSLOT_SWITCH_RNGKEY, random_bytes, size);
|
||||||
flush_dcache_range(random_bytes, random_bytes + size);
|
flush_dcache_range(random_bytes, random_bytes + size);
|
||||||
|
|
||||||
|
if (size != 0) {
|
||||||
memcpy(&args->X[1], random_bytes, size);
|
memcpy(&args->X[1], random_bytes, size);
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -34,8 +34,9 @@ void calculate_mgf1_and_xor(void *masked, size_t masked_size, const void *seed,
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t hash_buf_size = seed_size + 4;
|
size_t hash_buf_size = seed_size + 4;
|
||||||
|
if (seed_size != 0) {
|
||||||
memcpy(hash_buf, seed, seed_size);
|
memcpy(hash_buf, seed, seed_size);
|
||||||
|
}
|
||||||
uint32_t round_num = 0;
|
uint32_t round_num = 0;
|
||||||
|
|
||||||
uint8_t *p_out = (uint8_t *)masked;
|
uint8_t *p_out = (uint8_t *)masked;
|
||||||
|
|
|
@ -50,7 +50,9 @@ bool user_copy_to_secure(upage_ref_t *upage, void *secure_dst, void *user_src, s
|
||||||
}
|
}
|
||||||
|
|
||||||
void *secure_src = (void *)(upage->secure_monitor_address + ((uintptr_t)user_src - upage->user_address));
|
void *secure_src = (void *)(upage->secure_monitor_address + ((uintptr_t)user_src - upage->user_address));
|
||||||
|
if (size != 0) {
|
||||||
memcpy(secure_dst, secure_src, size);
|
memcpy(secure_dst, secure_src, size);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -66,6 +68,8 @@ bool secure_copy_to_user(upage_ref_t *upage, void *user_dst, void *secure_src, s
|
||||||
}
|
}
|
||||||
|
|
||||||
void *secure_dst = (void *)(upage->secure_monitor_address + ((uintptr_t)user_dst - upage->user_address));
|
void *secure_dst = (void *)(upage->secure_monitor_address + ((uintptr_t)user_dst - upage->user_address));
|
||||||
|
if(size != 0) {
|
||||||
memcpy(secure_dst, secure_src, size);
|
memcpy(secure_dst, secure_src, size);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue