/*
* Encode the contents of a python buffer view.
*/
-int py_enc_buffer(struct rx_call *call, Py_buffer *view)
+int py_enc_buffer(struct rx_call *call, Py_buffer *view, size_t dim)
{
int i;
printf(" }\n");
}
+ if (view->len > dim) {
+ PyErr_Format(PyExc_RuntimeError, "Marshalling Error: String or opaque value too long");
+ return -1;
+ }
+
rxrpc_enc(call, view->len);
if (view->ndim == 0 || (view->ndim == 1 && !view->shape)) {
*/
extern PyObject *py_rxgen_get_string(const void *_p, size_t n);
extern int py_rxgen_set_string(void *_p, size_t n, PyObject *val);
-extern int py_enc_buffer(struct rx_call *call, Py_buffer *view);
+extern int py_enc_buffer(struct rx_call *call, Py_buffer *view, size_t dim);
extern void py_dec_string(struct rx_call *call);
extern int py_dec_opaque(struct rx_call *call, PyObject *obj);
print PYOUT "\t\tgoto error;\n";
} elsif ($p->{class} eq "bulk" && ($p->{elem}->{class} eq "string" ||
$p->{elem}->{class} eq "opaque")) {
- print PYOUT "\tif (py_enc_buffer(call, ¶m_", $p->{name}, ") < 0) {\n";
+ my $dim = -1;
+ $dim = $p->{dim} if exists $p->{dim};
+ print PYOUT "\tif (py_enc_buffer(call, ¶m_", $p->{name}, ", ", $dim, ") < 0) {\n";
print PYOUT "\t\trxrpc_terminate_call(call, EINVAL);\n";
print PYOUT "\t\treturn NULL;\n";
print PYOUT "\t}\n";