Re: Seg faults in elinks 0.11.3

Kalle Olavi Niemitalo <[email protected]>
Newsgroups gmane.comp.web.elinks.user
Message-ID <[email protected]>
Roy Millar <[email protected]> writes:

> Now after entering my logon info (several items, for security), as
> soon as the new screen starts to appear, elinks seg faults in frames.c.

There have been many bugs in the frames support, but I think this
crash is not currently listed at bugzilla.elinks.cz.  Could you
post a self-contained test case?

Your crash was in format_frame():

	if (doc_view) {
		render_document(vs, doc_view, o);
		assert(doc_view->document);
		doc_view->document->frame = frame_desc;
	}

The assignment crashed because doc_view->document was not NULL
but pointed to freed memory.  render_document() calls
detach_formatted(), which sets doc_view->document = NULL; so the
dangling pointer must have been placed there after that.

I am not very familiar with this part of ELinks.
In 0.11, I think the way to debug this would be:

----------------------------------------------------------------------
Assert in done_document that no document_view points there.

This should help find the cause of the format_frame crash reported at
elinks-users.

---
commit 4ed1ea4b578fa145c3989c38ffc3e1e081195287
tree 7964249503382d465119634dc6857ad9463dadd2
parent 003d09ed781fb84fb711f42a82ddf89870ce10e4
author Kalle Olavi Niemitalo <[email protected]> Sun, 13 Apr 2008 21:31:20 +0300
committer Kalle Olavi Niemitalo <[email protected]> Sun, 13 Apr 2008 21:31:20 +0300

 src/document/document.c    |   19 +++++++++++++++++++
 src/document/html/frames.c |   11 +++++++++++
 src/document/view.h        |    9 +++++++++
 3 files changed, 39 insertions(+), 0 deletions(-)

diff --git a/src/document/document.c b/src/document/document.c
index 9765197..69d1a34 100644
--- a/src/document/document.c
+++ b/src/document/document.c
@@ -21,6 +21,7 @@
 #include "document/html/renderer.h"
 #include "document/options.h"
 #include "document/refresh.h"
+#include "document/view.h"
 #include "main/module.h"
 #include "main/object.h"
 #include "protocol/uri.h"
@@ -35,6 +36,10 @@
 
 static INIT_LIST_HEAD(format_cache);
 
+#ifdef CONFIG_DEBUG
+INIT_LIST_HEAD(debug_docview_refs);
+#endif
+
 struct document *
 init_document(struct cache_entry *cached, struct document_options *options)
 {
@@ -103,6 +108,18 @@ done_link_members(struct link *link)
 	mem_free_if(link->points);
 }
 
+#ifdef CONFIG_DEBUG
+void
+assert_document_not_in_any_view(struct document *document)
+{
+	struct debug_docview_ref *ref;
+	foreach (ref, debug_docview_refs)
+		assert(ref->doc_view->document != document);
+}
+#else
+# define assert_document_not_in_any_view (void)
+#endif
+
 void
 done_document(struct document *document)
 {
@@ -114,6 +131,8 @@ done_document(struct document *document)
 	assertm(!is_object_used(document), "Attempt to free locked formatted data.");
 	if_assert_failed return;
 
+	assert_document_not_in_any_view(document);
+
 	cached = find_in_cache(document->uri);
 	if (!cached)
 		INTERNAL("no cache entry for document");
diff --git a/src/document/html/frames.c b/src/document/html/frames.c
index d3d7134..03a4532 100644
--- a/src/document/html/frames.c
+++ b/src/document/html/frames.c
@@ -201,9 +201,20 @@ format_frame(struct session *ses, struct frame_desc *frame_desc,
 
 	doc_view = find_fd(ses, frame_desc->name, depth, o->box.x, o->box.y);
 	if (doc_view) {
+#ifdef CONFIG_DEBUG
+		struct debug_docview_ref ref;
+
+		ref.doc_view = doc_view;
+		add_to_list(debug_docview_refs, &ref);
+#endif
+
 		render_document(vs, doc_view, o);
 		assert(doc_view->document);
 		doc_view->document->frame = frame_desc;
+
+#ifdef CONFIG_DEBUG
+		del_from_list(&ref);
+#endif
 	}
 	o->plain = plain;
 
diff --git a/src/document/view.h b/src/document/view.h
index 931c1ca..d0179b6 100644
--- a/src/document/view.h
+++ b/src/document/view.h
@@ -47,4 +47,13 @@ struct document_view {
 	  && (doc_view)->vs->current_link < (doc_view)->document->nlinks) \
 	? &(doc_view)->document->links[(doc_view)->vs->current_link] : NULL)
 
+#ifdef CONFIG_DEBUG
+struct debug_docview_ref {
+	LIST_HEAD(struct debug_docview_ref);
+	struct document_view *doc_view;
+};
+
+extern struct list_head debug_docview_refs;
+#endif
+
 #endif
_______________________________________________
elinks-users mailing list
[email protected]
http://linuxfromscratch.org/mailman/listinfo/elinks-users
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.