From 42b0a779b57d37b9778c43361d2c5492ed6b5c63 Mon Sep 17 00:00:00 2001 From: Josh Micich Date: Thu, 15 May 2008 17:49:23 +0000 Subject: [PATCH] bug 45000 - Fixed NPE in ListLevel when numberText is null git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@656757 13f79535-47bb-0310-9956-ffa450edef68 --- src/documentation/content/xdocs/changes.xml | 1 + src/documentation/content/xdocs/status.xml | 1 + .../org/apache/poi/hwpf/model/ListLevel.java | 68 ++++++++++--------- 3 files changed, 39 insertions(+), 31 deletions(-) diff --git a/src/documentation/content/xdocs/changes.xml b/src/documentation/content/xdocs/changes.xml index 52e0f7175..2f0c4280c 100644 --- a/src/documentation/content/xdocs/changes.xml +++ b/src/documentation/content/xdocs/changes.xml @@ -37,6 +37,7 @@ + 45000 - Fixed NPE in ListLevel when numberText is null 44985 - Properly update TextSpecInfoAtom when the parent text is changed 41187 - fixed HSSFSheet to properly read xls files without ROW records 44950 - fixed HSSFFormulaEvaluator.evaluateInCell() and Area3DEval.getValue() also added validation for number of elements in AreaEvals diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index 6879556e8..854df3b0e 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -34,6 +34,7 @@ + 45000 - Fixed NPE in ListLevel when numberText is null 44985 - Properly update TextSpecInfoAtom when the parent text is changed 41187 - fixed HSSFSheet to properly read xls files without ROW records 44950 - fixed HSSFFormulaEvaluator.evaluateInCell() and Area3DEval.getValue() also added validation for number of elements in AreaEvals diff --git a/src/scratchpad/src/org/apache/poi/hwpf/model/ListLevel.java b/src/scratchpad/src/org/apache/poi/hwpf/model/ListLevel.java index 0adfe617f..f6b4d8594 100644 --- a/src/scratchpad/src/org/apache/poi/hwpf/model/ListLevel.java +++ b/src/scratchpad/src/org/apache/poi/hwpf/model/ListLevel.java @@ -1,4 +1,3 @@ - /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -16,22 +15,20 @@ limitations under the License. ==================================================================== */ - package org.apache.poi.hwpf.model; +import java.util.Arrays; + import org.apache.poi.util.BitField; import org.apache.poi.util.LittleEndian; -import org.apache.poi.hwpf.usermodel.CharacterProperties; -import org.apache.poi.hwpf.usermodel.ParagraphProperties; - -import org.apache.poi.hwpf.sprm.ParagraphSprmCompressor; -import org.apache.poi.hwpf.sprm.CharacterSprmCompressor; - -import java.util.Arrays; - -public class ListLevel +/** + * + */ +public final class ListLevel { + private static final int RGBXCH_NUMS_SIZE = 9; + private int _iStartAt; private byte _nfc; private byte _info; @@ -70,7 +67,7 @@ public class ListLevel _grpprlPapx = new byte[0]; _grpprlChpx = new byte[0]; _numberText = new char[0]; - _rgbxchNums = new byte[9]; + _rgbxchNums = new byte[RGBXCH_NUMS_SIZE]; if (numbered) { @@ -90,12 +87,11 @@ public class ListLevel _nfc = buf[offset++]; _info = buf[offset++]; - _rgbxchNums = new byte[9]; - for (int x = 0; x < 9; x++) - { - _rgbxchNums[x] = buf[offset++]; - } - _ixchFollow = buf[offset++]; + _rgbxchNums = new byte[RGBXCH_NUMS_SIZE]; + System.arraycopy(buf, offset, _rgbxchNums, 0, RGBXCH_NUMS_SIZE); + offset += RGBXCH_NUMS_SIZE; + + _ixchFollow = buf[offset++]; _dxaSpace = LittleEndian.getInt(buf, offset); offset += LittleEndian.INT_SIZE; _dxaIndent = LittleEndian.getInt(buf, offset); @@ -207,8 +203,8 @@ public class ListLevel offset += LittleEndian.INT_SIZE; buf[offset++] = _nfc; buf[offset++] = _info; - System.arraycopy(_rgbxchNums, 0, buf, offset, _rgbxchNums.length); - offset += _rgbxchNums.length; + System.arraycopy(_rgbxchNums, 0, buf, offset, RGBXCH_NUMS_SIZE); + offset += RGBXCH_NUMS_SIZE; buf[offset++] = _ixchFollow; LittleEndian.putInt(buf, offset, _dxaSpace); offset += LittleEndian.INT_SIZE; @@ -225,23 +221,33 @@ public class ListLevel System.arraycopy(_grpprlPapx, 0, buf, offset, _cbGrpprlPapx); offset += _cbGrpprlPapx; - LittleEndian.putShort(buf, offset, (short)_numberText.length); - offset += LittleEndian.SHORT_SIZE; - for (int x = 0; x < _numberText.length; x++) - { - LittleEndian.putShort(buf, offset, (short)_numberText[x]); + if (_numberText == null) { + // TODO - write junit to test this flow + LittleEndian.putUShort(buf, offset, 0); + } else { + LittleEndian.putUShort(buf, offset, _numberText.length); offset += LittleEndian.SHORT_SIZE; + for (int x = 0; x < _numberText.length; x++) + { + LittleEndian.putUShort(buf, offset, _numberText[x]); + offset += LittleEndian.SHORT_SIZE; + } } return buf; } public int getSizeInBytes() { - if (_numberText!=null) - { - return 28 + _cbGrpprlChpx + _cbGrpprlPapx + (_numberText.length * LittleEndian.SHORT_SIZE) + 2; - } else { - return 28 + _cbGrpprlChpx + _cbGrpprlPapx + 2; - } + int result = + 6 // int byte byte + + RGBXCH_NUMS_SIZE + + 13 // byte int int byte byte short + + _cbGrpprlChpx + + _cbGrpprlPapx + + 2; // numberText length + if (_numberText != null) { + result += _numberText.length * LittleEndian.SHORT_SIZE; + } + return result; } }