Bug 1756838

Summary: [abrt] gnome-shell: std::sys::unix::abort_internal(): gnome-shell killed by SIGABRT
Product: [Fedora] Fedora Reporter: Cameron Kaiser <ckaiser>
Component: llvmAssignee: Tom Stellard <tstellar>
Status: CLOSED EOL QA Contact: Fedora Extras Quality Assurance <extras-qa>
Severity: unspecified Docs Contact:
Priority: unspecified    
Version: 30CC: caillon+fedoraproject, dan, dmalcolm, fmuellner, gnome-sig, igor.raits, jadahl, jakub, jistone, john.j5live, mclasen, otaylor, philwyett, rhughes, rstrode, rust-sig, sandmann, scottt.tw, sean, sguelton, siddharth.kde, TicoTimo, tstellar
Target Milestone: ---   
Target Release: ---   
Hardware: ppc64le   
OS: Unspecified   
URL: https://retrace.fedoraproject.org/faf/reports/bthash/f272d687f99a64c9eb0d9cf185c3d2e4e4bbb5b7
Whiteboard: abrt_hash:f0b6e37d9013379a82c62ad5da57d571556217b9;VARIANT_ID=workstation;
Fixed In Version: Doc Type: If docs needed, set a value
Doc Text:
Story Points: ---
Clone Of: Environment:
Last Closed: 2020-05-26 18:00:22 UTC Type: ---
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: --- RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: --- Target Upstream Version:
Bug Depends On:    
Bug Blocks: 1071880    
Attachments:
Description Flags
File: backtrace
none
File: cgroup
none
File: core_backtrace
none
File: cpuinfo
none
File: dso_list
none
File: environ
none
File: limits
none
File: maps
none
File: mountinfo
none
File: open_fds
none
File: proc_pid_status
none
File: var_log_messages none

Description Cameron Kaiser 2019-09-30 04:41:36 UTC
Description of problem:
Crash occurs on this system simply by opening Applications (from Activities). An assertion can be seen in /var/log/messages, presumably from librsvg: "assertion failed: x < self.width as u32"

4-core Blackbird without GPU, F30 current.

Version-Release number of selected component:
gnome-shell-3.32.2-2.fc30

Additional info:
reporter:       libreport-2.10.1
backtrace_rating: 4
cmdline:        /usr/bin/gnome-shell
crash_function: std::sys::unix::abort_internal
executable:     /usr/bin/gnome-shell
journald_cursor: s=a84603bbdcbc4798a785ab59d6aef63a;i=1b8b;b=45c3d07433564dd6b302afd9042a8b50;m=2c3d0c7;t=593bd90f576d9;x=5c95320a1ee97ab5
kernel:         5.2.17-200.fc30.ppc64le
rootdir:        /
runlevel:       N 5
type:           CCpp
uid:            1000

Truncated backtrace:
Thread no. 0 (7 frames)
 #3 std::sys::unix::abort_internal at src/libstd/sys/unix/mod.rs:155
 #4 std::sys_common::util::abort at src/libstd/sys_common/util.rs:19
 #5 rust_panic at src/libstd/panicking.rs:528
 #6 std::panicking::update_count_then_panic at src/libstd/panicking.rs:516
 #7 std::panic::resume_unwind at src/libstd/panic.rs:427
 #8 rayon_core::unwind::resume_unwinding at /usr/src/debug/librsvg2-2.46.0-2.fc30.ppc64le/vendor/rayon-core/src/unwind.rs:21
 #9 rsvg_internals::surface_utils::shared_surface::SharedImageSurface::box_blur at /usr/src/debug/librsvg2-2.46.0-2.fc30.ppc64le/vendor/rayon-core/src/job.rs:180

Comment 1 Cameron Kaiser 2019-09-30 04:41:39 UTC
Created attachment 1620938 [details]
File: backtrace

Comment 2 Cameron Kaiser 2019-09-30 04:41:40 UTC
Created attachment 1620939 [details]
File: cgroup

Comment 3 Cameron Kaiser 2019-09-30 04:41:41 UTC
Created attachment 1620940 [details]
File: core_backtrace

Comment 4 Cameron Kaiser 2019-09-30 04:41:42 UTC
Created attachment 1620941 [details]
File: cpuinfo

