1
mirror of https://github.com/rapid7/metasploit-payloads synced 2025-03-30 22:19:17 +02:00

Add POSIX support for transport remove

This commit is contained in:
OJ 2015-06-16 12:24:00 +10:00
parent 149e4c2a7e
commit 2e78a4379a
3 changed files with 46 additions and 1 deletions
c/meterpreter/source

@ -250,6 +250,48 @@ BOOL remote_request_core_transport_prev(Remote* remote, Packet* packet, DWORD* r
return *result == ERROR_SUCCESS ? FALSE : TRUE;
}
DWORD remote_request_core_transport_remove(Remote* remote, Packet* packet)
{
DWORD result = ERROR_SUCCESS;
// make sure we are not trying to remove the last transport
if (remote->transport == remote->transport->prev_transport) {
dprintf("[DISPATCH] Refusing to delete the last transport");
result = ERROR_INVALID_FUNCTION;
}
else {
Transport* found = NULL;
Transport* transport = remote->transport;
char* transportUrl = packet_get_tlv_value_string(packet, TLV_TYPE_TRANS_URL);
do {
if (strcmp(transportUrl, transport->url) == 0) {
found = transport;
break;
}
transport = transport->next_transport;
} while (transport != remote->transport);
if (found == NULL || found == remote->transport) {
dprintf("[DISPATCH] Transport not found, or attempting to remove current");
// if we don't have a valid transport, or they're trying to remove the
// existing one, then bomb out (that might come later)
result = ERROR_INVALID_PARAMETER;
}
else {
remote->trans_remove(remote, found);
dprintf("[DISPATCH] Transport removed");
}
SAFE_FREE(transportUrl);
}
packet_transmit_empty_response(remote, packet, result);
dprintf("[DISPATCH] Response sent.");
return result;
}
DWORD remote_request_core_transport_add(Remote* remote, Packet* packet)
{
Transport* transport = NULL;

@ -207,6 +207,7 @@ typedef uint64_t QWORD;
#define ERROR_INVALID_PARAMETER EINVAL
#define ERROR_INVALID_HANDLE EINVAL
#define ERROR_INVALID_DATA EINVAL
#define ERROR_INVALID_FUNCTION EINVAL
#define ERROR_UNSUPPORTED_COMPRESSION EINVAL
#define ERROR_NOT_SUPPORTED EOPNOTSUPP

@ -1115,7 +1115,7 @@ static void append_transport(Transport** list, Transport* newTransport) {
static void remove_transport(Remote* remote, Transport* oldTransport) {
// if we point to ourself, then we're the last one
if (remote->transport->next_transport == oldTransport) {
if (remote->transport->next_transport == remote->transport) {
remote->transport = NULL;
}
else {
@ -1294,6 +1294,8 @@ DWORD server_setup(MetsrvConfig* config)
// Set up the transport creation function pointer
remote->trans_create = create_transport;
// Set up the transport removal function pointer
remote->trans_remove = remove_transport;
// and the config creation pointer
remote->config_create = config_create;