Bug 53109: Correctly handle unicode strings in NameCommentRecord

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1682999 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Dominik Stadler 2015-06-01 20:49:53 +00:00
parent e538572bea
commit f998d39515
4 changed files with 46 additions and 10 deletions

View File

@ -62,17 +62,27 @@ public final class NameCommentRecord extends StandardRecord {
out.writeShort(field_4_name_length); out.writeShort(field_4_name_length);
out.writeShort(field_5_comment_length); out.writeShort(field_5_comment_length);
out.writeByte(0); boolean isNameMultiByte = StringUtil.hasMultibyte(field_6_name_text);
StringUtil.putCompressedUnicode(field_6_name_text, out); out.writeByte(isNameMultiByte ? 1 : 0);
out.writeByte(0); if (isNameMultiByte) {
StringUtil.putCompressedUnicode(field_7_comment_text, out); StringUtil.putUnicodeLE(field_6_name_text, out);
} else {
StringUtil.putCompressedUnicode(field_6_name_text, out);
}
boolean isCommentMultiByte = StringUtil.hasMultibyte(field_7_comment_text);
out.writeByte(isCommentMultiByte ? 1 : 0);
if (isCommentMultiByte) {
StringUtil.putUnicodeLE(field_7_comment_text, out);
} else {
StringUtil.putCompressedUnicode(field_7_comment_text, out);
}
} }
@Override @Override
protected int getDataSize() { protected int getDataSize() {
return 18 // 4 shorts + 1 long + 2 spurious 'nul's return 18 // 4 shorts + 1 long + 2 spurious 'nul's
+ field_6_name_text.length() + (StringUtil.hasMultibyte(field_6_name_text) ? field_6_name_text.length()*2 : field_6_name_text.length())
+ field_7_comment_text.length(); + (StringUtil.hasMultibyte(field_7_comment_text) ? field_7_comment_text.length()*2 : field_7_comment_text.length());
} }
/** /**
@ -86,10 +96,16 @@ public final class NameCommentRecord extends StandardRecord {
final int field_4_name_length = in.readShort(); final int field_4_name_length = in.readShort();
final int field_5_comment_length = in.readShort(); final int field_5_comment_length = in.readShort();
in.readByte(); //spurious NUL if (in.readByte() == 0) {
field_6_name_text = StringUtil.readCompressedUnicode(in, field_4_name_length); field_6_name_text = StringUtil.readCompressedUnicode(in, field_4_name_length);
in.readByte(); //spurious NUL } else {
field_7_comment_text = StringUtil.readCompressedUnicode(in, field_5_comment_length); field_6_name_text = StringUtil.readUnicodeLE(in, field_4_name_length);
}
if (in.readByte() == 0) {
field_7_comment_text = StringUtil.readCompressedUnicode(in, field_5_comment_length);
} else {
field_7_comment_text = StringUtil.readUnicodeLE(in, field_5_comment_length);
}
} }
/** /**

View File

@ -2738,4 +2738,24 @@ public final class TestBugs extends BaseTestBugzillaIssues {
} }
wb.close(); wb.close();
} }
@Test
public void test53109() throws IOException {
HSSFWorkbook wb = openSample("53109.xls");
Workbook wbBack = HSSFTestDataSamples.writeOutAndReadBack(wb);
assertNotNull(wbBack);
wb.close();
}
@Test
public void test53109a() throws IOException {
HSSFWorkbook wb = openSample("com.aida-tour.www_SPO_files_maldives%20august%20october.xls");
Workbook wbBack = HSSFTestDataSamples.writeOutAndReadBack(wb);
assertNotNull(wbBack);
wb.close();
}
} }

Binary file not shown.