diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/Bitmap.c | 32 | ||||
| -rw-r--r-- | src/Hashmap.c | 2 |
2 files changed, 21 insertions, 13 deletions
diff --git a/src/Bitmap.c b/src/Bitmap.c index 674393d..e5eecd6 100644 --- a/src/Bitmap.c +++ b/src/Bitmap.c @@ -113,7 +113,7 @@ static size_t bestPaletteIndex(BH_Color *color, delta[2] = (int32_t)color->data.channel[2] - palette[i].data.channel[2]; delta[3] = (int32_t)color->data.channel[3] - palette[i].data.channel[3]; - currentError = delta[0] * delta[0] + delta[1] * delta[1] + + currentError = delta[0] * delta[0] + delta[1] * delta[1] + delta[2] * delta[2] + delta[3] * delta[3]; if (currentError < bestError) @@ -133,13 +133,13 @@ static void readPacked(const FormatInfo *formatInfo, BH_Color *value) { uint64_t raw; - + switch (formatInfo->type) { case TYPE_PACKED8: raw = *(uint8_t *)data; break; case TYPE_PACKED16: raw = *(uint16_t *)data; break; case TYPE_PACKED32: raw = *(uint32_t *)data; break; - case TYPE_PACKED64: raw = *(uint64_t *)data; break; + case TYPE_PACKED64: raw = *(uint64_t *)data; break; } switch (formatInfo->channels) @@ -173,8 +173,8 @@ static void writePacked(const FormatInfo *formatInfo, case TYPE_PACKED8: *(uint8_t *)data = raw; break; case TYPE_PACKED16: *(uint16_t *)data = raw; break; case TYPE_PACKED32: *(uint32_t *)data = raw; break; - case TYPE_PACKED64: *(uint64_t *)data = raw; break; - } + case TYPE_PACKED64: *(uint64_t *)data = raw; break; + } } @@ -301,7 +301,7 @@ void readData(const FormatInfo *formatInfo, case TYPE_INDEX: *value = palette[readIndex(formatInfo, data, x)]; break; - + case TYPE_ARRAY: readArray(formatInfo, data, x, value); value->type = BH_COLOR_TYPE_RGBA; @@ -326,7 +326,7 @@ void writeData(const FormatInfo *formatInfo, case TYPE_INDEX: writeIndex(formatInfo, data, x, bestPaletteIndex(value, palette, formatInfo)); break; - + case TYPE_ARRAY: BH_ColorToRGBA(value, value); writeArray(formatInfo, data, x, value); @@ -423,12 +423,14 @@ BH_Bitmap *BH_BitmapNew(uint32_t width, size_t header, body, allocSize, stride, step; /* Basic sanity check */ - if (width == 0 || width >= 0x7FFFFFFF || + if (width == 0 || width >= 0x7FFFFFFF || height == 0 || height >= 0x7FFFFFFF) return NULL; /* Get format information */ formatInfo = formats + (format & 0x0FFF); + if ((format & 0x0FFF) > sizeof(formats) / sizeof(FormatInfo)) + return NULL; /* Unset internal flags */ flags &= ~BH_BITMAP_FLAG_EXT_DATA; @@ -446,7 +448,7 @@ BH_Bitmap *BH_BitmapNew(uint32_t width, { if (BH_CHECK_UADD_WRAP(stride, sizeof(uint32_t) - 1, size_t)) return NULL; - + stride = (stride + sizeof(uint32_t) - 1) & ~(sizeof(uint32_t) - 1); } @@ -457,7 +459,7 @@ BH_Bitmap *BH_BitmapNew(uint32_t width, body = stride * height; if (BH_CHECK_UMUL_WRAP(stride, height, size_t)) return NULL; - + if (BH_CHECK_UADD_WRAP(body, sizeof(uint32_t) - 1, size_t)) return NULL; body = (body + (sizeof(uint32_t) - 1)) & ~(sizeof(uint32_t) - 1); @@ -478,7 +480,7 @@ BH_Bitmap *BH_BitmapNew(uint32_t width, if (BH_CHECK_UADD_WRAP(allocSize, header, size_t)) return NULL; allocSize += header; - + if (BH_CHECK_UADD_WRAP(allocSize, body, size_t)) return NULL; allocSize += body; @@ -550,7 +552,7 @@ BH_Bitmap *BH_BitmapCopy(BH_Bitmap *bitmap, /* Sanity checks */ if (!width || !height || x >= bitmap->width || y >= bitmap->height) return NULL; - + if (width < bitmap->width - x || height < bitmap->height - y) return NULL; @@ -674,6 +676,12 @@ void BH_BitmapConvertRow(void *src, srcInfo = formats + (srcFormat & 0x0FFF); destInfo = formats + (destFormat & 0x0FFF); + if ((srcFormat & 0x0FFF) > sizeof(formats) / sizeof(FormatInfo)) + return; + + if ((destFormat & 0x0FFF) > sizeof(formats) / sizeof(FormatInfo)) + return; + for (x = 0; count; --count, ++x) { void *srcAt, *destAt; diff --git a/src/Hashmap.c b/src/Hashmap.c index 8ecadf8..9f58abd 100644 --- a/src/Hashmap.c +++ b/src/Hashmap.c @@ -65,7 +65,7 @@ static int BH_CalcCapacity(size_t size, /* Catch capacity overflow */ if (BH_CHECK_UMUL_WRAP(*capacity, 2, size_t)) return BH_OOM; - + *capacity *= 2; *threshold = *capacity * factor; } |
