diff --git a/Makefile b/Makefile index 5c1320d..7ec7028 100644 --- a/Makefile +++ b/Makefile @@ -118,7 +118,7 @@ inotify.o: inotify.h playlist.h image_utils.o: image_utils.h tivo_utils.o: config.h tivo_utils.h tivo_beacon.o: config.h tivo_beacon.h tivo_utils.h -tivo_commands.o: config.h tivo_commands.h tivo_utils.h +tivo_commands.o: config.h tivo_commands.h tivo_utils.h utils.h utils.o: utils.h sql.o: sql.h log.o: log.h diff --git a/inotify.c b/inotify.c index 6c32d24..06f1529 100644 --- a/inotify.c +++ b/inotify.c @@ -492,9 +492,7 @@ inotify_insert_directory(int fd, char *name, const char * path) { if( e->d_name[0] == '.' ) continue; - esc_name = escape_tag(e->d_name); - if( !esc_name ) - esc_name = strdup(e->d_name); + esc_name = escape_tag(e->d_name, 1); asprintf(&path_buf, "%s/%s", path, e->d_name); switch( e->d_type ) { diff --git a/metadata.c b/metadata.c index 3adb4a7..6fe9c2a 100644 --- a/metadata.c +++ b/metadata.c @@ -381,7 +381,7 @@ GetAudioMetadata(const char * path, char * name) if( song.title && *song.title ) { m.title = trim(song.title); - if( (esc_tag = escape_tag(m.title)) ) + if( (esc_tag = escape_tag(m.title, 0)) ) { free_flags |= FLAG_TITLE; m.title = esc_tag; @@ -401,7 +401,7 @@ GetAudioMetadata(const char * path, char * name) m.creator = strdup("Various Artists"); free_flags |= FLAG_CREATOR; } - else if( (esc_tag = escape_tag(m.creator)) ) + else if( (esc_tag = escape_tag(m.creator, 0)) ) { m.creator = esc_tag; free_flags |= FLAG_CREATOR; @@ -422,7 +422,7 @@ GetAudioMetadata(const char * path, char * name) m.artist = strdup("Various Artists"); free_flags |= FLAG_ARTIST; } - else if( (esc_tag = escape_tag(m.artist)) ) + else if( (esc_tag = escape_tag(m.artist, 0)) ) { m.artist = esc_tag; free_flags |= FLAG_ARTIST; @@ -432,7 +432,7 @@ GetAudioMetadata(const char * path, char * name) if( song.album && *song.album ) { m.album = trim(song.album); - if( (esc_tag = escape_tag(m.album)) ) + if( (esc_tag = escape_tag(m.album, 0)) ) { free_flags |= FLAG_ALBUM; m.album = esc_tag; @@ -441,7 +441,7 @@ GetAudioMetadata(const char * path, char * name) if( song.genre && *song.genre ) { m.genre = trim(song.genre); - if( (esc_tag = escape_tag(m.genre)) ) + if( (esc_tag = escape_tag(m.genre, 0)) ) { free_flags |= FLAG_GENRE; m.genre = esc_tag; @@ -450,7 +450,7 @@ GetAudioMetadata(const char * path, char * name) if( song.comment && *song.comment ) { m.comment = trim(song.comment); - if( (esc_tag = escape_tag(m.comment)) ) + if( (esc_tag = escape_tag(m.comment, 0)) ) { free_flags |= FLAG_COMMENT; m.comment = esc_tag; @@ -1398,19 +1398,19 @@ GetVideoMetadata(const char * path, char * name) { if( video.title && *video.title ) { - m.title = strdup(trim(video.title)); + m.title = escape_tag(trim(video.title), 1); } if( video.genre && *video.genre ) { - m.genre = strdup(trim(video.genre)); + m.genre = escape_tag(trim(video.genre), 1); } if( video.contributor[ROLE_TRACKARTIST] && *video.contributor[ROLE_TRACKARTIST] ) { - m.artist = strdup(trim(video.contributor[ROLE_TRACKARTIST])); + m.artist = escape_tag(trim(video.contributor[ROLE_TRACKARTIST]), 1); } if( video.contributor[ROLE_ALBUMARTIST] && *video.contributor[ROLE_ALBUMARTIST] ) { - m.creator = strdup(trim(video.contributor[ROLE_ALBUMARTIST])); + m.creator = escape_tag(trim(video.contributor[ROLE_ALBUMARTIST]), 1); } else { @@ -1419,6 +1419,7 @@ GetVideoMetadata(const char * path, char * name) } } } + #ifndef NETGEAR #if LIBAVFORMAT_VERSION_INT >= ((52<<16)+(31<<8)+0) else if( strcmp(ctx->iformat->name, "mov,mp4,m4a,3gp,3g2,mj2") == 0 ) { @@ -1431,17 +1432,18 @@ GetVideoMetadata(const char * path, char * name) { //DEBUG DPRINTF(E_DEBUG, L_METADATA, " %-16s: %s\n", tag->key, tag->value); if( strcmp(tag->key, "title") == 0 ) - m.title = strdup(trim(tag->value)); + m.title = escape_tag(trim(tag->value), 1); else if( strcmp(tag->key, "genre") == 0 ) - m.genre = strdup(trim(tag->value)); + m.genre = escape_tag(trim(tag->value), 1); else if( strcmp(tag->key, "artist") == 0 ) - m.artist = strdup(trim(tag->value)); + m.artist = escape_tag(trim(tag->value), 1); else if( strcmp(tag->key, "comment") == 0 ) - m.comment = strdup(trim(tag->value)); + m.comment = escape_tag(trim(tag->value), 1); } } } #endif + #endif video_no_dlna: av_close_input_file(ctx); diff --git a/scanner.c b/scanner.c index ba58510..a2880d0 100644 --- a/scanner.c +++ b/scanner.c @@ -760,7 +760,7 @@ ScanDirectory(const char * dir, const char * parent, enum media_types dir_type) #endif type = TYPE_UNKNOWN; sprintf(full_path, "%s/%s", dir, namelist[i]->d_name); - name = escape_tag(namelist[i]->d_name); + name = escape_tag(namelist[i]->d_name, 1); if( namelist[i]->d_type == DT_DIR ) { type = TYPE_DIR; @@ -775,17 +775,16 @@ ScanDirectory(const char * dir, const char * parent, enum media_types dir_type) } if( (type == TYPE_DIR) && (access(full_path, R_OK|X_OK) == 0) ) { - insert_directory(name?name:namelist[i]->d_name, full_path, BROWSEDIR_ID, (parent ? parent:""), i+startID); + insert_directory(name, full_path, BROWSEDIR_ID, (parent ? parent:""), i+startID); sprintf(parent_id, "%s$%X", (parent ? parent:""), i+startID); ScanDirectory(full_path, parent_id, dir_type); } else if( type == TYPE_FILE ) { - if( insert_file(name?name:namelist[i]->d_name, full_path, (parent ? parent:""), i+startID) == 0 ) + if( insert_file(name, full_path, (parent ? parent:""), i+startID) == 0 ) fileno++; } - if( name ) - free(name); + free(name); free(namelist[i]); } free(namelist); diff --git a/tivo_commands.c b/tivo_commands.c index 73ea96d..16074bc 100644 --- a/tivo_commands.c +++ b/tivo_commands.c @@ -256,16 +256,14 @@ int callback(void *args, int argc, char **argv, char **azColName) passed_args->size += ret; if( flags & FLAG_VIDEO ) { - char *name = basename(path); - char *esc_name = escape_tag(name); + char *esc_name = escape_tag(basename(path), 1); ret = sprintf(str_buf, "" "video/*" "urn:tivo:image:save-until-i-delete-recording" "" "Videos" - "%s ", esc_name?esc_name:name); - if( esc_name ) - free(esc_name); + "%s ", esc_name); + free(esc_name); } else { @@ -415,9 +413,7 @@ SendContainer(struct upnphttp * h, const char * objectID, int itemStart, int ite sql = sqlite3_mprintf("SELECT NAME from OBJECTS where OBJECT_ID = '%s'", objectID); if( (sql_get_table(db, sql, &result, &ret, NULL) == SQLITE_OK) && ret ) { - title = escape_tag(result[1]); - if( !title ) - title = strdup(result[1]); + title = escape_tag(result[1], 1); } else title = strdup("UNKNOWN"); diff --git a/utils.c b/utils.c index 9192d20..acd3796 100644 --- a/utils.c +++ b/utils.c @@ -136,7 +136,7 @@ modifyString(char * string, const char * before, const char * after, short like) } char * -escape_tag(const char *tag) +escape_tag(const char *tag, uint8_t force_alloc) { char *esc_tag = NULL; @@ -147,6 +147,8 @@ escape_tag(const char *tag) esc_tag = modifyString(esc_tag, "<", "&lt;", 0); esc_tag = modifyString(esc_tag, ">", "&gt;", 0); } + else if( force_alloc ) + esc_tag = strdup(tag); return esc_tag; } diff --git a/utils.h b/utils.h index 5d8c4b8..8bb79e7 100644 --- a/utils.h +++ b/utils.h @@ -37,7 +37,7 @@ char * modifyString(char * string, const char * before, const char * after, short like); char * -escape_tag(const char *tag); +escape_tag(const char *tag, uint8_t force_alloc); void strip_ext(char * name);