1
0
mirror of git://projects.qi-hardware.com/eda-tools.git synced 2024-11-26 14:04:39 +02:00

eeshow/gui/ (aoi_click): also protect from access after free

Unlike aoi_hover, aoi_click was not observed to actually run into this
problem. But better safe than sorry.
This commit is contained in:
Werner Almesberger 2016-08-20 20:42:34 -03:00
parent eeda1c1700
commit 0d2b024d9c
4 changed files with 9 additions and 7 deletions

View File

@ -101,14 +101,16 @@ static bool need_dehover(const struct aoi *aois, int x, int y)
} }
bool aoi_click(const struct aoi *aois, int x, int y) /* Pointer to the anchor needed for the same reason as in aoi_hover. */
bool aoi_click(struct aoi *const *aois, int x, int y)
{ {
const struct aoi *aoi; const struct aoi *aoi;
if (need_dehover(aois, x, y)) if (need_dehover(*aois, x, y))
aoi_dehover(); aoi_dehover();
for (aoi = aois; aoi; aoi = aoi->next) for (aoi = *aois; aoi; aoi = aoi->next)
if (aoi->click && in_aoi(aoi, x, y)) { if (aoi->click && in_aoi(aoi, x, y)) {
aoi->click(aoi->user); aoi->click(aoi->user);
return 1; return 1;

View File

@ -34,7 +34,7 @@ struct aoi *aoi_add(struct aoi **aois, const struct aoi *cfg);
void aoi_update(struct aoi *aoi, const struct aoi *cfg); void aoi_update(struct aoi *aoi, const struct aoi *cfg);
bool aoi_hover(struct aoi *const *aois, int x, int y); bool aoi_hover(struct aoi *const *aois, int x, int y);
bool aoi_click(const struct aoi *aois, int x, int y); bool aoi_click(struct aoi *const *aois, int x, int y);
void aoi_set_related(struct aoi *aoi, const struct aoi *related); void aoi_set_related(struct aoi *aoi, const struct aoi *related);

View File

@ -206,7 +206,7 @@ static bool history_click(void *user, int x, int y)
{ {
struct gui_ctx *ctx = user; struct gui_ctx *ctx = user;
if (aoi_click(ctx->aois, x, y)) if (aoi_click(&ctx->aois, x, y))
return 1; return 1;
hide_history(ctx); hide_history(ctx);
return 1; return 1;

View File

@ -394,9 +394,9 @@ static bool sheet_click(void *user, int x, int y)
curr_sheet = find_corresponding_sheet(ctx->old_hist->sheets, curr_sheet = find_corresponding_sheet(ctx->old_hist->sheets,
ctx->new_hist->sheets, ctx->curr_sheet); ctx->new_hist->sheets, ctx->curr_sheet);
if (aoi_click(ctx->aois, x, y)) if (aoi_click(&ctx->aois, x, y))
return 1; return 1;
if (aoi_click(curr_sheet->aois, if (aoi_click(&curr_sheet->aois,
ex + curr_sheet->xmin, ey + curr_sheet->ymin)) ex + curr_sheet->xmin, ey + curr_sheet->ymin))
return 1; return 1;