mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-12-23 06:48:16 +00:00
fix(core): remove shutdown()
In a very weird situation, our declaration of `shutdown()` shadows a function `shutdown(int, int)` from sys/socket, which _just happens_ to be called by libxcb when closing the sdl window. This calls `main_clean_exit` which calls into micropython and causes at best an uncaught NLR and at worst an outright segfault because by that time the micropython environment doesn't exist anymore. I didn't think this sort of thing would be possible but here we are?? Fixed by removing `__shutdown()` and replacing `shutdown` with `trezor_shutdown`
This commit is contained in:
parent
f0486a2d0b
commit
9244522721
@ -1,7 +1,7 @@
|
|||||||
mod ffi {
|
mod ffi {
|
||||||
extern "C" {
|
extern "C" {
|
||||||
// trezorhal/common.c
|
// trezorhal/common.c
|
||||||
pub fn shutdown() -> !;
|
pub fn trezor_shutdown() -> !;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -13,7 +13,7 @@ use heapless::String;
|
|||||||
use crate::ui::util::u32_to_str;
|
use crate::ui::util::u32_to_str;
|
||||||
|
|
||||||
fn shutdown() -> ! {
|
fn shutdown() -> ! {
|
||||||
unsafe { ffi::shutdown() }
|
unsafe { ffi::trezor_shutdown() }
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "bootloader")]
|
#[cfg(feature = "bootloader")]
|
||||||
|
@ -43,7 +43,7 @@
|
|||||||
// from util.s
|
// from util.s
|
||||||
extern void shutdown_privileged(void);
|
extern void shutdown_privileged(void);
|
||||||
|
|
||||||
void __attribute__((noreturn)) shutdown(void) {
|
void __attribute__((noreturn)) trezor_shutdown(void) {
|
||||||
#ifdef USE_SVC_SHUTDOWN
|
#ifdef USE_SVC_SHUTDOWN
|
||||||
svc_shutdown();
|
svc_shutdown();
|
||||||
#else
|
#else
|
||||||
@ -88,7 +88,7 @@ __fatal_error(const char *expr, const char *msg, const char *file, int line,
|
|||||||
#endif
|
#endif
|
||||||
display_printf("\nPlease contact Trezor support.\n");
|
display_printf("\nPlease contact Trezor support.\n");
|
||||||
#endif
|
#endif
|
||||||
shutdown();
|
trezor_shutdown();
|
||||||
}
|
}
|
||||||
|
|
||||||
void __attribute__((noreturn))
|
void __attribute__((noreturn))
|
||||||
@ -108,7 +108,7 @@ error_shutdown(const char *label, const char *msg) {
|
|||||||
display_printf("\nPlease unplug the device.\n");
|
display_printf("\nPlease unplug the device.\n");
|
||||||
#endif
|
#endif
|
||||||
display_backlight(255);
|
display_backlight(255);
|
||||||
shutdown();
|
trezor_shutdown();
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
|
@ -51,7 +51,7 @@
|
|||||||
|
|
||||||
#define STAY_IN_BOOTLOADER_FLAG 0x0FC35A96
|
#define STAY_IN_BOOTLOADER_FLAG 0x0FC35A96
|
||||||
|
|
||||||
void __attribute__((noreturn)) shutdown(void);
|
void __attribute__((noreturn)) trezor_shutdown(void);
|
||||||
|
|
||||||
void __attribute__((noreturn))
|
void __attribute__((noreturn))
|
||||||
__fatal_error(const char *expr, const char *msg, const char *file, int line,
|
__fatal_error(const char *expr, const char *msg, const char *file, int line,
|
||||||
|
@ -34,15 +34,13 @@
|
|||||||
extern void main_clean_exit();
|
extern void main_clean_exit();
|
||||||
extern float DISPLAY_GAMMA;
|
extern float DISPLAY_GAMMA;
|
||||||
|
|
||||||
void __attribute__((noreturn)) __shutdown(void) {
|
void __attribute__((noreturn)) trezor_shutdown(void) {
|
||||||
printf("SHUTDOWN\n");
|
printf("SHUTDOWN\n");
|
||||||
main_clean_exit(3);
|
main_clean_exit(3);
|
||||||
for (;;)
|
for (;;)
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
void __attribute__((noreturn)) shutdown(void) { __shutdown(); }
|
|
||||||
|
|
||||||
#ifdef RGB16
|
#ifdef RGB16
|
||||||
#define COLOR_FATAL_ERROR RGB16(0x7F, 0x00, 0x00)
|
#define COLOR_FATAL_ERROR RGB16(0x7F, 0x00, 0x00)
|
||||||
#else
|
#else
|
||||||
@ -92,7 +90,7 @@ __fatal_error(const char *expr, const char *msg, const char *file, int line,
|
|||||||
printf("Hint:\nIsn't the emulator already running?\n");
|
printf("Hint:\nIsn't the emulator already running?\n");
|
||||||
#endif
|
#endif
|
||||||
hal_delay(3000);
|
hal_delay(3000);
|
||||||
shutdown();
|
trezor_shutdown();
|
||||||
}
|
}
|
||||||
|
|
||||||
void __attribute__((noreturn))
|
void __attribute__((noreturn))
|
||||||
@ -135,7 +133,7 @@ uint32_t hal_ticks_ms() {
|
|||||||
static int SDLCALL emulator_event_filter(void *userdata, SDL_Event *event) {
|
static int SDLCALL emulator_event_filter(void *userdata, SDL_Event *event) {
|
||||||
switch (event->type) {
|
switch (event->type) {
|
||||||
case SDL_QUIT:
|
case SDL_QUIT:
|
||||||
__shutdown();
|
trezor_shutdown();
|
||||||
return 0;
|
return 0;
|
||||||
case SDL_KEYUP:
|
case SDL_KEYUP:
|
||||||
if (event->key.repeat) {
|
if (event->key.repeat) {
|
||||||
@ -143,7 +141,7 @@ static int SDLCALL emulator_event_filter(void *userdata, SDL_Event *event) {
|
|||||||
}
|
}
|
||||||
switch (event->key.keysym.sym) {
|
switch (event->key.keysym.sym) {
|
||||||
case SDLK_ESCAPE:
|
case SDLK_ESCAPE:
|
||||||
__shutdown();
|
trezor_shutdown();
|
||||||
return 0;
|
return 0;
|
||||||
case SDLK_p:
|
case SDLK_p:
|
||||||
display_save("emu");
|
display_save("emu");
|
||||||
|
@ -40,7 +40,7 @@
|
|||||||
})
|
})
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void __attribute__((noreturn)) shutdown(void);
|
void __attribute__((noreturn)) trezor_shutdown(void);
|
||||||
|
|
||||||
void __attribute__((noreturn))
|
void __attribute__((noreturn))
|
||||||
__fatal_error(const char *expr, const char *msg, const char *file, int line,
|
__fatal_error(const char *expr, const char *msg, const char *file, int line,
|
||||||
|
@ -21,9 +21,6 @@
|
|||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
extern void __shutdown(void);
|
|
||||||
extern const char *display_save(const char *prefix);
|
|
||||||
|
|
||||||
#if defined TREZOR_MODEL_T
|
#if defined TREZOR_MODEL_T
|
||||||
|
|
||||||
#include "touch.h"
|
#include "touch.h"
|
||||||
|
Loading…
Reference in New Issue
Block a user