Hi all

the cddb module always causes a segfault on FreeBSD.

I've tracked down the cause of the problem to a structure defintion
which must be exceeding the available stack space for the thread
(following a report from Greg Rumple)

In freeamp/plm/metadata/cddb/cddb.cpp
in bool CDDB::ReadMetaData(const char* url, MetaData* metadata)
on line 111 is

     struct disc_data data;
     if (cddb_read_disc_data(data) < 0)
            return retvalue;


Even when the code is not executed, space for the stucture
is reserved by the compiler and this causes the seg fault.


Replacing this with a Malloc fixes the problem

        struct disc_data *p_data;
        p_data = (struct disc_data*)malloc(sizeof(disc_data));
        if (cddb_read_disc_data(p_data) < 0)
            return retvalue;


  There are then about 10 other refernces to data.xxx, which need to
  change to p_data->xxx  followed by an additional free(p_data)



A patch is attached.

Please please can we get this committed to FreeAMP before the
2.1 release.

With this fix, can play MP3s and HTTP streams on FreeBSD.
Console mode only at this time, but enough to say we have
a working FreeBSD solution.

Thanks
Roger
--
Roger Hardiman
Strathclyde Uni Telepresence Research Group, Glasgow, Scotland.
http://www.telepresence.strath.ac.uk      0141 548 2897
[EMAIL PROTECTED]
*** plm/metadata/cddb/cddb.cpp.orig     Wed Jun 21 14:34:36 2000
--- plm/metadata/cddb/cddb.cpp  Sat Oct  7 14:13:16 2000
*************** bool CDDB::ReadMetaData(const char* url,
*** 106,113 ****
  
          m_total_tracks = m_discinfo->disc_total_tracks;
  
!         struct disc_data data;
!         if (cddb_read_disc_data(&data) < 0)
              return retvalue;
  
          char *tracknumber = strrchr(url, DIR_MARKER);
--- 106,114 ----
  
          m_total_tracks = m_discinfo->disc_total_tracks;
  
!         struct disc_data *p_data;
!         p_data = (struct disc_data*)malloc(sizeof(disc_data));
!         if (cddb_read_disc_data(p_data) < 0)
              return retvalue;
  
          char *tracknumber = strrchr(url, DIR_MARKER);
*************** bool CDDB::ReadMetaData(const char* url,
*** 127,141 ****
              return retvalue;
  
          m_track--;
!         metadata->SetAlbum(data.data_title);
!         if (strlen(data.data_track[m_track].track_artist) > 0) 
!             metadata->SetArtist(data.data_track[m_track].track_artist);
          else
!             metadata->SetArtist(data.data_artist);
!         metadata->SetTitle(data.data_track[m_track].track_name);
!         metadata->SetComment(data.data_track[m_track].track_extended);
          metadata->SetTrack(m_track + 1);
!         metadata->SetGenre(cddb_genre(data.data_genre));
          metadata->SetTime(m_discinfo->disc_track[m_track].track_length.minutes *
                            60 +  
                            m_discinfo->disc_track[m_track].track_length.seconds);
--- 128,142 ----
              return retvalue;
  
          m_track--;
!         metadata->SetAlbum(p_data->data_title);
!         if (strlen(p_data->data_track[m_track].track_artist) > 0) 
!             metadata->SetArtist(p_data->data_track[m_track].track_artist);
          else
!             metadata->SetArtist(p_data->data_artist);
!         metadata->SetTitle(p_data->data_track[m_track].track_name);
!         metadata->SetComment(p_data->data_track[m_track].track_extended);
          metadata->SetTrack(m_track + 1);
!         metadata->SetGenre(cddb_genre(p_data->data_genre));
          metadata->SetTime(m_discinfo->disc_track[m_track].track_length.minutes *
                            60 +  
                            m_discinfo->disc_track[m_track].track_length.seconds);
*************** bool CDDB::ReadMetaData(const char* url,
*** 143,148 ****
--- 144,150 ----
          retvalue = true;
  
        delete pmo;
+       free(p_data);
      }
      return retvalue;
  }

Reply via email to