6ce4092
diff --git a/pngrutil.c b/pngrutil.c
6ce4092
index 8f8edbc..5ca4dcb 100644
6ce4092
--- a/pngrutil.c
6ce4092
+++ b/pngrutil.c
6ce4092
@@ -866,7 +866,7 @@ void /* PRIVATE */
6ce4092
 png_handle_PLTE(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
6ce4092
 {
6ce4092
    png_color palette[PNG_MAX_PALETTE_LENGTH];
6ce4092
-   int num, i;
6ce4092
+   int max_palette_length, num, i;
6ce4092
 #ifdef PNG_POINTER_INDEXING_SUPPORTED
6ce4092
    png_colorp pal_ptr;
6ce4092
 #endif
6ce4092
@@ -927,6 +927,14 @@ png_handle_PLTE(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
6ce4092
    /* The cast is safe because 'length' is less than 3*PNG_MAX_PALETTE_LENGTH */
6ce4092
    num = (int)length / 3;
6ce4092
 
6ce4092
+   if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
6ce4092
+       max_palette_length = (1 << png_ptr->bit_depth);
6ce4092
+   else
6ce4092
+       max_palette_length = PNG_MAX_PALETTE_LENGTH;
6ce4092
+
6ce4092
+   if (num > max_palette_length)
6ce4092
+       num = max_palette_length;
6ce4092
+
6ce4092
 #ifdef PNG_POINTER_INDEXING_SUPPORTED
6ce4092
    for (i = 0, pal_ptr = palette; i < num; i++, pal_ptr++)
6ce4092
    {
6ce4092
@@ -959,7 +967,7 @@ png_handle_PLTE(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
6ce4092
    if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
6ce4092
 #endif
6ce4092
    {
6ce4092
-      png_crc_finish(png_ptr, 0);
6ce4092
+      png_crc_finish(png_ptr, (int) length - num * 3);
6ce4092
    }
6ce4092
 
6ce4092
 #ifndef PNG_READ_OPT_PLTE_SUPPORTED
ad1e7bc
diff --git a/pngset.c b/pngset.c
6ce4092
index 5f62af1..42e0dc2 100644
ad1e7bc
--- a/pngset.c
ad1e7bc
+++ b/pngset.c
ad1e7bc
@@ -513,12 +513,17 @@ png_set_PLTE(png_structrp png_ptr, png_inforp info_ptr,
ad1e7bc
     png_const_colorp palette, int num_palette)
ad1e7bc
 {
ad1e7bc
 
ad1e7bc
+   png_uint_32 max_palette_length;
ad1e7bc
+
ad1e7bc
    png_debug1(1, "in %s storage function", "PLTE");
ad1e7bc
 
ad1e7bc
    if (png_ptr == NULL || info_ptr == NULL)
ad1e7bc
       return;
ad1e7bc
 
ad1e7bc
-   if (num_palette < 0 || num_palette > PNG_MAX_PALETTE_LENGTH)
ad1e7bc
+   max_palette_length = (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) ?
ad1e7bc
+      (1 << png_ptr->bit_depth) : PNG_MAX_PALETTE_LENGTH;
ad1e7bc
+
6ce4092
+   if (num_palette < 0 || num_palette > (int) max_palette_length)
ad1e7bc
    {
ad1e7bc
       if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
ad1e7bc
          png_error(png_ptr, "Invalid palette length");
6ce4092
diff --git a/pngwrite.c b/pngwrite.c
6ce4092
index 3c8cbbe..39ef69e 100644
6ce4092
--- a/pngwrite.c
6ce4092
+++ b/pngwrite.c
6ce4092
@@ -206,7 +206,7 @@ png_write_info(png_structrp png_ptr, png_const_inforp info_ptr)
6ce4092
       png_write_PLTE(png_ptr, info_ptr->palette,
6ce4092
           (png_uint_32)info_ptr->num_palette);
6ce4092
 
6ce4092
-   else if ((info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) !=0)
6ce4092
+   else if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
6ce4092
       png_error(png_ptr, "Valid palette required for paletted images");
6ce4092
 
6ce4092
 #ifdef PNG_WRITE_tRNS_SUPPORTED
ad1e7bc
diff --git a/pngwutil.c b/pngwutil.c
ad1e7bc
index 9e6019e..01be584 100644
ad1e7bc
--- a/pngwutil.c
ad1e7bc
+++ b/pngwutil.c
ad1e7bc
@@ -922,17 +922,20 @@ void /* PRIVATE */
ad1e7bc
 png_write_PLTE(png_structrp png_ptr, png_const_colorp palette,
ad1e7bc
     png_uint_32 num_pal)
ad1e7bc
 {
ad1e7bc
-   png_uint_32 i;
ad1e7bc
+   png_uint_32 max_palette_length, i;
ad1e7bc
    png_const_colorp pal_ptr;
ad1e7bc
    png_byte buf[3];
ad1e7bc
 
ad1e7bc
    png_debug(1, "in png_write_PLTE");
ad1e7bc
 
ad1e7bc
+   max_palette_length = (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) ?
ad1e7bc
+       (1 << png_ptr->bit_depth) : PNG_MAX_PALETTE_LENGTH;
ad1e7bc
+
ad1e7bc
    if ((
ad1e7bc
 #ifdef PNG_MNG_FEATURES_SUPPORTED
ad1e7bc
        (png_ptr->mng_features_permitted & PNG_FLAG_MNG_EMPTY_PLTE) == 0 &&
ad1e7bc
 #endif
ad1e7bc
-       num_pal == 0) || num_pal > 256)
ad1e7bc
+       num_pal == 0) || num_pal > max_palette_length)
ad1e7bc
    {
ad1e7bc
       if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
ad1e7bc
       {