BTW, the CVE is misleading, there are ruby script fixes needed as well as the unzip bug. Attached is a patch for the ruby fixes, which appear to be in upstream 1.4.5 already.
-- Kees Cook @outflux.net
diff -Nur amarok-1.4.3/amarok/src/scripts/databasescripts/backupDatabase.rb amarok-1.4.3.new/amarok/src/scripts/databasescripts/backupDatabase.rb --- amarok-1.4.3/amarok/src/scripts/databasescripts/backupDatabase.rb 2006-09-04 19:42:40.000000000 -0700 +++ amarok-1.4.3.new/amarok/src/scripts/databasescripts/backupDatabase.rb 2007-02-13 13:39:04.198770848 -0800 @@ -37,14 +37,12 @@ destination = $*[0] + "/" unless FileTest.directory?( destination ) - error = "Error: Save destination must be a directory" - `dcop amarok playlist popupMessage '#{error}'` + system("dcop", "amarok", "playlist", "popupMessage", "Error: Save destination must be a directory") exit( 1 ) end unless FileTest.writable_real?( destination ) - error = "Error: Destination directory not writable." - `dcop amarok playlist popupMessage '#{error}'` + system("dcop", "amarok", "playlist", "popupMessage", "Error: Destination directory not writeable.") exit( 1 ) end @@ -68,14 +66,11 @@ db = `dcop amarok script readConfig MySqlDbName`.chomp!() user = `dcop amarok script readConfig MySqlUser`.chomp!() pass = `dcop amarok script readConfig MySqlPassword`.chomp!() - `mysqldump -u #{user} -p#{pass} #{db} > #{dest}` + system("mysqldump", "-u", user, "-p", pass, db, "-r", dest); when "2" # postgres - error = "Sorry, postgresql database backups have not been implemented" - `dcop amarok playlist popupMessage #{error}` + system("dcop", "amarok", "playlist", "popupMessage", "Sorry, postgresql database backups have not been implemented.") exit( 1 ) end -message = "Database backup saved to: #{destination}/#{filename}" -`dcop amarok playlist popupMessage '#{message}'` - +system("dcop", "amarok", "playlist", "popupMessage", "Database backup saved to: #{destination}/#{filename}") diff -Nur amarok-1.4.3/amarok/src/scripts/databasescripts/databaseScripts.rb amarok-1.4.3.new/amarok/src/scripts/databasescripts/databaseScripts.rb --- amarok-1.4.3/amarok/src/scripts/databasescripts/databaseScripts.rb 2006-09-04 19:42:40.000000000 -0700 +++ amarok-1.4.3.new/amarok/src/scripts/databasescripts/databaseScripts.rb 2007-02-13 13:39:04.198770848 -0800 @@ -16,7 +16,7 @@ require 'Korundum' rescue LoadError error = 'Korundum (KDE bindings for ruby) from kdebindings v3.4 is required for this script.' - `dcop amarok playlist popupMessage "DatabaseScripts: #{error}"` + system("dcop", "amarok", "playlist", "popupMessage", "DatabaseScripts: #{error}") exit end @@ -103,7 +103,7 @@ filename = File.dirname( File.expand_path( __FILE__ ) ) + "/staleStatistics.rb" end - `ruby "#{filename}" "#{arg}"` + system("ruby", filename, arg) done( 0 ) end diff -Nur amarok-1.4.3/amarok/src/scripts/databasescripts/redoPodcasts.rb amarok-1.4.3.new/amarok/src/scripts/databasescripts/redoPodcasts.rb --- amarok-1.4.3/amarok/src/scripts/databasescripts/redoPodcasts.rb 2006-09-04 19:42:40.000000000 -0700 +++ amarok-1.4.3.new/amarok/src/scripts/databasescripts/redoPodcasts.rb 2007-02-13 13:39:04.198770848 -0800 @@ -12,6 +12,6 @@ podcasts.each do |channel| print "Adding podcast: #{channel}\n" - `dcop amarok playlistbrowser addPodcast #{channel}` + system("dcop", "amarok", "playlistbrowser", "addPodcast", channel) end print "Done.\n" diff -Nur amarok-1.4.3/amarok/src/scripts/databasescripts/staleAlbums.rb amarok-1.4.3.new/amarok/src/scripts/databasescripts/staleAlbums.rb --- amarok-1.4.3/amarok/src/scripts/databasescripts/staleAlbums.rb 2006-09-04 19:42:40.000000000 -0700 +++ amarok-1.4.3.new/amarok/src/scripts/databasescripts/staleAlbums.rb 2007-02-13 13:39:04.202771047 -0800 @@ -5,30 +5,36 @@ # (c) 2006 Roland Gigler <[EMAIL PROTECTED]> # License: GNU General Public License V2 -`dcop amarok playlist shortStatusMessage "Removing stale 'album' entries from the database"` +class String + def shellquote + return "'" + self.gsub("'", "'\\\\''") + "'" + end +end + +system("dcop", "amarok", "playlist", "shortStatusMessage", "Removing stale 'album' entries from the database") -qresult = `dcop amarok collection query "SELECT id FROM album;"` +qresult = `dcop amarok collection query #{"SELECT id FROM album;".shellquote}` result = qresult.split( "\n" ) i = 0 result.each do |id| print "Checking: #{id}, " - qresult2 = `dcop amarok collection query "SELECT COUNT(*) FROM tags where album = #{id};"` + qresult2 = `dcop amarok collection query #{"SELECT COUNT(*) FROM tags where album = #{id};".shellquote}` count = qresult2.chomp() printf "count: %s", count if count == "0" i = i + 1 - qresult3 = `dcop amarok collection query "SELECT name FROM album where id = #{id} ;"` + qresult3 = `dcop amarok collection query #{"SELECT name FROM album where id = #{id} ;".shellquote}` result3 = qresult3.split( "\n" ) puts "==>: Deleting: #{id}, #{result3}" - `dcop amarok collection query "DELETE FROM album WHERE id = '#{id}'"` + system("dcop", "amarok", "collection", "query", "DELETE FROM album WHERE id = '#{id}'") end print "\n" end puts "removed #{i} albums." if i > 0 - `dcop amarok playlist popupMessage "Removed #{i} stale 'album' entries from the database"` + system("dcop", "amarok", "playlist", "popupMessage", "Removed #{i.shellquote} stale 'album' entries from the database") end diff -Nur amarok-1.4.3/amarok/src/scripts/databasescripts/staleArtists.rb amarok-1.4.3.new/amarok/src/scripts/databasescripts/staleArtists.rb --- amarok-1.4.3/amarok/src/scripts/databasescripts/staleArtists.rb 2006-09-04 19:42:40.000000000 -0700 +++ amarok-1.4.3.new/amarok/src/scripts/databasescripts/staleArtists.rb 2007-02-13 13:39:04.202771047 -0800 @@ -5,7 +5,7 @@ # (c) 2006 Roland Gigler <[EMAIL PROTECTED]> # License: GNU General Public License V2 -`dcop amarok playlist shortStatusMessage "Removing stale 'artist' entries from the database"` +system("dcop", "amarok", "playlist", "shortStatusMessage", "Removing stale 'artist' entries from the database") qresult = `dcop amarok collection query "SELECT id FROM artist;"` result = qresult.split( "\n" ) @@ -22,12 +22,12 @@ qresult3 = `dcop amarok collection query "SELECT name FROM artist where id = #{id} ;"` result3 = qresult3.split( "\n" ) puts "==>: Deleting: #{id}, #{result3}" - `dcop amarok collection query "DELETE FROM artist WHERE id = '#{id}'"` + system("dcop", "amarok", "collection", "query", "DELETE FROM artist WHERE id = '#{id}'") end end puts "i: #{i}" if i > 0 - `dcop amarok playlist popupMessage "Removed #{i} stale 'artist' entries from the database"` + system("dcop", "amarok", "playlist", "popupMessage", "Removed #{i} stale 'artist' entries from the database") end diff -Nur amarok-1.4.3/amarok/src/scripts/databasescripts/staleImages.rb amarok-1.4.3.new/amarok/src/scripts/databasescripts/staleImages.rb --- amarok-1.4.3/amarok/src/scripts/databasescripts/staleImages.rb 2006-09-04 19:42:40.000000000 -0700 +++ amarok-1.4.3.new/amarok/src/scripts/databasescripts/staleImages.rb 2007-02-13 13:39:04.202771047 -0800 @@ -5,7 +5,7 @@ # (c) 2006 Roland Gigler <[EMAIL PROTECTED]> # License: GNU General Public License V2 -`dcop amarok playlist shortStatusMessage "Removing stale 'images' entries from the database"` +system("dcop", "amarok", "playlist", "shortStatusMessage", "Removing stale 'images' entries from the database") qresult = `dcop amarok collection query "SELECT path FROM images;"` result = qresult.split( "\n" ) @@ -18,10 +18,10 @@ i = i + 1 url.gsub!(/[']/, '\\\\\'') puts "Deleting: #{url}" - `dcop amarok collection query "DELETE FROM images WHERE path = '#{url}'"` + system("dcop", "amarok", "collection", "query", "DELETE FROM images WHERE path = '#{url}'") end end if i > 0 - `dcop amarok playlist popupMessage "Removed #{i} stale 'images' entries from the database"` + system("dcop", "amarok", "playlist", "popupMessage" "Removed #{i} stale 'images' entries from the database") end diff -Nur amarok-1.4.3/amarok/src/scripts/databasescripts/staleStatistics.rb amarok-1.4.3.new/amarok/src/scripts/databasescripts/staleStatistics.rb --- amarok-1.4.3/amarok/src/scripts/databasescripts/staleStatistics.rb 2006-09-04 19:42:40.000000000 -0700 +++ amarok-1.4.3.new/amarok/src/scripts/databasescripts/staleStatistics.rb 2007-02-13 13:39:04.202771047 -0800 @@ -4,7 +4,7 @@ # (c) 2005 Seb Ruiz <[EMAIL PROTECTED]> # License: GNU General Public License V2 -`dcop amarok playlist shortStatusMessage "Removing stale entries from the database"` +system("dcop", "amarok", "playlist", "shortStatusMessage", "Removing stale entries from the database") qresult = `dcop amarok collection query "SELECT url FROM statistics;"` result = qresult.split( "\n" ) @@ -16,10 +16,10 @@ i = i + 1 url.gsub!(/[']/, '\\\\\'') puts "Deleting: #{url}" - `dcop amarok collection query "DELETE FROM statistics WHERE url = '#{url}'"` + system("dcop", "amarok", "collection", "query", "DELETE FROM statistics WHERE url = '#{url}'") end end if i > 0 - `dcop amarok playlist popupMessage "Removed #{i} stale entries from the database"` -end \ No newline at end of file + system("dcop", "amarok", "playlist", "popupMessage", "Removed #{i} stale entries from the database") +end diff -Nur amarok-1.4.3/amarok/src/scripts/mp3fix/mp3fixer.rb amarok-1.4.3.new/amarok/src/scripts/mp3fix/mp3fixer.rb --- amarok-1.4.3/amarok/src/scripts/mp3fix/mp3fixer.rb 2006-09-04 19:42:40.000000000 -0700 +++ amarok-1.4.3.new/amarok/src/scripts/mp3fix/mp3fixer.rb 2007-02-13 13:39:04.202771047 -0800 @@ -15,15 +15,20 @@ def cleanup() - `dcop amarok script removeCustomMenuItem #{MenuItemName}` - `rm #{Dir.getwd()}/mp3fixer_playlist.m3u` + system("dcop", "amarok", "script", "removeCustomMenuItem", MenuItemName) + # use unlink ??! + system("rm", Dir.getwd() + "/mp3fixer_playlist.m3u") end +class String + def shellquote + return "'" + self.gsub("'", "'\\\\''") + "'" + end +end trap( "SIGTERM" ) { cleanup() } -`dcop amarok script addCustomMenuItem #{MenuItemName}` - +system("dcop", "amarok", "script", "addCustomMenuItem", MenuItemName) loop do message = gets().chomp() @@ -34,7 +39,7 @@ msg = 'Mp3Fixer does not have configuration options. Simply select a track in the ' msg += 'playlist, then start Mp3Fixer from the context-menu (right mouse click).' - `dcop amarok playlist popupMessage "#{msg}"` + system("dcop", "amarok", "playlist", "popupMessage", msg) when "customMenuClicked" if message.include?( MenuItemName ) @@ -54,34 +59,34 @@ mp3fix = File.dirname( File.expand_path( __FILE__ ) ) + "/mp3fix.rb" - `dcop amarok playlist shortStatusMessage "Mp3Fixer is analyzing the file '#{filename}'..."` - output = `ruby #{mp3fix} "#{path}"` + system("dcop", "amarok", "playlist", "shortStatusMessage", "Mp3Fixer is analyzing the file '#{filename}'...") + output = `env ruby #{mp3fix.shellquote} #{path.shellquote}` if $?.success?() reg = Regexp.new( "MP3FIX REPAIR SUMMARY:.*", Regexp::MULTILINE ) report = reg.match( output ).to_s() report.gsub!( "\n", "<BR/>" ) - `dcop amarok playlist popupMessage "#{report}"` + system("dcop", "amarok", "playlist", "popupMessage", report) folders << File.dirname( path ) unless folders.include?( File.dirname( path ) ) else reg = Regexp.new( "Error:.*", Regexp::MULTILINE ) errormsg = reg.match( output ) - `dcop amarok playlist popupMessage "Mp3Fixer #{errormsg}"` + system("dcop", "amarok", "playlist", "popupMessage", "Mp3Fixer #{errormsg}") end end # Touch all folders of the modified files, so that the scanner picks then up folders.each do |folder| - `touch #{folder}` + system("touch", folder) end - `dcop amarok collection scanCollectionChanges` + system("dcop", "amarok", "collection", "scanCollectionChanges") # Refresh the playlist - `dcop amarok playlist saveM3u #{Dir.getwd()}/mp3fixer_playlist.m3u false` - `dcop amarok playlist clearPlaylist` - `dcop amarok playlist addMedia #{Dir.getwd()}/mp3fixer_playlist.m3u` + system("dcop", "amarok", "playlist", "saveM3u", Dir.getwd() + "/mp3fixer_playlist.m3u", "false") + system("dcop", "amarok", "playlist", "clearPlaylist") + system("dcop", "amarok", "playlist", "addMedia", Dir.getwd() + "/mp3fixer_playlist.m3u") end end end