From 38d3f0eb0ad73e0520776ab886feb9968bcbe3b0 Mon Sep 17 00:00:00 2001 From: Tatsuya Sato Date: Mon, 1 Jun 2026 00:37:23 +0900 Subject: [PATCH] Guard against nil crashes on malformed documents (#127) A fuzzer (#127) found several "undefined method 'value' for nil" crashes when opening malformed docx files. Guard the gem-side cases: - #hyperlinks: skip relationships missing an Id or Target instead of calling .value on nil. - #default_paragraph_style: return nil (via safe navigation) when styles are absent or there is no default paragraph style. - Paragraph#font_color: return nil when a w:color tag has no w:val attribute. (The earlier #158 fix already addressed the related "xpath for nil" crash, and the zip is already closed safely via the initialize ensure block.) Adds fixtures with a malformed hyperlink relationship and with no default paragraph style, plus specs covering all three guards. Co-Authored-By: Claude Opus 4.8 --- lib/docx/containers/paragraph.rb | 2 +- lib/docx/document.rb | 8 +++-- spec/docx/document_spec.rb | 28 ++++++++++++++++++ spec/fixtures/malformed_hyperlink_rels.docx | Bin 0 -> 13753 bytes spec/fixtures/no_default_paragraph_style.docx | Bin 0 -> 13762 bytes 5 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 spec/fixtures/malformed_hyperlink_rels.docx create mode 100644 spec/fixtures/no_default_paragraph_style.docx diff --git a/lib/docx/containers/paragraph.rb b/lib/docx/containers/paragraph.rb index 21ba2ea..820d6c3 100755 --- a/lib/docx/containers/paragraph.rb +++ b/lib/docx/containers/paragraph.rb @@ -140,7 +140,7 @@ def font_size def font_color color_tag = @node.xpath('w:r//w:rPr//w:color').first - color_tag ? color_tag.attributes['val'].value : nil + color_tag ? color_tag.attributes['val']&.value : nil end def style diff --git a/lib/docx/document.rb b/lib/docx/document.rb index 2c116da..5cd222e 100755 --- a/lib/docx/document.rb +++ b/lib/docx/document.rb @@ -104,7 +104,11 @@ def font_size # Hyperlink targets are extracted from the document.xml.rels file def hyperlinks hyperlink_relationships.each_with_object({}) do |rel, hash| - hash[rel.attributes['Id'].value] = rel.attributes['Target'].value + id = rel.attributes['Id'] + target = rel.attributes['Target'] + next unless id && target + + hash[id.value] = target.value end end @@ -184,7 +188,7 @@ def replace_entry(entry_path, file_contents) end def default_paragraph_style - @styles.at_xpath("w:styles/w:style[@w:type='paragraph' and @w:default='1']/w:name/@w:val").value + @styles&.at_xpath("w:styles/w:style[@w:type='paragraph' and @w:default='1']/w:name/@w:val")&.value end def style_name_of(style_id) diff --git a/spec/docx/document_spec.rb b/spec/docx/document_spec.rb index 5bef68e..949f3ce 100755 --- a/spec/docx/document_spec.rb +++ b/spec/docx/document_spec.rb @@ -680,6 +680,34 @@ end end + # Regression tests for #127: malformed documents should not crash with + # internal "undefined method 'value' for nil" errors. + describe 'robustness against malformed documents' do + it 'ignores hyperlink relationships missing an Id or Target' do + doc = Docx::Document.open(@fixtures_path + '/malformed_hyperlink_rels.docx') + expect { doc.hyperlinks }.to_not raise_error + # the well-formed relationships are still returned; the malformed one is skipped + expect(doc.hyperlinks).to be_a(Hash) + end + + it 'returns nil for default_paragraph_style when there is no default paragraph style' do + doc = Docx::Document.open(@fixtures_path + '/no_default_paragraph_style.docx') + expect { doc.default_paragraph_style }.to_not raise_error + expect(doc.default_paragraph_style).to be_nil + end + + it 'returns nil for a paragraph font_color when the color tag has no value' do + node = Nokogiri::XML(<<~XML).root + + x + + XML + paragraph = Docx::Elements::Containers::Paragraph.new(node) + expect { paragraph.font_color }.to_not raise_error + expect(paragraph.font_color).to be_nil + end + end + describe 'replacing contents' do let(:replacement_file_path) { @fixtures_path + '/replacement.png' } let(:temp_file_path) { Tempfile.new(['docx_gem', '.docx']).path } diff --git a/spec/fixtures/malformed_hyperlink_rels.docx b/spec/fixtures/malformed_hyperlink_rels.docx new file mode 100644 index 0000000000000000000000000000000000000000..1210a1d76a99e5d0a6c944895f6eb6366575c040 GIT binary patch literal 13753 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 literal 0 HcmV?d00001 diff --git a/spec/fixtures/no_default_paragraph_style.docx b/spec/fixtures/no_default_paragraph_style.docx new file mode 100644 index 0000000000000000000000000000000000000000..6746b69eabc73514552fea6827c151767a52b5a6 GIT binary patch literal 13762 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 literal 0 HcmV?d00001