From: James Jones Date: Mon, 15 Feb 2021 17:27:44 +0000 (-0600) Subject: Clean up vmps dbuff usage (#3914) X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=452cfc8c5cd76297aa98952a0f0ebbf8fa7e8d78;p=thirdparty%2Ffreeradius-server.git Clean up vmps dbuff usage (#3914) --- diff --git a/src/protocols/vmps/vmps.c b/src/protocols/vmps/vmps.c index 77d974eaea1..394a52f0fb8 100644 --- a/src/protocols/vmps/vmps.c +++ b/src/protocols/vmps/vmps.c @@ -268,26 +268,28 @@ ssize_t fr_vmps_encode(fr_dbuff_t *dbuff, uint8_t const *original, { fr_dbuff_t work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff); fr_pair_t *vp; - fr_dbuff_marker_t hdr; - uint32_t sequence; + fr_dbuff_marker_t hdr, io; + uint8_t data_count = 0; /* - * Let's keep reference for packet header. + * Let's keep a reference for packet header, and another + * to let us write to to the encoding as needed. */ fr_dbuff_marker(&hdr, &work_dbuff); + fr_dbuff_marker(&io, &work_dbuff); /* * Create the header */ - fr_dbuff_in_bytes(&work_dbuff, FR_VQP_VERSION, /* Version */ - code, /* Opcode */ - FR_ERROR_CODE_VALUE_NO_ERROR, /* Response Code */ - 0x00); /* Data Count */ + FR_DBUFF_IN_BYTES_RETURN(&work_dbuff, FR_VQP_VERSION, /* Version */ + code, /* Opcode */ + FR_ERROR_CODE_VALUE_NO_ERROR, /* Response Code */ + data_count); /* Data Count */ if (original) { - fr_dbuff_in_memcpy(&work_dbuff, original + 4, 4); + FR_DBUFF_IN_MEMCPY_RETURN(&work_dbuff, original + 4, 4); } else { - fr_dbuff_in(&work_dbuff, seq_no); + FR_DBUFF_IN_RETURN(&work_dbuff, seq_no); } /* @@ -297,20 +299,22 @@ ssize_t fr_vmps_encode(fr_dbuff_t *dbuff, uint8_t const *original, size_t len; if (vp->da == attr_packet_type) { - fr_dbuff_current(&hdr)[1] = (uint8_t)vp->vp_uint32; + fr_dbuff_set(&io, fr_dbuff_current(&hdr) + 1); + fr_dbuff_in(&io, (uint8_t)vp->vp_uint32); fr_dcursor_next(cursor); continue; } if (vp->da == attr_error_code) { - fr_dbuff_current(&hdr)[2] = vp->vp_uint8; + fr_dbuff_set(&io, fr_dbuff_current(&hdr) + 2); + fr_dbuff_in(&io, vp->vp_uint8); fr_dcursor_next(cursor); continue; } if (!original && (vp->da == attr_sequence_number)) { - sequence = htonl(vp->vp_uint32); - memcpy(&fr_dbuff_current(&hdr)[4], &sequence, sizeof(sequence)); + fr_dbuff_set(&io, fr_dbuff_current(&hdr) + 4); + fr_dbuff_in(&io, vp->vp_uint32); fr_dcursor_next(cursor); continue; } @@ -342,10 +346,10 @@ ssize_t fr_vmps_encode(fr_dbuff_t *dbuff, uint8_t const *original, */ /* Type */ - fr_dbuff_in_bytes(&work_dbuff, 0x00, 0x00, 0x0c, (vp->da->attr & 0xff)); + FR_DBUFF_IN_BYTES_RETURN(&work_dbuff, 0x00, 0x00, 0x0c, (vp->da->attr & 0xff)); /* Length */ - fr_dbuff_in(&work_dbuff, (uint16_t)len); + FR_DBUFF_IN_RETURN(&work_dbuff, (uint16_t)len); /* Data */ switch (vp->vp_type) { @@ -365,11 +369,17 @@ ssize_t fr_vmps_encode(fr_dbuff_t *dbuff, uint8_t const *original, default: return -1; } - fr_dbuff_current(&hdr)[3]++; /* Update the Data Count */ + data_count++; fr_dcursor_next(cursor); } + /* + * Update the Data Count + */ + fr_dbuff_set(&io, fr_dbuff_current(&hdr) + 3); + fr_dbuff_in(&io, data_count); + return fr_dbuff_set(dbuff, &work_dbuff); }