Changeset 11549
- Timestamp:
- 10/20/19 18:01:47 (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/module-dvbapi.c
r11548 r11549 6134 6134 } 6135 6135 6136 static void set_chunksize_data_len_to_invalid(uint16_t *chunksize, uint16_t *data_len) 6137 { 6138 (*chunksize) = 1; 6139 (*data_len) = 1; 6140 } 6141 6142 static void log_packeterror(uint16_t mbuf_len, const char* command) 6143 { 6144 cs_log("dvbapi_get_packet_size(): error - buffer length (%" PRIu16 ") too short for %s", mbuf_len, command); 6145 } 6146 6136 6147 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) 6137 6148 { … … 6150 6161 { 6151 6162 cs_log("dvbapi_get_packet_size(): error - buffer length (%" PRIu16 ") too short", mbuf_len); 6152 (*chunksize) = 1; 6153 (*data_len) = 1; 6163 set_chunksize_data_len_to_invalid(chunksize, data_len); 6154 6164 return; 6155 6165 } 6156 6166 6157 6167 mbuf += msgid_size; 6168 6169 int32_t commandsize = 0; 6170 char* command = "DVBAPI_UNKNOWN_COMMAND"; 6171 uint32_t tmp_data_len = 0; 6158 6172 uint32_t opcode = b2i(4, mbuf); //get the client opcode (4 bytes) 6159 6173 6160 6174 //detect the opcode, its size (chunksize) and its internal data size (data_len) 6161 if((opcode & 0xFFFFF000) == DVBAPI_AOT_CA) // min 4+size bytes 6162 { 6163 // parse packet size (ASN.1) 6164 uint32_t sizebytes = 0; 6165 uint32_t tmp_data_len = mbuf[3] & 0x7F; 6166 if(mbuf[3] & 0x80) 6167 { 6168 sizebytes = tmp_data_len; 6169 if(3 + sizebytes < mbuf_len) 6170 { 6171 tmp_data_len = b2i(sizebytes, mbuf + 4); 6175 switch (opcode) 6176 { 6177 case DVBAPI_AOT_CA_STOP: 6178 { 6179 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; 6199 break; 6200 } 6201 case DVBAPI_FILTER_DATA: 6202 { 6203 command = "DVBAPI_FILTER_DATA"; 6204 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; 6211 break; 6212 } 6213 6214 case DVBAPI_CLIENT_INFO: 6215 { 6216 command = "DVBAPI_CLIENT_INFO"; 6217 commandsize = 7; 6218 if(mbuf_len < commandsize) 6219 { 6220 log_packeterror(mbuf_len, command); 6221 break; 6222 } 6223 tmp_data_len = mbuf[6]; 6224 break; 6225 } 6226 6227 default: 6228 { 6229 if((opcode & 0xFFFFFF00) == DVBAPI_AOT_CA_PMT) 6230 { 6231 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; 6251 break; 6172 6252 } 6173 6253 else 6174 6254 { 6175 cs_log("dvbapi_get_packet_size(): error - buffer length (%" PRIu16 ") too short for opcode %08X", mbuf_len, opcode);6176 (*chunksize) = 1;6177 (*data_len) = 1;6178 return;6179 }6180 6181 if(tmp_data_len > 0xFFFF)6182 {6183 cs_log("Socket command too big: %d bytes", tmp_data_len);6184 tmp_data_len = 0xFFFF - 4 - sizebytes;6185 }6186 }6187 (*data_len) = tmp_data_len;6188 (*chunksize) = 4 + sizebytes + (*data_len);6189 cs_log_dbg(D_DVBAPI, "Got packet with opcode %08X and size %" PRIu16, opcode, (*chunksize));6190 }6191 else6192 {6193 switch (opcode)6194 {6195 case DVBAPI_FILTER_DATA: // min 9 bytes6196 {6197 if(mbuf_len < 9)6198 {6199 cs_log("dvbapi_get_packet_size(): error - buffer length (%" PRIu16 ") too short for DVBAPI_FILTER_DATA", mbuf_len);6200 (*chunksize) = 1;6201 (*data_len) = 1;6202 return;6203 }6204 (*data_len) = b2i(2, mbuf + 7) & 0x0FFF;6205 (*chunksize) = 6 + 3 + (*data_len);6206 cs_log_dbg(D_DVBAPI, "Got DVBAPI_FILTER_DATA packet with size %" PRIu16, (*chunksize));6207 break;6208 }6209 6210 case DVBAPI_CLIENT_INFO: // min 7 bytes6211 {6212 if(mbuf_len < 7)6213 {6214 cs_log("dvbapi_get_packet_size(): error - buffer length (%" PRIu16 ") too short for DVBAPI_CLIENT_INFO", mbuf_len);6215 (*chunksize) = 1;6216 (*data_len) = 1;6217 return;6218 }6219 (*data_len) = mbuf[6];6220 (*chunksize) = 6 + 1 + (*data_len);6221 cs_log_dbg(D_DVBAPI, "Got DVBAPI_CLIENT_INFO packet with size %" PRIu16, (*chunksize));6222 break;6223 }6224 6225 default:6226 {6227 6255 cs_log("Unknown socket command received: 0x%08X", opcode); 6228 (*chunksize) = 1; 6229 (*data_len) = 1; 6230 break; 6231 } 6232 } 6233 } 6234 6235 if((*chunksize) < 1) 6236 { 6237 (*chunksize) = 1; 6238 (*data_len) = 1; 6239 } 6240 6241 if((*chunksize) > 1) 6242 { 6243 (*chunksize) += msgid_size; 6244 } 6256 } 6257 break; 6258 } 6259 } 6260 6261 if(mbuf_len < commandsize + tmp_data_len) 6262 { 6263 cs_log("dvbapi_get_packet_size(): error - buffer length (%" PRIu16 ") too short for %s", mbuf_len, command); 6264 set_chunksize_data_len_to_invalid(chunksize, data_len); 6265 return; 6266 } 6267 6268 if(tmp_data_len + commandsize > 0xFFFF) 6269 { 6270 cs_log("Socket command too big: %d bytes => truncated!", tmp_data_len); 6271 tmp_data_len = 0xFFFF - commandsize; 6272 } 6273 6274 (*data_len) = tmp_data_len; 6275 6276 if((*data_len) < 1) 6277 { 6278 cs_log("Socket command without data => ignoring!"); 6279 set_chunksize_data_len_to_invalid(chunksize, data_len); 6280 return; 6281 } 6282 6283 (*chunksize) += msgid_size + commandsize + (*data_len); 6284 cs_log_dbg(D_DVBAPI, "Got %s packet with size %" PRIu16, command,(*chunksize)); 6245 6285 } 6246 6286
Note:
See TracChangeset
for help on using the changeset viewer.