| 80 | // Load a main packet from a specified file |
| 81 | |
| 82 | bool MainPacket::Load(DiskFile *diskfile, u64 offset, PACKET_HEADER &header) |
| 83 | { |
| 84 | // Is the packet large enough |
| 85 | if (header.length < sizeof(MAINPACKET)) |
| 86 | { |
| 87 | return false; |
| 88 | } |
| 89 | |
| 90 | // Is there a whole number of fileid values |
| 91 | if (0 < (header.length - sizeof(MAINPACKET)) % sizeof(MD5Hash)) |
| 92 | { |
| 93 | return false; |
| 94 | } |
| 95 | |
| 96 | // Is the packet too large |
| 97 | if (header.length > sizeof(MAINPACKET) + 32768 * sizeof(MD5Hash)) |
| 98 | { |
| 99 | return false; |
| 100 | } |
| 101 | |
| 102 | // Compute the total number of entries in the fileid array |
| 103 | totalfilecount = (u32)(((size_t)header.length - sizeof(MAINPACKET)) / sizeof(MD5Hash)); |
| 104 | |
| 105 | MAINPACKET *packet = (MAINPACKET *)AllocatePacket((size_t)header.length); |
| 106 | |
| 107 | packet->header = header; |
| 108 | |
| 109 | // Read the rest of the packet from disk |
| 110 | if (!diskfile->Read(offset + sizeof(PACKET_HEADER), |
| 111 | &packet->blocksize, |
| 112 | (size_t)packet->header.length - sizeof(PACKET_HEADER))) |
| 113 | return false; |
| 114 | |
| 115 | // Does the packet have enough fileid values |
| 116 | recoverablefilecount = packet->recoverablefilecount; |
| 117 | if (recoverablefilecount > totalfilecount) |
| 118 | { |
| 119 | return false; |
| 120 | } |
| 121 | |
| 122 | // Is the block size valid |
| 123 | blocksize = packet->blocksize; |
| 124 | if (blocksize == 0 || (blocksize & 3) != 0) |
| 125 | { |
| 126 | return false; |
| 127 | } |
| 128 | |
| 129 | return true; |
| 130 | } |
no test coverage detected