author | erik <erik> | 2007-01-26 20:24:07 (UTC) |
---|---|---|
committer | erik <erik> | 2007-01-26 20:24:07 (UTC) |
commit | cc5b326a212414a612838b0041e6077477ebbc70 (patch) (unidiff) | |
tree | fd69c302a511c3bc715ff0e160181b9ad1cbf82d /noncore/apps | |
parent | 53d630c9c4813142ee13e6843c30476a5db26e78 (diff) | |
download | opie-cc5b326a212414a612838b0041e6077477ebbc70.zip opie-cc5b326a212414a612838b0041e6077477ebbc70.tar.gz opie-cc5b326a212414a612838b0041e6077477ebbc70.tar.bz2 |
A couple of places where a string is overrun. This fixes both of them.
-rw-r--r-- | noncore/apps/opie-reader/chm_lib.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/noncore/apps/opie-reader/chm_lib.c b/noncore/apps/opie-reader/chm_lib.c index ecf8278..7acd1d2 100644 --- a/noncore/apps/opie-reader/chm_lib.c +++ b/noncore/apps/opie-reader/chm_lib.c | |||
@@ -1555,167 +1555,168 @@ int chm_enumerate(struct chmFile *h, | |||
1555 | case CHM_ENUMERATOR_FAILURE: return 0; | 1555 | case CHM_ENUMERATOR_FAILURE: return 0; |
1556 | case CHM_ENUMERATOR_CONTINUE: break; | 1556 | case CHM_ENUMERATOR_CONTINUE: break; |
1557 | case CHM_ENUMERATOR_SUCCESS: return 1; | 1557 | case CHM_ENUMERATOR_SUCCESS: return 1; |
1558 | default: break; | 1558 | default: break; |
1559 | } | 1559 | } |
1560 | } | 1560 | } |
1561 | } | 1561 | } |
1562 | 1562 | ||
1563 | /* advance to next page */ | 1563 | /* advance to next page */ |
1564 | curPage = header.block_next; | 1564 | curPage = header.block_next; |
1565 | } | 1565 | } |
1566 | 1566 | ||
1567 | return 1; | 1567 | return 1; |
1568 | } | 1568 | } |
1569 | 1569 | ||
1570 | int chm_enumerate_dir(struct chmFile *h, | 1570 | int chm_enumerate_dir(struct chmFile *h, |
1571 | const char *prefix, | 1571 | const char *prefix, |
1572 | int what, | 1572 | int what, |
1573 | CHM_ENUMERATOR e, | 1573 | CHM_ENUMERATOR e, |
1574 | void *context) | 1574 | void *context) |
1575 | { | 1575 | { |
1576 | /* | 1576 | /* |
1577 | * XXX: do this efficiently (i.e. using the tree index) | 1577 | * XXX: do this efficiently (i.e. using the tree index) |
1578 | */ | 1578 | */ |
1579 | 1579 | ||
1580 | Int32 curPage; | 1580 | Int32 curPage; |
1581 | 1581 | ||
1582 | /* buffer to hold whatever page we're looking at */ | 1582 | /* buffer to hold whatever page we're looking at */ |
1583 | #ifdef WIN32 | 1583 | #ifdef WIN32 |
1584 | UChar *page_buf = alloca((unsigned int)h->block_len); | 1584 | UChar *page_buf = alloca((unsigned int)h->block_len); |
1585 | #else | 1585 | #else |
1586 | UChar page_buf[h->block_len]; | 1586 | UChar page_buf[h->block_len]; |
1587 | #endif | 1587 | #endif |
1588 | struct chmPmglHeader header; | 1588 | struct chmPmglHeader header; |
1589 | UChar *end; | 1589 | UChar *end; |
1590 | UChar *cur; | 1590 | UChar *cur; |
1591 | unsigned long lenRemain; | 1591 | unsigned long lenRemain; |
1592 | 1592 | ||
1593 | /* set to 1 once we've started */ | 1593 | /* set to 1 once we've started */ |
1594 | int it_has_begun=0; | 1594 | int it_has_begun=0; |
1595 | 1595 | ||
1596 | /* the current ui */ | 1596 | /* the current ui */ |
1597 | struct chmUnitInfo ui; | 1597 | struct chmUnitInfo ui; |
1598 | int flag; | 1598 | int flag; |
1599 | 1599 | ||
1600 | /* the length of the prefix */ | 1600 | /* the length of the prefix */ |
1601 | char prefixRectified[CHM_MAX_PATHLEN+1]; | 1601 | char prefixRectified[CHM_MAX_PATHLEN+1]; |
1602 | int prefixLen; | 1602 | int prefixLen; |
1603 | char lastPath[CHM_MAX_PATHLEN]; | 1603 | char lastPath[CHM_MAX_PATHLEN+1]; |
1604 | int lastPathLen; | 1604 | int lastPathLen; |
1605 | 1605 | ||
1606 | /* starting page */ | 1606 | /* starting page */ |
1607 | curPage = h->index_head; | 1607 | curPage = h->index_head; |
1608 | 1608 | ||
1609 | /* initialize pathname state */ | 1609 | /* initialize pathname state */ |
1610 | strncpy(prefixRectified, prefix, CHM_MAX_PATHLEN); | 1610 | strncpy(prefixRectified, prefix, CHM_MAX_PATHLEN); |
1611 | prefixLen = strlen(prefixRectified); | 1611 | prefixLen = strlen(prefixRectified); |
1612 | if (prefixLen != 0) | 1612 | if (prefixLen != 0) |
1613 | { | 1613 | { |
1614 | if (prefixRectified[prefixLen-1] != '/') | 1614 | if (prefixRectified[prefixLen-1] != '/') |
1615 | { | 1615 | { |
1616 | prefixRectified[prefixLen] = '/'; | 1616 | prefixRectified[prefixLen] = '/'; |
1617 | prefixRectified[prefixLen+1] = '\0'; | 1617 | prefixRectified[prefixLen+1] = '\0'; |
1618 | ++prefixLen; | 1618 | ++prefixLen; |
1619 | } | 1619 | } |
1620 | } | 1620 | } |
1621 | lastPath[0] = '\0'; | 1621 | lastPath[0] = '\0'; |
1622 | lastPathLen = -1; | 1622 | lastPathLen = -1; |
1623 | 1623 | ||
1624 | /* until we have either returned or given up */ | 1624 | /* until we have either returned or given up */ |
1625 | while (curPage != -1) | 1625 | while (curPage != -1) |
1626 | { | 1626 | { |
1627 | 1627 | ||
1628 | /* try to fetch the index page */ | 1628 | /* try to fetch the index page */ |
1629 | if (_chm_fetch_bytes(h, | 1629 | if (_chm_fetch_bytes(h, |
1630 | page_buf, | 1630 | page_buf, |
1631 | (UInt64)h->dir_offset + (UInt64)curPage*h->block_len, | 1631 | (UInt64)h->dir_offset + (UInt64)curPage*h->block_len, |
1632 | h->block_len) != h->block_len) | 1632 | h->block_len) != h->block_len) |
1633 | return 0; | 1633 | return 0; |
1634 | 1634 | ||
1635 | /* figure out start and end for this page */ | 1635 | /* figure out start and end for this page */ |
1636 | cur = page_buf; | 1636 | cur = page_buf; |
1637 | lenRemain = _CHM_PMGL_LEN; | 1637 | lenRemain = _CHM_PMGL_LEN; |
1638 | if (! _unmarshal_pmgl_header(&cur, &lenRemain, &header)) | 1638 | if (! _unmarshal_pmgl_header(&cur, &lenRemain, &header)) |
1639 | return 0; | 1639 | return 0; |
1640 | end = page_buf + h->block_len - (header.free_space); | 1640 | end = page_buf + h->block_len - (header.free_space); |
1641 | 1641 | ||
1642 | /* loop over this page */ | 1642 | /* loop over this page */ |
1643 | while (cur < end) | 1643 | while (cur < end) |
1644 | { | 1644 | { |
1645 | if (! _chm_parse_PMGL_entry(&cur, &ui)) | 1645 | if (! _chm_parse_PMGL_entry(&cur, &ui)) |
1646 | return 0; | 1646 | return 0; |
1647 | 1647 | ||
1648 | /* check if we should start */ | 1648 | /* check if we should start */ |
1649 | if (! it_has_begun) | 1649 | if (! it_has_begun) |
1650 | { | 1650 | { |
1651 | if (ui.length == 0 && strncmp(ui.path, prefixRectified, prefixLen) == 0) | 1651 | if (ui.length == 0 && strncmp(ui.path, prefixRectified, prefixLen) == 0) |
1652 | it_has_begun = 1; | 1652 | it_has_begun = 1; |
1653 | else | 1653 | else |
1654 | continue; | 1654 | continue; |
1655 | 1655 | ||
1656 | if (ui.path[prefixLen] == '\0') | 1656 | if (ui.path[prefixLen] == '\0') |
1657 | continue; | 1657 | continue; |
1658 | } | 1658 | } |
1659 | 1659 | ||
1660 | /* check if we should stop */ | 1660 | /* check if we should stop */ |
1661 | else | 1661 | else |
1662 | { | 1662 | { |
1663 | if (strncmp(ui.path, prefixRectified, prefixLen) != 0) | 1663 | if (strncmp(ui.path, prefixRectified, prefixLen) != 0) |
1664 | return 1; | 1664 | return 1; |
1665 | } | 1665 | } |
1666 | 1666 | ||
1667 | /* check if we should include this path */ | 1667 | /* check if we should include this path */ |
1668 | if (lastPathLen != -1) | 1668 | if (lastPathLen != -1) |
1669 | { | 1669 | { |
1670 | if (strncmp(ui.path, lastPath, lastPathLen) == 0) | 1670 | if (strncmp(ui.path, lastPath, lastPathLen) == 0) |
1671 | continue; | 1671 | continue; |
1672 | } | 1672 | } |
1673 | strcpy(lastPath, ui.path); | 1673 | strncpy(lastPath, ui.path, CHM_MAX_PATHLEN); |
1674 | lastPath[CHM_MAX_PATHLEN] = '\0'; | ||
1674 | lastPathLen = strlen(lastPath); | 1675 | lastPathLen = strlen(lastPath); |
1675 | 1676 | ||
1676 | /* check for DIRS */ | 1677 | /* check for DIRS */ |
1677 | if (ui.length == 0 && !(what & CHM_ENUMERATE_DIRS)) | 1678 | if (ui.length == 0 && !(what & CHM_ENUMERATE_DIRS)) |
1678 | continue; | 1679 | continue; |
1679 | 1680 | ||
1680 | /* check for FILES */ | 1681 | /* check for FILES */ |
1681 | if (ui.length != 0 && !(what & CHM_ENUMERATE_FILES)) | 1682 | if (ui.length != 0 && !(what & CHM_ENUMERATE_FILES)) |
1682 | continue; | 1683 | continue; |
1683 | 1684 | ||
1684 | /* check for NORMAL vs. META */ | 1685 | /* check for NORMAL vs. META */ |
1685 | if (ui.path[0] == '/') | 1686 | if (ui.path[0] == '/') |
1686 | { | 1687 | { |
1687 | 1688 | ||
1688 | /* check for NORMAL vs. SPECIAL */ | 1689 | /* check for NORMAL vs. SPECIAL */ |
1689 | if (ui.path[1] == '#' || ui.path[1] == '$') | 1690 | if (ui.path[1] == '#' || ui.path[1] == '$') |
1690 | flag = CHM_ENUMERATE_SPECIAL; | 1691 | flag = CHM_ENUMERATE_SPECIAL; |
1691 | else | 1692 | else |
1692 | flag = CHM_ENUMERATE_NORMAL; | 1693 | flag = CHM_ENUMERATE_NORMAL; |
1693 | } | 1694 | } |
1694 | else | 1695 | else |
1695 | flag = CHM_ENUMERATE_META; | 1696 | flag = CHM_ENUMERATE_META; |
1696 | if (! (what & flag)) | 1697 | if (! (what & flag)) |
1697 | continue; | 1698 | continue; |
1698 | 1699 | ||
1699 | /* call the enumerator */ | 1700 | /* call the enumerator */ |
1700 | { | 1701 | { |
1701 | int status = (*e)(h, &ui, context); | 1702 | int status = (*e)(h, &ui, context); |
1702 | switch (status) | 1703 | switch (status) |
1703 | { | 1704 | { |
1704 | case CHM_ENUMERATOR_FAILURE: return 0; | 1705 | case CHM_ENUMERATOR_FAILURE: return 0; |
1705 | case CHM_ENUMERATOR_CONTINUE: break; | 1706 | case CHM_ENUMERATOR_CONTINUE: break; |
1706 | case CHM_ENUMERATOR_SUCCESS: return 1; | 1707 | case CHM_ENUMERATOR_SUCCESS: return 1; |
1707 | default: break; | 1708 | default: break; |
1708 | } | 1709 | } |
1709 | } | 1710 | } |
1710 | } | 1711 | } |
1711 | 1712 | ||
1712 | /* advance to next page */ | 1713 | /* advance to next page */ |
1713 | curPage = header.block_next; | 1714 | curPage = header.block_next; |
1714 | } | 1715 | } |
1715 | 1716 | ||
1716 | return 1; | 1717 | return 1; |
1717 | } | 1718 | } |
1718 | 1719 | ||
1719 | /* resolve a particular object from the archive */ | 1720 | /* resolve a particular object from the archive */ |
1720 | int chm_resolve_location(struct chmFile *h, | 1721 | int chm_resolve_location(struct chmFile *h, |
1721 | unsigned long pos, | 1722 | unsigned long pos, |