Comment 5 Cameron Kaiser 2019-09-30 04:41:43 UTC
Created attachment 1620942 [details]
File: dso_list

Comment 6 Cameron Kaiser 2019-09-30 04:41:44 UTC
Created attachment 1620943 [details]
File: environ

Comment 7 Cameron Kaiser 2019-09-30 04:41:45 UTC
Created attachment 1620944 [details]
File: limits

Comment 8 Cameron Kaiser 2019-09-30 04:41:46 UTC
Created attachment 1620945 [details]
File: maps

Comment 9 Cameron Kaiser 2019-09-30 04:41:47 UTC
Created attachment 1620946 [details]
File: mountinfo

Comment 10 Cameron Kaiser 2019-09-30 04:41:48 UTC
Created attachment 1620947 [details]
File: open_fds

Comment 11 Cameron Kaiser 2019-09-30 04:41:49 UTC
Created attachment 1620948 [details]
File: proc_pid_status

Comment 12 Cameron Kaiser 2019-09-30 04:41:50 UTC
Created attachment 1620949 [details]
File: var_log_messages

Comment 13 Dan Horák 2019-09-30 07:32:12 UTC
I see (similar) crashes in librsvg2 with xfce4-panel (can be easily reproduced) and in xfce4-notifyd. Workaround is to downgrade to the previous librsvg2-2.45.90-1.fc30

Comment 14 Dan Horák 2019-09-30 07:39:22 UTC
[dan@talos ~]$ RUST_BACKTRACE=full xfce4-panel

