]> git.cworth.org Git - sup/commitdiff
protect ferret index #[] access
authorWilliam Morgan <wmorgan-sup@masanjin.net>
Fri, 7 Nov 2008 06:18:45 +0000 (22:18 -0800)
committerWilliam Morgan <wmorgan-sup@masanjin.net>
Fri, 7 Nov 2008 06:18:45 +0000 (22:18 -0800)
lib/sup/index.rb

index 6e3e2951310957f8fb098e35192bf003e35bb786..e585478b408925c59c6faeab84225776e4533441 100644 (file)
@@ -386,23 +386,27 @@ EOS
 
   ## builds a message object from a ferret result
   def build_message docid
-    doc = @index_mutex.synchronize { @index[docid] }
-    source = @source_mutex.synchronize { @sources[doc[:source_id].to_i] }
-    #puts "building message #{doc[:message_id]} (#{source}##{doc[:source_info]})"
-    raise "invalid source #{doc[:source_id]}" unless source
-
-    fake_header = {
-      "date" => Time.at(doc[:date].to_i),
-      "subject" => unwrap_subj(doc[:subject]),
-      "from" => doc[:from],
-      "to" => doc[:to].split(/\s+/).join(", "), # reformat
-      "message-id" => doc[:message_id],
-      "references" => doc[:refs].split(/\s+/).map { |x| "<#{x}>" }.join(" "),
-    }
+    @index_mutex.synchronize do
+      doc = @index[docid]
+
+      source = @source_mutex.synchronize { @sources[doc[:source_id].to_i] }
+      raise "invalid source #{doc[:source_id]}" unless source
 
-    Message.new :source => source, :source_info => doc[:source_info].to_i, 
-                :labels => doc[:label].split(" ").map { |s| s.intern },
-                :snippet => doc[:snippet], :header => fake_header
+      #puts "building message #{doc[:message_id]} (#{source}##{doc[:source_info]})"
+
+      fake_header = {
+        "date" => Time.at(doc[:date].to_i),
+        "subject" => unwrap_subj(doc[:subject]),
+        "from" => doc[:from],
+        "to" => doc[:to].split(/\s+/).join(", "), # reformat
+        "message-id" => doc[:message_id],
+        "references" => doc[:refs].split(/\s+/).map { |x| "<#{x}>" }.join(" "),
+      }
+
+      Message.new :source => source, :source_info => doc[:source_info].to_i,
+                  :labels => doc[:label].split(" ").map { |s| s.intern },
+                  :snippet => doc[:snippet], :header => fake_header
+    end
   end
 
   def fresh_thread_id; @next_thread_id += 1; end