From fae622c8b77feebac66a538d76e4211de8bd8eb3 Mon Sep 17 00:00:00 2001 From: Philip McGrath Date: Sun, 24 Jul 2022 21:50:44 -0400 Subject: [PATCH] fix saving `AnyStyle::Dictionary` after `populate!` Some of these fixes are more generally applicable. A more robust solution might find data files using e.g. `Gem.find_files()`. --- lib/anystyle/dictionary/gdbm.rb | 6 ++++++ lib/anystyle/dictionary/marshal.rb | 31 ++++++++++++++++++++++++------ 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/lib/anystyle/dictionary/gdbm.rb b/lib/anystyle/dictionary/gdbm.rb index 754903c..c814df2 100644 --- a/lib/anystyle/dictionary/gdbm.rb +++ b/lib/anystyle/dictionary/gdbm.rb @@ -1,5 +1,6 @@ module AnyStyle require 'gdbm' + require 'fileutils' class Dictionary class GDBM < Dictionary @@ -17,8 +18,13 @@ module AnyStyle def open close + FileUtils.mkdir_p(File.dirname(options[:path])) @db = ::GDBM.new(*options.values_at(:path, :mode, :flags)) self + rescue Errno::EACCES + # GDBM.new tries this if :flags is nil, but not necessarily otherwise + @db = ::GDBM.new(options[:path],options[:mode],::GDBM::READER) + self ensure populate! if empty? end diff --git a/lib/anystyle/dictionary/marshal.rb b/lib/anystyle/dictionary/marshal.rb index 761ca36..b9529d0 100644 --- a/lib/anystyle/dictionary/marshal.rb +++ b/lib/anystyle/dictionary/marshal.rb @@ -1,4 +1,6 @@ module AnyStyle + require 'fileutils' + require 'tempfile' class Dictionary class Marshal < Dictionary @defaults = { @@ -10,17 +12,34 @@ module AnyStyle end def open - if File.exists?(options[:path]) - @db = ::Marshal.load(File.open(options[:path])) - else - @db = {} + File.open(options[:path]) do |file| + @db = ::Marshal.load(file) end self + rescue Errno::ENOENT + @db = {} + self ensure if empty? populate! - if File.writable?(options[:path]) - ::Marshal.dump(db, File.open(options[:path], 'wb')) + tmp = nil + begin + FileUtils.mkdir_p(File.dirname(options[:path])) + tmp = Tempfile.create(File.basename(options[:path]), + File.dirname(options[:path]), + mode: File::Constants::BINARY) + pth = tmp.path() + ::Marshal.dump(db, tmp) + tmp.close() + File.rename(tmp.path, options[:path]) # will overwrite if exists + tmp = nil + rescue SystemCallError => e + warn(e.message) + ensure + if tmp then + tmp.close() + tmp.unlink() + end end end end -- 2.32.0 >...This fixes CVE-2022-39316, CVE-2022-39317, CVE-2022-39318, CVE-2022-39319, CVE-2022-39320, CVE-2022-41877, CVE-2022-39347, CVE-2022-39282, CVE-2022-39283, CVE-2021-41159 and CVE-2021-41160. * gnu/packages/rdesktop.scm (freerdp): Update to 2.2.0. [arguments]: Use gexps. Do not set DOCBOOKXSL_DIR in #:configureflags. Maxim Cournoyer 2023-04-21gnu: freerdp: Remove input labels....* gnu/packages/rdesktop.scm (freerdp) [inputs]: Remove labels. Maxim Cournoyer 2022-12-12gnu: ffmpeg: Promote version 5 to the default....* gnu/packages/video.scm (ffmpeg): Alias to FFMPEG-5. (mlt-6)[inpust]: Replace "ffmpeg" with FFMPEG-4. (transcode, libquicktime, ffmpegthumbnailer, mplayer, obs, simplescreenrecorder, handbrake, ffms2, libopenshot, wlstream)[inputs]: Change from FFMPEG to FFMPEG-4. * gnu/packages/arcan.scm (arcan)[inputs]: Likewise. * gnu/packages/astronomy.scm (stackistry, libskry)[inputs]: Likewise. * gnu/packages/audio.scm (aubio, bs1770gain)[inputs]: Likewise. * gnu/packages/education.scm (openboard)[inputs]: Likewise. * gnu/packages/emulators.scm (dolphin-emu, retroarch, pcsxr, ppsspp)[inputs]: Likewise. * gnu/packages/game-development.scm (warsow-qfusion)[inputs]: Likewise. * gnu/packages/games.scm (oshu, hedgewars)[inputs]: Likewise. * gnu/packages/gnunet.scm (libextractor)[inputs]: Likewise. * gnu/packages/graphics.scm (openscenegraph)[inputs]: Likewise. * gnu/packages/image-processing.scm (opencv, paraview-5.9)[inputs]: Likewise. * gnu/packages/julia-jll.scm (julia-ffmpeg-jll)[inputs]: Likewise. * gnu/packages/kde-multimedia.scm (kid3)[inputs]: Likewise. * gnu/packages/kodi.scm (kodi)[inputs]: Likewise. * gnu/packages/linphone.scm (mediastreamer2)[inputs]: Likewise. * gnu/packages/linux.scm (pipewire)[inputs]: Likewise. (pipewire-0.3)[inputs]: Replace "ffmpeg" with FFMPEG. * gnu/packages/mp3.scm (chromaprint)[inputs]: Change from FFMPEG to FFMPEG-4. * gnu/packages/music.scm (musikcube)[inputs]: Likewise. * gnu/packages/rdesktop.scm (freerdp)[inputs]: Likewise. * gnu/packages/qt.scm (qtwebengine-5)[inputs]: Likewise. Marius Bakke