summaryrefslogtreecommitdiff
path: root/reentr.c
diff options
context:
space:
mode:
authorHugo van der Sanden <hv@crypt.org>2017-02-28 11:21:55 +0000
committerDavid Mitchell <davem@iabyn.com>2017-03-15 09:16:29 +0000
commitacfc2cc32784cce84bd781bc3822b14406b94db2 (patch)
tree4b15ad6ee0691f5a592c9fbe39a161101ab44780 /reentr.c
parent35a27ac0799b5ce44b9a5af182c93c3d5c266026 (diff)
downloadperl-acfc2cc32784cce84bd781bc3822b14406b94db2.tar.gz
reentr: update size after Renew
RT #130841 Setting it before Renew can cause problems if the Renew fails. Required 'make regen'.
Diffstat (limited to 'reentr.c')
-rw-r--r--reentr.c37
1 files changed, 19 insertions, 18 deletions
diff --git a/reentr.c b/reentr.c
index c464acc834..70b971b5a4 100644
--- a/reentr.c
+++ b/reentr.c
@@ -33,6 +33,13 @@
#include "perl.h"
#include "reentr.h"
+#define RenewDouble(data_pointer, size_pointer, type) \
+ STMT_START { \
+ const size_t size = *(size_pointer) * 2; \
+ Renew((data_pointer), (size), type); \
+ *(size_pointer) = size; \
+ } STMT_END
+
void
Perl_reentrant_size(pTHX) {
PERL_UNUSED_CONTEXT;
@@ -326,9 +333,8 @@ Perl_reentrant_retry(const char *f, ...)
PERL_REENTRANT_MAXSIZE / 2)
#endif
{
- PL_reentrant_buffer->_hostent_size *= 2;
- Renew(PL_reentrant_buffer->_hostent_buffer,
- PL_reentrant_buffer->_hostent_size, char);
+ RenewDouble(PL_reentrant_buffer->_hostent_buffer,
+ &PL_reentrant_buffer->_hostent_size, char);
switch (PL_op->op_type) {
case OP_GHBYADDR:
p0 = va_arg(ap, void *);
@@ -359,9 +365,8 @@ Perl_reentrant_retry(const char *f, ...)
#endif
{
Gid_t gid;
- PL_reentrant_buffer->_grent_size *= 2;
- Renew(PL_reentrant_buffer->_grent_buffer,
- PL_reentrant_buffer->_grent_size, char);
+ RenewDouble(PL_reentrant_buffer->_grent_buffer,
+ &PL_reentrant_buffer->_grent_size, char);
switch (PL_op->op_type) {
case OP_GGRNAM:
p0 = va_arg(ap, void *);
@@ -394,9 +399,8 @@ Perl_reentrant_retry(const char *f, ...)
#endif
{
Netdb_net_t net;
- PL_reentrant_buffer->_netent_size *= 2;
- Renew(PL_reentrant_buffer->_netent_buffer,
- PL_reentrant_buffer->_netent_size, char);
+ RenewDouble(PL_reentrant_buffer->_netent_buffer,
+ &PL_reentrant_buffer->_netent_size, char);
switch (PL_op->op_type) {
case OP_GNBYADDR:
net = va_arg(ap, Netdb_net_t);
@@ -426,9 +430,8 @@ Perl_reentrant_retry(const char *f, ...)
#endif
{
Uid_t uid;
- PL_reentrant_buffer->_pwent_size *= 2;
- Renew(PL_reentrant_buffer->_pwent_buffer,
- PL_reentrant_buffer->_pwent_size, char);
+ RenewDouble(PL_reentrant_buffer->_pwent_buffer,
+ &PL_reentrant_buffer->_pwent_size, char);
switch (PL_op->op_type) {
case OP_GPWNAM:
p0 = va_arg(ap, void *);
@@ -462,9 +465,8 @@ Perl_reentrant_retry(const char *f, ...)
PERL_REENTRANT_MAXSIZE / 2)
#endif
{
- PL_reentrant_buffer->_protoent_size *= 2;
- Renew(PL_reentrant_buffer->_protoent_buffer,
- PL_reentrant_buffer->_protoent_size, char);
+ RenewDouble(PL_reentrant_buffer->_protoent_buffer,
+ &PL_reentrant_buffer->_protoent_size, char);
switch (PL_op->op_type) {
case OP_GPBYNAME:
p0 = va_arg(ap, void *);
@@ -492,9 +494,8 @@ Perl_reentrant_retry(const char *f, ...)
PERL_REENTRANT_MAXSIZE / 2)
#endif
{
- PL_reentrant_buffer->_servent_size *= 2;
- Renew(PL_reentrant_buffer->_servent_buffer,
- PL_reentrant_buffer->_servent_size, char);
+ RenewDouble(PL_reentrant_buffer->_servent_buffer,
+ &PL_reentrant_buffer->_servent_size, char);
switch (PL_op->op_type) {
case OP_GSBYNAME:
p0 = va_arg(ap, void *);