aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPo Lu2021-11-12 09:53:30 +0800
committerPo Lu2021-11-12 09:53:30 +0800
commitfe0f7bddb648a75d1db4ea574536a207ea881712 (patch)
treefab3ac2d99e7ee1dd877d9e1eb579ea769d557f3 /src
parent554a875493680f8b52821267ee88e191d462ea36 (diff)
downloademacs-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.c42
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
45static Lisp_Object id_to_xwidget_map; 45static Lisp_Object id_to_xwidget_map;
46static Lisp_Object internal_xwidget_view_list;
47static Lisp_Object internal_xwidget_list;
46static uint32_t xwidget_counter = 0; 48static 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
2468xwidget_view_delete_all_in_window (struct window *w) 2479xwidget_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)
2513static void 2524static void
2514xwidget_start_redisplay (void) 2525xwidget_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);