Fix UB caused by using a free'd struct (actually fix QR code reader)
This commit is contained in:
@@ -34,7 +34,6 @@ typedef struct {
|
|||||||
u32 *texture_buffer;
|
u32 *texture_buffer;
|
||||||
Handle mutex;
|
Handle mutex;
|
||||||
volatile bool finished;
|
volatile bool finished;
|
||||||
volatile bool finished_update;
|
|
||||||
volatile bool success;
|
volatile bool success;
|
||||||
Handle cancel;
|
Handle cancel;
|
||||||
|
|
||||||
|
|||||||
@@ -56,7 +56,6 @@ void exit_qr(qr_data *data)
|
|||||||
free(data->camera_buffer);
|
free(data->camera_buffer);
|
||||||
free(data->texture_buffer);
|
free(data->texture_buffer);
|
||||||
quirc_destroy(data->context);
|
quirc_destroy(data->context);
|
||||||
free(data);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void capture_cam_thread(void *arg)
|
void capture_cam_thread(void *arg)
|
||||||
@@ -201,7 +200,6 @@ void update_qr(qr_data *data)
|
|||||||
if (!quirc_decode(&code, &scan_data))
|
if (!quirc_decode(&code, &scan_data))
|
||||||
{
|
{
|
||||||
exit_qr(data);
|
exit_qr(data);
|
||||||
data->finished_update = true;
|
|
||||||
|
|
||||||
draw_install(INSTALL_DOWNLOAD);
|
draw_install(INSTALL_DOWNLOAD);
|
||||||
char * zip_buf = NULL;
|
char * zip_buf = NULL;
|
||||||
@@ -290,14 +288,15 @@ bool init_qr(void)
|
|||||||
qr_data *data = calloc(1, sizeof(qr_data));
|
qr_data *data = calloc(1, sizeof(qr_data));
|
||||||
data->capturing = false;
|
data->capturing = false;
|
||||||
data->finished = false;
|
data->finished = false;
|
||||||
data->finished_update = false;
|
|
||||||
data->context = quirc_new();
|
data->context = quirc_new();
|
||||||
quirc_resize(data->context, 400, 240);
|
quirc_resize(data->context, 400, 240);
|
||||||
|
|
||||||
data->camera_buffer = calloc(1, 400 * 240 * sizeof(u16));
|
data->camera_buffer = calloc(1, 400 * 240 * sizeof(u16));
|
||||||
data->texture_buffer = calloc(1, 400 * 240 * sizeof(u32));
|
data->texture_buffer = calloc(1, 400 * 240 * sizeof(u32));
|
||||||
|
|
||||||
while (!data->finished_update && !data->finished) update_qr(data);
|
while (!data->finished) update_qr(data);
|
||||||
|
bool success = data->success;
|
||||||
|
free(data);
|
||||||
|
|
||||||
return (bool)data->success;
|
return success;
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user