X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilcsftp%2Fsftp_client.c;h=1b198b860f689488be8b7544deb01fb1f37d786c;hb=c257b555225193e54d85daf541d29578b3c93882;hp=a4b671e46fa36b43b55fa782f9b21d2d06b979b1;hpb=a818c5b5411bbc4436d1c5f011236985c96bb787;p=silc.git diff --git a/lib/silcsftp/sftp_client.c b/lib/silcsftp/sftp_client.c index a4b671e4..1b198b86 100644 --- a/lib/silcsftp/sftp_client.c +++ b/lib/silcsftp/sftp_client.c @@ -1,10 +1,10 @@ /* - sftp_client.c + sftp_client.c Author: Pekka Riikonen - Copyright (C) 2001 Pekka Riikonen + Copyright (C) 2001 2003 Pekka Riikonen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -39,7 +39,6 @@ typedef struct SilcSFTPRequestStruct { /* SFTP client context */ typedef struct { - SilcSocketConnection sock; SilcSFTPSendPacketCallback send_packet; void *send_context; SilcSFTPVersionCallback version; @@ -64,7 +63,11 @@ static SilcSFTPHandle silc_sftp_handle_create(unsigned char *data, SilcSFTPHandle handle; handle = silc_calloc(1, sizeof(*handle)); + if (!handle) + return NULL; handle->data = silc_calloc(data_len, sizeof(*handle->data)); + if (!handle->data) + return NULL; memcpy(handle->data, data, data_len); handle->data_len = data_len; @@ -81,7 +84,7 @@ static void silc_sftp_handle_delete(SilcSFTPHandle handle) /* Returns the handle data of the `handle' to the `data' pointer. */ -static void silc_sftp_handle_get(SilcSFTPHandle handle, +static void silc_sftp_handle_get(SilcSFTPHandle handle, const unsigned char **data, SilcUInt32 *data_len) { @@ -92,7 +95,7 @@ static void silc_sftp_handle_get(SilcSFTPHandle handle, /* General routine to send SFTP packet to the SFTP server. */ static void silc_sftp_send_packet(SilcSFTPClient sftp, - SilcSFTPPacket type, + SilcSFTPPacket type, SilcUInt32 len, ...) { SilcBuffer tmp; @@ -105,11 +108,11 @@ static void silc_sftp_send_packet(SilcSFTPClient sftp, return; sftp->packet = tmp; - SILC_LOG_HEXDUMP(("SFTP packet to server"), sftp->packet->data, + SILC_LOG_HEXDUMP(("SFTP packet to server"), sftp->packet->data, sftp->packet->len); /* Send the packet */ - (*sftp->send_packet)(sftp->sock, sftp->packet, sftp->send_context); + (*sftp->send_packet)(sftp->packet, sftp->send_context); /* Clear packet */ sftp->packet->data = sftp->packet->tail = sftp->packet->head; @@ -140,8 +143,8 @@ static SilcSFTPRequest silc_sftp_find_request(SilcSFTPClient sftp, SilcUInt32 id operation. The variable argument list includes the status and req->type specific data. */ -static void silc_sftp_call_request(SilcSFTPClient sftp, - SilcSFTPRequest req, +static void silc_sftp_call_request(SilcSFTPClient sftp, + SilcSFTPRequest req, SilcSFTPPacket type, SilcSFTPStatus status, ...) { @@ -168,9 +171,9 @@ static void silc_sftp_call_request(SilcSFTPClient sftp, data_len = (SilcUInt32)va_arg(vp, SilcUInt32); if (req->data) - (*req->data)((SilcSFTP)sftp, status, (const unsigned char *)data, + (*req->data)((SilcSFTP)sftp, status, (const unsigned char *)data, data_len, req->context); - } + } break; case SILC_SFTP_OPEN: @@ -190,6 +193,11 @@ static void silc_sftp_call_request(SilcSFTPClient sftp, hdata = (unsigned char *)va_arg(vp, unsigned char *); hdata_len = (SilcUInt32)va_arg(vp, SilcUInt32); handle = silc_sftp_handle_create(hdata, hdata_len); + if (!handle) { + if (req->handle) + (*req->handle)((SilcSFTP)sftp, status, NULL, req->context); + break; + } if (req->handle) (*req->handle)((SilcSFTP)sftp, status, handle, req->context); @@ -213,7 +221,7 @@ static void silc_sftp_call_request(SilcSFTPClient sftp, language_tag = (char *)va_arg(vp, char *); if (req->status) - (*req->status)((SilcSFTP)sftp, status, (const char *)message, + (*req->status)((SilcSFTP)sftp, status, (const char *)message, (const char *)language_tag, req->context); } break; @@ -234,7 +242,7 @@ static void silc_sftp_call_request(SilcSFTPClient sftp, attr = (SilcSFTPAttributes)va_arg(vp, SilcSFTPAttributes); if (req->attr) - (*req->attr)((SilcSFTP)sftp, status, (const SilcSFTPAttributes)attr, + (*req->attr)((SilcSFTP)sftp, status, (const SilcSFTPAttributes)attr, req->context); } break; @@ -275,7 +283,7 @@ static void silc_sftp_call_request(SilcSFTPClient sftp, data_len = (SilcUInt32)va_arg(vp, SilcUInt32); if (req->extended) - (*req->extended)((SilcSFTP)sftp, status, (const unsigned char *)data, + (*req->extended)((SilcSFTP)sftp, status, (const unsigned char *)data, data_len, req->context); } break; @@ -291,15 +299,13 @@ static void silc_sftp_call_request(SilcSFTPClient sftp, va_end(vp); } -/* Starts SFTP client by associating the socket connection `sock' to the - created SFTP client context. The version callback indicated by the - `callback' will be called after the SFTP session has been started - and server has returned the version of the protocol. The SFTP client - context is returned in the callback too. This returns the allocated - SFTP client context or NULL on error. */ +/* Starts SFTP client and returns context for it. The version callback + indicated by the `callback' will be called after the SFTP session has + been started and server has returned the version of the protocol. The + SFTP client context is returned in the callback too. This returns + allocated SFTP client context or NULL on error. */ -SilcSFTP silc_sftp_client_start(SilcSocketConnection sock, - SilcSFTPSendPacketCallback send_packet, +SilcSFTP silc_sftp_client_start(SilcSFTPSendPacketCallback send_packet, void *send_context, SilcSFTPVersionCallback callback, void *context) @@ -310,7 +316,8 @@ SilcSFTP silc_sftp_client_start(SilcSocketConnection sock, return NULL; sftp = silc_calloc(1, sizeof(*sftp)); - sftp->sock = sock; + if (!sftp) + return NULL; sftp->send_packet = send_packet; sftp->send_context = send_context; sftp->version = callback; @@ -318,7 +325,7 @@ SilcSFTP silc_sftp_client_start(SilcSocketConnection sock, silc_list_init(sftp->requests, struct SilcSFTPRequestStruct, next); /* Send the SFTP session initialization to the server */ - silc_sftp_send_packet(sftp, SILC_SFTP_INIT, 4, + silc_sftp_send_packet(sftp, SILC_SFTP_INIT, 4, SILC_STR_UI_INT(SILC_SFTP_PROTOCOL_VERSION), SILC_STR_END); @@ -358,7 +365,7 @@ void silc_sftp_client_receive_process(SilcSFTP context, SILC_LOG_DEBUG(("Start")); /* Parse the packet */ - type = silc_sftp_packet_decode(packet->buffer, (unsigned char **)&payload, + type = silc_sftp_packet_decode(packet->buffer, (unsigned char **)&payload, &payload_len); if (!type) return; @@ -376,13 +383,13 @@ void silc_sftp_client_receive_process(SilcSFTP context, SILC_STR_UI_INT(&version), SILC_STR_END); if (ret < 0) { - (*sftp->version)((SilcSFTP)sftp, SILC_SFTP_STATUS_FAILURE, 0, + (*sftp->version)((SilcSFTP)sftp, SILC_SFTP_STATUS_FAILURE, 0, sftp->version_context); break; } /* Call the callback */ - (*sftp->version)((SilcSFTP)sftp, SILC_SFTP_STATUS_OK, version, + (*sftp->version)((SilcSFTP)sftp, SILC_SFTP_STATUS_OK, version, sftp->version_context); } break; @@ -394,7 +401,7 @@ void silc_sftp_client_receive_process(SilcSFTP context, SILC_LOG_DEBUG(("Status packet")); - ret = silc_buffer_unformat(&buf, + ret = silc_buffer_unformat(&buf, SILC_STR_UI_INT(&id), SILC_STR_UI_INT(&status), SILC_STR_END); @@ -436,9 +443,9 @@ void silc_sftp_client_receive_process(SilcSFTP context, SILC_LOG_DEBUG(("Handle packet")); - ret = silc_buffer_unformat(&buf, + ret = silc_buffer_unformat(&buf, SILC_STR_UI_INT(&id), - SILC_STR_UI32_NSTRING(&handle, + SILC_STR_UI32_NSTRING(&handle, &handle_len), SILC_STR_END); if (ret < 0) @@ -450,7 +457,7 @@ void silc_sftp_client_receive_process(SilcSFTP context, break; /* Call the callback */ - silc_sftp_call_request(sftp, req, type, SILC_SFTP_STATUS_OK, + silc_sftp_call_request(sftp, req, type, SILC_SFTP_STATUS_OK, handle, handle_len); } break; @@ -462,7 +469,7 @@ void silc_sftp_client_receive_process(SilcSFTP context, SILC_LOG_DEBUG(("Data packet")); - ret = silc_buffer_unformat(&buf, + ret = silc_buffer_unformat(&buf, SILC_STR_UI_INT(&id), SILC_STR_UI32_NSTRING(&data, &data_len), SILC_STR_END); @@ -475,7 +482,7 @@ void silc_sftp_client_receive_process(SilcSFTP context, break; /* Call the callback */ - silc_sftp_call_request(sftp, req, type, SILC_SFTP_STATUS_OK, + silc_sftp_call_request(sftp, req, type, SILC_SFTP_STATUS_OK, data, data_len); } break; @@ -487,7 +494,7 @@ void silc_sftp_client_receive_process(SilcSFTP context, SILC_LOG_DEBUG(("Name packet")); - ret = silc_buffer_unformat(&buf, + ret = silc_buffer_unformat(&buf, SILC_STR_UI_INT(&id), SILC_STR_UI_INT(&count), SILC_STR_END); @@ -519,7 +526,7 @@ void silc_sftp_client_receive_process(SilcSFTP context, SILC_LOG_DEBUG(("Attributes packet")); - ret = silc_buffer_unformat(&buf, + ret = silc_buffer_unformat(&buf, SILC_STR_UI_INT(&id), SILC_STR_UI_XNSTRING(&data, buf.len - 4), SILC_STR_END); @@ -547,7 +554,7 @@ void silc_sftp_client_receive_process(SilcSFTP context, SILC_LOG_DEBUG(("Extended reply packet")); - ret = silc_buffer_unformat(&buf, + ret = silc_buffer_unformat(&buf, SILC_STR_UI_INT(&id), SILC_STR_UI_XNSTRING(&data, buf.len - 4), SILC_STR_END); @@ -560,7 +567,7 @@ void silc_sftp_client_receive_process(SilcSFTP context, break; /* Call the callback */ - silc_sftp_call_request(sftp, req, type, SILC_SFTP_STATUS_OK, + silc_sftp_call_request(sftp, req, type, SILC_SFTP_STATUS_OK, data, buf.len - 4); } break; @@ -570,7 +577,7 @@ void silc_sftp_client_receive_process(SilcSFTP context, } } -void silc_sftp_open(SilcSFTP sftp, +void silc_sftp_open(SilcSFTP sftp, const char *filename, SilcSFTPFileOperation pflags, SilcSFTPAttributes attrs, @@ -585,6 +592,8 @@ void silc_sftp_open(SilcSFTP sftp, SILC_LOG_DEBUG(("Open request")); req = silc_calloc(1, sizeof(*req)); + if (!req) + return; req->id = client->id++; req->type = SILC_SFTP_OPEN; req->handle = callback; @@ -592,14 +601,16 @@ void silc_sftp_open(SilcSFTP sftp, silc_list_add(client->requests, req); attrs_buf = silc_sftp_attr_encode(attrs); + if (!attrs_buf) + return; len = 4 + 4 + strlen(filename) + 4 + attrs_buf->len; - silc_sftp_send_packet(client, req->type, len, + silc_sftp_send_packet(client, req->type, len, SILC_STR_UI_INT(req->id), SILC_STR_UI_INT(strlen(filename)), SILC_STR_UI32_STRING(filename), SILC_STR_UI_INT(pflags), - SILC_STR_UI_XNSTRING(attrs_buf->data, + SILC_STR_UI_XNSTRING(attrs_buf->data, attrs_buf->len), SILC_STR_END); @@ -620,6 +631,8 @@ void silc_sftp_close(SilcSFTP sftp, SILC_LOG_DEBUG(("Close request")); req = silc_calloc(1, sizeof(*req)); + if (!req) + return; req->id = client->id++; req->type = SILC_SFTP_CLOSE; req->status = callback; @@ -629,16 +642,17 @@ void silc_sftp_close(SilcSFTP sftp, silc_sftp_handle_get(handle, &hdata, &hdata_len); len = 4 + 4 + hdata_len; - silc_sftp_send_packet(client, req->type, len, + silc_sftp_send_packet(client, req->type, len, SILC_STR_UI_INT(req->id), SILC_STR_UI_INT(hdata_len), SILC_STR_UI_XNSTRING(hdata, hdata_len), SILC_STR_END); + silc_sftp_handle_delete(handle); } void silc_sftp_read(SilcSFTP sftp, SilcSFTPHandle handle, - SilcUInt64 offset, + SilcUInt64 offset, SilcUInt32 len, SilcSFTPDataCallback callback, void *context) @@ -652,6 +666,8 @@ void silc_sftp_read(SilcSFTP sftp, SILC_LOG_DEBUG(("Read request")); req = silc_calloc(1, sizeof(*req)); + if (!req) + return; req->id = client->id++; req->type = SILC_SFTP_READ; req->data = callback; @@ -661,7 +677,7 @@ void silc_sftp_read(SilcSFTP sftp, silc_sftp_handle_get(handle, &hdata, &hdata_len); len2 = 4 + 4 + hdata_len + 8 + 4; - silc_sftp_send_packet(client, req->type, len2, + silc_sftp_send_packet(client, req->type, len2, SILC_STR_UI_INT(req->id), SILC_STR_UI_INT(hdata_len), SILC_STR_UI_XNSTRING(hdata, hdata_len), @@ -687,6 +703,8 @@ void silc_sftp_write(SilcSFTP sftp, SILC_LOG_DEBUG(("Write request")); req = silc_calloc(1, sizeof(*req)); + if (!req) + return; req->id = client->id++; req->type = SILC_SFTP_WRITE; req->status = callback; @@ -696,7 +714,7 @@ void silc_sftp_write(SilcSFTP sftp, silc_sftp_handle_get(handle, &hdata, &hdata_len); len = 4 + 4 + hdata_len + 8 + 4 + data_len; - silc_sftp_send_packet(client, req->type, len, + silc_sftp_send_packet(client, req->type, len, SILC_STR_UI_INT(req->id), SILC_STR_UI_INT(hdata_len), SILC_STR_UI_XNSTRING(hdata, hdata_len), @@ -718,6 +736,8 @@ void silc_sftp_remove(SilcSFTP sftp, SILC_LOG_DEBUG(("Remove request")); req = silc_calloc(1, sizeof(*req)); + if (!req) + return; req->id = client->id++; req->type = SILC_SFTP_REMOVE; req->status = callback; @@ -726,7 +746,7 @@ void silc_sftp_remove(SilcSFTP sftp, len = 4 + 4 + strlen(filename); - silc_sftp_send_packet(client, req->type, len, + silc_sftp_send_packet(client, req->type, len, SILC_STR_UI_INT(req->id), SILC_STR_UI_INT(strlen(filename)), SILC_STR_UI32_STRING(filename), @@ -746,6 +766,8 @@ void silc_sftp_rename(SilcSFTP sftp, SILC_LOG_DEBUG(("Rename request")); req = silc_calloc(1, sizeof(*req)); + if (!req) + return; req->id = client->id++; req->type = SILC_SFTP_RENAME; req->status = callback; @@ -754,7 +776,7 @@ void silc_sftp_rename(SilcSFTP sftp, len = 4 + 4 + strlen(oldname) + 4 + strlen(newname); - silc_sftp_send_packet(client, req->type, len, + silc_sftp_send_packet(client, req->type, len, SILC_STR_UI_INT(req->id), SILC_STR_UI_INT(strlen(oldname)), SILC_STR_UI32_STRING(oldname), @@ -777,6 +799,8 @@ void silc_sftp_mkdir(SilcSFTP sftp, SILC_LOG_DEBUG(("Mkdir request")); req = silc_calloc(1, sizeof(*req)); + if (!req) + return; req->id = client->id++; req->type = SILC_SFTP_MKDIR; req->status = callback; @@ -784,9 +808,11 @@ void silc_sftp_mkdir(SilcSFTP sftp, silc_list_add(client->requests, req); attrs_buf = silc_sftp_attr_encode(attrs); + if (!attrs_buf) + return; len = 4 + 4 + strlen(path) + attrs_buf->len; - silc_sftp_send_packet(client, req->type, len, + silc_sftp_send_packet(client, req->type, len, SILC_STR_UI_INT(req->id), SILC_STR_UI_INT(strlen(path)), SILC_STR_UI32_STRING(path), @@ -809,6 +835,8 @@ void silc_sftp_rmdir(SilcSFTP sftp, SILC_LOG_DEBUG(("Rmdir request")); req = silc_calloc(1, sizeof(*req)); + if (!req) + return; req->id = client->id++; req->type = SILC_SFTP_RMDIR; req->status = callback; @@ -817,7 +845,7 @@ void silc_sftp_rmdir(SilcSFTP sftp, len = 4 + 4 + strlen(path); - silc_sftp_send_packet(client, req->type, len, + silc_sftp_send_packet(client, req->type, len, SILC_STR_UI_INT(req->id), SILC_STR_UI_INT(strlen(path)), SILC_STR_UI32_STRING(path), @@ -836,6 +864,8 @@ void silc_sftp_opendir(SilcSFTP sftp, SILC_LOG_DEBUG(("Opendir request")); req = silc_calloc(1, sizeof(*req)); + if (!req) + return; req->id = client->id++; req->type = SILC_SFTP_OPENDIR; req->handle = callback; @@ -844,7 +874,7 @@ void silc_sftp_opendir(SilcSFTP sftp, len = 4 + 4 + strlen(path); - silc_sftp_send_packet(client, req->type, len, + silc_sftp_send_packet(client, req->type, len, SILC_STR_UI_INT(req->id), SILC_STR_UI_INT(strlen(path)), SILC_STR_UI32_STRING(path), @@ -865,6 +895,8 @@ void silc_sftp_readdir(SilcSFTP sftp, SILC_LOG_DEBUG(("Readdir request")); req = silc_calloc(1, sizeof(*req)); + if (!req) + return; req->id = client->id++; req->type = SILC_SFTP_READDIR; req->name = callback; @@ -874,7 +906,7 @@ void silc_sftp_readdir(SilcSFTP sftp, silc_sftp_handle_get(handle, &hdata, &hdata_len); len = 4 + 4 + hdata_len; - silc_sftp_send_packet(client, req->type, len, + silc_sftp_send_packet(client, req->type, len, SILC_STR_UI_INT(req->id), SILC_STR_UI_INT(hdata_len), SILC_STR_UI_XNSTRING(hdata, hdata_len), @@ -893,6 +925,8 @@ void silc_sftp_stat(SilcSFTP sftp, SILC_LOG_DEBUG(("Stat request")); req = silc_calloc(1, sizeof(*req)); + if (!req) + return; req->id = client->id++; req->type = SILC_SFTP_STAT; req->attr = callback; @@ -901,7 +935,7 @@ void silc_sftp_stat(SilcSFTP sftp, len = 4 + 4 + strlen(path); - silc_sftp_send_packet(client, req->type, len, + silc_sftp_send_packet(client, req->type, len, SILC_STR_UI_INT(req->id), SILC_STR_UI_INT(strlen(path)), SILC_STR_UI32_STRING(path), @@ -920,6 +954,8 @@ void silc_sftp_lstat(SilcSFTP sftp, SILC_LOG_DEBUG(("Lstat request")); req = silc_calloc(1, sizeof(*req)); + if (!req) + return; req->id = client->id++; req->type = SILC_SFTP_LSTAT; req->attr = callback; @@ -928,7 +964,7 @@ void silc_sftp_lstat(SilcSFTP sftp, len = 4 + 4 + strlen(path); - silc_sftp_send_packet(client, req->type, len, + silc_sftp_send_packet(client, req->type, len, SILC_STR_UI_INT(req->id), SILC_STR_UI_INT(strlen(path)), SILC_STR_UI32_STRING(path), @@ -949,6 +985,8 @@ void silc_sftp_fstat(SilcSFTP sftp, SILC_LOG_DEBUG(("Fstat request")); req = silc_calloc(1, sizeof(*req)); + if (!req) + return; req->id = client->id++; req->type = SILC_SFTP_FSTAT; req->attr = callback; @@ -958,7 +996,7 @@ void silc_sftp_fstat(SilcSFTP sftp, silc_sftp_handle_get(handle, &hdata, &hdata_len); len = 4 + 4 + hdata_len; - silc_sftp_send_packet(client, req->type, len, + silc_sftp_send_packet(client, req->type, len, SILC_STR_UI_INT(req->id), SILC_STR_UI_INT(hdata_len), SILC_STR_UI_XNSTRING(hdata, hdata_len), @@ -979,6 +1017,8 @@ void silc_sftp_setstat(SilcSFTP sftp, SILC_LOG_DEBUG(("Setstat request")); req = silc_calloc(1, sizeof(*req)); + if (!req) + return; req->id = client->id++; req->type = SILC_SFTP_SETSTAT; req->status = callback; @@ -986,9 +1026,11 @@ void silc_sftp_setstat(SilcSFTP sftp, silc_list_add(client->requests, req); attrs_buf = silc_sftp_attr_encode(attrs); + if (!attrs_buf) + return; len = 4 + 4 + strlen(path) + attrs_buf->len; - silc_sftp_send_packet(client, req->type, len, + silc_sftp_send_packet(client, req->type, len, SILC_STR_UI_INT(req->id), SILC_STR_UI_INT(strlen(path)), SILC_STR_UI32_STRING(path), @@ -1015,6 +1057,8 @@ void silc_sftp_fsetstat(SilcSFTP sftp, SILC_LOG_DEBUG(("Fsetstat request")); req = silc_calloc(1, sizeof(*req)); + if (!req) + return; req->id = client->id++; req->type = SILC_SFTP_FSETSTAT; req->status = callback; @@ -1023,9 +1067,11 @@ void silc_sftp_fsetstat(SilcSFTP sftp, silc_sftp_handle_get(handle, &hdata, &hdata_len); attrs_buf = silc_sftp_attr_encode(attrs); + if (!attrs_buf) + return; len = 4 + 4 + hdata_len + attrs_buf->len; - silc_sftp_send_packet(client, req->type, len, + silc_sftp_send_packet(client, req->type, len, SILC_STR_UI_INT(req->id), SILC_STR_UI_INT(hdata_len), SILC_STR_UI_XNSTRING(hdata, hdata_len), @@ -1048,6 +1094,8 @@ void silc_sftp_readlink(SilcSFTP sftp, SILC_LOG_DEBUG(("Readlink request")); req = silc_calloc(1, sizeof(*req)); + if (!req) + return; req->id = client->id++; req->type = SILC_SFTP_READLINK; req->name = callback; @@ -1056,7 +1104,7 @@ void silc_sftp_readlink(SilcSFTP sftp, len = 4 + 4 + strlen(path); - silc_sftp_send_packet(client, req->type, len, + silc_sftp_send_packet(client, req->type, len, SILC_STR_UI_INT(req->id), SILC_STR_UI_INT(strlen(path)), SILC_STR_UI32_STRING(path), @@ -1076,6 +1124,8 @@ void silc_sftp_symlink(SilcSFTP sftp, SILC_LOG_DEBUG(("Symlink request")); req = silc_calloc(1, sizeof(*req)); + if (!req) + return; req->id = client->id++; req->type = SILC_SFTP_SYMLINK; req->status = callback; @@ -1084,7 +1134,7 @@ void silc_sftp_symlink(SilcSFTP sftp, len = 4 + 4 + strlen(linkpath) + 4 + strlen(targetpath); - silc_sftp_send_packet(client, req->type, len, + silc_sftp_send_packet(client, req->type, len, SILC_STR_UI_INT(req->id), SILC_STR_UI_INT(strlen(linkpath)), SILC_STR_UI32_STRING(linkpath), @@ -1105,6 +1155,8 @@ void silc_sftp_realpath(SilcSFTP sftp, SILC_LOG_DEBUG(("Realpath request")); req = silc_calloc(1, sizeof(*req)); + if (!req) + return; req->id = client->id++; req->type = SILC_SFTP_REALPATH; req->name = callback; @@ -1113,7 +1165,7 @@ void silc_sftp_realpath(SilcSFTP sftp, len = 4 + 4 + strlen(path); - silc_sftp_send_packet(client, req->type, len, + silc_sftp_send_packet(client, req->type, len, SILC_STR_UI_INT(req->id), SILC_STR_UI_INT(strlen(path)), SILC_STR_UI32_STRING(path), @@ -1134,6 +1186,8 @@ void silc_sftp_extended(SilcSFTP sftp, SILC_LOG_DEBUG(("Extended request")); req = silc_calloc(1, sizeof(*req)); + if (!req) + return; req->id = client->id++; req->type = SILC_SFTP_WRITE; req->extended = callback; @@ -1142,7 +1196,7 @@ void silc_sftp_extended(SilcSFTP sftp, len = 4 + 4 + strlen(request) + data_len; - silc_sftp_send_packet(client, req->type, len, + silc_sftp_send_packet(client, req->type, len, SILC_STR_UI_INT(req->id), SILC_STR_UI_INT(strlen(request)), SILC_STR_UI32_STRING(request),