aboutsummaryrefslogtreecommitdiffstats
path: root/pack.c
diff options
context:
space:
mode:
authorTomasz Kramkowski <tk@the-tk.com>2021-08-07 15:10:44 +0100
committerTomasz Kramkowski <tk@the-tk.com>2021-08-07 15:17:22 +0100
commit98ef6a8510d555148528e4fffb6cfa587dbd4c46 (patch)
treef79f0f69a4be5b940d5a6b554102d062fa021719 /pack.c
parentf382d3caec8c30c3884d5616da04f5a663afa39e (diff)
downloadpack-98ef6a8510d555148528e4fffb6cfa587dbd4c46.tar.gz
pack-98ef6a8510d555148528e4fffb6cfa587dbd4c46.tar.xz
pack-98ef6a8510d555148528e4fffb6cfa587dbd4c46.zip
always va_end even when an error occurs
Diffstat (limited to 'pack.c')
-rw-r--r--pack.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/pack.c b/pack.c
index 002d1ee..4a8228a 100644
--- a/pack.c
+++ b/pack.c
@@ -22,6 +22,7 @@ enum pack_status pack(void *buf_, size_t size, const char *fmt, ...)
{
enum pack_endian endianness = PACK_ENDIAN_BIG;
unsigned char *buf = buf_;
+ enum pack_status ret = PACK_OK;
size_t offset = 0;
va_list ap;
@@ -45,15 +46,15 @@ enum pack_status pack(void *buf_, size_t size, const char *fmt, ...)
ITYPE_MACROS
#undef T
case PACK_TYPE_PADDING: v.unsigned_ = 0; sign = false; break;
- default: return PACK_FMTINVAL;
+ default: SET_AND_GOTO(ret, PACK_FMTINVAL, stop);
}
tr_debug("i: %d, fmt[i]: %c, sign: %ssigned", i, fmt[i], sign ? "" : "un");
s = getsize(fmt[i]);
tr_debug("s: %" PRIuSIZE, s);
- if (s == (size_t)-1) return PACK_FMTINVAL;
+ if (s == (size_t)-1) SET_AND_GOTO(ret, PACK_FMTINVAL, stop);
- if (size - offset < s) return PACK_TOOSMALL;
+ if (size - offset < s) SET_AND_GOTO(ret, PACK_TOOSMALL, stop);
if (sign) {
intmax_t n = v.signed_;
@@ -71,7 +72,8 @@ enum pack_status pack(void *buf_, size_t size, const char *fmt, ...)
offset += s;
}
+stop:
va_end(ap);
- return PACK_OK;
+ return ret;
}