summaryrefslogtreecommitdiff
path: root/ruby/src
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2019-07-11 13:15:09 +0200
committerBenoit Foucher <benoit@zeroc.com>2019-07-11 13:15:09 +0200
commit7f7401b4e626b7e917dea9dc84c992ddfa305ef6 (patch)
tree8d6ae2d3b7199cff193b7def6eeedbc6257d1a36 /ruby/src
parentFixed another Java IceSSL failure on RHEL8, fixes #431 (diff)
downloadice-7f7401b4e626b7e917dea9dc84c992ddfa305ef6.tar.bz2
ice-7f7401b4e626b7e917dea9dc84c992ddfa305ef6.tar.xz
ice-7f7401b4e626b7e917dea9dc84c992ddfa305ef6.zip
Fixed Ruby crash (and similar issues in other mappings), fixes #432
Diffstat (limited to 'ruby/src')
-rw-r--r--ruby/src/IceRuby/Types.cpp30
1 files changed, 19 insertions, 11 deletions
diff --git a/ruby/src/IceRuby/Types.cpp b/ruby/src/IceRuby/Types.cpp
index d25cc274331..fb9aefe3ce8 100644
--- a/ruby/src/IceRuby/Types.cpp
+++ b/ruby/src/IceRuby/Types.cpp
@@ -270,7 +270,8 @@ IceRuby::StreamUtil::setSlicedDataMember(VALUE obj, const Ice::SlicedDataPtr& sl
//
// bytes
//
- volatile VALUE bytes = callRuby(rb_str_new, reinterpret_cast<const char*>(&(*p)->bytes[0]),
+ volatile VALUE bytes = callRuby(rb_str_new,
+ (*p)->bytes.empty() ? 0 : reinterpret_cast<const char*>(&(*p)->bytes[0]),
static_cast<long>((*p)->bytes.size()));
callRuby(rb_iv_set, slice, "@bytes", bytes);
@@ -1187,7 +1188,7 @@ IceRuby::SequenceInfo::marshal(VALUE p, Ice::OutputStream* os, ObjectMap* object
volatile VALUE arr = Qnil;
- Ice::OutputStream::size_type sizePos;
+ Ice::OutputStream::size_type sizePos = 0;
if(optional)
{
if(elementType->variableLength())
@@ -1431,7 +1432,7 @@ IceRuby::SequenceInfo::marshalPrimitiveSequence(const PrimitiveInfoPtr& pi, VALU
}
seq[static_cast<size_t>(i)] = static_cast<Ice::Byte>(val);
}
- os->write(&seq[0], &seq[0] + seq.size());
+ os->write(seq);
}
break;
}
@@ -1448,7 +1449,7 @@ IceRuby::SequenceInfo::marshalPrimitiveSequence(const PrimitiveInfoPtr& pi, VALU
}
seq[static_cast<size_t>(i)] = static_cast<Ice::Short>(val);
}
- os->write(&seq[0], &seq[0] + seq.size());
+ os->write(seq);
break;
}
case PrimitiveInfo::KindInt:
@@ -1464,7 +1465,7 @@ IceRuby::SequenceInfo::marshalPrimitiveSequence(const PrimitiveInfoPtr& pi, VALU
}
seq[static_cast<size_t>(i)] = static_cast<Ice::Int>(val);
}
- os->write(&seq[0], &seq[0] + seq.size());
+ os->write(seq);
break;
}
case PrimitiveInfo::KindLong:
@@ -1475,7 +1476,7 @@ IceRuby::SequenceInfo::marshalPrimitiveSequence(const PrimitiveInfoPtr& pi, VALU
{
seq[static_cast<size_t>(i)] = getLong(RARRAY_AREF(arr, i));
}
- os->write(&seq[0], &seq[0] + seq.size());
+ os->write(seq);
break;
}
case PrimitiveInfo::KindFloat:
@@ -1492,7 +1493,7 @@ IceRuby::SequenceInfo::marshalPrimitiveSequence(const PrimitiveInfoPtr& pi, VALU
assert(TYPE(v) == T_FLOAT);
seq[static_cast<size_t>(i)] = static_cast<Ice::Float>(RFLOAT_VALUE(v));
}
- os->write(&seq[0], &seq[0] + seq.size());
+ os->write(seq);
break;
}
case PrimitiveInfo::KindDouble:
@@ -1509,7 +1510,7 @@ IceRuby::SequenceInfo::marshalPrimitiveSequence(const PrimitiveInfoPtr& pi, VALU
assert(TYPE(v) == T_FLOAT);
seq[static_cast<size_t>(i)] = RFLOAT_VALUE(v);
}
- os->write(&seq[0], &seq[0] + seq.size());
+ os->write(seq);
break;
}
case PrimitiveInfo::KindString:
@@ -1520,11 +1521,18 @@ IceRuby::SequenceInfo::marshalPrimitiveSequence(const PrimitiveInfoPtr& pi, VALU
{
seq[static_cast<size_t>(i)] = getString(RARRAY_AREF(arr, i));
}
+ if(seq.empty())
+ {
+ os->write(seq);
+ }
+ else
+ {
#ifdef HAVE_RUBY_ENCODING_H
- os->write(&seq[0], &seq[0] + seq.size(), false); // Bypass string conversion.
+ os->write(&seq[0], &seq[0] + seq.size(), false); // Bypass string conversion.
#else
- os->write(&seq[0], &seq[0] + seq.size(), true);
+ os->write(&seq[0], &seq[0] + seq.size(), true);
#endif
+ }
break;
}
}
@@ -2353,7 +2361,7 @@ IceRuby::ProxyInfo::optionalFormat() const
void
IceRuby::ProxyInfo::marshal(VALUE p, Ice::OutputStream* os, ObjectMap*, bool optional)
{
- Ice::OutputStream::size_type sizePos;
+ Ice::OutputStream::size_type sizePos = 0;
if(optional)
{
sizePos = os->startSize();