void ctdb_request_dmaster(struct ctdb_context *ctdb, struct ctdb_req_header *hdr)
{
struct ctdb_req_dmaster_old *c = (struct ctdb_req_dmaster_old *)hdr;
+ size_t req_dmaster_header_len = offsetof(struct ctdb_req_dmaster_old,
+ data);
+ size_t buf_len = hdr->length;
TDB_DATA key, data, data2;
struct ctdb_ltdb_header header;
struct ctdb_db_context *ctdb_db;
size_t len;
int ret;
+ if (buf_len < req_dmaster_header_len ||
+ c->keylen > buf_len - req_dmaster_header_len ||
+ c->datalen > buf_len - req_dmaster_header_len - c->keylen) {
+ DBG_WARNING("Invalid packet\n");
+ return;
+ }
+
key.dptr = c->data;
key.dsize = c->keylen;
data.dptr = c->data + c->keylen;
void ctdb_request_call(struct ctdb_context *ctdb, struct ctdb_req_header *hdr)
{
struct ctdb_req_call_old *c = (struct ctdb_req_call_old *)hdr;
+ size_t req_call_header_len = offsetof(struct ctdb_req_call_old, data);
+ size_t buf_len = hdr->length;
TDB_DATA data;
struct ctdb_reply_call_old *r;
int ret, len;
struct ctdb_db_context *ctdb_db;
int tmp_count, bucket;
+ if (buf_len < req_call_header_len ||
+ c->keylen > buf_len - req_call_header_len ||
+ c->calldatalen > buf_len - req_call_header_len - c->keylen) {
+ DBG_WARNING("Invalid packet\n");
+ return;
+ }
+
if (ctdb->methods == NULL) {
DEBUG(DEBUG_INFO,(__location__ " Failed ctdb_request_call. Transport is DOWN\n"));
return;
void ctdb_reply_call(struct ctdb_context *ctdb, struct ctdb_req_header *hdr)
{
struct ctdb_reply_call_old *c = (struct ctdb_reply_call_old *)hdr;
+ size_t reply_call_header_len = offsetof(struct ctdb_reply_call_old,
+ data);
+ size_t buf_len = hdr->length;
struct ctdb_call_state *state;
+ if (buf_len < reply_call_header_len ||
+ c->datalen > buf_len - reply_call_header_len) {
+ DBG_WARNING("Invalid packet\n");
+ return;
+ }
+
state = reqid_find(ctdb->idr, hdr->reqid, struct ctdb_call_state);
if (state == NULL) {
DEBUG(DEBUG_ERR, (__location__ " reqid %u not found\n", hdr->reqid));
void ctdb_reply_dmaster(struct ctdb_context *ctdb, struct ctdb_req_header *hdr)
{
struct ctdb_reply_dmaster_old *c = (struct ctdb_reply_dmaster_old *)hdr;
+ size_t reply_dmaster_header_len = offsetof(struct ctdb_reply_dmaster_old,
+ data);
+ size_t buf_len = hdr->length;
struct ctdb_db_context *ctdb_db;
TDB_DATA key, data;
uint32_t record_flags = 0;
size_t len;
int ret;
+ if (buf_len < reply_dmaster_header_len ||
+ c->keylen > buf_len - reply_dmaster_header_len ||
+ c->datalen > buf_len - reply_dmaster_header_len - c->keylen) {
+ DBG_WARNING("Invalid packet\n");
+ return;
+ }
+
ctdb_db = find_ctdb_db(ctdb, c->db_id);
if (ctdb_db == NULL) {
DEBUG(DEBUG_ERR,("Unknown db_id 0x%x in ctdb_reply_dmaster\n", c->db_id));
void ctdb_request_control(struct ctdb_context *ctdb, struct ctdb_req_header *hdr)
{
struct ctdb_req_control_old *c = (struct ctdb_req_control_old *)hdr;
+ size_t req_control_header_len = offsetof(struct ctdb_req_control_old,
+ data);
+ size_t buf_len = hdr->length;
TDB_DATA data, *outdata;
int32_t status;
bool async_reply = false;
const char *errormsg = NULL;
+ if (buf_len < req_control_header_len ||
+ c->datalen > buf_len - req_control_header_len) {
+ DBG_WARNING("Invalid packet\n");
+ return;
+ }
+
data.dptr = &c->data[0];
data.dsize = c->datalen;
void ctdb_reply_control(struct ctdb_context *ctdb, struct ctdb_req_header *hdr)
{
struct ctdb_reply_control_old *c = (struct ctdb_reply_control_old *)hdr;
+ size_t reply_control_header_len = offsetof(struct ctdb_reply_control_old,
+ data);
+ size_t buf_len = hdr->length;
TDB_DATA data;
struct ctdb_control_state *state;
const char *errormsg = NULL;
+ if (buf_len < reply_control_header_len ||
+ c->datalen > buf_len - reply_control_header_len ||
+ c->errorlen > buf_len - reply_control_header_len - c->datalen) {
+ DBG_WARNING("Invalid packet\n");
+ return;
+ }
+
state = reqid_find(ctdb->idr, hdr->reqid, struct ctdb_control_state);
if (state == NULL) {
DEBUG(DEBUG_ERR,("pnn %u Invalid reqid %u in ctdb_reply_control\n",