aboutsummaryrefslogtreecommitdiffstats
path: root/lib/ic/c_src/oe_ei_encode_atom.c
diff options
context:
space:
mode:
authorHans Nilsson <[email protected]>2018-04-20 11:51:05 +0200
committerHans Nilsson <[email protected]>2018-04-20 11:51:05 +0200
commit0343b68b053ee97b2ef70ea07b9aa87e8842c591 (patch)
tree27e2f211cb8082896699873dce95fa71f2c3f8b7 /lib/ic/c_src/oe_ei_encode_atom.c
parentf15f615f9185077b02c011ac28257e8365c01e75 (diff)
parentf2c1d537dc28ffbde5d42aedec70bf4c6574c3ea (diff)
downloadotp-0343b68b053ee97b2ef70ea07b9aa87e8842c591.tar.gz
otp-0343b68b053ee97b2ef70ea07b9aa87e8842c591.tar.bz2
otp-0343b68b053ee97b2ef70ea07b9aa87e8842c591.zip
Merge branch 'maint-20' into maint
* maint-20: Updated OTP version Prepare release erl_interface: Optimize latin1_to_utf8 and friend inets: Fix broken httpc options handling erl_interface: Fix ei_connect ssh: Fix server crashes for exit-normal signals ssh: Fix ssh_sftpd:handle_op not returning State ic: Optimize oe_ei_encode_atom
Diffstat (limited to 'lib/ic/c_src/oe_ei_encode_atom.c')
-rw-r--r--lib/ic/c_src/oe_ei_encode_atom.c43
1 files changed, 26 insertions, 17 deletions
diff --git a/lib/ic/c_src/oe_ei_encode_atom.c b/lib/ic/c_src/oe_ei_encode_atom.c
index 758586d1d4..99a9fe26f0 100644
--- a/lib/ic/c_src/oe_ei_encode_atom.c
+++ b/lib/ic/c_src/oe_ei_encode_atom.c
@@ -20,28 +20,37 @@
*/
#include <ic.h>
+#include <string.h>
+
+
+#define DIRTY_ATOM_ENC_MAX(LATIN1_CHARS) ((LATIN1_CHARS)*2 + 3)
+
int oe_ei_encode_atom(CORBA_Environment *ev, const char *p) {
int size = ev->_iout;
+ size_t len = strlen(p);
+
+ if (DIRTY_ATOM_ENC_MAX(len) >= ev->_outbufsz) {
+
+ ei_encode_atom_len(0,&size,p,len);
+
+ if (size >= ev->_outbufsz) {
+ char *buf = ev->_outbuf;
+ int bufsz = ev->_outbufsz + ev->_memchunk;
+
+ while (size >= bufsz)
+ bufsz += ev->_memchunk;
+
+ if ((buf = realloc(buf, bufsz)) == NULL) {
+ CORBA_exc_set(ev, CORBA_SYSTEM_EXCEPTION, NO_MEMORY, "End of heap memory while encoding");
+ return -1; /* OUT OF MEMORY */
+ }
- ei_encode_atom(0,&size,p);
-
- if (size >= ev->_outbufsz) {
- char *buf = ev->_outbuf;
- int bufsz = ev->_outbufsz + ev->_memchunk;
-
- while (size >= bufsz)
- bufsz += ev->_memchunk;
-
- if ((buf = realloc(buf, bufsz)) == NULL) {
- CORBA_exc_set(ev, CORBA_SYSTEM_EXCEPTION, NO_MEMORY, "End of heap memory while encoding");
- return -1; /* OUT OF MEMORY */
- }
-
- ev->_outbuf = buf;
- ev->_outbufsz = bufsz;
+ ev->_outbuf = buf;
+ ev->_outbufsz = bufsz;
+ }
}
- return ei_encode_atom(ev->_outbuf,&ev->_iout,p);
+ return ei_encode_atom_len(ev->_outbuf,&ev->_iout,p,len);
}