Commit 93bbc62c authored by John Stebbins's avatar John Stebbins

libhb: eliminate file path length limits

parent 7e5b372e
......@@ -38,7 +38,7 @@ static int title_info_compare_mpls(const void *, const void *);
***********************************************************************
*
**********************************************************************/
hb_bd_t * hb_bd_init( hb_handle_t *h, char * path )
hb_bd_t * hb_bd_init( hb_handle_t *h, const char * path )
{
hb_bd_t * d;
int ii;
......@@ -281,14 +281,12 @@ hb_title_t * hb_bd_title_scan( hb_bd_t * d, int tt, uint64_t min_duration )
if (d->disc_info->disc_name != NULL && d->disc_info->disc_name[0] != 0)
{
strncpy(title->name, d->disc_info->disc_name, sizeof(title->name));
title->name[sizeof(title->name) - 1] = 0;
title->name = strdup(d->disc_info->disc_name);
}
else if (d->disc_info->udf_volume_id != NULL &&
d->disc_info->udf_volume_id[0] != 0)
{
strncpy(title->name, d->disc_info->udf_volume_id, sizeof(title->name));
title->name[sizeof(title->name) - 1] = 0;
title->name = strdup(d->disc_info->udf_volume_id);
}
else
{
......@@ -300,7 +298,7 @@ hb_title_t * hb_bd_title_scan( hb_bd_t * d, int tt, uint64_t min_duration )
p_last = &p_cur[1];
}
}
snprintf(title->name, sizeof( title->name ), "%s", p_last);
title->name = strdup(p_last);
char *dot_term = strrchr(title->name, '.');
if (dot_term)
*dot_term = '\0';
......
......@@ -3681,7 +3681,7 @@ hb_title_t * hb_title_init( char * path, int index )
t->list_subtitle = hb_list_init();
t->list_attachment = hb_list_init();
t->metadata = hb_metadata_init();
strncat(t->path, path, sizeof(t->path) - 1);
t->path = strdup(path);
// default to decoding mpeg2
t->video_id = 0xE0;
t->video_codec = WORK_DECAVCODECV;
......@@ -3738,7 +3738,9 @@ void hb_title_close( hb_title_t ** _t )
hb_metadata_close( &t->metadata );
free( t->video_codec_name );
free((char*)t->name);
free((char*)t->path);
free(t->video_codec_name);
free(t->container_name);
free( t );
......@@ -4817,6 +4819,10 @@ hb_subtitle_t *hb_subtitle_copy(const hb_subtitle_t *src)
{
subtitle->config.name = strdup(src->config.name);
}
if (src->config.src_filename)
{
subtitle->config.src_filename = strdup(src->config.src_filename);
}
}
return subtitle;
}
......@@ -4850,15 +4856,17 @@ hb_list_t *hb_subtitle_list_copy(const hb_list_t *src)
**********************************************************************
*
*********************************************************************/
void hb_subtitle_close( hb_subtitle_t **sub )
void hb_subtitle_close( hb_subtitle_t **_sub )
{
if ( sub && *sub )
hb_subtitle_t * sub = *_sub;
if ( _sub && sub )
{
free ((char*)(*sub)->name);
free ((char*)(*sub)->config.name);
free ((*sub)->extradata);
free(*sub);
*sub = NULL;
free((char*)sub->name);
free((char*)sub->config.name);
free((char*)sub->config.src_filename);
free(sub->extradata);
free(sub);
*_sub = NULL;
}
}
......@@ -4919,6 +4927,7 @@ int hb_subtitle_add(const hb_job_t * job, const hb_subtitle_config_t * subtitlec
{
subtitle->config.name = strdup(subtitlecfg->name);
}
subtitle->config.src_filename = NULL;
subtitle->out_track = hb_list_count(job->list_subtitle) + 1;
hb_list_add(job->list_subtitle, subtitle);
return 1;
......@@ -4962,6 +4971,7 @@ int hb_import_subtitle_add( const hb_job_t * job,
{
subtitle->config.name = strdup(subtitlecfg->name);
}
subtitle->config.src_filename = strdup(subtitlecfg->src_filename);
hb_list_add(job->list_subtitle, subtitle);
return 1;
......
......@@ -302,9 +302,9 @@ struct hb_subtitle_config_s
const char * name;
/* SRT subtitle tracks only */
char src_filename[256];
char src_codeset[40];
int64_t offset;
const char * src_filename;
char src_codeset[40];
int64_t offset;
};
/*******************************************************************************
......@@ -457,7 +457,7 @@ struct hb_title_set_s
{
hb_list_t * list_title;
int feature; // Detected DVD feature title
char path[1024];
const char * path;
};
typedef enum
......@@ -1047,8 +1047,8 @@ struct hb_title_s
{
enum { HB_DVD_TYPE, HB_BD_TYPE, HB_STREAM_TYPE, HB_FF_STREAM_TYPE } type;
uint32_t reg_desc;
char path[1024];
char name[1024];
const char * path;
const char * name;
int index;
int playlist;
int angle_count;
......
......@@ -15,7 +15,7 @@
#include "dvdread/ifo_print.h"
#include "dvdread/nav_read.h"
static hb_dvd_t * hb_dvdread_init( hb_handle_t * h, char * path );
static hb_dvd_t * hb_dvdread_init( hb_handle_t * h, const char * path );
static void hb_dvdread_close( hb_dvd_t ** _d );
static char * hb_dvdread_name( char * path );
static int hb_dvdread_title_count( hb_dvd_t * d );
......@@ -106,7 +106,7 @@ static char * hb_dvdread_name( char * path )
***********************************************************************
*
**********************************************************************/
hb_dvd_t * hb_dvdread_init( hb_handle_t * h, char * path )
hb_dvd_t * hb_dvdread_init( hb_handle_t * h, const char * path )
{
hb_dvd_t * e;
hb_dvdread_t * d;
......@@ -310,6 +310,7 @@ static hb_title_t * hb_dvdread_title_scan( hb_dvd_t * e, int t, uint64_t min_dur
ifo_handle_t * vts = NULL;
int pgc_id, pgn, i;
hb_chapter_t * chapter;
char name[1024];
unsigned char unused[1024];
const char * codec_name;
......@@ -318,8 +319,7 @@ static hb_title_t * hb_dvdread_title_scan( hb_dvd_t * e, int t, uint64_t min_dur
title = hb_title_init( d->path, t );
title->type = HB_DVD_TYPE;
if( DVDUDFVolumeInfo( d->reader, title->name, sizeof( title->name ),
unused, sizeof( unused ) ) )
if( DVDUDFVolumeInfo(d->reader, name, sizeof(name), unused, sizeof(unused)))
{
char * p_cur, * p_last = d->path;
for( p_cur = d->path; *p_cur; p_cur++ )
......@@ -329,11 +329,15 @@ static hb_title_t * hb_dvdread_title_scan( hb_dvd_t * e, int t, uint64_t min_dur
p_last = &p_cur[1];
}
}
snprintf( title->name, sizeof( title->name ), "%s", p_last );
title->name = strdup(p_last);
char *dot_term = strrchr(title->name, '.');
if (dot_term)
*dot_term = '\0';
}
else
{
title->name = strdup(name);
}
/* VTS which our title is in */
int title_vts = d->vmg->tt_srpt->title[t-1].title_set_nr;
......@@ -1296,6 +1300,7 @@ static void hb_dvdread_close( hb_dvd_t ** _d )
DVDClose( d->reader );
}
free( d->path );
free( d );
*_d = NULL;
}
......@@ -1378,7 +1383,7 @@ char * hb_dvd_name( char * path )
return dvd_methods->name(path);
}
hb_dvd_t * hb_dvd_init( hb_handle_t * h, char * path )
hb_dvd_t * hb_dvd_init( hb_handle_t * h, const char * path )
{
return dvd_methods->init(h, path);
}
......
......@@ -96,7 +96,7 @@ union hb_dvd_s
struct hb_dvd_func_s
{
hb_dvd_t * (* init) ( hb_handle_t *, char * );
hb_dvd_t * (* init) ( hb_handle_t *, const char * );
void (* close) ( hb_dvd_t ** );
char * (* name) ( char * );
int (* title_count) ( hb_dvd_t * );
......
......@@ -19,7 +19,7 @@
#define DVD_READ_CACHE 1
static char * hb_dvdnav_name( char * path );
static hb_dvd_t * hb_dvdnav_init( hb_handle_t * h, char * path );
static hb_dvd_t * hb_dvdnav_init( hb_handle_t * h, const char * path );
static int hb_dvdnav_title_count( hb_dvd_t * d );
static hb_title_t * hb_dvdnav_title_scan( hb_dvd_t * d, int t, uint64_t min_duration );
static int hb_dvdnav_start( hb_dvd_t * d, hb_title_t *title, int chapter );
......@@ -150,7 +150,7 @@ fail:
***********************************************************************
*
**********************************************************************/
static hb_dvd_t * hb_dvdnav_init( hb_handle_t * h, char * path )
static hb_dvd_t * hb_dvdnav_init( hb_handle_t * h, const char * path )
{
hb_dvd_t * e;
hb_dvdnav_t * d;
......@@ -458,7 +458,8 @@ static hb_title_t * hb_dvdnav_title_scan( hb_dvd_t * e, int t, uint64_t min_dura
hb_chapter_t * chapter;
hb_dvd_chapter_t * dvd_chapter;
int count;
const char * name;
const char * title_string;
char name[1024];
unsigned char unused[1024];
const char * codec_name;
......@@ -466,30 +467,33 @@ static hb_title_t * hb_dvdnav_title_scan( hb_dvd_t * e, int t, uint64_t min_dura
title = hb_title_init( d->path, t );
title->type = HB_DVD_TYPE;
if (dvdnav_get_title_string(d->dvdnav, &name) == DVDNAV_STATUS_OK)
if (dvdnav_get_title_string(d->dvdnav, &title_string) == DVDNAV_STATUS_OK)
{
strncpy(title->name, name, sizeof(title->name) - 1);
title->name[sizeof(title->name) - 1] = 0;
title->name = strdup(title_string);
}
if (strlen(title->name) == 0)
if (title->name == NULL || title->name[0] == 0)
{
if( DVDUDFVolumeInfo( d->reader, title->name, sizeof( title->name ),
unused, sizeof( unused ) ) )
free((char*)title->name);
if (DVDUDFVolumeInfo(d->reader, name, sizeof(name),
unused, sizeof(unused)))
{
char * p_cur, * p_last = d->path;
for( p_cur = d->path; *p_cur; p_cur++ )
{
if( IS_DIR_SEP(p_cur[0]) && p_cur[1] )
char * p_cur, * p_last = d->path;
for( p_cur = d->path; *p_cur; p_cur++ )
{
p_last = &p_cur[1];
if( IS_DIR_SEP(p_cur[0]) && p_cur[1] )
{
p_last = &p_cur[1];
}
}
title->name = strdup(p_last);
char *dot_term = strrchr(title->name, '.');
if (dot_term)
*dot_term = '\0';
}
snprintf( title->name, sizeof( title->name ), "%s", p_last );
char *dot_term = strrchr(title->name, '.');
if (dot_term)
*dot_term = '\0';
else
{
title->name = strdup(name);
}
}
......
......@@ -365,7 +365,7 @@ void hb_scan( hb_handle_t * h, const char * path, int title_index,
hb_title_t * title;
// Check if scanning is necessary.
if (!strcmp(h->title_set.path, path))
if (h->title_set.path != NULL && !strcmp(h->title_set.path, path))
{
// Current title_set path matches requested path.
// Check if the requested title has already been scanned.
......@@ -408,6 +408,8 @@ void hb_scan( hb_handle_t * h, const char * path, int title_index,
hb_list_rem( h->title_set.list_title, title );
hb_title_close( &title );
}
free((char*)h->title_set.path);
h->title_set.path = NULL;
/* Print CPU info here so that it's in all scan and encode logs */
const char *cpu_name = hb_get_cpu_name();
......@@ -435,7 +437,8 @@ void hb_scan( hb_handle_t * h, const char * path, int title_index,
void hb_force_rescan( hb_handle_t * h )
{
h->title_set.path[0] = 0;
free((char*)h->title_set.path);
h->title_set.path = NULL;
}
/**
......@@ -1642,6 +1645,8 @@ void hb_close( hb_handle_t ** _h )
hb_title_close( &title );
}
hb_list_close( &h->title_set.list_title );
free((char*)h->title_set.path);
h->title_set.path = NULL;
hb_list_close( &h->jobs );
hb_lock_close( &h->state_lock );
......
......@@ -922,11 +922,13 @@ char* hb_job_to_json( const hb_job_t * job )
// These functions exist only to perform type checking when using
// json_unpack_ex().
typedef const char * const_str_t;
static double* unpack_f(double *f) { return f; }
static int* unpack_i(int *i) { return i; }
static json_int_t* unpack_I(json_int_t *i) { return i; }
static int * unpack_b(int *b) { return b; }
static const char** unpack_s(const char **s){ return s; }
static const_str_t* unpack_s(const_str_t *s){ return s; }
static json_t** unpack_o(json_t** o) { return o; }
void hb_json_job_scan( hb_handle_t * h, const char * json_job )
......@@ -1633,8 +1635,7 @@ hb_job_t* hb_dict_to_job( hb_handle_t * h, hb_dict_t *dict )
}
else if (importfile != NULL)
{
strncpy(sub_config.src_filename, importfile, 255);
sub_config.src_filename[255] = 0;
sub_config.src_filename = importfile;
const char * lang = "und";
const char * srtcodeset = "UTF-8";
......
......@@ -323,7 +323,7 @@ typedef struct hb_bd_s hb_bd_t;
typedef union hb_dvd_s hb_dvd_t;
typedef struct hb_stream_s hb_stream_t;
hb_dvd_t * hb_dvd_init( hb_handle_t * h, char * path );
hb_dvd_t * hb_dvd_init( hb_handle_t * h, const char * path );
int hb_dvd_title_count( hb_dvd_t * );
hb_title_t * hb_dvd_title_scan( hb_dvd_t *, int title, uint64_t min_duration );
int hb_dvd_start( hb_dvd_t *, hb_title_t *title, int chapter );
......@@ -337,7 +337,7 @@ int hb_dvd_angle_count( hb_dvd_t * d );
void hb_dvd_set_angle( hb_dvd_t * d, int angle );
int hb_dvd_main_feature( hb_dvd_t * d, hb_list_t * list_title );
hb_bd_t * hb_bd_init( hb_handle_t *h, char * path );
hb_bd_t * hb_bd_init( hb_handle_t *h, const char * path );
int hb_bd_title_count( hb_bd_t * d );
hb_title_t * hb_bd_title_scan( hb_bd_t * d, int t, uint64_t min_duration );
int hb_bd_start( hb_bd_t * d, hb_title_t *title );
......@@ -353,7 +353,7 @@ int hb_bd_main_feature( hb_bd_t * d, hb_list_t * list_title );
hb_stream_t * hb_bd_stream_open( hb_handle_t *h, hb_title_t *title );
void hb_ts_stream_reset(hb_stream_t *stream);
hb_stream_t * hb_stream_open(hb_handle_t *h, char * path,
hb_stream_t * hb_stream_open(hb_handle_t *h, const char * path,
hb_title_t *title, int scan);
void hb_stream_close( hb_stream_t ** );
hb_title_t * hb_stream_title_scan( hb_stream_t *, hb_title_t *);
......
......@@ -295,12 +295,12 @@ static void ScanFunc( void * _data )
}
if (hb_list_count(data->title_set->list_title) > 0)
{
strncpy(data->title_set->path, data->path, 1024);
data->title_set->path[1023] = 0;
data->title_set->path = strdup(data->path);
}
else
{
data->title_set->path[0] = 0;
free((char*)data->title_set->path);
data->title_set->path = NULL;
}
finish:
......
......@@ -813,7 +813,7 @@ static void prune_streams(hb_stream_t *d)
*
**********************************************************************/
hb_stream_t *
hb_stream_open(hb_handle_t *h, char *path, hb_title_t *title, int scan)
hb_stream_open(hb_handle_t *h, const char *path, hb_title_t *title, int scan)
{
if (title == NULL)
{
......@@ -1052,9 +1052,11 @@ hb_title_t * hb_stream_title_scan(hb_stream_t *stream, hb_title_t * title)
title->type = HB_STREAM_TYPE;
// Copy part of the stream path to the title name
char *sep = hb_strr_dir_sep(stream->path);
char * name = stream->path;
char * sep = hb_strr_dir_sep(stream->path);
if (sep)
strcpy(title->name, sep+1);
name = sep + 1;
title->name = strdup(name);
char *dot_term = strrchr(title->name, '.');
if (dot_term)
*dot_term = '\0';
......@@ -5685,9 +5687,11 @@ static hb_title_t *ffmpeg_title_scan( hb_stream_t *stream, hb_title_t *title )
title->type = HB_FF_STREAM_TYPE;
// Copy part of the stream path to the title name
char *sep = hb_strr_dir_sep(stream->path);
char * name = stream->path;
char * sep = hb_strr_dir_sep(stream->path);
if (sep)
strcpy(title->name, sep+1);
name = sep + 1;
title->name = strdup(name);
char *dot_term = strrchr(title->name, '.');
if (dot_term)
*dot_term = '\0';
......
......@@ -264,8 +264,7 @@
sub_config.offset = subTrack.offset;
// we need to strncpy file name and codeset
strncpy(sub_config.src_filename, subTrack.fileURL.fileSystemRepresentation, 255);
sub_config.src_filename[255] = 0;
sub_config.src_filename = subTrack.fileURL.fileSystemRepresentation;
strncpy(sub_config.src_codeset, subTrack.charCode.UTF8String, 39);
sub_config.src_codeset[39] = 0;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment