return pdu;
}
-void
+static void
dcerpc_add_deferred_pointer(struct dcerpc_context *ctx,
struct dcerpc_pdu *pdu,
dcerpc_coder coder, void *ptr)
pdu->max_ptr++;
}
-int
+static int
dcerpc_process_deferred_pointers(struct dcerpc_context *ctx,
struct dcerpc_pdu *pdu,
struct smb2_iovec *iov,
return offset;
}
- if (!(ptr == PTR_REF && pdu->top_level)) {
- if (dce->tctx_id) {
- offset = (offset + 7) & ~7;
- } else {
- offset = (offset + 3) & ~3;
- }
+ if (dce->tctx_id) {
+ offset = (offset + 7) & ~7;
+ } else {
+ offset = (offset + 3) & ~3;
}
switch (type) {
pdu->top_level = 0;
offset = coder(dce, pdu, iov, offset, ptr);
pdu->top_level = top_level;
- return offset;
+ goto out;
}
offset = dcerpc_encode_3264(dce, pdu, iov, offset, RPTR);
case PTR_FULL:
if (ptr == NULL) {
offset = dcerpc_encode_3264(dce, pdu, iov, offset, 0);
- return offset;
+ goto out;
}
pdu->ptr_id++;
case PTR_UNIQUE:
if (ptr == NULL) {
offset = dcerpc_encode_3264(dce, pdu, iov, offset, 0);
- return offset;
+ goto out;
}
offset = dcerpc_encode_3264(dce, pdu, iov, offset, UPTR);
break;
}
+ out:
+ if (pdu->top_level) {
+ offset = dcerpc_process_deferred_pointers(dce, pdu, iov, offset);
+ }
return offset;
}
pdu->top_level = 0;
offset = coder(dce, pdu, iov, offset, ptr);
pdu->top_level = top_level;
- return offset;
+ goto out;
}
offset = dcerpc_decode_3264(dce, pdu, iov, offset, &p);
break;
}
+ out:
+ if (pdu->top_level) {
+ pdu->top_level = 0;
+ offset = dcerpc_process_deferred_pointers(dce, pdu, iov, offset);
+ pdu->top_level = top_level;
+ }
return offset;
}