Mercurial > mplayer.hg
view libmpdemux/stream_vcd.c @ 18066:2ee39341b7a6
fix segfault in the skin browser when sbSelectedSkin gets dereferenced before setting, when no skin is selected in the skin list upon opening the browser,
and "Cancel" or "OK" buttons get clicked.
Noticed when runnig freshly compiled gmplayer on a system where the skins were still under the old location.
based on a combined patch by Stanislav Maslovski <stanislav POIS maslovski AH gmail POIS com>
author | gpoirier |
---|---|
date | Sun, 09 Apr 2006 13:52:45 +0000 |
parents | 6ff3379a0862 |
children | d2d9d011203f |
line wrap: on
line source
#include "config.h" #ifdef HAVE_VCD #include "mp_msg.h" #include "stream.h" #include "help_mp.h" #include "m_option.h" #include "m_struct.h" #include <fcntl.h> #include <stdlib.h> #include <unistd.h> #include <sys/ioctl.h> #include <errno.h> #if defined(__FreeBSD__) || defined(__DragonFly__) #include <sys/cdrio.h> #include "vcd_read_fbsd.h" #elif defined(__NetBSD__) || defined (__OpenBSD__) #include "vcd_read_nbsd.h" #elif defined(SYS_DARWIN) #include "vcd_read_darwin.h" #else #include "vcd_read.h" #endif extern char *cdrom_device; static struct stream_priv_s { int track; char* device; } stream_priv_dflts = { 1, NULL }; #define ST_OFF(f) M_ST_OFF(struct stream_priv_s,f) /// URL definition static m_option_t stream_opts_fields[] = { { "track", ST_OFF(track), CONF_TYPE_INT, M_OPT_MIN, 1, 0, NULL }, { "device", ST_OFF(device), CONF_TYPE_STRING, 0, 0 ,0, NULL}, /// For url parsing { "hostname", ST_OFF(track), CONF_TYPE_INT, M_OPT_MIN, 1, 0, NULL }, { "filename", ST_OFF(device), CONF_TYPE_STRING, 0, 0 ,0, NULL}, { NULL, NULL, 0, 0, 0, 0, NULL } }; static struct m_struct_st stream_opts = { "vcd", sizeof(struct stream_priv_s), &stream_priv_dflts, stream_opts_fields }; static int fill_buffer(stream_t *s, char* buffer, int max_len){ if(s->pos > s->end_pos) /// don't past end of current track return 0; return vcd_read(s->priv,buffer); } static int seek(stream_t *s,off_t newpos) { s->pos = newpos; vcd_set_msf(s->priv,s->pos/VCD_SECTOR_DATA); return 1; } static void close_s(stream_t *stream) { free(stream->priv); } static int open_s(stream_t *stream,int mode, void* opts, int* file_format) { struct stream_priv_s* p = (struct stream_priv_s*)opts; int ret,ret2,f; mp_vcd_priv_t* vcd; #ifdef __FreeBSD__ int bsize = VCD_SECTOR_SIZE; #endif if(mode != STREAM_READ) { m_struct_free(&stream_opts,opts); return STREAM_UNSUPORTED; } if (!p->device) { if(cdrom_device) p->device = strdup(cdrom_device); else p->device = strdup(DEFAULT_CDROM_DEVICE); } f=open(p->device,O_RDONLY); if(f<0){ mp_msg(MSGT_OPEN,MSGL_ERR,MSGTR_CdDevNotfound,p->device); m_struct_free(&stream_opts,opts); return STREAM_ERROR; } vcd = vcd_read_toc(f); if(!vcd) { mp_msg(MSGT_OPEN,MSGL_ERR,"Failed to get cd toc\n"); close(f); m_struct_free(&stream_opts,opts); return STREAM_ERROR; } ret2=vcd_get_track_end(vcd,p->track); if(ret2<0){ mp_msg(MSGT_OPEN,MSGL_ERR,MSGTR_ErrTrackSelect " (get)\n"); close(f); free(vcd); m_struct_free(&stream_opts,opts); return STREAM_ERROR; } ret=vcd_seek_to_track(vcd,p->track); if(ret<0){ mp_msg(MSGT_OPEN,MSGL_ERR,MSGTR_ErrTrackSelect " (seek)\n"); close(f); free(vcd); m_struct_free(&stream_opts,opts); return STREAM_ERROR; } mp_msg(MSGT_OPEN,MSGL_V,"VCD start byte position: 0x%X end: 0x%X\n",ret,ret2); #ifdef __FreeBSD__ if (ioctl (f, CDRIOCSETBLOCKSIZE, &bsize) == -1) { mp_msg(MSGT_OPEN,MSGL_WARN,"Error in CDRIOCSETBLOCKSIZE"); } #endif stream->fd = f; stream->type = STREAMTYPE_VCD; stream->sector_size = VCD_SECTOR_DATA; stream->start_pos=ret; stream->end_pos=ret2; stream->priv = vcd; stream->fill_buffer = fill_buffer; stream->seek = seek; stream->close = close_s; m_struct_free(&stream_opts,opts); return STREAM_OK; } stream_info_t stream_info_vcd = { "Video CD", "vcd", "Albeu", "based on the code from ???", open_s, { "vcd", NULL }, &stream_opts, 1 // Urls are an option string }; #endif