Fix animated stickers with wrong dimensions.

This commit is contained in:
John Preston 2020-07-17 08:13:45 +04:00
parent f64f1ea62e
commit 9463bbd266
5 changed files with 20 additions and 11 deletions

View file

@ -102,9 +102,13 @@ MimeType MimeTypeForData(const QByteArray &data) {
return MimeType(QMimeDatabase().mimeTypeForData(data)); return MimeType(QMimeDatabase().mimeTypeForData(data));
} }
bool IsMimeStickerAnimated(const QString &mime) {
return mime == qsl("application/x-tgsticker");
}
bool IsMimeSticker(const QString &mime) { bool IsMimeSticker(const QString &mime) {
return mime == qsl("image/webp") return mime == qsl("image/webp")
|| mime == qsl("application/x-tgsticker"); || IsMimeStickerAnimated(mime);
} }
} // namespace Core } // namespace Core

View file

@ -39,6 +39,7 @@ MimeType MimeTypeForName(const QString &mime);
MimeType MimeTypeForFile(const QFileInfo &file); MimeType MimeTypeForFile(const QFileInfo &file);
MimeType MimeTypeForData(const QByteArray &data); MimeType MimeTypeForData(const QByteArray &data);
bool IsMimeStickerAnimated(const QString &mime);
bool IsMimeSticker(const QString &mime); bool IsMimeSticker(const QString &mime);
} // namespace Core } // namespace Core

View file

@ -573,8 +573,11 @@ void DocumentData::setattributes(
}); });
} }
if (type == StickerDocument if (type == StickerDocument
&& (!GoodStickerDimensions(dimensions.width(), dimensions.height()) && ((size > Storage::kMaxStickerBytesSize)
|| (size > Storage::kMaxStickerBytesSize))) { || (!sticker()->animated
&& !GoodStickerDimensions(
dimensions.width(),
dimensions.height())))) {
type = FileDocument; type = FileDocument;
_additional = nullptr; _additional = nullptr;
} }

View file

@ -82,12 +82,12 @@ using BigNumContext = openssl::Context;
Z(32); Z(32);
S(qstr("\x20")); S(qstr("\x20"));
R(32); R(32);
S(qstr("\x00\x22")); S(qstr("\x00\x20"));
G(0); G(0);
S(qstr("" S(qstr(""
"\x13\x01\x13\x02\x13\x03\xc0\x2b\xc0\x2f\xc0\x2c\xc0\x30\xcc\xa9" "\x13\x01\x13\x02\x13\x03\xc0\x2b\xc0\x2f\xc0\x2c\xc0\x30\xcc\xa9"
"\xcc\xa8\xc0\x13\xc0\x14\x00\x9c\x00\x9d\x00\x2f\x00\x35\x00\x0a" "\xcc\xa8\xc0\x13\xc0\x14\x00\x9c\x00\x9d\x00\x2f\x00\x35\x01\x00"
"\x01\x00\x01\x91")); "\x01\x93"));
G(2); G(2);
S(qstr("\x00\x00\x00\x00")); S(qstr("\x00\x00\x00\x00"));
Open(); Open();
@ -103,9 +103,9 @@ using BigNumContext = openssl::Context;
S(qstr("" S(qstr(""
"\x00\x1d\x00\x17\x00\x18\x00\x0b\x00\x02\x01\x00\x00\x23\x00\x00" "\x00\x1d\x00\x17\x00\x18\x00\x0b\x00\x02\x01\x00\x00\x23\x00\x00"
"\x00\x10\x00\x0e\x00\x0c\x02\x68\x32\x08\x68\x74\x74\x70\x2f\x31" "\x00\x10\x00\x0e\x00\x0c\x02\x68\x32\x08\x68\x74\x74\x70\x2f\x31"
"\x2e\x31\x00\x05\x00\x05\x01\x00\x00\x00\x00\x00\x0d\x00\x14\x00" "\x2e\x31\x00\x05\x00\x05\x01\x00\x00\x00\x00\x00\x0d\x00\x12\x00"
"\x12\x04\x03\x08\x04\x04\x01\x05\x03\x08\x05\x05\x01\x08\x06\x06" "\x10\x04\x03\x08\x04\x04\x01\x05\x03\x08\x05\x05\x01\x08\x06\x06"
"\x01\x02\x01\x00\x12\x00\x00\x00\x33\x00\x2b\x00\x29")); "\x01\x00\x12\x00\x00\x00\x33\x00\x2b\x00\x29"));
G(4); G(4);
S(qstr("\x00\x01\x00\x00\x1d\x00\x20")); S(qstr("\x00\x01\x00\x00\x1d\x00\x20"));
K(); K();

View file

@ -842,8 +842,9 @@ void FileLoadTask::process() {
if (ValidateThumbDimensions(w, h)) { if (ValidateThumbDimensions(w, h)) {
isSticker = Core::IsMimeSticker(filemime) isSticker = Core::IsMimeSticker(filemime)
&& GoodStickerDimensions(w, h) && (filesize < Storage::kMaxStickerBytesSize)
&& (filesize < Storage::kMaxStickerBytesSize); && (Core::IsMimeStickerAnimated(filemime)
|| GoodStickerDimensions(w, h));
if (isSticker) { if (isSticker) {
attributes.push_back(MTP_documentAttributeSticker( attributes.push_back(MTP_documentAttributeSticker(
MTP_flags(0), MTP_flags(0),