pan-users
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Pan-users] debugging? (segmentation fault)


From: Rhialto
Subject: Re: [Pan-users] debugging? (segmentation fault)
Date: Sun, 13 Feb 2022 15:12:44 +0100

On Sat 12 Feb 2022 at 23:25:55 -0800, David Chmelik wrote:
> > When a segfault occurs, execute the command "backtrace".
>     This is some further information seen when running it and the
> backtrace,  The only thing different last few years is I've been trying to
> read a few hundred newsgroups on Eternal-September (backup server AIOE) and
> Gmane.
> 
> IA__gtk_tree_view_column_set_fixed_width: assertion 'fixed_width > 0' failed
> IA__gdk_window_get_state: assertion 'GDK_IS_WINDOW (window)' failed
> 
> (gdb) backtrace
> #0  0x00007ffff6acf4bc in ____strtoll_l_internal () at /lib64/libc.so.6
> #1  0x00007ffff6acb710 in atoi () at /lib64/libc.so.6
> #2  0x0000000000730692 in pan::DataImpl::load_headers(pan::DataIO const&,
> pan::Quark const&) (this=0x7fffffffd340, data_io=..., group=...)
>     at headers.cc:573

Ok, I'm not familiar with this code and I also haven't tried it in a
debugger, but here is some analysis from just observing.

If in frame # atoi() crashes, it must have gotten a bad pointer (such as
NULL). It gets it from line 573 in headers.cc:

          if (gotline && !expired)
          {
            StringView tok;
            s.ltrim ();
            s.pop_token (tok);
            const int number (atoi (tok.str)); <<< here

s is also a StringView, and pop_token puts the next word from it in tok:

bool
StringView :: pop_token (StringView& token, char delimiter)
{
   const bool got_token (len != 0);
   const char * pch = strchr (delimiter);
   if (pch) {
     token.str = str;
     token.len = pch - str;
     len -= token.len+1;
     str += token.len+1;
   } else {
     token.str = str;
     token.len = len;
     str = 0;
     len = 0;
   }
   return got_token;
}

token.src can never be a NULL pointer unless (this.)str already is NULL.

It looks like s.ltrim() can leave the str pointer NULL, if the string is
empty after trimming whitespace:

void
StringView :: ltrim ()
{
  // strip leading whitespace
  if (!empty()) {
    ..blah..
    eat_chars (p-str);
  }
}

void
StringView :: eat_chars (size_t n)
{
  n = std::min (n, len);
  len -= n;
  str = len ? str+n : 0;        <<<< here: can set to NULL
}

For this case, it would probably to to check tok.empty() before doing
calling atoi (tok.str).

I'm not sure what input it's trying to parse there: input from an nntp
server, or data that Pan wrote to a file earlier. In any case, clearly
it needs more checks. There are several other cases a bit earlier in the
file where atoi(tok.str) is called without checking if the token is
valid or not...

-Olaf.
-- 
___ "Buying carbon credits is a bit like a serial killer paying someone else to
\X/  have kids to make his activity cost neutral." -The BOFH    falu.nl@rhialto

Attachment: signature.asc
Description: PGP signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]