Accept extra values in Zip64 extra field if they match the directory entry.
diff --git a/lib/zip_dirent.c b/lib/zip_dirent.c
index 2bd89bf..52ca9ff 100644
--- a/lib/zip_dirent.c
+++ b/lib/zip_dirent.c
@@ -521,29 +521,56 @@
 	    return -1;
 	}
 
-	if (zde->uncomp_size == ZIP_UINT32_MAX)
+        if (zde->uncomp_size == ZIP_UINT32_MAX) {
 	    zde->uncomp_size = _zip_buffer_get_64(ef_buffer);
+        }
 	else if (local) {
 	    /* From appnote.txt: This entry in the Local header MUST
 	       include BOTH original and compressed file size fields. */
 	    (void)_zip_buffer_skip(ef_buffer, 8); /* error is caught by _zip_buffer_eof() call */
 	}
-	if (zde->comp_size == ZIP_UINT32_MAX)
+        if (zde->comp_size == ZIP_UINT32_MAX) {
 	    zde->comp_size = _zip_buffer_get_64(ef_buffer);
+        }
 	if (!local) {
-	    if (zde->offset == ZIP_UINT32_MAX)
+            if (zde->offset == ZIP_UINT32_MAX) {
 		zde->offset = _zip_buffer_get_64(ef_buffer);
-	    if (zde->disk_number == ZIP_UINT16_MAX)
+            }
+            if (zde->disk_number == ZIP_UINT16_MAX) {
 		zde->disk_number = _zip_buffer_get_32(ef_buffer);
+            }
 	}
 
 	if (!_zip_buffer_eof(ef_buffer)) {
-	    zip_error_set(error, ZIP_ER_INCONS, 0);
-	    _zip_buffer_free(ef_buffer);
-	    if (!from_buffer) {
-		_zip_buffer_free(buffer);
-	    }
-	    return -1;
+            /* accept additional fields if values match */
+            bool ok = true;
+            switch (got_len) {
+                case 28:
+                    _zip_buffer_set_offset(ef_buffer, 24);
+                    if (zde->disk_number != _zip_buffer_get_32(ef_buffer)) {
+                        ok = false;
+                    }
+                    /* fallthrough */
+                case 24:
+                    _zip_buffer_set_offset(ef_buffer, 0);
+                    if ((zde->uncomp_size != _zip_buffer_get_64(ef_buffer))
+                        || (zde->comp_size != _zip_buffer_get_64(ef_buffer))
+                        || (zde->offset != _zip_buffer_get_64(ef_buffer))) {
+                        ok = false;
+                    }
+                    break;
+                    
+                default:
+                    ok = false;
+            }
+            if (!ok) {
+                zip_error_set(error, ZIP_ER_INCONS, 0);
+                _zip_buffer_free(ef_buffer);
+                if (!from_buffer) {
+                    _zip_buffer_free(buffer);
+                }
+                return -1;
+            }
 	}
 	_zip_buffer_free(ef_buffer);
     }