--- libelwix/src/vars.c 2022/01/24 16:01:49 1.9.56.2 +++ libelwix/src/vars.c 2022/01/24 17:07:24 1.9.56.3 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: vars.c,v 1.9.56.2 2022/01/24 16:01:49 misho Exp $ +* $Id: vars.c,v 1.9.56.3 2022/01/24 17:07:24 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -252,7 +252,7 @@ buffer2vars(u_char * __restrict buf, int buflen, int v /* * ait_vars2tlv() - Marshaling data from array with variables to TLV buffer * - * @buf = Buffer + * @buf = Buffer, If =NULL then we return only needed buffer size * @buflen = Size of buffer * @vars = Variable array * return: -1 error, 0 nothing done or >0 size of marshaled data @@ -265,16 +265,19 @@ ait_vars2tlv(u_char * __restrict buf, int buflen, arra ait_val_t *val; u_char *dat; - assert(buf); assert(vars); - if (!buf || !vars) + if (!vars) return -1; - if (!buflen || !array_Size(vars)) + if (!array_Size(vars)) return 0; /* calculate amount of data into buffer */ - for (i = 0, Limit = 0; i < array_Size(vars); i++, - Limit += 5 + AIT_LEN(array(vars, i, ait_val_t*))); + for (i = 0, Limit = 0; i < array_Size(vars); + Limit += 5 + AIT_LEN(array(vars, i, ait_val_t*)), i++); + /* check only needed buffer size */ + if (!buf) + return Limit; + if (Limit > buflen) { elwix_SetErr(EMSGSIZE, "Short buffer buflen=%d needed min %d", buflen, Limit); @@ -369,7 +372,7 @@ ait_tlv2vars(u_char * __restrict buf, int buflen) return NULL; /* de-marshaling */ - for (i = 0, dat = buf; i < buflen; i++) { + for (i = 0, dat = buf; *dat != empty && dat < (buf + buflen); i++) { val = ait_getVars(&vars, i); if (!val) { ait_freeVars(&vars);