From 11ab0194eb01e01179f7734208d74a7daa679531 Mon Sep 17 00:00:00 2001 From: Thomas Wentzel Date: Thu, 6 Mar 2014 22:19:27 +0100 Subject: [PATCH] Got into a situation where telegram would crash upon startup, since fetch_encrypted_message_file would end up being called with a message_media of type CODE_decrypted_message_media_document. --- structures.c | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/structures.c b/structures.c index adda1a7..5a980ac 100644 --- a/structures.c +++ b/structures.c @@ -1482,15 +1482,29 @@ void fetch_encrypted_message_file (struct message_media *M) { if (x == CODE_encrypted_file_empty) { assert (M->type != CODE_decrypted_message_media_photo && M->type != CODE_decrypted_message_media_video); } else { - assert (M->type == CODE_decrypted_message_media_photo || M->type == CODE_decrypted_message_media_video); - M->encr_photo.id = fetch_long (); - M->encr_photo.access_hash = fetch_long (); - fetch_int (); - //assert (M->encr_photo.size == fetch_int ()); - //M->encr_photo.size = fetch_int (); // Why it is not the same? - M->encr_photo.dc_id = fetch_int (); - M->encr_photo.key_fingerprint = fetch_int (); - + assert (M->type == CODE_decrypted_message_media_document || M->type == CODE_decrypted_message_media_photo || M->type == CODE_decrypted_message_media_video); + + switch (M->type) { + case CODE_decrypted_message_media_document: + // Not at all sure these entries are correct. + // Especially since values are not fetched into structures rigidly for photo and video. + M->encr_document.id = fetch_long(); + M->encr_document.access_hash = fetch_long(); + M->encr_document.dc_id = fetch_int(); + M->encr_document.size = fetch_int(); + M->encr_document.key_fingerprint = fetch_int(); + break; + case CODE_decrypted_message_media_photo: + case CODE_decrypted_message_media_video: + M->encr_photo.id = fetch_long (); + M->encr_photo.access_hash = fetch_long (); + fetch_int (); + //assert (M->encr_photo.size == fetch_int ()); + //M->encr_photo.size = fetch_int (); // Why it is not the same? + M->encr_photo.dc_id = fetch_int (); + M->encr_photo.key_fingerprint = fetch_int (); + break; + } } }