(wrapper-2.0:9952): Gtk-WARNING **: 09:35:09.845: Negative content width -1 (allocation 1, extents 1x1) while allocating gadget (node button, owner GtkButton)
thread '<unnamed>' panicked at 'assertion failed: bounds.x1 <= surface.width()', rsvg_internals/src/surface_utils/iterators.rs:37:9
stack backtrace:
   0:     0x7fffaaf69a80 - std::panicking::default_hook::{{closure}}::hbbae378650839868
                               at /builddir/build/BUILD/rustc-1.37.0-src/vendor/backtrace/src/backtrace/libunwind.rs:88
   1:     0x7fffaaf69460 - std::panicking::default_hook::h58249a6f14e4bf62
                               at src/libstd/panicking.rs:214
   2:     0x7fffaaf69460 - std::panicking::rust_panic_with_hook::h633524f10f041ca9
                               at src/libstd/panicking.rs:477
   3:     0x7fffaae18264 - std::panicking::begin_panic::h012caccc2983082f
                               at /builddir/build/BUILD/rustc-1.37.0-src/src/libstd/panicking.rs:411
   4:     0x7fffaadb448c - rsvg_internals::surface_utils::iterators::Pixels::new::hcd672f0646515fc5
                               at rsvg_internals/src/surface_utils/iterators.rs:0
   5:     0x7fffaadc7218 - rsvg_internals::srgb::linearize_surface::ha03986ff6556c618
                               at rsvg_internals/src/srgb.rs:41
   6:     0x7fffaadc7218 - rsvg_internals::surface_utils::shared_surface::SharedImageSurface::to_linear_rgb::hcb6e60f8115be0bf
                               at rsvg_internals/src/surface_utils/shared_surface.rs:441
   7:     0x7fffaadc7218 - rsvg_internals::filters::context::FilterContext::get_input::h71e2bb8dc0d6de81
                               at rsvg_internals/src/filters/context.rs:434
   8:     0x7fffaae08178 - rsvg_internals::filters::PrimitiveWithInput::get_input::h898a8aaaa35a23cd
                               at rsvg_internals/src/filters/mod.rs:211
   9:     0x7fffaae08178 - <rsvg_internals::filters::gaussian_blur::GaussianBlur as rsvg_internals::filters::Filter>::render::h1f1ee0180ecc4fa2
                               at rsvg_internals/src/filters/gaussian_blur.rs:206
  10:     0x7fffaae2c410 - rsvg_internals::filters::render::{{closure}}::hdcacd4b357fd3680
                               at rsvg_internals/src/filters/mod.rs:318
  11:     0x7fffaadfb980 - rsvg_internals::drawing_ctx::DrawingCtx::run_filter::h73a8a84b62f78726
                               at /builddir/build/BUILD/rustc-1.37.0-src/src/libcore/ops/function.rs:231
  12:     0x7fffaadfb980 - rsvg_internals::drawing_ctx::DrawingCtx::with_discrete_layer::{{closure}}::hc4921bbe241eba70
                               at rsvg_internals/src/drawing_ctx.rs:466
  13:     0x7fffaae0f0c8 - rsvg_internals::drawing_ctx::DrawingCtx::with_saved_cr::he5e4ba603f4b949a
                               at rsvg_internals/src/drawing_ctx.rs:558
  14:     0x7fffaae0f0c8 - rsvg_internals::drawing_ctx::DrawingCtx::with_discrete_layer::hdd4bc4b3ff77a79c
                               at rsvg_internals/src/drawing_ctx.rs:403
  15:     0x7fffaae0f0c8 - rsvg_internals::shapes::render_path_builder::hcd329421e8d61b85
                               at rsvg_internals/src/shapes.rs:26
  16:     0x7fffaae0eeac - <rsvg_internals::shapes::NodePath as rsvg_internals::node::NodeTrait>::draw::h409ecf784a7cff7e
                               at rsvg_internals/src/shapes.rs:148
  17:     0x7fffaae070f0 - rsvg_internals::drawing_ctx::DrawingCtx::draw_node_from_stack::haafd7ef433a68660
                               at rsvg_internals/src/node.rs:505
  18:     0x7fffaae5d09c - <rctree::Node<rsvg_internals::node::NodeData> as rsvg_internals::node::NodeDraw>::draw_children::h493d8b979cc1f7bc
                               at rsvg_internals/src/node.rs:523
  19:     0x7fffaadf8fe0 - rsvg_internals::drawing_ctx::DrawingCtx::with_discrete_layer::{{closure}}::hc4921bbe241eba70
                               at rsvg_internals/src/drawing_ctx.rs:459
  20:     0x7fffaae5d6e4 - rsvg_internals::drawing_ctx::DrawingCtx::with_saved_cr::he5e4ba603f4b949a
                               at rsvg_internals/src/drawing_ctx.rs:558
  21:     0x7fffaae5d6e4 - rsvg_internals::drawing_ctx::DrawingCtx::with_discrete_layer::hdd4bc4b3ff77a79c
                               at rsvg_internals/src/drawing_ctx.rs:403
  22:     0x7fffaae5d6e4 - <rsvg_internals::structure::NodeGroup as rsvg_internals::node::NodeTrait>::draw::h768f48723fdc23bd
                               at rsvg_internals/src/structure.rs:36
  23:     0x7fffaae070f0 - rsvg_internals::drawing_ctx::DrawingCtx::draw_node_from_stack::haafd7ef433a68660
                               at rsvg_internals/src/node.rs:505
  24:     0x7fffaae5d09c - <rctree::Node<rsvg_internals::node::NodeData> as rsvg_internals::node::NodeDraw>::draw_children::h493d8b979cc1f7bc
                               at rsvg_internals/src/node.rs:523
  25:     0x7fffaadf8c00 - rsvg_internals::drawing_ctx::DrawingCtx::with_discrete_layer::{{closure}}::hc4921bbe241eba70
                               at rsvg_internals/src/drawing_ctx.rs:524
  26:     0x7fffaae5d6e4 - rsvg_internals::drawing_ctx::DrawingCtx::with_saved_cr::he5e4ba603f4b949a
                               at rsvg_internals/src/drawing_ctx.rs:558
  27:     0x7fffaae5d6e4 - rsvg_internals::drawing_ctx::DrawingCtx::with_discrete_layer::hdd4bc4b3ff77a79c
                               at rsvg_internals/src/drawing_ctx.rs:403
  28:     0x7fffaae5d6e4 - <rsvg_internals::structure::NodeGroup as rsvg_internals::node::NodeTrait>::draw::h768f48723fdc23bd
                               at rsvg_internals/src/structure.rs:36
  29:     0x7fffaae070f0 - rsvg_internals::drawing_ctx::DrawingCtx::draw_node_from_stack::haafd7ef433a68660
                               at rsvg_internals/src/node.rs:505
  30:     0x7fffaae5d09c - <rctree::Node<rsvg_internals::node::NodeData> as rsvg_internals::node::NodeDraw>::draw_children::h493d8b979cc1f7bc
                               at rsvg_internals/src/node.rs:523
  31:     0x7fffaadf8c00 - rsvg_internals::drawing_ctx::DrawingCtx::with_discrete_layer::{{closure}}::hc4921bbe241eba70
                               at rsvg_internals/src/drawing_ctx.rs:524
  32:     0x7fffaae5d6e4 - rsvg_internals::drawing_ctx::DrawingCtx::with_saved_cr::he5e4ba603f4b949a
                               at rsvg_internals/src/drawing_ctx.rs:558
  33:     0x7fffaae5d6e4 - rsvg_internals::drawing_ctx::DrawingCtx::with_discrete_layer::hdd4bc4b3ff77a79c
                               at rsvg_internals/src/drawing_ctx.rs:403
  34:     0x7fffaae5d6e4 - <rsvg_internals::structure::NodeGroup as rsvg_internals::node::NodeTrait>::draw::h768f48723fdc23bd
                               at rsvg_internals/src/structure.rs:36
  35:     0x7fffaae070f0 - rsvg_internals::drawing_ctx::DrawingCtx::draw_node_from_stack::haafd7ef433a68660
                               at rsvg_internals/src/node.rs:505
  36:     0x7fffaae5d09c - <rctree::Node<rsvg_internals::node::NodeData> as rsvg_internals::node::NodeDraw>::draw_children::h493d8b979cc1f7bc
                               at rsvg_internals/src/node.rs:523
  37:     0x7fffaadf8c00 - rsvg_internals::drawing_ctx::DrawingCtx::with_discrete_layer::{{closure}}::hc4921bbe241eba70
                               at rsvg_internals/src/drawing_ctx.rs:524
  38:     0x7fffaae5d6e4 - rsvg_internals::drawing_ctx::DrawingCtx::with_saved_cr::he5e4ba603f4b949a
                               at rsvg_internals/src/drawing_ctx.rs:558
  39:     0x7fffaae5d6e4 - rsvg_internals::drawing_ctx::DrawingCtx::with_discrete_layer::hdd4bc4b3ff77a79c
                               at rsvg_internals/src/drawing_ctx.rs:403
  40:     0x7fffaae5d6e4 - <rsvg_internals::structure::NodeGroup as rsvg_internals::node::NodeTrait>::draw::h768f48723fdc23bd
                               at rsvg_internals/src/structure.rs:36
  41:     0x7fffaae070f0 - rsvg_internals::drawing_ctx::DrawingCtx::draw_node_from_stack::haafd7ef433a68660
                               at rsvg_internals/src/node.rs:505
  42:     0x7fffaae5d09c - <rctree::Node<rsvg_internals::node::NodeData> as rsvg_internals::node::NodeDraw>::draw_children::h493d8b979cc1f7bc
                               at rsvg_internals/src/node.rs:523
  43:     0x7fffaae5fc4c - <rsvg_internals::structure::NodeSvg as rsvg_internals::node::NodeTrait>::draw::{{closure}}::h05ca3b43316d05c2
                               at rsvg_internals/src/structure.rs:262
  44:     0x7fffaadf8c00 - rsvg_internals::drawing_ctx::DrawingCtx::with_discrete_layer::{{closure}}::hc4921bbe241eba70
                               at rsvg_internals/src/drawing_ctx.rs:524
  45:     0x7fffaae5f9f0 - rsvg_internals::drawing_ctx::DrawingCtx::with_saved_cr::he5e4ba603f4b949a
                               at rsvg_internals/src/drawing_ctx.rs:558
  46:     0x7fffaae5f9f0 - rsvg_internals::drawing_ctx::DrawingCtx::with_discrete_layer::hdd4bc4b3ff77a79c
                               at rsvg_internals/src/drawing_ctx.rs:403
  47:     0x7fffaae5f9f0 - <rsvg_internals::structure::NodeSvg as rsvg_internals::node::NodeTrait>::draw::h279d58be2a52c3f5
                               at rsvg_internals/src/structure.rs:258
  48:     0x7fffaae070f0 - rsvg_internals::drawing_ctx::DrawingCtx::draw_node_from_stack::haafd7ef433a68660
                               at rsvg_internals/src/node.rs:505
  49:     0x7fffaae40408 - rsvg_internals::handle::Handle::render_layer::h11e052b0dc8ce871
                               at rsvg_internals/src/handle.rs:466
  50:     0x7fffaae40178 - rsvg_internals::handle::Handle::render_cairo_sub::h928b9c442d1734bc
                               at rsvg_internals/src/handle.rs:424
  51:     0x7fffaada8270 - rsvg_c_api::c_api::CHandle::get_pixbuf_sub::heca5a27ff5aec127
                               at rsvg_internals/src/handle.rs:604
  52:     0x7fffaada8270 - rsvg_rust_handle_get_pixbuf_sub
                               at librsvg/c_api.rs:982
  53:     0x7fffaada2730 - rsvg_handle_get_pixbuf_sub
                               at librsvg/rsvg-handle.c:1043
  54:     0x7fffaada27bc - rsvg_handle_get_pixbuf
                               at librsvg/rsvg-handle.c:1064
  55:     0x7fffab17116c - gdk_pixbuf__svg_image_stop_load
                               at /usr/src/debug/librsvg2-2.46.0-2.fc30.ppc64le/gdk-pixbuf-loader/io-svg.c:165
  56:     0x7fffab17116c - gdk_pixbuf__svg_image_stop_load
                               at /usr/src/debug/librsvg2-2.46.0-2.fc30.ppc64le/gdk-pixbuf-loader/io-svg.c:145
  57:     0x7fffbb5465ec - gdk_pixbuf_loader_close
  58:     0x7fffbb5414bc - <unknown>
  59:     0x7fffbb542c90 - gdk_pixbuf_new_from_stream_at_scale
  60:     0x7fffbc4d3d84 - <unknown>
  61:     0x7fffbc4d8928 - gtk_icon_info_load_icon
  62:     0x7fffbc4d8c98 - gtk_icon_theme_load_icon_for_scale
  63:     0x7fffbc4d8efc - gtk_icon_theme_load_icon
  64:     0x7fffb801463c - <unknown>
  65:     0x7fffb8015b04 - <unknown>
  66:     0x7fffb8015f34 - <unknown>
  67:     0x7fffb8016288 - <unknown>
  68:     0x7fffb80163e4 - <unknown>
  69:     0x7fffbbadab10 - g_cclosure_marshal_VOID__VOID
  70:     0x7fffbbad4fe4 - <unknown>
  71:     0x7fffbbad766c - g_closure_invoke
  72:     0x7fffbbaf4c3c - <unknown>
  73:     0x7fffbbaffd14 - g_signal_emit_valist
  74:     0x7fffbbb00140 - g_signal_emit
  75:     0x7fffbc720074 - gtk_widget_show
  76:     0x7fffbc535670 - <unknown>
  77:     0x7fffbc536380 - gtk_menu_popup_at_widget
  78:     0x7fffb81355e0 - applications_menu_plugin_menu
                               at applicationsmenu.c:837
  79:     0x7fffbc79642c - <unknown>
  80:     0x7fffbbad766c - g_closure_invoke
  81:     0x7fffbbaf5668 - <unknown>
  82:     0x7fffbbaff480 - g_signal_emit_valist
  83:     0x7fffbbb00140 - g_signal_emit
  84:     0x7fffbc70fdd4 - <unknown>
  85:     0x7fffbc527758 - <unknown>
  86:     0x7fffbc52aaf8 - gtk_main_do_event
  87:     0x7fffbc0b57a4 - <unknown>
  88:     0x7fffbc102480 - <unknown>
  89:     0x7fffbb99a94c - g_main_context_dispatch
  90:     0x7fffbb99ae68 - <unknown>
  91:     0x7fffbb99b45c - g_main_loop_run
  92:     0x7fffbc529464 - gtk_main
  93:        0x139c76fd0 - main
  94:     0x7fffbb614d28 - generic_start_main.isra.0
  95:     0x7fffbb614f24 - __libc_start_main
  96:                0x0 - <unknown>
