Validate buffer size in measurement units utils

This commit is contained in:
Alex Kotov 2021-12-14 00:59:00 +05:00
parent 675827558f
commit 6abde5fa30
Signed by: kotovalexarian
GPG Key ID: 553C0EBBEB5D5F08
1 changed files with 71 additions and 39 deletions

View File

@ -6,103 +6,135 @@
#include <kernaux/stdlib.h> #include <kernaux/stdlib.h>
#define TMP_BUFFER_SIZE (64)
bool kernaux_units_human_raw( bool kernaux_units_human_raw(
const size_t value, const size_t value,
const enum KernAux_Unit unit, const enum KernAux_Unit unit,
char *buffer, char *const buffer,
const size_t buffer_size const size_t buffer_size
) { ) {
kernaux_itoa(value, buffer, 10); char tmp_buffer[TMP_BUFFER_SIZE];
while (*buffer != '\0') ++buffer; char *tmp = tmp_buffer;
*(buffer++) = ' ';
kernaux_itoa(value, tmp, 10);
while (*tmp != '\0') ++tmp;
*(tmp++) = ' ';
switch (unit) { switch (unit) {
case KERNAUX_UNIT_BIT: case KERNAUX_UNIT_BIT:
*(buffer++) = 'b'; *(tmp++) = 'b';
*(buffer++) = 'i'; *(tmp++) = 'i';
*(buffer++) = 't'; *(tmp++) = 't';
break; break;
case KERNAUX_UNIT_BYTE: case KERNAUX_UNIT_BYTE:
*(buffer++) = 'B'; *(tmp++) = 'B';
*(buffer++) = 'y'; *(tmp++) = 'y';
*(buffer++) = 't'; *(tmp++) = 't';
*(buffer++) = 'e'; *(tmp++) = 'e';
break; break;
} }
*(buffer++) = '\0';
*(tmp++) = '\0';
const size_t tmp_size = kernaux_strlen(tmp_buffer) + 1;
if (tmp_size > buffer_size) return false;
kernaux_strncpy(buffer, tmp_buffer, tmp_size);
return true;
} }
bool kernaux_units_human_dec( bool kernaux_units_human_dec(
const size_t value, const size_t value,
const enum KernAux_Unit unit, const enum KernAux_Unit unit,
const enum KernAux_UnitPrefixDec prefix, const enum KernAux_UnitPrefixDec prefix,
char *buffer, char *const buffer,
const size_t buffer_size const size_t buffer_size
) { ) {
kernaux_itoa(value, buffer, 10); char tmp_buffer[TMP_BUFFER_SIZE];
while (*buffer != '\0') ++buffer; char *tmp = tmp_buffer;
*(buffer++) = ' ';
kernaux_itoa(value, tmp, 10);
while (*tmp != '\0') ++tmp;
*(tmp++) = ' ';
switch (prefix) { switch (prefix) {
case KERNAUX_UNITPFX_KILO: case KERNAUX_UNITPFX_KILO:
*(buffer++) = 'k'; *(tmp++) = 'k';
break; break;
case KERNAUX_UNITPFX_MEGA: case KERNAUX_UNITPFX_MEGA:
*(buffer++) = 'M'; *(tmp++) = 'M';
break; break;
case KERNAUX_UNITPFX_GIGA: case KERNAUX_UNITPFX_GIGA:
*(buffer++) = 'G'; *(tmp++) = 'G';
break; break;
} }
switch (unit) { switch (unit) {
case KERNAUX_UNIT_BIT: case KERNAUX_UNIT_BIT:
*(buffer++) = 'b'; *(tmp++) = 'b';
*(buffer++) = 'i'; *(tmp++) = 'i';
*(buffer++) = 't'; *(tmp++) = 't';
break; break;
case KERNAUX_UNIT_BYTE: case KERNAUX_UNIT_BYTE:
*(buffer++) = 'B'; *(tmp++) = 'B';
break; break;
} }
*(buffer++) = '\0';
*(tmp++) = '\0';
const size_t tmp_size = kernaux_strlen(tmp_buffer) + 1;
if (tmp_size > buffer_size) return false;
kernaux_strncpy(buffer, tmp_buffer, tmp_size);
return true;
} }
bool kernaux_units_human_bin( bool kernaux_units_human_bin(
const size_t value, const size_t value,
const enum KernAux_Unit unit, const enum KernAux_Unit unit,
const enum KernAux_UnitPrefixBin prefix, const enum KernAux_UnitPrefixBin prefix,
char *buffer, char *const buffer,
const size_t buffer_size const size_t buffer_size
) { ) {
kernaux_itoa(value, buffer, 10); char tmp_buffer[TMP_BUFFER_SIZE];
while (*buffer != '\0') ++buffer; char *tmp = tmp_buffer;
*(buffer++) = ' ';
kernaux_itoa(value, tmp, 10);
while (*tmp != '\0') ++tmp;
*(tmp++) = ' ';
switch (prefix) { switch (prefix) {
case KERNAUX_UNITPFX_KIBI: case KERNAUX_UNITPFX_KIBI:
*(buffer++) = 'K'; *(tmp++) = 'K';
*(buffer++) = 'i'; *(tmp++) = 'i';
break; break;
case KERNAUX_UNITPFX_MEBI: case KERNAUX_UNITPFX_MEBI:
*(buffer++) = 'M'; *(tmp++) = 'M';
*(buffer++) = 'i'; *(tmp++) = 'i';
break; break;
case KERNAUX_UNITPFX_GIBI: case KERNAUX_UNITPFX_GIBI:
*(buffer++) = 'G'; *(tmp++) = 'G';
*(buffer++) = 'i'; *(tmp++) = 'i';
break; break;
} }
switch (unit) { switch (unit) {
case KERNAUX_UNIT_BIT: case KERNAUX_UNIT_BIT:
*(buffer++) = 'b'; *(tmp++) = 'b';
*(buffer++) = 'i'; *(tmp++) = 'i';
*(buffer++) = 't'; *(tmp++) = 't';
break; break;
case KERNAUX_UNIT_BYTE: case KERNAUX_UNIT_BYTE:
*(buffer++) = 'B'; *(tmp++) = 'B';
break; break;
} }
*(buffer++) = '\0';
*(tmp++) = '\0';
const size_t tmp_size = kernaux_strlen(tmp_buffer) + 1;
if (tmp_size > buffer_size) return false;
kernaux_strncpy(buffer, tmp_buffer, tmp_size);
return true;
} }