diff options
author | wiz <wiz@pkgsrc.org> | 2010-02-16 09:01:46 +0000 |
---|---|---|
committer | wiz <wiz@pkgsrc.org> | 2010-02-16 09:01:46 +0000 |
commit | f2fb550aedd216b72f376c093bd75959825c5685 (patch) | |
tree | 272dbe0d347f5a734d739d6e3cfb1e8d38a436c7 /audio/amarok/patches | |
parent | 777266b08934799fe5f835622c87e014ea25d0f8 (diff) | |
download | pkgsrc-f2fb550aedd216b72f376c093bd75959825c5685.tar.gz |
Update to 2.2.2nb3 from wip, packaged by myself.
This is the KDE4 version of amarok, lots of changes. Try it out!
Diffstat (limited to 'audio/amarok/patches')
-rw-r--r-- | audio/amarok/patches/patch-aa | 401 | ||||
-rw-r--r-- | audio/amarok/patches/patch-ab | 32 | ||||
-rw-r--r-- | audio/amarok/patches/patch-ac | 27 | ||||
-rw-r--r-- | audio/amarok/patches/patch-ad | 89 |
4 files changed, 384 insertions, 165 deletions
diff --git a/audio/amarok/patches/patch-aa b/audio/amarok/patches/patch-aa index 3d513f26024..f82c07575cc 100644 --- a/audio/amarok/patches/patch-aa +++ b/audio/amarok/patches/patch-aa @@ -1,46 +1,369 @@ -$NetBSD: patch-aa,v 1.14 2008/09/22 05:35:20 wiz Exp $ +$NetBSD: patch-aa,v 1.15 2010/02/16 09:01:46 wiz Exp $ ---- amarok/src/mediadevice/mtp/mtpmediadevice.cpp.orig 2008-08-13 23:21:51.000000000 +0200 -+++ amarok/src/mediadevice/mtp/mtpmediadevice.cpp -@@ -293,12 +293,13 @@ MediaItem - parent_id = getDefaultParentId(); +post-2.2.2 patch from upstream + +--- src/collection/sqlcollection/ScanResultProcessor.cpp.orig 2010-01-06 22:19:46.000000000 +0000 ++++ src/collection/sqlcollection/ScanResultProcessor.cpp +@@ -42,19 +42,59 @@ ScanResultProcessor::ScanResultProcessor + ScanResultProcessor::~ScanResultProcessor() + { + //everything has a URL, so enough to just delete from here ++ QSet<QStringList*> currSet; //prevent double deletes + foreach( QStringList *list, m_urlsHashByUid ) +- delete list; ++ { ++ if( list ) ++ { ++ if( !currSet.contains( list ) ) ++ { ++ delete list; ++ currSet.insert( list ); ++ } ++ } ++ else ++ debug() << "GAAH! Tried to double-delete a value in m_urlsHashByUid"; ++ } + foreach( QLinkedList<QStringList*> *list, m_albumsHashByName ) + { +- foreach( QStringList *slist, *list ) +- delete slist; +- delete list; ++ if( list ) ++ { ++ foreach( QStringList *slist, *list ) ++ { ++ if( slist ) ++ { ++ if( !currSet.contains( slist ) ) ++ { ++ delete slist; ++ currSet.insert( slist ); ++ } ++ else ++ debug() << "GAAH! Tried to double-delete a value in m_albumsHashByName"; ++ } ++ } ++ delete list; ++ } + } + foreach( QLinkedList<QStringList*> *list, m_tracksHashByAlbum ) + { +- foreach( QStringList *slist, *list ) +- delete slist; +- delete list; ++ if( list ) ++ { ++ foreach( QStringList *slist, *list ) ++ { ++ if( slist ) ++ { ++ if( !currSet.contains( slist ) ) ++ { ++ delete slist; ++ currSet.insert( slist ); ++ } ++ else ++ debug() << "GAAH! Tried to double-delete a value in m_tracksHashByAlbum"; ++ } ++ } ++ delete list; ++ } } - debug() << "Parent id : " << parent_id << endl; -+ trackmeta->parent_id = parent_id; + } - m_critical_mutex.lock(); - debug() << "Sending track... " << bundle.url().path().utf8() << endl; - int ret = LIBMTP_Send_Track_From_File( - m_device, bundle.url().path().utf8(), trackmeta, -- progressCallback, this, parent_id -+ progressCallback, this - ); - m_critical_mutex.unlock(); +@@ -67,11 +107,11 @@ ScanResultProcessor::setScanType( ScanTy + void + ScanResultProcessor::addDirectory( const QString &dir, uint mtime ) + { +- DEBUG_BLOCK +- debug() << "SRP::addDirectory on " << dir << " with mtime " << mtime; ++ //DEBUG_BLOCK ++ //debug() << "SRP::addDirectory on " << dir << " with mtime " << mtime; + if( dir.isEmpty() ) + { +- debug() << "got directory with no path from the scanner, not adding"; ++ //debug() << "got directory with no path from the scanner, not adding"; + return; + } + setupDatabase(); +@@ -254,7 +294,7 @@ ScanResultProcessor::rollback() + void + ScanResultProcessor::processDirectory( const QList<QVariantMap > &data ) + { +-// DEBUG_BLOCK ++ //DEBUG_BLOCK + setupDatabase(); + //using the following heuristics: + //if more than one album is in the dir, use the artist of each track as albumartist +@@ -274,24 +314,54 @@ ScanResultProcessor::processDirectory( c + if( row.value( Field::ALBUM ).toString() != album ) + multipleAlbums = true; + } ++ + if( multipleAlbums || album.isEmpty() || artists.size() == 1 ) + { + foreach( const QVariantMap &row, data ) + { +- int artist = genericId( &m_artists, row.value( Field::ARTIST ).toString(), &m_nextArtistNum ); +- addTrack( row, artist ); ++ QString uid = row.value( Field::UNIQUEID ).toString(); ++ if( m_uidsSeenThisScan.contains( uid ) ) ++ { ++ QString originalLocation = ( ( m_urlsHashByUid.contains( uid ) && ++ m_urlsHashByUid[uid] != 0 ) ? ++ MountPointManager::instance()->getAbsolutePath( m_urlsHashByUid[uid]->at( 1 ).toInt(), m_urlsHashByUid[uid]->at( 2 ) ) : "(unknown)" ); ++ debug() << "Skipping file with uniqueid " << uid << " as it was already seen this scan," << ++ "file is at " << row.value( Field::URL ).toString() << ", original file is at " << originalLocation; ++ } ++ else ++ { ++ int artist = genericId( &m_artists, row.value( Field::ARTIST ).toString(), &m_nextArtistNum ); ++ //debug() << "artist found = " << artist; ++ addTrack( row, artist ); ++ m_uidsSeenThisScan.insert( uid ); ++ } + } + } + else + { + QString albumArtist = findAlbumArtist( artists, data.count() ); ++ //debug() << "albumArtist found = " << albumArtist; + //an empty string means that no albumartist was found + int artist = albumArtist.isEmpty() ? 0 : genericId( &m_artists, albumArtist, &m_nextArtistNum ); ++ //debug() << "artist found = " << artist; -@@ -529,7 +530,7 @@ LIBMTP_album_t - for( MtpMediaItem *it = dynamic_cast<MtpMediaItem*>(items->first()); it; it = dynamic_cast<MtpMediaItem*>(items->next()) ) - album_object->tracks[i++] = it->track()->id(); - album_object->no_tracks = items->count(); -- ret = LIBMTP_Create_New_Album( m_device, album_object, 0 ); -+ ret = LIBMTP_Create_New_Album( m_device, album_object ); - if( ret != 0 ) + //debug() << "albumartist " << albumArtist << "for artists" << artists; + foreach( const QVariantMap &row, data ) { - debug() << "creating album failed : " << ret << endl; -@@ -608,7 +609,7 @@ MtpMediaDevice::createFolder( const char +- addTrack( row, artist ); ++ QString uid = row.value( Field::UNIQUEID ).toString(); ++ if( m_uidsSeenThisScan.contains( uid ) ) ++ { ++ QString originalLocation = ( ( m_urlsHashByUid.contains( uid ) && ++ m_urlsHashByUid[uid] != 0 ) ? ++ MountPointManager::instance()->getAbsolutePath( m_urlsHashByUid[uid]->at( 1 ).toInt(), m_urlsHashByUid[uid]->at( 2 ) ) : "(unknown)" ); ++ debug() << "Skipping file with uniqueid " << uid << " as it was already seen this scan," << ++ "file is at " << row.value( Field::URL ).toString() << ", original file is at " << originalLocation; ++ } ++ else ++ { ++ addTrack( row, artist ); ++ m_uidsSeenThisScan.insert( uid ); ++ } + } + } + } +@@ -299,6 +369,7 @@ ScanResultProcessor::processDirectory( c + QString + ScanResultProcessor::findAlbumArtist( const QSet<QString> &artists, int trackCount ) const { - debug() << "Creating new folder '" << name << "' as a child of "<< parent_id << endl; - char *name_copy = qstrdup( name ); -- uint32_t new_folder_id = LIBMTP_Create_Folder( m_device, name_copy, parent_id ); -+ uint32_t new_folder_id = LIBMTP_Create_Folder( m_device, name_copy, parent_id, 0 ); - delete(name_copy); - debug() << "New folder ID: " << new_folder_id << endl; - if( new_folder_id == 0 ) -@@ -913,7 +914,7 @@ MtpMediaDevice::playlistFromItem( MtpMed - if( item->playlist()->id() == 0 ) - { - debug() << "creating new playlist : " << metadata->name << endl; -- int ret = LIBMTP_Create_New_Playlist( m_device, metadata, 0 ); -+ int ret = LIBMTP_Create_New_Playlist( m_device, metadata ); - if( ret == 0 ) ++ //DEBUG_BLOCK + QMap<QString, int> artistCount; + bool featuring; + QStringList trackArtists; +@@ -371,6 +442,7 @@ void + ScanResultProcessor::addTrack( const QVariantMap &trackData, int albumArtistId ) + { + //DEBUG_BLOCK ++ //debug() << "albumArtistId = " << albumArtistId; + //amarok 1 stored all tracks of a compilation in different directories. + //when using its "Organize Collection" feature + //try to detect these cases +@@ -419,7 +491,15 @@ ScanResultProcessor::addTrack( const QVa + + //urlId will take care of the urls table part of AFT + int url = urlId( path, uid ); +- ++/* ++ foreach( QString key, m_urlsHashByUid.keys() ) ++ debug() << "Key: " << key << ", list: " << *m_urlsHashByUid[key]; ++ foreach( int key, m_urlsHashById.keys() ) ++ debug() << "Key: " << key << ", list: " << *m_urlsHashById[key]; ++ typedef QPair<int, QString> blahType; //QFOREACH is stupid when it comes to QPairs ++ foreach( blahType key, m_urlsHashByLocation.keys() ) ++ debug() << "Key: " << key << ", list: " << *m_urlsHashByLocation[key]; ++*/ + QStringList *trackList = new QStringList(); + int id = m_nextTrackNum; + //debug() << "Appending new track number with tracknum: " << id; +@@ -470,7 +550,7 @@ ScanResultProcessor::addTrack( const QVa + //insert into hashes + if( m_tracksHashByUrl.contains( url ) && m_tracksHashByUrl[url] != 0 ) + { +- //debug() << "m_tracksHashByUrl contains the url!"; ++ //debug() << "m_tracksHashByUrl already contains url " << url; + //need to replace, not overwrite/add a new one + QStringList *oldValues = m_tracksHashByUrl[url]; + QString oldId = oldValues->at( 0 ); +@@ -490,8 +570,24 @@ ScanResultProcessor::addTrack( const QVa + m_tracksHashById.insert( id, trackList ); + } + ++ //debug() << "album = " << album; ++ + if( m_tracksHashByAlbum.contains( album ) && m_tracksHashByAlbum[album] != 0 ) +- m_tracksHashByAlbum[album]->append( trackList ); ++ { ++ //contains isn't the fastest on linked lists, but in reality this is on the order of maybe ++ //ten quick pointer comparisons per track on average...probably lower ++ //debug() << "trackList is " << trackList; ++ if( !m_tracksHashByAlbum[album]->contains( trackList ) ) ++ { ++ //debug() << "appending trackList to m_tracksHashByAlbum"; ++ m_tracksHashByAlbum[album]->append( trackList ); ++ } ++ else ++ { ++ //debug() << "not appending trackList to m_tracksHashByAlbum"; ++ } ++ ++ } + else + { + QLinkedList<QStringList*> *list = new QLinkedList<QStringList*>(); +@@ -595,6 +691,8 @@ ScanResultProcessor::albumId( const QStr + QLinkedList<QStringList*> *list = m_albumsHashByName[album]; + foreach( QStringList *slist, *list ) + { ++ //debug() << "albumArtistId = " << albumArtistId; ++ //debug() << "Checking list: " << *slist; + if( slist->at( 2 ).isEmpty() && albumArtistId == 0 ) + { + //debug() << "artist is empty and albumArtistId = 0, returning " << slist->at( 0 ); +@@ -631,7 +729,10 @@ ScanResultProcessor::albumInsert( const + albumList->append( QString() ); + m_albumsHashById[returnedNum] = albumList; + if( m_albumsHashByName.contains( album ) && m_albumsHashByName[album] != 0 ) +- m_albumsHashByName[album]->append( albumList ); ++ { ++ if( !m_albumsHashByName[album]->contains( albumList ) ) ++ m_albumsHashByName[album]->append( albumList ); ++ } + else + { + QLinkedList<QStringList*> *list = new QLinkedList<QStringList*>(); +@@ -645,7 +746,7 @@ ScanResultProcessor::albumInsert( const + int + ScanResultProcessor::urlId( const QString &url, const QString &uid ) + { +- /* ++/* + DEBUG_BLOCK + foreach( QString key, m_urlsHashByUid.keys() ) + debug() << "Key: " << key << ", list: " << *m_urlsHashByUid[key]; +@@ -654,8 +755,7 @@ ScanResultProcessor::urlId( const QStrin + typedef QPair<int, QString> blahType; //QFOREACH is stupid when it comes to QPairs + foreach( blahType key, m_urlsHashByLocation.keys() ) + debug() << "Key: " << key << ", list: " << *m_urlsHashByLocation[key]; +- */ +- ++*/ + QFileInfo fileInfo( url ); + const QString dir = fileInfo.absoluteDir().absolutePath(); + int dirId = directoryId( dir ); +@@ -665,6 +765,7 @@ ScanResultProcessor::urlId( const QStrin + QPair<int, QString> locationPair( deviceId, rpath ); + //debug() << "in urlId with url = " << url << " and uid = " << uid; + //debug() << "checking locationPair " << locationPair; ++/* + if( m_urlsHashByLocation.contains( locationPair ) ) + { + QStringList values; +@@ -674,6 +775,7 @@ ScanResultProcessor::urlId( const QStrin + values << "zero"; + //debug() << "m_urlsHashByLocation contains it! It is " << values; + } ++*/ + QStringList currUrlIdValues; + if( m_urlsHashByUid.contains( uid ) && m_urlsHashByUid[uid] != 0 ) + currUrlIdValues = *m_urlsHashByUid[uid]; +@@ -717,6 +819,7 @@ ScanResultProcessor::urlId( const QStrin + //debug() << "m_urlsHashByUid contains this UID, updating deviceId and path"; + QStringList *list = m_urlsHashByUid[uid]; + //debug() << "list from UID hash is " << list << " with values " << *list; ++ QPair<int, QString> oldLocationPair( list->at( 1 ).toInt(), list->at( 2 ) ); + list->replace( 1, QString::number( deviceId ) ); + list->replace( 2, rpath ); + list->replace( 3, QString::number( dirId ) ); +@@ -737,6 +840,7 @@ ScanResultProcessor::urlId( const QStrin + delete oldList; + } + m_urlsHashByLocation[locationPair] = list; ++ m_urlsHashByLocation.remove( oldLocationPair ); + } + m_permanentTablesUrlUpdates.insert( uid, url ); + m_changedUrls.insert( uid, QPair<QString, QString>( MountPointManager::instance()->getAbsolutePath( currUrlIdValues[1].toInt(), currUrlIdValues[2] ), url ) ); +@@ -751,6 +855,7 @@ ScanResultProcessor::urlId( const QStrin { - item->playlist()->setId( metadata->playlist_id ); + QStringList *list = m_urlsHashByLocation[locationPair]; + //debug() << "Replacing hash " << list->at( 4 ) << " with " << uid; ++ QString oldId = list->at( 4 ); + list->replace( 4, uid ); + if( m_urlsHashByUid.contains( uid ) + && m_urlsHashByUid[uid] != 0 +@@ -762,6 +867,7 @@ ScanResultProcessor::urlId( const QStrin + delete oldList; + } + m_urlsHashByUid[uid] = list; ++ m_urlsHashByUid.remove( oldId ); + } + m_permanentTablesUidUpdates.insert( url, uid ); + m_changedUids.insert( currUrlIdValues[4], uid ); +@@ -855,7 +961,8 @@ ScanResultProcessor::directoryId( const + int + ScanResultProcessor::checkExistingAlbums( const QString &album ) + { +-// DEBUG_BLOCK ++ //DEBUG_BLOCK ++ //debug() << "looking for album " << album; + // "Unknown" albums shouldn't be handled as compilations + if( album.isEmpty() ) + return 0; +@@ -865,7 +972,10 @@ ScanResultProcessor::checkExistingAlbums + //it's probably a compilation. + //this handles A1 compilations that were automatically organized by Amarok + if( !m_albumsHashByName.contains( album ) || m_albumsHashByName[album] == 0 ) ++ { ++ //debug() << "hashByName doesn't contain album, or it's zero"; + return 0; ++ } + + QStringList trackIds; + QLinkedList<QStringList*> *llist = m_albumsHashByName[album]; +@@ -915,8 +1025,10 @@ ScanResultProcessor::checkExistingAlbums + } + } + ++ //debug() << "trackIds = " << trackIds; + if( trackIds.isEmpty() ) + { ++ //debug() << "trackIds empty, returning zero"; + return 0; + } + else +@@ -933,6 +1045,7 @@ ScanResultProcessor::checkExistingAlbums + list->replace( 3, compilationString ); + } + } ++ //debug() << "returning " << compilationId; + return compilationId; + } + } +@@ -1167,6 +1280,17 @@ ScanResultProcessor::copyHashesToTempTab + foreach( blahType key, m_urlsHashByLocation.keys() ) + debug() << "Key: " << key << ", list: " << *m_urlsHashByLocation[key]; + debug() << "Next album num: " << m_nextAlbumNum; ++ ++ foreach( int key, m_tracksHashById.keys() ) ++ debug() << "Key: " << key << ", list: " << *m_tracksHashById[key]; ++ foreach( int key, m_tracksHashByUrl.keys() ) ++ debug() << "Key: " << key << ", list: " << *m_tracksHashByUrl[key]; ++ foreach( int key, m_tracksHashByAlbum.keys() ) ++ { ++ debug() << "Key: " << key; ++ foreach( QStringList* item, *m_tracksHashByAlbum[key] ) ++ debug() << "list: " << item << " is " << *item; ++ } + */ + + DEBUG_BLOCK diff --git a/audio/amarok/patches/patch-ab b/audio/amarok/patches/patch-ab index 1594c1e0bc9..0a0fd5b541e 100644 --- a/audio/amarok/patches/patch-ab +++ b/audio/amarok/patches/patch-ab @@ -1,22 +1,12 @@ -$NetBSD: patch-ab,v 1.3 2007/07/01 00:33:53 wiz Exp $ +$NetBSD: patch-ab,v 1.4 2010/02/16 09:01:46 wiz Exp $ ---- configure.orig 2007-06-17 19:52:02.000000000 +0000 -+++ configure -@@ -37060,7 +37060,7 @@ if test "${ac_cv_lib_tunepimp_tr_GetPUID - echo $ECHO_N "(cached) $ECHO_C" >&6 - else - ac_check_lib_save_LIBS=$LIBS --LIBS="-ltunepimp $LIBS" -+LIBS="-ltunepimp $PTHREAD_LDFLAGS $PTHREAD_LIBS $LIBS" - cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ - _ACEOF -@@ -37579,7 +37579,7 @@ if test "${ac_cv_lib_konqsidebarplugin__ - echo $ECHO_N "(cached) $ECHO_C" >&6 - else - ac_check_lib_save_LIBS=$LIBS --LIBS="-lkonqsidebarplugin $LIBS" -+LIBS="-lkonqsidebarplugin ${PTHREAD_LIBS} ${PTHREAD_LDFLAGS} $LIBS" - cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ - _ACEOF +--- src/collection/mysqlecollection/CMakeLists.txt.orig 2009-09-28 17:34:03.000000000 +0000 ++++ src/collection/mysqlecollection/CMakeLists.txt +@@ -82,6 +82,7 @@ if(APPLE) + SET_TARGET_PROPERTIES(amarok_collection-mysqlecollection PROPERTIES LINK_FLAGS "-undefined dynamic_lookup") + endif(APPLE) + ++SET_TARGET_PROPERTIES(amarok_collection-mysqlecollection PROPERTIES LINK_FLAGS "@@WLR@@") + install(TARGETS amarok_collection-mysqlecollection DESTINATION ${PLUGIN_INSTALL_DIR} ) + + install(FILES ../sqlcollection/org.kde.amarok.SqlCollection.xml DESTINATION ${DBUS_INTERFACES_INSTALL_DIR}) diff --git a/audio/amarok/patches/patch-ac b/audio/amarok/patches/patch-ac index c6d039bb289..93b725d6642 100644 --- a/audio/amarok/patches/patch-ac +++ b/audio/amarok/patches/patch-ac @@ -1,19 +1,14 @@ -$NetBSD: patch-ac,v 1.3 2009/02/15 11:22:48 wiz Exp $ +$NetBSD: patch-ac,v 1.4 2010/02/16 09:01:46 wiz Exp $ -SVN commit 917750 by nhnielsen: -Fix for wikipedia tab not showing any info. Thanks to Helge Stenström -and WarwickH at -https://bugs.edge.launchpad.net/ubuntu/+source/amarok/+bug/316140 for -the fix. +post-2.2.2 patch from upstream ---- amarok/src/contextbrowser.cpp.orig 2008-08-13 21:21:51.000000000 +0000 -+++ amarok/src/contextbrowser.cpp -@@ -4189,7 +4189,7 @@ ContextBrowser::wikiResult( KIO::Job* jo - } +--- src/collection/sqlcollection/ScanResultProcessor.h.orig 2010-01-06 22:19:46.000000000 +0000 ++++ src/collection/sqlcollection/ScanResultProcessor.h +@@ -94,6 +94,7 @@ class ScanResultProcessor : public QObje + QMap<QString, int> m_directories; + QMap<QString, QList< QPair< QString, QString > > > m_imageMap; - // Ok lets remove the top and bottom parts of the page -- m_wiki = m_wiki.mid( m_wiki.find( "<h1 class=\"firstHeading\">" ) ); -+ m_wiki = m_wiki.mid( m_wiki.find( "<h1 id=\"firstHeading\"" ) ); - m_wiki = m_wiki.mid( 0, m_wiki.find( "<div class=\"printfooter\">" ) ); - // Adding back license information - m_wiki += copyright; ++ QSet<QString> m_uidsSeenThisScan; + QHash<QString, uint> m_filesInDirs; + + TrackUrls m_changedUids; //not really track urls diff --git a/audio/amarok/patches/patch-ad b/audio/amarok/patches/patch-ad deleted file mode 100644 index ace497e89dd..00000000000 --- a/audio/amarok/patches/patch-ad +++ /dev/null @@ -1,89 +0,0 @@ -$NetBSD: patch-ad,v 1.1 2009/01/12 12:33:40 wiz Exp $ - -Security fix, SVN r908415 from upstream 1.4.x branch. - ---- amarok/src/metadata/audible/audibletag.cpp.orig 2008-08-13 23:21:51.000000000 +0200 -+++ amarok/src/metadata/audible/audibletag.cpp -@@ -71,7 +71,8 @@ void Audible::Tag::readTags( FILE *fp ) - { - char buf[1023]; - fseek(fp, OFF_PRODUCT_ID, SEEK_SET); -- fread(buf, strlen("product_id"), 1, fp); -+ if (fread(buf, strlen("product_id"), 1, fp) != 1) -+ return; - if(memcmp(buf, "product_id", strlen("product_id"))) - { - buf[20]='\0'; -@@ -130,24 +131,65 @@ void Audible::Tag::readTags( FILE *fp ) - - bool Audible::Tag::readTag( FILE *fp, char **name, char **value) - { -+ // arbitrary value that has to be smaller than 2^32-1 and that should be large enough for all tags -+ const uint32_t maxtaglen = 100000; -+ - uint32_t nlen; -- fread(&nlen, sizeof(nlen), 1, fp); -+ if (fread(&nlen, sizeof(nlen), 1, fp) != 1) -+ return false; - nlen = ntohl(nlen); - //fprintf(stderr, "tagname len=%x\n", (unsigned)nlen); -- *name = new char[nlen+1]; -- (*name)[nlen] = '\0'; -+ if (nlen > maxtaglen) -+ return false; - - uint32_t vlen; -- fread(&vlen, sizeof(vlen), 1, fp); -+ if (fread(&vlen, sizeof(vlen), 1, fp) != 1) -+ return false; - vlen = ntohl(vlen); - //fprintf(stderr, "tag len=%x\n", (unsigned)vlen); -+ if (vlen > maxtaglen) -+ return false; -+ -+ *name = new char[nlen+1]; -+ if (!*name) -+ return false; -+ - *value = new char[vlen+1]; -+ if (!*value) -+ { -+ delete[] *name; -+ *name = 0; -+ return false; -+ } -+ -+ (*name)[nlen] = '\0'; - (*value)[vlen] = '\0'; - -- fread(*name, nlen, 1, fp); -- fread(*value, vlen, 1, fp); -+ if (fread(*name, nlen, 1, fp) != 1) -+ { -+ delete[] *name; -+ *name = 0; -+ delete[] *value; -+ *value = 0; -+ return false; -+ } -+ if (fread(*value, vlen, 1, fp) != 1) -+ { -+ delete[] *name; -+ *name = 0; -+ delete[] *value; -+ *value = 0; -+ return false; -+ } - char lasttag; -- fread(&lasttag, 1, 1, fp); -+ if (fread(&lasttag, 1, 1, fp) != 1) -+ { -+ delete[] *name; -+ *name = 0; -+ delete[] *value; -+ *value = 0; -+ return false; -+ } - //fprintf(stderr, "%s: \"%s\"\n", *name, *value); - - m_tagsEndOffset += 2 * 4 + nlen + vlen + 1; |