summaryrefslogtreecommitdiff
path: root/Build/source/libs/graphite2/graphite2-src
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/libs/graphite2/graphite2-src')
-rw-r--r--Build/source/libs/graphite2/graphite2-src/CMakeLists.txt5
-rw-r--r--Build/source/libs/graphite2/graphite2-src/ChangeLog5
-rw-r--r--Build/source/libs/graphite2/graphite2-src/README.md7
-rw-r--r--Build/source/libs/graphite2/graphite2-src/include/graphite2/Font.h2
-rw-r--r--Build/source/libs/graphite2/graphite2-src/src/CMakeLists.txt22
-rw-r--r--Build/source/libs/graphite2/graphite2-src/src/Code.cpp9
-rw-r--r--Build/source/libs/graphite2/graphite2-src/src/Collider.cpp33
-rw-r--r--Build/source/libs/graphite2/graphite2-src/src/Decompressor.cpp59
-rw-r--r--Build/source/libs/graphite2/graphite2-src/src/FeatureMap.cpp24
-rw-r--r--Build/source/libs/graphite2/graphite2-src/src/FileFace.cpp2
-rw-r--r--Build/source/libs/graphite2/graphite2-src/src/Pass.cpp24
-rw-r--r--Build/source/libs/graphite2/graphite2-src/src/SegCacheEntry.cpp2
-rw-r--r--Build/source/libs/graphite2/graphite2-src/src/Segment.cpp4
-rw-r--r--Build/source/libs/graphite2/graphite2-src/src/Silf.cpp1
-rw-r--r--Build/source/libs/graphite2/graphite2-src/src/TtfUtil.cpp9
-rw-r--r--Build/source/libs/graphite2/graphite2-src/src/gr_face.cpp2
-rw-r--r--Build/source/libs/graphite2/graphite2-src/src/gr_features.cpp10
-rw-r--r--Build/source/libs/graphite2/graphite2-src/src/gr_font.cpp12
-rw-r--r--Build/source/libs/graphite2/graphite2-src/src/gr_logging.cpp5
-rw-r--r--Build/source/libs/graphite2/graphite2-src/src/gr_segment.cpp4
-rw-r--r--Build/source/libs/graphite2/graphite2-src/src/inc/Code.h2
-rw-r--r--Build/source/libs/graphite2/graphite2-src/src/inc/Collider.h4
-rw-r--r--Build/source/libs/graphite2/graphite2-src/src/inc/Compression.h5
-rw-r--r--Build/source/libs/graphite2/graphite2-src/src/inc/FeatureMap.h20
-rw-r--r--Build/source/libs/graphite2/graphite2-src/src/inc/Font.h1
-rw-r--r--Build/source/libs/graphite2/graphite2-src/src/inc/List.h5
-rw-r--r--Build/source/libs/graphite2/graphite2-src/src/inc/Machine.h25
-rw-r--r--Build/source/libs/graphite2/graphite2-src/src/inc/Main.h58
-rw-r--r--Build/source/libs/graphite2/graphite2-src/src/inc/Segment.h2
-rw-r--r--Build/source/libs/graphite2/graphite2-src/src/inc/Sparse.h9
-rw-r--r--Build/source/libs/graphite2/graphite2-src/src/inc/opcode_table.h2
-rw-r--r--Build/source/libs/graphite2/graphite2-src/src/inc/opcodes.h19
32 files changed, 259 insertions, 134 deletions
diff --git a/Build/source/libs/graphite2/graphite2-src/CMakeLists.txt b/Build/source/libs/graphite2/graphite2-src/CMakeLists.txt
index bb8d75bd63a..3466c5fc0d3 100644
--- a/Build/source/libs/graphite2/graphite2-src/CMakeLists.txt
+++ b/Build/source/libs/graphite2/graphite2-src/CMakeLists.txt
@@ -8,6 +8,8 @@ if (NOT CMAKE_BUILD_TYPE)
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY VALUE Release)
endif (NOT CMAKE_BUILD_TYPE)
+option(BUILD_SHARED_LIBS "Make library a shared library instead of static" ON)
+
enable_language(CXX C)
include_directories(${PROJECT_SOURCE_DIR}/include)
@@ -23,12 +25,15 @@ option(GRAPHITE2_ASAN "Enable Address Sanitizing")
message(STATUS "Build: " ${CMAKE_BUILD_TYPE})
+string(REPLACE "ON" "shared" _LIB_OBJECT_TYPE ${BUILD_SHARED_LIBS})
+string(REPLACE "OFF" "static" _LIB_OBJECT_TYPE ${_LIB_OBJECT_TYPE})
string(REPLACE "ON" "disabled" _SEGCACHE_SUPPORT ${GRAPHITE2_NSEGCACHE})
string(REPLACE "OFF" "enabled" _SEGCACHE_SUPPORT ${_SEGCACHE_SUPPORT})
string(REPLACE "ON" "disabled" _FILEFACE_SUPPORT ${GRAPHITE2_NFILEFACE})
string(REPLACE "OFF" "enabled" _FILEFACE_SUPPORT ${_FILEFACE_SUPPORT})
string(REPLACE "ON" "disabled" _TRACING_SUPPORT ${GRAPHITE2_NTRACING})
string(REPLACE "OFF" "enabled" _TRACING_SUPPORT ${_TRACING_SUPPORT})
+message(STATUS "Building library: " ${_LIB_OBJECT_TYPE})
message(STATUS "Segment Cache support: " ${_SEGCACHE_SUPPORT})
message(STATUS "File Face support: " ${_FILEFACE_SUPPORT})
message(STATUS "Tracing support: " ${_TRACING_SUPPORT})
diff --git a/Build/source/libs/graphite2/graphite2-src/ChangeLog b/Build/source/libs/graphite2/graphite2-src/ChangeLog
index 026feda56a4..0a824ff42fe 100644
--- a/Build/source/libs/graphite2/graphite2-src/ChangeLog
+++ b/Build/source/libs/graphite2/graphite2-src/ChangeLog
@@ -1,3 +1,8 @@
+1.3.11
+ . Fixes due to security review
+ . Minor collision avoidance fixes
+ . Fix LZ4 decompressor against high compression
+
1.3.10
. Address floating point build parameters to give consistent positioning results across platforms
. Various bug fixes
diff --git a/Build/source/libs/graphite2/graphite2-src/README.md b/Build/source/libs/graphite2/graphite2-src/README.md
index 2c4ecf58d8a..d6db43a2624 100644
--- a/Build/source/libs/graphite2/graphite2-src/README.md
+++ b/Build/source/libs/graphite2/graphite2-src/README.md
@@ -1,5 +1,12 @@
# Graphite engine
+## Project CI status
+Linux -- Intel 64bit:[![Build Status](http://build.palaso.org/app/rest/builds/buildType:bt124/statusIcon)](http://build.palaso.org/viewType.html?buildTypeId=bt124&guest=1)
+Intel 32bit:[![Build Status](http://build.palaso.org/app/rest/builds/buildType:bt123/statusIcon)](http://build.palaso.org/viewType.html?buildTypeId=bt123&guest=1)
+ARM 32bit:[![Build Status](http://build.palaso.org/app/rest/builds/buildType:Graphite_Linux32bitArm/statusIcon)](http://build.palaso.org/viewType.html?buildTypeId=Graphite_Linux32bitArm&guest=1)
+
+Windows -- Intel 64bit:[![Build Status](http://build.palaso.org/app/rest/builds/buildType:Graphite_Windows64bitProduction/statusIcon)](http://build.palaso.org/viewType.html?buildTypeId=Graphite_Windows64bitProduction&guest=1)
+
## What is Graphite?
Graphite is a system that can be used to create “smart fonts” capable of displaying writing systems with various complex behaviors. A smart font contains not only letter shapes but also additional instructions indicating how to combine and position the letters in complex ways.
diff --git a/Build/source/libs/graphite2/graphite2-src/include/graphite2/Font.h b/Build/source/libs/graphite2/graphite2-src/include/graphite2/Font.h
index 729ebff88ab..efe2af9f247 100644
--- a/Build/source/libs/graphite2/graphite2-src/include/graphite2/Font.h
+++ b/Build/source/libs/graphite2/graphite2-src/include/graphite2/Font.h
@@ -30,7 +30,7 @@
#define GR2_VERSION_MAJOR 1
#define GR2_VERSION_MINOR 3
-#define GR2_VERSION_BUGFIX 10
+#define GR2_VERSION_BUGFIX 11
#ifdef __cplusplus
extern "C"
diff --git a/Build/source/libs/graphite2/graphite2-src/src/CMakeLists.txt b/Build/source/libs/graphite2/graphite2-src/src/CMakeLists.txt
index 08e1c8fa3d7..aa42dbb0d52 100644
--- a/Build/source/libs/graphite2/graphite2-src/src/CMakeLists.txt
+++ b/Build/source/libs/graphite2/graphite2-src/src/CMakeLists.txt
@@ -56,6 +56,10 @@ if (GRAPHITE2_TELEMETRY)
add_definitions(-DGRAPHITE2_TELEMETRY)
endif (GRAPHITE2_TELEMETRY)
+if (NOT BUILD_SHARED_LIBS)
+ add_definitions(-DGRAPHITE2_STATIC)
+endif (NOT BUILD_SHARED_LIBS)
+
set(GRAPHITE_HEADERS
../include/graphite2/Font.h
../include/graphite2/Segment.h
@@ -65,7 +69,7 @@ set(GRAPHITE_HEADERS
file(GLOB PRIVATE_HEADERS inc/*.h)
-add_library(graphite2 SHARED
+add_library(graphite2
${GRAPHITE2_VM_TYPE}_machine.cpp
gr_char_info.cpp
gr_features.cpp
@@ -107,9 +111,9 @@ set_target_properties(graphite2 PROPERTIES PUBLIC_HEADER "${GRAPHITE_HEADERS}"
LT_VERSION_AGE ${GRAPHITE_API_AGE})
if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
- set_target_properties(graphite2 PROPERTIES
- COMPILE_FLAGS "-Wall -Wextra -Wno-unknown-pragmas -Wendif-labels -Wshadow -Wctor-dtor-privacy -Wnon-virtual-dtor -fno-rtti -fno-exceptions -fvisibility=hidden -fvisibility-inlines-hidden -fno-stack-protector"
- LINK_FLAGS "-nodefaultlibs ${GRAPHITE_LINK_FLAGS}"
+ set_target_properties(graphite2 PROPERTIES
+ COMPILE_FLAGS "-Wall -Wextra -Wno-unknown-pragmas -Wendif-labels -Wshadow -Wctor-dtor-privacy -Wnon-virtual-dtor -fno-rtti -fno-exceptions -fvisibility=hidden -fvisibility-inlines-hidden"
+ LINK_FLAGS "-nodefaultlibs ${GRAPHITE_LINK_FLAGS}"
LINKER_LANGUAGE C)
if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "x86|i.86")
add_definitions(-mfpmath=sse -msse2)
@@ -130,16 +134,18 @@ if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
target_link_libraries(graphite2 c gcc)
endif (GRAPHITE2_ASAN)
include(Graphite)
- nolib_test(stdc++ $<TARGET_SONAME_FILE:graphite2>)
+ if (BUILD_SHARED_LIBS)
+ nolib_test(stdc++ $<TARGET_SONAME_FILE:graphite2>)
+ endif (BUILD_SHARED_LIBS)
endif (${CMAKE_CXX_COMPILER} MATCHES ".*mingw.*")
set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "")
CREATE_LIBTOOL_FILE(graphite2 "/lib${LIB_SUFFIX}")
endif (${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
if (${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
- set_target_properties(graphite2 PROPERTIES
- COMPILE_FLAGS "-Wall -Wextra -Wno-unknown-pragmas -Wimplicit-fallthrough -Wendif-labels -Wshadow -Wno-ctor-dtor-privacy -Wno-non-virtual-dtor -fno-rtti -fno-exceptions -fvisibility=hidden -fvisibility-inlines-hidden -fno-stack-protector -mfpmath=sse -msse2"
- LINK_FLAGS "-nodefaultlibs"
+ set_target_properties(graphite2 PROPERTIES
+ COMPILE_FLAGS "-Wall -Wextra -Wno-unknown-pragmas -Wimplicit-fallthrough -Wendif-labels -Wshadow -Wno-ctor-dtor-privacy -Wno-non-virtual-dtor -fno-rtti -fno-exceptions -fvisibility=hidden -fvisibility-inlines-hidden -mfpmath=sse -msse2"
+ LINK_FLAGS "-nodefaultlibs"
LINKER_LANGUAGE C)
target_link_libraries(graphite2 c)
include(Graphite)
diff --git a/Build/source/libs/graphite2/graphite2-src/src/Code.cpp b/Build/source/libs/graphite2/graphite2-src/src/Code.cpp
index 92ba92379cb..4497eea4c53 100644
--- a/Build/source/libs/graphite2/graphite2-src/src/Code.cpp
+++ b/Build/source/libs/graphite2/graphite2-src/src/Code.cpp
@@ -219,7 +219,11 @@ Machine::Code::Code(bool is_constraint, const byte * bytecode_begin, const byte
if (_out)
*_out += total_sz;
else
- _code = static_cast<instr *>(realloc(_code, total_sz));
+ {
+ instr * const old_code = _code;
+ _code = static_cast<instr *>(realloc(_code, total_sz));
+ if (!_code) free(old_code);
+ }
_data = reinterpret_cast<byte *>(_code + (_instr_count+1));
if (!_code)
@@ -316,8 +320,9 @@ opcode Machine::Code::decoder::fetch_opcode(const byte * bc)
if (_stack_depth <= 0)
failure(underfull_stack);
break;
- case NEXT :
case NEXT_N : // runtime checked
+ break;
+ case NEXT :
case COPY_NEXT :
++_out_index;
if (_out_index < -1 || _out_index > _out_length || _slotref > _max.rule_length)
diff --git a/Build/source/libs/graphite2/graphite2-src/src/Collider.cpp b/Build/source/libs/graphite2/graphite2-src/src/Collider.cpp
index 035bb9a3125..d82163aadc2 100644
--- a/Build/source/libs/graphite2/graphite2-src/src/Collider.cpp
+++ b/Build/source/libs/graphite2/graphite2-src/src/Collider.cpp
@@ -306,7 +306,7 @@ bool ShiftCollider::mergeSlot(Segment *seg, Slot *slot, const SlotCollision *csl
float seq_above_wt = cslot->seqAboveWt();
float seq_below_wt = cslot->seqBelowWt();
float seq_valign_wt = cslot->seqValignWt();
- float lmargin = _margin;
+ float lmargin;
// if isAfter, invert orderFlags for diagonal orders.
if (isAfter)
{
@@ -558,6 +558,8 @@ bool ShiftCollider::mergeSlot(Segment *seg, Slot *slot, const SlotCollision *csl
{
// Set up the bogus slot representing the exclusion glyph.
Slot *exclSlot = seg->newSlot();
+ if (!exclSlot)
+ return res;
exclSlot->setGlyph(seg, cslot->exclGlyph());
Position exclOrigin(slot->origin() + cslot->exclOffset());
exclSlot->origin(exclOrigin);
@@ -805,6 +807,8 @@ static float get_edge(Segment *seg, const Slot *s, const Position &shift, float
{
const BBox &bb = gc.getBoundingBBox(gid);
const SlantBox &sb = gc.getBoundingSlantBox(gid);
+ if (sy + bb.yi - margin > y + width / 2 || sy + bb.ya + margin < y - width / 2)
+ return res;
float td = sx - sy + y;
float ts = sx + sy - y;
if (isRight)
@@ -924,7 +928,7 @@ bool KernCollider::initSlot(Segment *seg, Slot *aSlot, const Rect &limit, float
}
}
done:
- _mingap = (float)1e38;
+ _mingap = (float)1e37; // less than 1e38 s.t. 1e38-_mingap is really big
_target = aSlot;
_margin = margin;
_currShift = currShift;
@@ -945,7 +949,7 @@ bool KernCollider::mergeSlot(Segment *seg, Slot *slot, const Position &currShift
const float sx = slot->origin().x + currShift.x;
float x = (sx + (rtl > 0 ? bb.tr.x : bb.bl.x)) * rtl;
// this isn't going to reduce _mingap so skip
- if (x < rtl * (_xbound - _mingap - currSpace))
+ if (_hit && x < rtl * (_xbound - _mingap - currSpace))
return false;
const float sy = slot->origin().y + currShift.y;
@@ -954,19 +958,24 @@ bool KernCollider::mergeSlot(Segment *seg, Slot *slot, const Position &currShift
if (smin > smax)
return false;
bool collides = false;
+ bool nooverlap = true;
for (int i = smin; i <= smax; ++i)
{
- float t;
float here = _edges[i] * rtl;
- float y = (float)(_miny - 1 + (i + .5f) * _sliceWidth); // vertical center of slice
- if ( (x > here - _mingap - currSpace) )
+ if (here > (float)9e37)
+ continue;
+ if (!_hit || x > here - _mingap - currSpace)
{
+ float y = (float)(_miny - 1 + (i + .5f) * _sliceWidth); // vertical center of slice
// 2 * currSpace to account for the space that is already separating them and the space we want to add
float m = get_edge(seg, slot, currShift, y, _sliceWidth, 0., rtl > 0) * rtl + 2 * currSpace;
- t = here - m;
+ if (m < (float)-8e37) // only true if the glyph has a gap in it
+ continue;
+ nooverlap = false;
+ float t = here - m;
// _mingap is positive to shrink
- if (t < _mingap)
+ if (t < _mingap || (!_hit && !collides))
{
_mingap = t;
collides = true;
@@ -980,8 +989,14 @@ bool KernCollider::mergeSlot(Segment *seg, Slot *slot, const Position &currShift
}
#endif
}
+ else
+ nooverlap = false;
}
- return collides; // note that true is not a necessarily reliable value
+ if (nooverlap)
+ _mingap = max(_mingap, _xbound + currSpace + _margin - x);
+ if (collides && !nooverlap)
+ _hit = true;
+ return collides | nooverlap; // note that true is not a necessarily reliable value
} // end of KernCollider::mergeSlot
diff --git a/Build/source/libs/graphite2/graphite2-src/src/Decompressor.cpp b/Build/source/libs/graphite2/graphite2-src/src/Decompressor.cpp
index 4b8b1b4958d..26a4291392c 100644
--- a/Build/source/libs/graphite2/graphite2-src/src/Decompressor.cpp
+++ b/Build/source/libs/graphite2/graphite2-src/src/Decompressor.cpp
@@ -43,29 +43,32 @@ u32 read_literal(u8 const * &s, u8 const * const e, u32 l) {
return l;
}
-bool read_sequence(u8 const * &src, u8 const * const end, u8 const * &literal, u32 & literal_len, u32 & match_len, u32 & match_dist)
+bool read_sequence(u8 const * &src, u8 const * const end, u8 const * &literal,
+ u32 & literal_len, u32 & match_len, u32 & match_dist)
{
u8 const token = *src++;
literal_len = read_literal(src, end, token >> 4);
literal = src;
src += literal_len;
-
- if (src > end - 2 || src < literal)
+
+ // Normal exit for end of stream, wrap arround check and parital match check.
+ if (src > end - sizeof(u16) || src < literal)
return false;
match_dist = *src++;
match_dist |= *src++ << 8;
- match_len = read_literal(src, end, token & 0xf);
-
- return src <= end-5;
+ match_len = read_literal(src, end, token & 0xf) + MINMATCH;
+
+ // Malformed stream check.
+ return src <= end-MINCODA;
}
}
int lz4::decompress(void const *in, size_t in_size, void *out, size_t out_size)
{
- if (out_size <= in_size || in_size < sizeof(unsigned long)+1)
+ if (out_size <= in_size || in_size < MINSRCSIZE)
return -1;
u8 const * src = static_cast<u8 const *>(in),
@@ -74,39 +77,47 @@ int lz4::decompress(void const *in, size_t in_size, void *out, size_t out_size)
u8 * dst = static_cast<u8*>(out),
* const dst_end = dst + out_size;
-
+
+ // Check the in and out size hasn't wrapped around.
+ if (src >= src_end || dst >= dst_end)
+ return -1;
+
u32 literal_len = 0,
match_len = 0,
match_dist = 0;
-
- while (read_sequence(src, src_end, literal, literal_len, match_len, match_dist))
+
+ while (read_sequence(src, src_end, literal, literal_len, match_len,
+ match_dist))
{
if (literal_len != 0)
{
- // Copy in literal. At this point the last full sequence must be at
- // least MINMATCH + 5 from the end of the output buffer.
- if (align(literal_len) > unsigned(dst_end - dst - (MINMATCH+5)) || dst_end - dst < MINMATCH + 5)
+ // Copy in literal. At this point the a minimal literal + minminal
+ // match plus the coda (1 + 2 + 5) must be 8 bytes or more allowing
+ // us to remain within the src buffer for an overrun_copy on
+ // machines upto 64 bits.
+ if (align(literal_len) > out_size)
return -1;
dst = overrun_copy(dst, literal, literal_len);
+ out_size -= literal_len;
}
// Copy, possibly repeating, match from earlier in the
// decoded output.
u8 const * const pcpy = dst - match_dist;
if (pcpy < static_cast<u8*>(out)
- || pcpy >= dst
- || match_len > unsigned(dst_end - dst - (MINMATCH+5))
- || dst_end - dst < MINMATCH + 5)
+ || match_len > unsigned(out_size - LASTLITERALS)
+ // Wrap around checks:
+ || out_size < LASTLITERALS || pcpy >= dst)
return -1;
- if (dst > pcpy+sizeof(unsigned long)
- && dst + align(match_len + MINMATCH) <= dst_end)
- dst = overrun_copy(dst, pcpy, match_len + MINMATCH);
- else
- dst = safe_copy(dst, pcpy, match_len + MINMATCH);
+ if (dst > pcpy+sizeof(unsigned long)
+ && align(match_len) <= out_size)
+ dst = overrun_copy(dst, pcpy, match_len);
+ else
+ dst = safe_copy(dst, pcpy, match_len);
+ out_size -= match_len;
}
-
- if (literal_len > src_end - literal
- || literal_len > dst_end - dst)
+
+ if (literal > src_end - literal_len || literal_len > out_size)
return -1;
dst = fast_copy(dst, literal, literal_len);
diff --git a/Build/source/libs/graphite2/graphite2-src/src/FeatureMap.cpp b/Build/source/libs/graphite2/graphite2-src/src/FeatureMap.cpp
index d0fc55ddf50..87ebc39e23d 100644
--- a/Build/source/libs/graphite2/graphite2-src/src/FeatureMap.cpp
+++ b/Build/source/libs/graphite2/graphite2-src/src/FeatureMap.cpp
@@ -73,7 +73,7 @@ FeatureRef::FeatureRef(const Face & face,
unsigned short & bits_offset, uint32 max_val,
uint32 name, uint16 uiName, uint16 flags,
FeatureSetting *settings, uint16 num_set) throw()
-: m_pFace(&face),
+: m_face(face),
m_nameValues(settings),
m_mask(mask_over_val(max_val)),
m_max(max_val),
@@ -120,7 +120,7 @@ bool FeatureMap::readFeats(const Face & face)
return false;
}
- m_feats = new FeatureRef [m_numFeats];
+ m_feats = grzeroalloc<FeatureRef>(m_numFeats);
uint16 * const defVals = gralloc<uint16>(m_numFeats);
if (!defVals || !m_feats) return false;
unsigned short bits = 0; //to cause overflow on first Feature
@@ -176,9 +176,9 @@ bool FeatureMap::readFeats(const Face & face)
for (int i = 0; i < m_numFeats; ++i)
{
m_feats[i].applyValToFeature(defVals[i], m_defaultFeatures);
- m_pNamedFeats[i] = m_feats+i;
+ m_pNamedFeats[i] = m_feats[i];
}
-
+
free(defVals);
qsort(m_pNamedFeats, m_numFeats, sizeof(NameAndFeatureRef), &cmpNameAndFeatures);
@@ -267,13 +267,13 @@ const FeatureRef *FeatureMap::findFeatureRef(uint32 name) const
}
bool FeatureRef::applyValToFeature(uint32 val, Features & pDest) const
-{
- if (val>maxVal() || !m_pFace)
+{
+ if (val>maxVal())
return false;
if (pDest.m_pMap==NULL)
- pDest.m_pMap = &m_pFace->theSill().theFeatureMap();
+ pDest.m_pMap = &m_face.theSill().theFeatureMap();
else
- if (pDest.m_pMap!=&m_pFace->theSill().theFeatureMap())
+ if (pDest.m_pMap!=&m_face.theSill().theFeatureMap())
return false; //incompatible
if (m_index >= pDest.size())
pDest.resize(m_index+1);
@@ -283,11 +283,9 @@ bool FeatureRef::applyValToFeature(uint32 val, Features & pDest) const
}
uint32 FeatureRef::getFeatureVal(const Features& feats) const
-{
- if (m_index < feats.size() && &m_pFace->theSill().theFeatureMap()==feats.m_pMap)
- return (feats[m_index] & m_mask) >> m_bits;
+{
+ if (m_index < feats.size() && &m_face.theSill().theFeatureMap()==feats.m_pMap)
+ return (feats[m_index] & m_mask) >> m_bits;
else
return 0;
}
-
-
diff --git a/Build/source/libs/graphite2/graphite2-src/src/FileFace.cpp b/Build/source/libs/graphite2/graphite2-src/src/FileFace.cpp
index d1510d3e9e8..b99e678b8fa 100644
--- a/Build/source/libs/graphite2/graphite2-src/src/FileFace.cpp
+++ b/Build/source/libs/graphite2/graphite2-src/src/FileFace.cpp
@@ -92,7 +92,7 @@ const void *FileFace::get_table_fn(const void* appFaceHandle, unsigned int name,
return 0;
tbl = malloc(tbl_len);
- if (fread(tbl, 1, tbl_len, file_face._file) != tbl_len)
+ if (!tbl || fread(tbl, 1, tbl_len, file_face._file) != tbl_len)
{
free(tbl);
return 0;
diff --git a/Build/source/libs/graphite2/graphite2-src/src/Pass.cpp b/Build/source/libs/graphite2/graphite2-src/src/Pass.cpp
index 683143c5097..7dd4f1c9c96 100644
--- a/Build/source/libs/graphite2/graphite2-src/src/Pass.cpp
+++ b/Build/source/libs/graphite2/graphite2-src/src/Pass.cpp
@@ -171,7 +171,9 @@ bool Pass::readPass(const byte * const pass_start, size_t pass_length, size_t su
const uint16 * const o_actions = reinterpret_cast<const uint16 *>(p);
be::skip<uint16>(p, m_numRules + 1);
const byte * const states = p;
- if (e.test(2u*m_numTransition*m_numColumns >= (unsigned)(pass_end - p), E_BADPASSLENGTH)) return face.error(e);
+ if (e.test(2u*m_numTransition*m_numColumns >= (unsigned)(pass_end - p), E_BADPASSLENGTH)
+ || e.test(p >= pass_end, E_BADPASSLENGTH))
+ return face.error(e);
be::skip<int16>(p, m_numTransition*m_numColumns);
be::skip<uint8>(p);
if (e.test(p != pcCode, E_BADPASSCCODEPTR)) return face.error(e);
@@ -270,10 +272,11 @@ bool Pass::readRules(const byte * rule_map, const size_t num_entries,
return face.error(e);
}
- byte * moved_progs = static_cast<byte *>(realloc(m_progs, prog_pool_free - m_progs));
+ byte * const moved_progs = prog_pool_free > m_progs ? static_cast<byte *>(realloc(m_progs, prog_pool_free - m_progs)) : 0;
if (e.test(!moved_progs, E_OUTOFMEM))
{
- if (prog_pool_free - m_progs == 0) m_progs = 0;
+ free(m_progs);
+ m_progs = 0;
return face.error(e);
}
@@ -714,18 +717,18 @@ void Pass::adjustSlot(int delta, Slot * & slot_out, SlotMap & smap) const
{
while (++delta <= 0 && slot_out)
{
+ slot_out = slot_out->prev();
if (smap.highpassed() && smap.highwater() == slot_out)
smap.highpassed(false);
- slot_out = slot_out->prev();
}
}
else if (delta > 0)
{
while (--delta >= 0 && slot_out)
{
- slot_out = slot_out->next();
if (slot_out == smap.highwater() && slot_out)
smap.highpassed(true);
+ slot_out = slot_out->next();
}
}
}
@@ -968,8 +971,8 @@ bool Pass::resolveCollisions(Segment *seg, Slot *slotFix, Slot *start,
if (nbor != slotFix // don't process if this is the slot of interest
&& !(cNbor->ignore()) // don't process if ignoring
&& (nbor == base || sameCluster // process if in the same cluster as slotFix
- || !inKernCluster(seg, nbor) // or this cluster is not to be kerned
- || (rtl ^ ignoreForKern)) // or it comes before(ltr) or after(rtl)
+ || !inKernCluster(seg, nbor)) // or this cluster is not to be kerned
+// || (rtl ^ ignoreForKern)) // or it comes before(ltr) or after(rtl)
&& (!isRev // if processing forwards then good to merge otherwise only:
|| !(cNbor->flags() & SlotCollision::COLL_FIX) // merge in immovable stuff
|| ((cNbor->flags() & SlotCollision::COLL_KERN) && !sameCluster) // ignore other kernable clusters
@@ -1037,6 +1040,8 @@ float Pass::resolveKern(Segment *seg, Slot *slotFix, GR_MAYBE_UNUSED Slot *start
base = base->attachedTo();
SlotCollision *cFix = seg->collisionInfo(base);
const GlyphCache &gc = seg->getFace()->glyphs();
+ const Rect &bbb = seg->theGlyphBBoxTemporary(slotFix->gid());
+ const float by = slotFix->origin().y + cFix->shift().y;
if (base != slotFix)
{
@@ -1047,6 +1052,8 @@ float Pass::resolveKern(Segment *seg, Slot *slotFix, GR_MAYBE_UNUSED Slot *start
bool isInit = false;
KernCollider coll(dbgout);
+ ymax = max(by + bbb.tr.y, ymax);
+ ymin = min(by + bbb.bl.y, ymin);
for (nbor = slotFix->next(); nbor; nbor = nbor->next())
{
if (nbor->isChildOf(base))
@@ -1066,9 +1073,6 @@ float Pass::resolveKern(Segment *seg, Slot *slotFix, GR_MAYBE_UNUSED Slot *start
else
{
space_count = 0;
- float y = nbor->origin().y + cNbor->shift().y;
- ymax = max(y + bb.tr.y, ymax);
- ymin = min(y + bb.bl.y, ymin);
if (nbor != slotFix && !cNbor->ignore())
{
seenEnd = true;
diff --git a/Build/source/libs/graphite2/graphite2-src/src/SegCacheEntry.cpp b/Build/source/libs/graphite2/graphite2-src/src/SegCacheEntry.cpp
index d35912d5aed..70c561b62c5 100644
--- a/Build/source/libs/graphite2/graphite2-src/src/SegCacheEntry.cpp
+++ b/Build/source/libs/graphite2/graphite2-src/src/SegCacheEntry.cpp
@@ -42,7 +42,7 @@ SegCacheEntry::SegCacheEntry(const uint16* cmapGlyphs, size_t length, Segment *
m_accessCount(0), m_lastAccess(cacheTime)
{
if (m_unicode)
- for (uint16 i = 0; i < length; i++)
+ for (size_t i = 0; i < length; i++)
m_unicode[i] = cmapGlyphs[i];
const size_t glyphCount = seg->slotCount(),
diff --git a/Build/source/libs/graphite2/graphite2-src/src/Segment.cpp b/Build/source/libs/graphite2/graphite2-src/src/Segment.cpp
index 3020bfd36d0..f84d28cca8c 100644
--- a/Build/source/libs/graphite2/graphite2-src/src/Segment.cpp
+++ b/Build/source/libs/graphite2/graphite2-src/src/Segment.cpp
@@ -59,7 +59,9 @@ Segment::Segment(unsigned int numchars, const Face* face, uint32 script, int tex
m_dir(textDir),
m_flags(((m_silf->flags() & 0x20) != 0) << 1)
{
- freeSlot(newSlot());
+ Slot *s = newSlot();
+ if (s)
+ freeSlot(s);
m_bufSize = log_binary(numchars)+1;
}
diff --git a/Build/source/libs/graphite2/graphite2-src/src/Silf.cpp b/Build/source/libs/graphite2/graphite2-src/src/Silf.cpp
index e36b50289f0..1848e020269 100644
--- a/Build/source/libs/graphite2/graphite2-src/src/Silf.cpp
+++ b/Build/source/libs/graphite2/graphite2-src/src/Silf.cpp
@@ -276,6 +276,7 @@ size_t Silf::readClassMap(const byte *p, size_t data_len, uint32 version, Error
return ERROROFFSET;
// Check the linear offsets are sane, these must be monotonically increasing.
+ assert(m_nClass >= m_nLinear);
for (const uint32 *o = m_classOffsets, * const o_end = o + m_nLinear; o != o_end; ++o)
if (e.test(o[0] > o[1], E_BADCLASSOFFSET))
return ERROROFFSET;
diff --git a/Build/source/libs/graphite2/graphite2-src/src/TtfUtil.cpp b/Build/source/libs/graphite2/graphite2-src/src/TtfUtil.cpp
index 75e8da11c45..4fb73f2409f 100644
--- a/Build/source/libs/graphite2/graphite2-src/src/TtfUtil.cpp
+++ b/Build/source/libs/graphite2/graphite2-src/src/TtfUtil.cpp
@@ -341,6 +341,11 @@ bool CheckTable(const Tag TableId, const void * pTable, size_t lTableSize)
return be::swap(pName->format) == 0;
}
+ case Tag::glyf:
+ {
+ return (lTableSize >= sizeof(Sfnt::Glyph));
+ }
+
default:
break;
}
@@ -464,7 +469,7 @@ void HeadTableModifyTime(const void * pHead,
{
const Sfnt::FontHeader * pTable =
reinterpret_cast<const Sfnt::FontHeader *>(pHead);
-
+ ;
*pnDateBC = be::swap(pTable->modified[0]);
*pnDateAD = be::swap(pTable->modified[1]);
}
@@ -1247,7 +1252,7 @@ size_t LocaLookup(gid16 nGlyphId,
void * GlyfLookup(const void * pGlyf, size_t nGlyfOffset, size_t nTableLen)
{
const uint8 * pByte = reinterpret_cast<const uint8 *>(pGlyf);
- if (nGlyfOffset + pByte < pByte || nGlyfOffset + sizeof(Sfnt::Glyph) >= nTableLen)
+ if (nGlyfOffset + pByte < pByte || nGlyfOffset >= nTableLen - sizeof(Sfnt::Glyph))
return NULL;
return const_cast<uint8 *>(pByte + nGlyfOffset);
}
diff --git a/Build/source/libs/graphite2/graphite2-src/src/gr_face.cpp b/Build/source/libs/graphite2/graphite2-src/src/gr_face.cpp
index fe1eb838207..65a4b117f5b 100644
--- a/Build/source/libs/graphite2/graphite2-src/src/gr_face.cpp
+++ b/Build/source/libs/graphite2/graphite2-src/src/gr_face.cpp
@@ -195,7 +195,7 @@ gr_uint32 gr_face_lang_by_index(const gr_face* pFace, gr_uint16 i)
void gr_face_destroy(gr_face *face)
{
- delete face;
+ delete static_cast<Face*>(face);
}
diff --git a/Build/source/libs/graphite2/graphite2-src/src/gr_features.cpp b/Build/source/libs/graphite2/graphite2-src/src/gr_features.cpp
index 38cebb7b5db..30c5c1099b6 100644
--- a/Build/source/libs/graphite2/graphite2-src/src/gr_features.cpp
+++ b/Build/source/libs/graphite2/graphite2-src/src/gr_features.cpp
@@ -80,14 +80,14 @@ gr_int16 gr_fref_value(const gr_feature_ref* pfeatureref, gr_uint16 settingno)
void* gr_fref_label(const gr_feature_ref* pfeatureref, gr_uint16 *langId, gr_encform utf, gr_uint32 *length)
{
- if(!pfeatureref || !pfeatureref->getFace())
+ if(!pfeatureref)
{
langId = 0;
length = 0;
return NULL;
}
uint16 label = pfeatureref->getNameId();
- NameTable * names = pfeatureref->getFace()->nameTable();
+ NameTable * names = pfeatureref->getFace().nameTable();
if (!names)
{
langId = 0;
@@ -101,14 +101,14 @@ void* gr_fref_label(const gr_feature_ref* pfeatureref, gr_uint16 *langId, gr_enc
void* gr_fref_value_label(const gr_feature_ref*pfeatureref, gr_uint16 setting,
gr_uint16 *langId, gr_encform utf, gr_uint32 *length)
{
- if(!pfeatureref || (setting >= pfeatureref->getNumSettings()) || !pfeatureref->getFace())
+ if(!pfeatureref || (setting >= pfeatureref->getNumSettings()))
{
langId = 0;
length = 0;
return NULL;
}
uint16 label = pfeatureref->getSettingName(setting);
- NameTable * names = pfeatureref->getFace()->nameTable();
+ NameTable * names = pfeatureref->getFace().nameTable();
if (!names)
{
langId = 0;
@@ -131,7 +131,7 @@ gr_feature_val* gr_featureval_clone(const gr_feature_val* pfeatures/*may be NULL
void gr_featureval_destroy(gr_feature_val *p)
{
- delete p;
+ delete static_cast<Features*>(p);
}
diff --git a/Build/source/libs/graphite2/graphite2-src/src/gr_font.cpp b/Build/source/libs/graphite2/graphite2-src/src/gr_font.cpp
index ed70ab7381e..7470e1bb5f1 100644
--- a/Build/source/libs/graphite2/graphite2-src/src/gr_font.cpp
+++ b/Build/source/libs/graphite2/graphite2-src/src/gr_font.cpp
@@ -47,10 +47,16 @@ gr_font* gr_make_font(float ppm/*pixels per em*/, const gr_face *face)
gr_font* gr_make_font_with_ops(float ppm/*pixels per em*/, const void* appFontHandle/*non-NULL*/, const gr_font_ops * font_ops, const gr_face * face/*needed for scaling*/)
{ //the appFontHandle must stay alive all the time when the gr_font is alive. When finished with the gr_font, call destroy_gr_font
- if (face == 0) return 0;
+ if (face == 0 || ppm <= 0) return 0;
Font * const res = new Font(ppm, *face, appFontHandle, font_ops);
- return static_cast<gr_font*>(res);
+ if (*res)
+ return static_cast<gr_font*>(res);
+ else
+ {
+ delete res;
+ return 0;
+ }
}
gr_font* gr_make_font_with_advance_fn(float ppm/*pixels per em*/, const void* appFontHandle/*non-NULL*/, gr_advance_fn getAdvance, const gr_face * face/*needed for scaling*/)
@@ -61,7 +67,7 @@ gr_font* gr_make_font_with_advance_fn(float ppm/*pixels per em*/, const void* ap
void gr_font_destroy(gr_font *font)
{
- delete font;
+ delete static_cast<Font*>(font);
}
diff --git a/Build/source/libs/graphite2/graphite2-src/src/gr_logging.cpp b/Build/source/libs/graphite2/graphite2-src/src/gr_logging.cpp
index 3e453ba8e2c..94efc453bb8 100644
--- a/Build/source/libs/graphite2/graphite2-src/src/gr_logging.cpp
+++ b/Build/source/libs/graphite2/graphite2-src/src/gr_logging.cpp
@@ -41,7 +41,7 @@ of the License or (at your option) any later version.
using namespace graphite2;
#if !defined GRAPHITE2_NTRACING
-json *global_log = NULL;
+json *global_log = 0;
#endif
extern "C" {
@@ -120,6 +120,7 @@ void gr_stop_logging(GR_MAYBE_UNUSED gr_face * face)
{
FILE * log = global_log->stream();
delete global_log;
+ global_log = 0;
fclose(log);
}
#endif
@@ -214,7 +215,7 @@ json & graphite2::operator << (json & j, const dslot & ds) throw()
j << "user" << json::flat << json::array;
for (int n = 0; n!= seg.numAttrs(); ++n)
j << s.userAttrs()[n];
- j << json::close;
+ j << json::close;
if (s.firstChild())
{
j << "children" << json::flat << json::array;
diff --git a/Build/source/libs/graphite2/graphite2-src/src/gr_segment.cpp b/Build/source/libs/graphite2/graphite2-src/src/gr_segment.cpp
index 0ab7a0854cc..37ce7ddd0ec 100644
--- a/Build/source/libs/graphite2/graphite2-src/src/gr_segment.cpp
+++ b/Build/source/libs/graphite2/graphite2-src/src/gr_segment.cpp
@@ -103,7 +103,7 @@ gr_segment* gr_make_seg(const gr_font *font, const gr_face *face, gr_uint32 scri
if (pFeats == 0)
pFeats = tmp_feats = static_cast<const gr_feature_val*>(face->theSill().cloneFeatures(0));
gr_segment * seg = makeAndInitialize(font, face, script, pFeats, enc, pStart, nChars, dir);
- delete tmp_feats;
+ delete static_cast<const FeatureVal*>(tmp_feats);
return seg;
}
@@ -111,7 +111,7 @@ gr_segment* gr_make_seg(const gr_font *font, const gr_face *face, gr_uint32 scri
void gr_seg_destroy(gr_segment* p)
{
- delete p;
+ delete static_cast<Segment*>(p);
}
diff --git a/Build/source/libs/graphite2/graphite2-src/src/inc/Code.h b/Build/source/libs/graphite2/graphite2-src/src/inc/Code.h
index 3985ae416e9..3439299e3d6 100644
--- a/Build/source/libs/graphite2/graphite2-src/src/inc/Code.h
+++ b/Build/source/libs/graphite2/graphite2-src/src/inc/Code.h
@@ -162,7 +162,7 @@ inline void Machine::Code::externalProgramMoved(ptrdiff_t dist) throw()
{
if (_code && !_own)
{
- _code += dist / sizeof(instr);
+ _code += dist / signed(sizeof(instr));
_data += dist;
}
}
diff --git a/Build/source/libs/graphite2/graphite2-src/src/inc/Collider.h b/Build/source/libs/graphite2/graphite2-src/src/inc/Collider.h
index 5d953b4a4cb..267776dd4e9 100644
--- a/Build/source/libs/graphite2/graphite2-src/src/inc/Collider.h
+++ b/Build/source/libs/graphite2/graphite2-src/src/inc/Collider.h
@@ -210,6 +210,7 @@ private:
float _sliceWidth; // width of each slice
float _mingap;
float _xbound; // max or min edge
+ bool _hit;
#if !defined GRAPHITE2_NTRACING
// Debugging
@@ -233,7 +234,8 @@ KernCollider::KernCollider(GR_MAYBE_UNUSED json *dbg)
_maxy(1e38f),
_sliceWidth(0.0f),
_mingap(0.0f),
- _xbound(0.0)
+ _xbound(0.0),
+ _hit(false)
{
#if !defined GRAPHITE2_NTRACING
_seg = 0;
diff --git a/Build/source/libs/graphite2/graphite2-src/src/inc/Compression.h b/Build/source/libs/graphite2/graphite2-src/src/inc/Compression.h
index 61351c416ea..6596af2ffa4 100644
--- a/Build/source/libs/graphite2/graphite2-src/src/inc/Compression.h
+++ b/Build/source/libs/graphite2/graphite2-src/src/inc/Compression.h
@@ -47,7 +47,10 @@ typedef uint32_t u32;
typedef uint64_t u64;
#endif
-ptrdiff_t const MINMATCH = 4;
+ptrdiff_t const MINMATCH = 4,
+ LASTLITERALS = 5,
+ MINCODA = LASTLITERALS+1,
+ MINSRCSIZE = 13;
template<int S>
inline
diff --git a/Build/source/libs/graphite2/graphite2-src/src/inc/FeatureMap.h b/Build/source/libs/graphite2/graphite2-src/src/inc/FeatureMap.h
index fc845f6e165..9610c39a487 100644
--- a/Build/source/libs/graphite2/graphite2-src/src/inc/FeatureMap.h
+++ b/Build/source/libs/graphite2/graphite2-src/src/inc/FeatureMap.h
@@ -56,7 +56,6 @@ class FeatureRef
static const uint8 SIZEOF_CHUNK = sizeof(chunk_t)*8;
public:
- FeatureRef();
FeatureRef(const Face & face, unsigned short & bits_offset, uint32 max_val,
uint32 name, uint16 uiName, uint16 flags,
FeatureSetting *settings, uint16 num_set) throw();
@@ -76,14 +75,14 @@ public:
uint16 getSettingName(uint16 index) const { return m_nameValues[index].label(); }
int16 getSettingValue(uint16 index) const { return m_nameValues[index].value(); }
uint32 maxVal() const { return m_max; }
- const Face* getFace() const { return m_pFace;}
+ const Face & getFace() const { return m_face;}
const FeatureMap* getFeatureMap() const;// { return m_pFace;}
CLASS_NEW_DELETE;
private:
FeatureRef(const FeatureRef & rhs);
- const Face * m_pFace; //not NULL
+ const Face & m_face;
FeatureSetting * m_nameValues; // array of name table ids for feature values
chunk_t m_mask, // bit mask to get the value from the vector
m_max; // max value the value can take
@@ -99,27 +98,18 @@ private: //unimplemented
};
-inline
-FeatureRef::FeatureRef()
-: m_pFace(0), m_nameValues(0),
- m_mask(0), m_max(0), m_id(0),
- m_nameid(0), m_flags(0), m_numSet(0),
- m_bits(0), m_index(0)
-{
-}
-
class NameAndFeatureRef
{
public:
NameAndFeatureRef(uint32 name = 0) : m_name(name) , m_pFRef(NULL){}
- NameAndFeatureRef(const FeatureRef* p/*not NULL*/) : m_name(p->getId()), m_pFRef(p) {}
+ NameAndFeatureRef(FeatureRef const & p) : m_name(p.getId()), m_pFRef(&p) {}
bool operator<(const NameAndFeatureRef& rhs) const //orders by m_name
{ return m_name<rhs.m_name; }
CLASS_NEW_DELETE
-
+
uint32 m_name;
const FeatureRef* m_pFRef;
};
@@ -128,7 +118,7 @@ class FeatureMap
{
public:
FeatureMap() : m_numFeats(0), m_feats(NULL), m_pNamedFeats(NULL) {}
- ~FeatureMap() { delete [] m_feats; delete[] m_pNamedFeats; }
+ ~FeatureMap() { free(m_feats); delete[] m_pNamedFeats; }
bool readFeats(const Face & face);
const FeatureRef *findFeatureRef(uint32 name) const;
diff --git a/Build/source/libs/graphite2/graphite2-src/src/inc/Font.h b/Build/source/libs/graphite2/graphite2-src/src/inc/Font.h
index bc7084050e5..df6e79b61a3 100644
--- a/Build/source/libs/graphite2/graphite2-src/src/inc/Font.h
+++ b/Build/source/libs/graphite2/graphite2-src/src/inc/Font.h
@@ -44,6 +44,7 @@ public:
float scale() const;
bool isHinted() const;
const Face & face() const;
+ operator bool () const throw() { return m_advances; }
CLASS_NEW_DELETE;
private:
diff --git a/Build/source/libs/graphite2/graphite2-src/src/inc/List.h b/Build/source/libs/graphite2/graphite2-src/src/inc/List.h
index 020560235c1..eacb1cfd5cb 100644
--- a/Build/source/libs/graphite2/graphite2-src/src/inc/List.h
+++ b/Build/source/libs/graphite2/graphite2-src/src/inc/List.h
@@ -34,6 +34,7 @@ of the License or (at your option) any later version.
#include <cstdlib>
#include <new>
+#include "Main.h"
namespace graphite2 {
@@ -104,7 +105,9 @@ void Vector<T>::reserve(size_t n)
if (n > capacity())
{
const ptrdiff_t sz = size();
- m_first = static_cast<T*>(realloc(m_first, n*sizeof(T)));
+ size_t requested;
+ if (checked_mul(n,sizeof(T), requested)) std::abort();
+ m_first = static_cast<T*>(realloc(m_first, requested));
if (!m_first) std::abort();
m_last = m_first + sz;
m_end = m_first + n;
diff --git a/Build/source/libs/graphite2/graphite2-src/src/inc/Machine.h b/Build/source/libs/graphite2/graphite2-src/src/inc/Machine.h
index 1a01b7a43f7..b23819fb981 100644
--- a/Build/source/libs/graphite2/graphite2-src/src/inc/Machine.h
+++ b/Build/source/libs/graphite2/graphite2-src/src/inc/Machine.h
@@ -15,8 +15,8 @@
You should also have received a copy of the GNU Lesser General Public
License along with this library in the file named "LICENSE".
- If not, write to the Free Software Foundation, 51 Franklin Street,
- Suite 500, Boston, MA 02110-1335, USA or visit their web page on the
+ If not, write to the Free Software Foundation, 51 Franklin Street,
+ Suite 500, Boston, MA 02110-1335, USA or visit their web page on the
internet at http://www.fsf.org/licenses/lgpl.html.
Alternatively, the contents of this file may be used under the terms of the
@@ -27,11 +27,12 @@ of the License or (at your option) any later version.
// This general interpreter interface.
// Author: Tim Eves
-// Build one of direct_machine.cpp or call_machine.cpp to implement this
+// Build one of direct_machine.cpp or call_machine.cpp to implement this
// interface.
#pragma once
#include <cstring>
+#include <limits>
#include <graphite2/Types.h>
#include "inc/Main.h"
@@ -56,6 +57,13 @@ of the License or (at your option) any later version.
#define REGPARM(n)
#endif
+#if defined(__MINGW32__)
+// MinGW's <limits> at some point includes winnt.h which #define's a
+// DELETE macro, which conflicts with enum opcode below, so we undefine
+// it here.
+#undef DELETE
+#endif
+
namespace graphite2 {
// Forward declarations
@@ -64,7 +72,7 @@ class Slot;
class SlotMap;
-namespace vm
+namespace vm
{
@@ -112,12 +120,12 @@ enum opcode {
PUT_GLYPH, PUSH_GLYPH_ATTR, PUSH_ATT_TO_GLYPH_ATTR,
BITOR, BITAND, BITNOT,
BITSET, SET_FEAT,
- MAX_OPCODE,
+ MAX_OPCODE,
// private opcodes for internal use only, comes after all other on disk opcodes
TEMP_COPY = MAX_OPCODE
};
-struct opcode_t
+struct opcode_t
{
instr impl[2];
uint8 param_sz;
@@ -186,6 +194,8 @@ inline Machine::status_t Machine::status() const throw()
inline void Machine::check_final_stack(const stack_t * const sp)
{
+ if (_status != finished) return;
+
stack_t const * const base = _stack + STACK_GUARD,
* const limit = base + STACK_MAX;
if (sp < base) _status = stack_underflow; // This should be impossible now.
@@ -195,6 +205,3 @@ inline void Machine::check_final_stack(const stack_t * const sp)
} // namespace vm
} // namespace graphite2
-
-
-
diff --git a/Build/source/libs/graphite2/graphite2-src/src/inc/Main.h b/Build/source/libs/graphite2/graphite2-src/src/inc/Main.h
index deeffcccd5a..f66b48d0b7d 100644
--- a/Build/source/libs/graphite2/graphite2-src/src/inc/Main.h
+++ b/Build/source/libs/graphite2/graphite2-src/src/inc/Main.h
@@ -15,8 +15,8 @@
You should also have received a copy of the GNU Lesser General Public
License along with this library in the file named "LICENSE".
- If not, write to the Free Software Foundation, 51 Franklin Street,
- Suite 500, Boston, MA 02110-1335, USA or visit their web page on the
+ If not, write to the Free Software Foundation, 51 Franklin Street,
+ Suite 500, Boston, MA 02110-1335, USA or visit their web page on the
internet at http://www.fsf.org/licenses/lgpl.html.
Alternatively, the contents of this file may be used under the terms of the
@@ -77,15 +77,61 @@ public:
struct telemetry {};
#endif
+// Checked multiplaction to catch overflow or underflow when allocating memory
+#if defined(__has_builtin)
+ #if __has_builtin(__builtin_mul_overflow)
+ #define HAVE_BUILTIN_OVERFLOW
+ #endif
+#elif defined(__GNUC__) && (__GNUC__ >= 5) && !defined(__INTEL_COMPILER)
+ #define HAVE_BUILTIN_OVERFLOW
+#endif
+#if defined(__has_include)
+ #if __has_include(<intsafe.h>)
+ #define HAVE_INTSAFE_H
+ #endif
+#elif defined(_WIN32)
+ #define HAVE_INTSAFE_H
+#endif
+
+// Need to import intsafe into the top level namespace
+#if defined(HAVE_INTSAFE_H)
+} // namespace graphite2
+
+#include <intsafe.h>
+
+namespace graphite2 {
+#endif
+
+#if defined(HAVE_BUILTIN_OVERFLOW)
+inline
+bool checked_mul(const size_t a, const size_t b, size_t & t) {
+ return __builtin_mul_overflow(a, b, &t);
+}
+#elif defined(HAVE_INTSAFE_H)
+inline
+bool checked_mul(const size_t a, const size_t b, size_t & t) {
+ return SizeTMult(a, b, &t) == INTSAFE_E_ARITHMETIC_OVERFLOW;
+}
+#else
+inline
+bool checked_mul(const size_t a, const size_t b, size_t & t) {
+ t = a*b;
+ return (((a | b) & (~size_t(0) << (sizeof(size_t) << 2))) && (t / a != b));
+}
+#endif
+
// typesafe wrapper around malloc for simple types
// use free(pointer) to deallocate
template <typename T> T * gralloc(size_t n)
{
+ size_t total;
+ if (checked_mul(n, sizeof(T), total))
+ return 0;
#ifdef GRAPHITE2_TELEMETRY
- telemetry::count_bytes(sizeof(T) * n);
+ telemetry::count_bytes(total);
#endif
- return static_cast<T*>(malloc(sizeof(T) * n));
+ return static_cast<T*>(malloc(total));
}
template <typename T> T * grzeroalloc(size_t n)
@@ -128,7 +174,7 @@ inline T max(const T a, const T b)
#if defined(__clang__) && __cplusplus >= 201103L
/* clang's fallthrough annotations are only available starting in C++11. */
- #define GR_FALLTHROUGH [[clang::fallthrough]]
+ #define GR_FALLTHROUGH [[fallthrough]]
#elif defined(_MSC_VER)
/*
* MSVC's __fallthrough annotations are checked by /analyze (Code Analysis):
@@ -136,6 +182,8 @@ inline T max(const T a, const T b)
*/
#include <sal.h>
#define GR_FALLTHROUGH __fallthrough
+#elif __GNUC__ >= 7
+ #define GR_FALLTHROUGH __attribute__ ((fallthrough))
#else
#define GR_FALLTHROUGH /* fallthrough */
#endif
diff --git a/Build/source/libs/graphite2/graphite2-src/src/inc/Segment.h b/Build/source/libs/graphite2/graphite2-src/src/inc/Segment.h
index bcba1f2a87b..e5a8ad408a7 100644
--- a/Build/source/libs/graphite2/graphite2-src/src/inc/Segment.h
+++ b/Build/source/libs/graphite2/graphite2-src/src/inc/Segment.h
@@ -205,7 +205,7 @@ int8 Segment::getSlotBidiClass(Slot *s) const
inline
void Segment::finalise(const Font *font, bool reverse)
{
- if (!m_first) return;
+ if (!m_first || !m_last) return;
m_advance = positionSlots(font, m_first, m_last, m_silf->dir(), true);
//associateChars(0, m_numCharinfo);
diff --git a/Build/source/libs/graphite2/graphite2-src/src/inc/Sparse.h b/Build/source/libs/graphite2/graphite2-src/src/inc/Sparse.h
index 4a8e3fa7d1f..ceb9cea6f39 100644
--- a/Build/source/libs/graphite2/graphite2-src/src/inc/Sparse.h
+++ b/Build/source/libs/graphite2/graphite2-src/src/inc/Sparse.h
@@ -15,8 +15,8 @@
You should also have received a copy of the GNU Lesser General Public
License along with this library in the file named "LICENSE".
- If not, write to the Free Software Foundation, 51 Franklin Street,
- Suite 500, Boston, MA 02110-1335, USA or visit their web page on the
+ If not, write to the Free Software Foundation, 51 Franklin Street,
+ Suite 500, Boston, MA 02110-1335, USA or visit their web page on the
internet at http://www.fsf.org/licenses/lgpl.html.
Alternatively, the contents of this file may be used under the terms of the
@@ -73,7 +73,7 @@ public:
size_t size() const throw();
size_t _sizeof() const throw();
-
+
CLASS_NEW_DELETE;
private:
@@ -122,10 +122,7 @@ sparse::sparse(I attr, const I last)
+ n_values);
if (m_array.values == 0)
- {
- free(m_array.values); m_array.map=0;
return;
- }
// coverity[forward_null : FALSE] Since m_array is union and m_array.values is not NULL
chunk * ci = m_array.map;
diff --git a/Build/source/libs/graphite2/graphite2-src/src/inc/opcode_table.h b/Build/source/libs/graphite2/graphite2-src/src/inc/opcode_table.h
index 50ae1d4d077..0191088b220 100644
--- a/Build/source/libs/graphite2/graphite2-src/src/inc/opcode_table.h
+++ b/Build/source/libs/graphite2/graphite2-src/src/inc/opcode_table.h
@@ -73,7 +73,7 @@ static const opcode_t opcode_table[] =
{{do2(gtr_eq)}, 0, "GTR_EQ"}, // 0x18
{{do_(next), NILOP}, 0, "NEXT"},
- {{do_(next_n), NILOP}, 1, "NEXT_N"}, // number <= smap.end - map
+ {{NILOP, NILOP}, 1, "NEXT_N"}, // number <= smap.end - map
{{do_(next), NILOP}, 0, "COPY_NEXT"},
{{do_(put_glyph_8bit_obs), NILOP}, 1, "PUT_GLYPH_8BIT_OBS"}, // output_class
{{do_(put_subs_8bit_obs), NILOP}, 3, "PUT_SUBS_8BIT_OBS"}, // slot input_class output_class
diff --git a/Build/source/libs/graphite2/graphite2-src/src/inc/opcodes.h b/Build/source/libs/graphite2/graphite2-src/src/inc/opcodes.h
index 3b6dd3fc3d8..0064a3e678f 100644
--- a/Build/source/libs/graphite2/graphite2-src/src/inc/opcodes.h
+++ b/Build/source/libs/graphite2/graphite2-src/src/inc/opcodes.h
@@ -26,7 +26,7 @@ of the License or (at your option) any later version.
*/
#pragma once
// This file will be pulled into and integrated into a machine implmentation
-// DO NOT build directly and under no circumstances every #include headers in
+// DO NOT build directly and under no circumstances ever #include headers in
// here or you will break the direct_machine.
//
// Implementers' notes
@@ -65,7 +65,7 @@ of the License or (at your option) any later version.
// #define NOT_IMPLEMENTED assert(false)
-#define NOT_IMPLEMENTED
+// #define NOT_IMPLEMENTED
#define binop(op) const uint32 a = pop(); *sp = uint32(*sp) op a
#define sbinop(op) const int32 a = pop(); *sp = int32(*sp) op a
@@ -130,8 +130,10 @@ STARTOP(mul)
ENDOP
STARTOP(div_)
- if (*sp == 0) DIE;
- sbinop(/);
+ const int32 b = pop();
+ const int32 a = int32(*sp);
+ if (b == 0 || (a == std::numeric_limits<int32>::min() && b == -1)) DIE;
+ *sp = int32(*sp) / b;
ENDOP
STARTOP(min_)
@@ -208,12 +210,12 @@ STARTOP(next)
++map;
ENDOP
-STARTOP(next_n)
- use_params(1);
- NOT_IMPLEMENTED;
+//STARTOP(next_n)
+// use_params(1);
+// NOT_IMPLEMENTED;
//declare_params(1);
//const size_t num = uint8(*param);
-ENDOP
+//ENDOP
//STARTOP(copy_next)
// if (is) is = is->next();
@@ -337,6 +339,7 @@ STARTOP(delete_)
else
seg.last(is->prev());
+
if (is == smap.highwater())
smap.highwater(is->next());
if (is->prev())