about summary refs log tree commit homepage
diff options
context:
space:
mode:
-rw-r--r--ext/posix_mq/posix_mq.c2
-rw-r--r--test/test_posix_mq.rb9
2 files changed, 10 insertions, 1 deletions
diff --git a/ext/posix_mq/posix_mq.c b/ext/posix_mq/posix_mq.c
index 80943fb..d9abf1e 100644
--- a/ext/posix_mq/posix_mq.c
+++ b/ext/posix_mq/posix_mq.c
@@ -685,7 +685,7 @@ static VALUE name(VALUE self)
 {
         struct posix_mq *mq = get(self, 0);
 
-        return mq->name;
+        return rb_str_dup(mq->name);
 }
 
 static int lookup_sig(VALUE sig)
diff --git a/test/test_posix_mq.rb b/test/test_posix_mq.rb
index fa98a9c..963d623 100644
--- a/test/test_posix_mq.rb
+++ b/test/test_posix_mq.rb
@@ -27,6 +27,15 @@ class Test_POSIX_MQ < Test::Unit::TestCase
     assert @mq.closed?
   end
 
+  def test_name_clobber_proof
+    @mq = POSIX_MQ.new(@path, :rw)
+    tmp = @mq.name
+    tmp.freeze
+    assert_nothing_raised { @mq.name.gsub!(/\A/, "foo") }
+    assert_equal tmp, @mq.name
+    assert tmp.object_id != @mq.name.object_id
+  end
+
   def test_dup_clone
     @mq = POSIX_MQ.new(@path, :rw)
     dup = @mq.dup