diff options
| author | Po Lu | 2021-11-12 09:53:30 +0800 |
|---|---|---|
| committer | Po Lu | 2021-11-12 09:53:30 +0800 |
| commit | fe0f7bddb648a75d1db4ea574536a207ea881712 (patch) | |
| tree | fab3ac2d99e7ee1dd877d9e1eb579ea769d557f3 /src | |
| parent | 554a875493680f8b52821267ee88e191d462ea36 (diff) | |
| download | emacs-fe0f7bddb648a75d1db4ea574536a207ea881712.tar.gz emacs-fe0f7bddb648a75d1db4ea574536a207ea881712.zip | |
Prevent crashes from Lisp code modifying xwidget-list
* src/xwidget.c (internal_xwidget_view_list)
(internal_xwidget_list): New variable.
(find_xwidget_for_offscreen_window)
(define_cursors, offscreen_damage_event)
(webkit_ready_to_show, xwidget_init_view)
(Fxwidget_resize, Fdelete_xwidget_view)
(Fxwidget_view_lookup, xwidget_spec_value)
(lookup_xwidget, xwidget_end_redisplay)
(kill_frame_xwidget_views, kill_buffer_xwidgets)
(Fmake_xwidget, Fget_buffer_xwidgets): Use internal list.
(syms_of_xwidget): Initialize internal xwidget lists.
Diffstat (limited to 'src')
| -rw-r--r-- | src/xwidget.c | 42 |
1 files changed, 27 insertions, 15 deletions
diff --git a/src/xwidget.c b/src/xwidget.c index d0cc3b987c9..70e57692550 100644 --- a/src/xwidget.c +++ b/src/xwidget.c | |||
| @@ -43,6 +43,8 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */ | |||
| 43 | #endif | 43 | #endif |
| 44 | 44 | ||
| 45 | static Lisp_Object id_to_xwidget_map; | 45 | static Lisp_Object id_to_xwidget_map; |
| 46 | static Lisp_Object internal_xwidget_view_list; | ||
| 47 | static Lisp_Object internal_xwidget_list; | ||
| 46 | static uint32_t xwidget_counter = 0; | 48 | static uint32_t xwidget_counter = 0; |
| 47 | 49 | ||
| 48 | #ifdef USE_GTK | 50 | #ifdef USE_GTK |
| @@ -144,7 +146,8 @@ fails. */) | |||
| 144 | xw->width = XFIXNAT (width); | 146 | xw->width = XFIXNAT (width); |
| 145 | xw->kill_without_query = false; | 147 | xw->kill_without_query = false; |
| 146 | XSETXWIDGET (val, xw); | 148 | XSETXWIDGET (val, xw); |
| 147 | Vxwidget_list = Fcons (val, Vxwidget_list); | 149 | internal_xwidget_list = Fcons (val, internal_xwidget_list); |
| 150 | Vxwidget_list = Fcopy_sequence (internal_xwidget_list); | ||
| 148 | xw->plist = Qnil; | 151 | xw->plist = Qnil; |
| 149 | xw->xwidget_id = ++xwidget_counter; | 152 | xw->xwidget_id = ++xwidget_counter; |
| 150 | xw->find_text = NULL; | 153 | xw->find_text = NULL; |
| @@ -448,7 +451,7 @@ BUFFER may be a buffer or the name of one. */) | |||
| 448 | 451 | ||
| 449 | xw_list = Qnil; | 452 | xw_list = Qnil; |
| 450 | 453 | ||
| 451 | for (tail = Vxwidget_list; CONSP (tail); tail = XCDR (tail)) | 454 | for (tail = internal_xwidget_list; CONSP (tail); tail = XCDR (tail)) |
| 452 | { | 455 | { |
| 453 | xw = XCAR (tail); | 456 | xw = XCAR (tail); |
| 454 | if (XWIDGETP (xw) && EQ (Fxwidget_buffer (xw), buffer)) | 457 | if (XWIDGETP (xw) && EQ (Fxwidget_buffer (xw), buffer)) |
| @@ -498,7 +501,7 @@ find_xwidget_for_offscreen_window (GdkWindow *window) | |||
| 498 | struct xwidget *xw; | 501 | struct xwidget *xw; |
| 499 | GdkWindow *w; | 502 | GdkWindow *w; |
| 500 | 503 | ||
| 501 | for (tem = Vxwidget_list; CONSP (tem); tem = XCDR (tem)) | 504 | for (tem = internal_xwidget_list; CONSP (tem); tem = XCDR (tem)) |
| 502 | { | 505 | { |
| 503 | if (XWIDGETP (XCAR (tem))) | 506 | if (XWIDGETP (XCAR (tem))) |
| 504 | { | 507 | { |
| @@ -750,7 +753,7 @@ define_cursors (struct xwidget *xw, WebKitHitTestResult *res) | |||
| 750 | 753 | ||
| 751 | xw->hit_result = webkit_hit_test_result_get_context (res); | 754 | xw->hit_result = webkit_hit_test_result_get_context (res); |
| 752 | 755 | ||
| 753 | for (Lisp_Object tem = Vxwidget_view_list; CONSP (tem); | 756 | for (Lisp_Object tem = internal_xwidget_view_list; CONSP (tem); |
| 754 | tem = XCDR (tem)) | 757 | tem = XCDR (tem)) |
| 755 | { | 758 | { |
| 756 | if (XWIDGET_VIEW_P (XCAR (tem))) | 759 | if (XWIDGET_VIEW_P (XCAR (tem))) |
| @@ -1020,7 +1023,7 @@ offscreen_damage_event (GtkWidget *widget, GdkEvent *event, | |||
| 1020 | { | 1023 | { |
| 1021 | block_input (); | 1024 | block_input (); |
| 1022 | 1025 | ||
| 1023 | for (Lisp_Object tail = Vxwidget_view_list; CONSP (tail); | 1026 | for (Lisp_Object tail = internal_xwidget_view_list; CONSP (tail); |
| 1024 | tail = XCDR (tail)) | 1027 | tail = XCDR (tail)) |
| 1025 | { | 1028 | { |
| 1026 | if (XWIDGET_VIEW_P (XCAR (tail))) | 1029 | if (XWIDGET_VIEW_P (XCAR (tail))) |
| @@ -1118,7 +1121,7 @@ webkit_ready_to_show (WebKitWebView *new_view, | |||
| 1118 | Lisp_Object tem; | 1121 | Lisp_Object tem; |
| 1119 | struct xwidget *xw; | 1122 | struct xwidget *xw; |
| 1120 | 1123 | ||
| 1121 | for (tem = Vxwidget_list; CONSP (tem); tem = XCDR (tem)) | 1124 | for (tem = internal_xwidget_list; CONSP (tem); tem = XCDR (tem)) |
| 1122 | { | 1125 | { |
| 1123 | if (XWIDGETP (XCAR (tem))) | 1126 | if (XWIDGETP (XCAR (tem))) |
| 1124 | { | 1127 | { |
| @@ -1485,7 +1488,8 @@ xwidget_init_view (struct xwidget *xww, | |||
| 1485 | Lisp_Object val; | 1488 | Lisp_Object val; |
| 1486 | 1489 | ||
| 1487 | XSETXWIDGET_VIEW (val, xv); | 1490 | XSETXWIDGET_VIEW (val, xv); |
| 1488 | Vxwidget_view_list = Fcons (val, Vxwidget_view_list); | 1491 | internal_xwidget_view_list = Fcons (val, internal_xwidget_view_list); |
| 1492 | Vxwidget_view_list = Fcopy_sequence (internal_xwidget_view_list); | ||
| 1489 | 1493 | ||
| 1490 | XSETWINDOW (xv->w, s->w); | 1494 | XSETWINDOW (xv->w, s->w); |
| 1491 | XSETXWIDGET (xv->model, xww); | 1495 | XSETXWIDGET (xv->model, xww); |
| @@ -1916,7 +1920,8 @@ DEFUN ("xwidget-resize", Fxwidget_resize, Sxwidget_resize, 3, 3, 0, | |||
| 1916 | nsxwidget_resize (xw); | 1920 | nsxwidget_resize (xw); |
| 1917 | #endif | 1921 | #endif |
| 1918 | 1922 | ||
| 1919 | for (Lisp_Object tail = Vxwidget_view_list; CONSP (tail); tail = XCDR (tail)) | 1923 | for (Lisp_Object tail = internal_xwidget_view_list; CONSP (tail); |
| 1924 | tail = XCDR (tail)) | ||
| 1920 | { | 1925 | { |
| 1921 | if (XWIDGET_VIEW_P (XCAR (tail))) | 1926 | if (XWIDGET_VIEW_P (XCAR (tail))) |
| 1922 | { | 1927 | { |
| @@ -2055,7 +2060,8 @@ DEFUN ("delete-xwidget-view", | |||
| 2055 | nsxwidget_delete_view (xv); | 2060 | nsxwidget_delete_view (xv); |
| 2056 | #endif | 2061 | #endif |
| 2057 | 2062 | ||
| 2058 | Vxwidget_view_list = Fdelq (xwidget_view, Vxwidget_view_list); | 2063 | internal_xwidget_view_list = Fdelq (xwidget_view, internal_xwidget_view_list); |
| 2064 | Vxwidget_view_list = Fcopy_sequence (internal_xwidget_view_list); | ||
| 2059 | return Qnil; | 2065 | return Qnil; |
| 2060 | } | 2066 | } |
| 2061 | 2067 | ||
| @@ -2073,7 +2079,7 @@ Return nil if no association is found. */) | |||
| 2073 | window = Fselected_window (); | 2079 | window = Fselected_window (); |
| 2074 | CHECK_WINDOW (window); | 2080 | CHECK_WINDOW (window); |
| 2075 | 2081 | ||
| 2076 | for (Lisp_Object tail = Vxwidget_view_list; CONSP (tail); | 2082 | for (Lisp_Object tail = internal_xwidget_view_list; CONSP (tail); |
| 2077 | tail = XCDR (tail)) | 2083 | tail = XCDR (tail)) |
| 2078 | { | 2084 | { |
| 2079 | Lisp_Object xwidget_view = XCAR (tail); | 2085 | Lisp_Object xwidget_view = XCAR (tail); |
| @@ -2423,6 +2429,11 @@ syms_of_xwidget (void) | |||
| 2423 | QCweakness, Qvalue); | 2429 | QCweakness, Qvalue); |
| 2424 | staticpro (&id_to_xwidget_map); | 2430 | staticpro (&id_to_xwidget_map); |
| 2425 | 2431 | ||
| 2432 | internal_xwidget_list = Qnil; | ||
| 2433 | staticpro (&internal_xwidget_list); | ||
| 2434 | internal_xwidget_view_list = Qnil; | ||
| 2435 | staticpro (&internal_xwidget_view_list); | ||
| 2436 | |||
| 2426 | #ifdef USE_GTK | 2437 | #ifdef USE_GTK |
| 2427 | x_window_to_xwv_map = CALLN (Fmake_hash_table, QCtest, Qeq); | 2438 | x_window_to_xwv_map = CALLN (Fmake_hash_table, QCtest, Qeq); |
| 2428 | 2439 | ||
| @@ -2468,7 +2479,7 @@ void | |||
| 2468 | xwidget_view_delete_all_in_window (struct window *w) | 2479 | xwidget_view_delete_all_in_window (struct window *w) |
| 2469 | { | 2480 | { |
| 2470 | struct xwidget_view *xv = NULL; | 2481 | struct xwidget_view *xv = NULL; |
| 2471 | for (Lisp_Object tail = Vxwidget_view_list; CONSP (tail); | 2482 | for (Lisp_Object tail = internal_xwidget_view_list; CONSP (tail); |
| 2472 | tail = XCDR (tail)) | 2483 | tail = XCDR (tail)) |
| 2473 | { | 2484 | { |
| 2474 | if (XWIDGET_VIEW_P (XCAR (tail))) | 2485 | if (XWIDGET_VIEW_P (XCAR (tail))) |
| @@ -2513,7 +2524,7 @@ lookup_xwidget (Lisp_Object spec) | |||
| 2513 | static void | 2524 | static void |
| 2514 | xwidget_start_redisplay (void) | 2525 | xwidget_start_redisplay (void) |
| 2515 | { | 2526 | { |
| 2516 | for (Lisp_Object tail = Vxwidget_view_list; CONSP (tail); | 2527 | for (Lisp_Object tail = internal_xwidget_view_list; CONSP (tail); |
| 2517 | tail = XCDR (tail)) | 2528 | tail = XCDR (tail)) |
| 2518 | { | 2529 | { |
| 2519 | if (XWIDGET_VIEW_P (XCAR (tail))) | 2530 | if (XWIDGET_VIEW_P (XCAR (tail))) |
| @@ -2584,7 +2595,7 @@ xwidget_end_redisplay (struct window *w, struct glyph_matrix *matrix) | |||
| 2584 | } | 2595 | } |
| 2585 | } | 2596 | } |
| 2586 | 2597 | ||
| 2587 | for (Lisp_Object tail = Vxwidget_view_list; CONSP (tail); | 2598 | for (Lisp_Object tail = internal_xwidget_view_list; CONSP (tail); |
| 2588 | tail = XCDR (tail)) | 2599 | tail = XCDR (tail)) |
| 2589 | { | 2600 | { |
| 2590 | if (XWIDGET_VIEW_P (XCAR (tail))) | 2601 | if (XWIDGET_VIEW_P (XCAR (tail))) |
| @@ -2622,7 +2633,7 @@ kill_frame_xwidget_views (struct frame *f) | |||
| 2622 | { | 2633 | { |
| 2623 | Lisp_Object rem = Qnil; | 2634 | Lisp_Object rem = Qnil; |
| 2624 | 2635 | ||
| 2625 | for (Lisp_Object tail = Vxwidget_view_list; CONSP (tail); | 2636 | for (Lisp_Object tail = internal_xwidget_view_list; CONSP (tail); |
| 2626 | tail = XCDR (tail)) | 2637 | tail = XCDR (tail)) |
| 2627 | { | 2638 | { |
| 2628 | if (XWIDGET_VIEW_P (XCAR (tail)) | 2639 | if (XWIDGET_VIEW_P (XCAR (tail)) |
| @@ -2643,7 +2654,8 @@ kill_buffer_xwidgets (Lisp_Object buffer) | |||
| 2643 | for (tail = Fget_buffer_xwidgets (buffer); CONSP (tail); tail = XCDR (tail)) | 2654 | for (tail = Fget_buffer_xwidgets (buffer); CONSP (tail); tail = XCDR (tail)) |
| 2644 | { | 2655 | { |
| 2645 | xwidget = XCAR (tail); | 2656 | xwidget = XCAR (tail); |
| 2646 | Vxwidget_list = Fdelq (xwidget, Vxwidget_list); | 2657 | internal_xwidget_list = Fdelq (xwidget, internal_xwidget_list); |
| 2658 | Vxwidget_list = Fcopy_sequence (internal_xwidget_list); | ||
| 2647 | /* TODO free the GTK things in xw. */ | 2659 | /* TODO free the GTK things in xw. */ |
| 2648 | { | 2660 | { |
| 2649 | CHECK_LIVE_XWIDGET (xwidget); | 2661 | CHECK_LIVE_XWIDGET (xwidget); |