*/
RADIUS_PACKET *fr_dhcp_recv(int sockfd)
{
+ ssize_t len;
uint32_t magic;
struct sockaddr_storage src;
struct sockaddr_storage dst;
int port;
uint8_t *code;
- packet = rad_alloc(0);
+ packet = rad_alloc(NULL, 0);
if (!packet) {
fr_strerror_printf("Failed allocating packet");
return NULL;
}
- memset(packet, 0, sizeof(packet));
+ memset(packet, 0, sizeof(*packet));
packet->data = malloc(MAX_PACKET_SIZE);
if (!packet->data) {
sizeof_src = sizeof(src);
#ifdef WITH_UDPFROMTO
sizeof_dst = sizeof(dst);
- packet->data_len = recvfromto(sockfd, packet->data, MAX_PACKET_SIZE, 0,
- (struct sockaddr *)&src, &sizeof_src,
- (struct sockaddr *)&dst, &sizeof_dst);
+ len = recvfromto(sockfd, packet->data, MAX_PACKET_SIZE, 0,
+ (struct sockaddr *)&src, &sizeof_src,
+ (struct sockaddr *)&dst, &sizeof_dst);
#else
- packet->data_len = recvfrom(sockfd, packet->data, MAX_PACKET_SIZE, 0,
- (struct sockaddr *)&src, &sizeof_src);
+ len = recvfrom(sockfd, packet->data, MAX_PACKET_SIZE, 0,
+ (struct sockaddr *)&src, &sizeof_src);
#endif
- if (packet->data_len <= 0) {
+ if (len <= 0) {
fr_strerror_printf("Failed reading DHCP socket: %s", strerror(errno));
rad_free(&packet);
return NULL;
}
- if (packet->data_len < MIN_PACKET_SIZE) {
+ if (len < MIN_PACKET_SIZE) {
fr_strerror_printf("DHCP packet is too small (%d < %d)",
- (int) packet->data_len, MIN_PACKET_SIZE);
+ (int) len, MIN_PACKET_SIZE);
rad_free(&packet);
return NULL;
}
return NULL;
}
+ packet->data_len = len;
+
memcpy(&magic, packet->data + 236, 4);
magic = ntohl(magic);
if (magic != DHCP_OPTION_MAGIC_NUMBER) {
for (i = 0; i < 14; i++) {
vp = pairmake(dhcp_header_names[i], NULL, T_OP_EQ);
if (!vp) {
- fr_strerror_printf("Parse error %s", fr_strerror());
+ char buffer[256];
+ strlcpy(buffer, fr_strerror(), sizeof(buffer));
+ fr_strerror_printf("Cannot decode packet due to internal error: %s", buffer);
pairfree(&head);
return -1;
}
length = fr_dhcp_vp2attr(vp, ptr + 2,
tlv->vp_tlv + tlv->length - ptr);
- if (length > 255) return NULL;
+ if (length > 255) {
+ pairfree(&tlv);
+ return NULL;
+ }
/*
* Pack the attribute.
for (i = 0; i < 14; i++) {
vp = pairmake(dhcp_header_names[i], NULL, T_OP_EQ);
if (!vp) {
- fr_strerror_printf("Parse error %s", fr_strerror());
+ char buffer[256];
+ strlcpy(buffer, fr_strerror(), sizeof(buffer));
+ fr_strerror_printf("Cannot decode packet due to internal error: %s", buffer);
return -1;
}
while (vp) {
unsigned int num_entries = 1;
VALUE_PAIR *same;
- uint8_t *plength, *pattr;
+ uint8_t *plength;
if (vp->da->vendor != DHCP_MAGIC_VENDOR) goto next;
if (vp->da->attr == 53) goto next; /* already done */
vp->vp_octets[0] = 1;
}
#endif
- pattr = p;
*(p++) = vp->da->attr & 0xff;
plength = p;
*(p++) = 0; /* header isn't included in attr length */