Mercurial > code
changeset 80:820426789f17
Fix array in pack.c
author | David Demelier <markand@malikania.fr> |
---|---|
date | Thu, 12 Jan 2012 15:42:08 +0100 |
parents | fd817a7dbf2f |
children | cb5d3d66ea04 |
files | pack.c |
diffstat | 1 files changed, 17 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/pack.c Tue Nov 15 20:12:48 2011 +0100 +++ b/pack.c Thu Jan 12 15:42:08 2012 +0100 @@ -19,6 +19,7 @@ #include <stdlib.h> #include <stdint.h> #include <stdarg.h> +#include <string.h> #include <ctype.h> #include "pack.h" @@ -154,12 +155,11 @@ const char *p; char tok; struct item item; + int nelem; STAILQ_INIT(list); for (p = fmt; *p != '\0'; ++p) { - int i, nelem = 1; - if (isspace(*p)) continue; @@ -174,12 +174,25 @@ if (nelem == 0) continue; - for (i = 0; i < nelem; ++i) { + /* + * If i is 1, then we only have one integer, if it's more + * than one, user may have given an array of something else. + */ + if (nelem == 1) { PACK_GETARG(item.i, ap, tok); - item.conv = pack_getconvert(tok); + item.conv = pack_getconvert(tok); if (pack_item_add(list, &item) < 0) return pack_fatal(list); + } else { + uint8_t *arr = va_arg(ap, void *); + int i; + + for (i = 0; i < nelem; ++i) { + memcpy(&item.i, &arr[i * item.size], item.size); + if (pack_item_add(list, &item) < 0) + return pack_fatal(list); + } } }