diff options
author | Lutz Donnerhacke <donner@FreeBSD.org> | 2021-02-07 21:07:34 +0000 |
---|---|---|
committer | Lutz Donnerhacke <donner@FreeBSD.org> | 2021-02-08 13:31:58 +0000 |
commit | 45d75e3ac3fb5bf8230ca28dc09b48c6e5ed7a4f (patch) | |
tree | 84296fde604ccd4dc0fb00e8d982db54f90a3fbb /sys/netgraph | |
parent | fb8c2f743ab695f6004650b58bf96972e2535b20 (diff) | |
download | src-45d75e3ac3fb5bf8230ca28dc09b48c6e5ed7a4f.tar.gz src-45d75e3ac3fb5bf8230ca28dc09b48c6e5ed7a4f.zip |
netgraph/ng_base: Allow larger BINARY2ASCII conversions
Allocate the necessary memory for the conversion dynamically starting
with a value which is sufficient for almost all normal cases.
PR: 187835
Reviewed by: kp
Differential Revision: https://reviews.freebsd.org/D23840
Diffstat (limited to 'sys/netgraph')
-rw-r--r-- | sys/netgraph/ng_base.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/sys/netgraph/ng_base.c b/sys/netgraph/ng_base.c index 6ab39421b255..63bc251f52f9 100644 --- a/sys/netgraph/ng_base.c +++ b/sys/netgraph/ng_base.c @@ -2771,7 +2771,7 @@ ng_generic_msg(node_p here, item_p item, hook_p lasthook) case NGM_BINARY2ASCII: { - int bufSize = 20 * 1024; /* XXX hard coded constant */ + int bufSize = 1024; const struct ng_parse_type *argstype; const struct ng_cmdlist *c; struct ng_mesg *binary, *ascii; @@ -2785,7 +2785,7 @@ ng_generic_msg(node_p here, item_p item, hook_p lasthook) error = EINVAL; break; } - +retry_b2a: /* Get a response message with lots of room */ NG_MKRESPONSE(resp, msg, sizeof(*ascii) + bufSize, M_NOWAIT); if (resp == NULL) { @@ -2827,9 +2827,13 @@ ng_generic_msg(node_p here, item_p item, hook_p lasthook) if (argstype == NULL) { *ascii->data = '\0'; } else { - if ((error = ng_unparse(argstype, - (u_char *)binary->data, - ascii->data, bufSize)) != 0) { + error = ng_unparse(argstype, (u_char *)binary->data, + ascii->data, bufSize); + if (error == ERANGE) { + NG_FREE_MSG(resp); + bufSize *= 2; + goto retry_b2a; + } else if (error) { NG_FREE_MSG(resp); break; } |