- Timestamp:
- 10/21/19 21:27:31 (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/module-dvbapi.c
r11549 r11550 6145 6145 } 6146 6146 6147 static bool is_commansize_valid(uint32_t commandsize, uint16_t mbuf_len, const char* command) 6148 { 6149 if(mbuf_len < commandsize) 6150 { 6151 log_packeterror(mbuf_len, command); 6152 return false; 6153 } 6154 return true; 6155 } 6156 6157 static uint8_t get_asn1packetsize(uint8_t *mbuf, uint16_t mbuf_len, const char *command, uint32_t *tmp_data_len) 6158 { 6159 uint8_t sizebytes = 1; 6160 uint8_t commandsize = 3; 6161 *tmp_data_len = mbuf[3] & 0x7F; 6162 if(mbuf[3] & 0x80) 6163 { 6164 commandsize = 4; 6165 sizebytes = *tmp_data_len; 6166 if(3 + sizebytes < mbuf_len) 6167 { 6168 *tmp_data_len = b2i(sizebytes, mbuf + 4); 6169 } 6170 else 6171 { 6172 log_packeterror(mbuf_len, command); 6173 *tmp_data_len = 0; 6174 return 0; 6175 } 6176 } 6177 return commandsize + sizebytes; 6178 } 6179 6147 6180 static void dvbapi_get_packet_size(uint8_t *mbuf, uint16_t mbuf_len, uint16_t *chunksize, uint16_t *data_len, uint16_t client_proto_version) 6148 6181 { … … 6178 6211 { 6179 6212 command = "DVBAPI_AOT_CA_STOP"; 6180 // parse packet size (ASN.1) 6181 uint32_t sizebytes = 1; 6182 commandsize = 3; 6183 tmp_data_len = mbuf[3] & 0x7F; 6184 if(mbuf[3] & 0x80) 6185 { 6186 commandsize = 4; 6187 sizebytes = tmp_data_len; 6188 if(3 + sizebytes < mbuf_len) 6189 { 6190 tmp_data_len = b2i(sizebytes, mbuf + 4); 6191 } 6192 else 6193 { 6194 log_packeterror(mbuf_len, command); 6195 break; 6196 } 6197 } 6198 commandsize += sizebytes; 6213 commandsize = get_asn1packetsize(mbuf, mbuf_len, command, &tmp_data_len); 6199 6214 break; 6200 6215 } … … 6203 6218 command = "DVBAPI_FILTER_DATA"; 6204 6219 commandsize = 9; 6205 if(mbuf_len < commandsize) 6206 { 6207 log_packeterror(mbuf_len, command); 6208 break; 6209 } 6210 tmp_data_len = b2i(2, mbuf + 7) & 0x0FFF; 6220 if(is_commansize_valid(commandsize, mbuf_len, command)) 6221 { 6222 tmp_data_len = b2i(2, mbuf + 7) & 0x0FFF; 6223 } 6211 6224 break; 6212 6225 } … … 6216 6229 command = "DVBAPI_CLIENT_INFO"; 6217 6230 commandsize = 7; 6218 if(mbuf_len < commandsize) 6219 { 6220 log_packeterror(mbuf_len, command); 6221 break; 6222 } 6223 tmp_data_len = mbuf[6]; 6231 if(is_commansize_valid(commandsize, mbuf_len, command)) 6232 { 6233 tmp_data_len = mbuf[6]; 6234 } 6224 6235 break; 6225 6236 } … … 6230 6241 { 6231 6242 command = "DVBAPI_AOT_CA_PMT"; 6232 // parse packet size (ASN.1) 6233 uint32_t sizebytes = 1; 6234 commandsize = 3; 6235 tmp_data_len = mbuf[3] & 0x7F; 6236 if(mbuf[3] & 0x80) 6237 { 6238 commandsize = 4; 6239 sizebytes = tmp_data_len; 6240 if(3 + sizebytes < mbuf_len) 6241 { 6242 tmp_data_len = b2i(sizebytes, mbuf + 4); 6243 } 6244 else 6245 { 6246 log_packeterror(mbuf_len, command); 6247 break; 6248 } 6249 } 6250 commandsize += sizebytes; 6243 commandsize = get_asn1packetsize(mbuf, mbuf_len, command, &tmp_data_len); 6251 6244 break; 6252 6245 }
Note:
See TracChangeset
for help on using the changeset viewer.