Whenever I visit http://puppyisos.org/isos (puppy / linux), Dillo
segfaults. The reason is that in some cases the variable Client_bw
is NULL. However, some functions depend on it and access its member
variables.
Client_bw is initialized in Cache_process_queue() (src/cache.c).
When authentication is required, this variable is passed over to
Cache_auth_entry() which sets a timeout. Its callback
(Cache_auth_callback()) opens up a dialog asking for the credentials
and then calls a_Nav_reload() with the Client_bw as its first
parameter. Finally in a_Nav_cancel_expect() Client_bw's member
variable nav_expecting is used and as bw is NULL, Dillo segfaults.
I came up with a small patch that removes Cache_auth_callback() and
Cache_auth_entry() as I have not seen any advantages in delaying the
authentication popup. The next thing I did was to show the dialog on
condition that Client_bw is not NULL and that we have finished the
transfer (At least I hope CA_Close is the proper flag for doing so).
There were various unnecessary checks in src/nav.c. They compared bw
with NULL. In my opinion the affected functions (a_Nav_expect_done,
a_Nav_push and a_Nav_repush) should never be called if you cannot be
sure that bw is not NUL. What is your view on this subject?
Unfortunately, my approach does not solve the original problem that
caused Client_bw being NULL. Furthermore, the patch introduces a new
bug: The dialog pops up when reloading the site but after having
entered the correct credentials or having pressed the ``Cancel''
button, it appears again. Any ideas?
While digging deeper into the code, I noticed that we make heavy use
of timers for popups and reloading pages? Is there any special
reason for it?
--Tim