* main binary packet receiver loop */
| 446 | * main binary packet receiver loop |
| 447 | */ |
| 448 | void call_callbacks(char* buffer, struct receive_info *rcv) |
| 449 | { |
| 450 | struct packet_cb_list *p; |
| 451 | unsigned int pkg_len; |
| 452 | bin_packet_t packet; |
| 453 | str capability; |
| 454 | |
| 455 | memcpy(&pkg_len, buffer + BIN_PACKET_MARKER_SIZE, sizeof(unsigned int)); |
| 456 | if (pkg_len < HEADER_SIZE + LEN_FIELD_SIZE + CMD_FIELD_SIZE) { |
| 457 | LM_ERR("invalid BIN packet size %u\n", pkg_len); |
| 458 | return; |
| 459 | } |
| 460 | if (pkg_len > BIN_MAX_BUF_LEN) { |
| 461 | LM_ERR("BIN packet size %u exceeds max size %zu\n", |
| 462 | pkg_len, (size_t)BIN_MAX_BUF_LEN); |
| 463 | return; |
| 464 | } |
| 465 | |
| 466 | //add extra size so a realloc wont trigger after small altering of the packet |
| 467 | packet.buffer.s = pkg_malloc(pkg_len + 50); |
| 468 | if (!packet.buffer.s) { |
| 469 | LM_ERR("oom\n"); |
| 470 | return; |
| 471 | } |
| 472 | |
| 473 | packet.buffer.len = pkg_len; |
| 474 | packet.size = pkg_len + 50; |
| 475 | packet.flags = 0; |
| 476 | memcpy(packet.buffer.s, buffer, pkg_len); |
| 477 | |
| 478 | bin_get_capability(&packet, &capability); |
| 479 | if ((unsigned int)capability.len > |
| 480 | pkg_len - HEADER_SIZE - LEN_FIELD_SIZE - CMD_FIELD_SIZE) { |
| 481 | LM_ERR("invalid BIN packet capability length %d for packet size %u\n", |
| 482 | capability.len, pkg_len); |
| 483 | bin_free_packet(&packet); |
| 484 | return; |
| 485 | } |
| 486 | |
| 487 | packet.front_pointer = capability.s + capability.len + CMD_FIELD_SIZE; |
| 488 | memcpy(&packet.type, capability.s + capability.len, sizeof(int)); |
| 489 | |
| 490 | /* packet will be now processed for a specific capability */ |
| 491 | for (p = reg_cbs; p; p = p->next) { |
| 492 | if (p->capability.len == capability.len && |
| 493 | memcmp(capability.s, p->capability.s, capability.len) == 0) { |
| 494 | |
| 495 | LM_DBG("binary Packet CMD: %d. Capability: %.*s\n", |
| 496 | packet.type, capability.len, capability.s); |
| 497 | |
| 498 | p->cbf(&packet, packet.type, rcv,p->att); |
| 499 | |
| 500 | break; |
| 501 | } |
| 502 | } |
| 503 | |
| 504 | bin_free_packet(&packet); |
| 505 | } |
no test coverage detected