fatal runtime error: failed to initiate panic, error 0
Neúspěšně ukončen (SIGABRT) (core dumped [obraz paměti uložen])

Comment 15 Dan Horák 2019-09-30 08:11:32 UTC
librsvg2-2.46.0-2.fc30 is built with rust-1.37.0-1.fc30.ppc64le
librsvg2-2.45.90-1.fc30 is built with rust-1.36.0-1.fc30.ppc64le

Comment 16 Cameron Kaiser 2019-10-01 00:29:05 UTC
Is the problem perhaps higher up? You had that weird Gtk warning saying the content width was already -1.

Comment 17 Dan Horák 2019-10-01 07:28:11 UTC
I did a bit more testing with following results
  - librsvg2-2.45.90-1.fc30.dh.1.ppc64le rebuilt with rust 1.37 -> crash
  - librsvg2-2.46.0-2.fc30.dh.1.ppc64le rebuilt with rust 1.38 -> crash
  - librsvg2-2.46.0-2.fc30.dh.2.ppc64le rebuilt with rust 1.36 -> OK

so I'm starting to suspect rust. Either it's more strict (but for ppc64le only, I'm not aware of any other report like this) or 1.37 introduced a bug.

Comment 18 Dan Horák 2019-10-01 07:29:40 UTC
Switching to rust for the maintainer to at least comment the issue.

Comment 19 Josh Stone 2019-10-01 18:04:52 UTC
Can you try with Rust 1.38 on Fedora 31 or rawhide? There we have LLVM 9, in case this is a new codegen issue.

Comment 20 Dan Horák 2019-10-02 11:43:30 UTC
It could be a codegen issue with LLVM8 at the end. Because when I rebuilt librsvg2 in F-31 buildroot with updates-testing enabled (rust 1.38 + llvm-libs 9.0.0 get installed), installed resulting librsvg2 rpm in a F-30 system, it works as expected, no crash.

Comment 21 Josh Stone 2019-10-02 19:13:43 UTC
OK, I'm moving this to LLVM, but I'll also try to further investigate the difference.

Comment 22 Dan Horák 2019-10-02 19:24:15 UTC
Let me know, if you would like to have access to a VM, where the issue can be reproduced.

Comment 23 serge_sans_paille 2019-10-03 08:08:36 UTC
Josh, can you come-up with an LLVM-only reproducer, based on rust-generated bitcode?

Comment 24 Josh Stone 2019-10-03 16:41:39 UTC
I don't know enough about what's actually going wrong to try to reduce it yet. The failed assertion makes sense given the Gtk-WARNING before it, so we'll have to track down what led to that unexpected state.

Dan, does that Gtk-WARNING appear with the good librsvg2 builds too?

Comment 25 Dan Horák 2019-10-04 07:19:23 UTC
Josh, yes, the "Negative content width -1" warning appears also when the good librsvg2 is installed.

Comment 26 Dan Horák 2019-12-10 10:23:49 UTC
for the record - a workaround is to update to F-31 librsvg2 rpms in F-30

Comment 27 Ben Cotton 2020-04-30 20:38:49 UTC
This message is a reminder that Fedora 30 is nearing its end of life.
Fedora will stop maintaining and issuing updates for Fedora 30 on 2020-05-26.
It is Fedora's policy to close all bug reports from releases that are no longer
maintained. At that time this bug will be closed as EOL if it remains open with a
Fedora 'version' of '30'.

Package Maintainer: If you wish for this bug to remain open because you
plan to fix it in a currently maintained version, simply change the 'version' 
to a later Fedora version.

Thank you for reporting this issue and we are sorry that we were not 
able to fix it before Fedora 30 is end of life. If you would still like 
to see this bug fixed and are able to reproduce it against a later version 
of Fedora, you are encouraged  change the 'version' to a later Fedora 
version prior this bug is closed as described in the policy above.

Although we aim to fix as many bugs as possible during every release's 
lifetime, sometimes those efforts are overtaken by events. Often a 
more recent Fedora release includes newer upstream software that fixes 
bugs or makes them obsolete.

Comment 28 Ben Cotton 2020-05-26 18:00:22 UTC
Fedora 30 changed to end-of-life (EOL) status on 2020-05-26. Fedora 30 is
no longer maintained, which means that it will not receive any further
security or bug fix updates. As a result we are closing this bug.

If you can reproduce this bug against a currently maintained version of
Fedora please feel free to reopen this bug against that version. If you
are unable to reopen this bug, please file a new report against the
current release. If you experience problems, please add a comment to this
bug.

Thank you for reporting this bug and we are sorry it could not be fixed.