projects
/
silc.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Added SILC Server library.
[silc.git]
/
lib
/
silcsftp
/
sftp_server.c
diff --git
a/lib/silcsftp/sftp_server.c
b/lib/silcsftp/sftp_server.c
index 119dbf1f36d7c58d5886087fb3e20d96d339d6c6..de0b52ef9d7eaade18f4a1ac0b4418af93a4d1f6 100644
(file)
--- a/
lib/silcsftp/sftp_server.c
+++ b/
lib/silcsftp/sftp_server.c
@@
-1,10
+1,10
@@
/*
/*
- sftp_server.c
+ sftp_server.c
Author: Pekka Riikonen <priikone@silcnet.org>
Author: Pekka Riikonen <priikone@silcnet.org>
- Copyright (C) 2001 Pekka Riikonen
+ Copyright (C) 2001
- 2004
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
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
@@
-18,51
+18,54
@@
*/
/* $Id$ */
*/
/* $Id$ */
-#include "silc
includes
.h"
+#include "silc.h"
#include "silcsftp.h"
#include "silcsftp_fs.h"
#include "sftp_util.h"
/* SFTP Server context */
typedef struct {
#include "silcsftp.h"
#include "silcsftp_fs.h"
#include "sftp_util.h"
/* SFTP Server context */
typedef struct {
- SilcSocketConnection sock;
SilcSFTPSendPacketCallback send_packet;
void *send_context;
SilcSFTPMonitors monitors;
SilcSFTPMonitor monitor;
void *monitor_context;
SilcSFTPFilesystem fs;
SilcSFTPSendPacketCallback send_packet;
void *send_context;
SilcSFTPMonitors monitors;
SilcSFTPMonitor monitor;
void *monitor_context;
SilcSFTPFilesystem fs;
+ SilcBuffer packet;
} *SilcSFTPServer;
/* General routine to send SFTP packet to the SFTP client. */
static void silc_sftp_send_packet(SilcSFTPServer sftp,
} *SilcSFTPServer;
/* General routine to send SFTP packet to the SFTP client. */
static void silc_sftp_send_packet(SilcSFTPServer sftp,
- SilcSFTPPacket type,
-
ui
nt32 len, ...)
+ SilcSFTPPacket type,
+
SilcUI
nt32 len, ...)
{
{
- SilcBuffer
packet
;
+ SilcBuffer
tmp
;
va_list vp;
va_start(vp, len);
va_list vp;
va_start(vp, len);
-
packet = silc_sftp_packet_encode_vp(type
, len, vp);
+
tmp = silc_sftp_packet_encode_vp(type, sftp->packet
, len, vp);
va_end(vp);
va_end(vp);
-
- if (!packet)
+ if (!tmp)
return;
return;
+ sftp->packet = tmp;
- SILC_LOG_HEXDUMP(("SFTP packet to client"), packet->data, packet->len);
+ SILC_LOG_HEXDUMP(("SFTP packet to client"), sftp->packet->data,
+ sftp->packet->len);
/* Send the packet */
/* Send the packet */
- (*sftp->send_packet)(sftp->
sock,
packet, sftp->send_context);
+ (*sftp->send_packet)(sftp->packet, sftp->send_context);
- silc_buffer_free(packet);
+ /* Clear packet */
+ sftp->packet->data = sftp->packet->tail = sftp->packet->head;
+ sftp->packet->len = 0;
}
/* Sends error to the client */
static void silc_sftp_send_error(SilcSFTPServer sftp,
SilcSFTPStatus status,
}
/* Sends error to the client */
static void silc_sftp_send_error(SilcSFTPServer sftp,
SilcSFTPStatus status,
-
ui
nt32 id)
+
SilcUI
nt32 id)
{
SILC_LOG_DEBUG(("Send error %d", status));
{
SILC_LOG_DEBUG(("Send error %d", status));
@@
-83,12
+86,12
@@
static void silc_sftp_server_status(SilcSFTP sftp,
void *context)
{
SilcSFTPServer server = (SilcSFTPServer)sftp;
void *context)
{
SilcSFTPServer server = (SilcSFTPServer)sftp;
-
uint32 id = (uint32)context
;
+
SilcUInt32 id = SILC_PTR_TO_32(context)
;
int mlen, llen;
SILC_LOG_DEBUG(("Status callback"));
SILC_LOG_DEBUG(("Request ID: %d", id));
int mlen, llen;
SILC_LOG_DEBUG(("Status callback"));
SILC_LOG_DEBUG(("Request ID: %d", id));
-
+
if (!message)
message = "";
if (!language_tag)
if (!message)
message = "";
if (!language_tag)
@@
-114,9
+117,9
@@
static void silc_sftp_server_handle(SilcSFTP sftp,
void *context)
{
SilcSFTPServer server = (SilcSFTPServer)sftp;
void *context)
{
SilcSFTPServer server = (SilcSFTPServer)sftp;
-
uint32 id = (uint32)context
;
+
SilcUInt32 id = SILC_PTR_TO_32(context)
;
unsigned char *hdata;
unsigned char *hdata;
-
ui
nt32 hdata_len;
+
SilcUI
nt32 hdata_len;
SILC_LOG_DEBUG(("Handle callback"));
SILC_LOG_DEBUG(("Request ID: %d", id));
SILC_LOG_DEBUG(("Handle callback"));
SILC_LOG_DEBUG(("Request ID: %d", id));
@@
-145,11
+148,11
@@
static void silc_sftp_server_handle(SilcSFTP sftp,
static void silc_sftp_server_data(SilcSFTP sftp,
SilcSFTPStatus status,
const unsigned char *data,
static void silc_sftp_server_data(SilcSFTP sftp,
SilcSFTPStatus status,
const unsigned char *data,
-
ui
nt32 data_len,
+
SilcUI
nt32 data_len,
void *context)
{
SilcSFTPServer server = (SilcSFTPServer)sftp;
void *context)
{
SilcSFTPServer server = (SilcSFTPServer)sftp;
-
uint32 id = (uint32)context
;
+
SilcUInt32 id = SILC_PTR_TO_32(context)
;
SILC_LOG_DEBUG(("Data callback"));
SILC_LOG_DEBUG(("Request ID: %d", id));
SILC_LOG_DEBUG(("Data callback"));
SILC_LOG_DEBUG(("Request ID: %d", id));
@@
-174,7
+177,7
@@
static void silc_sftp_server_name(SilcSFTP sftp,
void *context)
{
SilcSFTPServer server = (SilcSFTPServer)sftp;
void *context)
{
SilcSFTPServer server = (SilcSFTPServer)sftp;
-
uint32 id = (uint32)context
;
+
SilcUInt32 id = SILC_PTR_TO_32(context)
;
SilcBuffer namebuf;
SILC_LOG_DEBUG(("Name callback"));
SilcBuffer namebuf;
SILC_LOG_DEBUG(("Name callback"));
@@
-205,7
+208,7
@@
static void silc_sftp_server_attr(SilcSFTP sftp,
void *context)
{
SilcSFTPServer server = (SilcSFTPServer)sftp;
void *context)
{
SilcSFTPServer server = (SilcSFTPServer)sftp;
-
uint32 id = (uint32)context
;
+
SilcUInt32 id = SILC_PTR_TO_32(context)
;
SilcBuffer attr_buf;
SILC_LOG_DEBUG(("Attr callback"));
SilcBuffer attr_buf;
SILC_LOG_DEBUG(("Attr callback"));
@@
-217,6
+220,10
@@
static void silc_sftp_server_attr(SilcSFTP sftp,
}
attr_buf = silc_sftp_attr_encode(attrs);
}
attr_buf = silc_sftp_attr_encode(attrs);
+ if (!attr_buf) {
+ silc_sftp_send_error(server, SILC_SFTP_STATUS_FAILURE, id);
+ return;
+ }
silc_sftp_send_packet(server, SILC_SFTP_ATTRS, 4 + attr_buf->len,
SILC_STR_UI_INT(id),
silc_sftp_send_packet(server, SILC_SFTP_ATTRS, 4 + attr_buf->len,
SILC_STR_UI_INT(id),
@@
-231,11
+238,11
@@
static void silc_sftp_server_attr(SilcSFTP sftp,
static void silc_sftp_server_extended(SilcSFTP sftp,
SilcSFTPStatus status,
const unsigned char *data,
static void silc_sftp_server_extended(SilcSFTP sftp,
SilcSFTPStatus status,
const unsigned char *data,
-
ui
nt32 data_len,
+
SilcUI
nt32 data_len,
void *context)
{
SilcSFTPServer server = (SilcSFTPServer)sftp;
void *context)
{
SilcSFTPServer server = (SilcSFTPServer)sftp;
-
uint32 id = (uint32)context
;
+
SilcUInt32 id = SILC_PTR_TO_32(context)
;
SILC_LOG_DEBUG(("Extended callback"));
SILC_LOG_DEBUG(("Request ID: %d", id));
SILC_LOG_DEBUG(("Extended callback"));
SILC_LOG_DEBUG(("Request ID: %d", id));
@@
-251,21
+258,20
@@
static void silc_sftp_server_extended(SilcSFTP sftp,
SILC_STR_END);
}
SILC_STR_END);
}
-/* Starts SFTP server by associating the socket connection `sock' to the
- created SFTP server context. This function returns the allocated
- SFTP client context or NULL on error. The `send_packet' is called
+/* Starts SFTP server and returns context to it. This function returns the
+ allocated SFTP client context or NULL on error. The `send_packet' is called
by the library when it needs to send a packet. The `fs' is the
structure containing filesystem access callbacks. */
by the library when it needs to send a packet. The `fs' is the
structure containing filesystem access callbacks. */
-SilcSFTP silc_sftp_server_start(SilcSocketConnection sock,
- SilcSFTPSendPacketCallback send_packet,
+SilcSFTP silc_sftp_server_start(SilcSFTPSendPacketCallback send_packet,
void *send_context,
SilcSFTPFilesystem fs)
{
SilcSFTPServer server;
server = silc_calloc(1, sizeof(*server));
void *send_context,
SilcSFTPFilesystem fs)
{
SilcSFTPServer server;
server = silc_calloc(1, sizeof(*server));
- server->sock = sock;
+ if (!server)
+ return NULL;
server->send_packet = send_packet;
server->send_context = send_context;
server->fs = fs;
server->send_packet = send_packet;
server->send_context = send_context;
server->fs = fs;
@@
-285,6
+291,8
@@
void silc_sftp_server_shutdown(SilcSFTP sftp)
SILC_LOG_DEBUG(("Stopping SFTP server %p", server));
SILC_LOG_DEBUG(("Stopping SFTP server %p", server));
+ if (server->packet)
+ silc_buffer_free(server->packet);
silc_free(server);
}
silc_free(server);
}
@@
-292,7
+300,7
@@
void silc_sftp_server_shutdown(SilcSFTP sftp)
void silc_sftp_server_set_monitor(SilcSFTP sftp,
SilcSFTPMonitors monitors,
void silc_sftp_server_set_monitor(SilcSFTP sftp,
SilcSFTPMonitors monitors,
- SilcSFTPMonitor monitor,
+ SilcSFTPMonitor monitor,
void *context)
{
SilcSFTPServer server = (SilcSFTPServer)sftp;
void *context)
{
SilcSFTPServer server = (SilcSFTPServer)sftp;
@@
-313,10
+321,10
@@
void silc_sftp_server_receive_process(SilcSFTP sftp,
SilcSFTPPacket type;
char *filename = NULL, *path = NULL;
const unsigned char *payload = NULL;
SilcSFTPPacket type;
char *filename = NULL, *path = NULL;
const unsigned char *payload = NULL;
-
ui
nt32 payload_len;
+
SilcUI
nt32 payload_len;
int ret;
SilcBufferStruct buf;
int ret;
SilcBufferStruct buf;
-
ui
nt32 id;
+
SilcUI
nt32 id;
SilcSFTPAttributes attrs;
SilcSFTPHandle handle;
SilcSFTPMonitorDataStruct mdata;
SilcSFTPAttributes attrs;
SilcSFTPHandle handle;
SilcSFTPMonitorDataStruct mdata;
@@
-324,7
+332,7
@@
void silc_sftp_server_receive_process(SilcSFTP sftp,
SILC_LOG_DEBUG(("Start"));
/* Parse the packet */
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;
&payload_len);
if (!type)
return;
@@
-363,7
+371,7
@@
void silc_sftp_server_receive_process(SilcSFTP sftp,
{
SilcSFTPFileOperation pflags;
unsigned char *attr_buf;
{
SilcSFTPFileOperation pflags;
unsigned char *attr_buf;
-
ui
nt32 attr_len = 0;
+
SilcUI
nt32 attr_len = 0;
SilcBufferStruct tmpbuf;
SILC_LOG_DEBUG(("Open request"));
SilcBufferStruct tmpbuf;
SILC_LOG_DEBUG(("Open request"));
@@
-372,7
+380,7
@@
void silc_sftp_server_receive_process(SilcSFTP sftp,
SILC_STR_UI_INT(&id),
SILC_STR_UI32_STRING_ALLOC(&filename),
SILC_STR_UI_INT(&pflags),
SILC_STR_UI_INT(&id),
SILC_STR_UI32_STRING_ALLOC(&filename),
SILC_STR_UI_INT(&pflags),
- SILC_STR_UI32_NSTRING(&attr_buf,
+ SILC_STR_UI32_NSTRING(&attr_buf,
&attr_len),
SILC_STR_END);
if (ret < 0)
&attr_len),
SILC_STR_END);
if (ret < 0)
@@
-381,8
+389,12
@@
void silc_sftp_server_receive_process(SilcSFTP sftp,
if (attr_len) {
silc_buffer_set(&tmpbuf, attr_buf, attr_len);
attrs = silc_sftp_attr_decode(&tmpbuf);
if (attr_len) {
silc_buffer_set(&tmpbuf, attr_buf, attr_len);
attrs = silc_sftp_attr_decode(&tmpbuf);
+ if (!attrs)
+ goto failure;
} else {
attrs = silc_calloc(1, sizeof(*attrs));
} else {
attrs = silc_calloc(1, sizeof(*attrs));
+ if (!attrs)
+ goto failure;
}
/* Call monitor */
}
/* Call monitor */
@@
-395,7
+407,8
@@
void silc_sftp_server_receive_process(SilcSFTP sftp,
/* Open operation */
server->fs->fs->sftp_open(server->fs->fs_context, sftp, filename, pflags,
/* Open operation */
server->fs->fs->sftp_open(server->fs->fs_context, sftp, filename, pflags,
- attrs, silc_sftp_server_handle, (void *)id);
+ attrs, silc_sftp_server_handle,
+ SILC_32_TO_PTR(id));
silc_free(filename);
silc_sftp_attr_free(attrs);
silc_free(filename);
silc_sftp_attr_free(attrs);
@@
-405,13
+418,13
@@
void silc_sftp_server_receive_process(SilcSFTP sftp,
case SILC_SFTP_CLOSE:
{
unsigned char *hdata;
case SILC_SFTP_CLOSE:
{
unsigned char *hdata;
-
ui
nt32 hdata_len;
+
SilcUI
nt32 hdata_len;
SILC_LOG_DEBUG(("Close request"));
ret = silc_buffer_unformat(&buf,
SILC_STR_UI_INT(&id),
SILC_LOG_DEBUG(("Close request"));
ret = silc_buffer_unformat(&buf,
SILC_STR_UI_INT(&id),
- SILC_STR_UI32_NSTRING(&hdata,
+ SILC_STR_UI32_NSTRING(&hdata,
&hdata_len),
SILC_STR_END);
if (ret < 0)
&hdata_len),
SILC_STR_END);
if (ret < 0)
@@
-434,22
+447,23
@@
void silc_sftp_server_receive_process(SilcSFTP sftp,
/* Close operation */
server->fs->fs->sftp_close(server->fs->fs_context, sftp, handle,
/* Close operation */
server->fs->fs->sftp_close(server->fs->fs_context, sftp, handle,
- silc_sftp_server_status, (void *)id);
+ silc_sftp_server_status, SILC_32_TO_PTR(id));
+
}
break;
case SILC_SFTP_READ:
{
unsigned char *hdata;
}
break;
case SILC_SFTP_READ:
{
unsigned char *hdata;
-
ui
nt32 hdata_len;
-
ui
nt64 offset;
-
ui
nt32 len;
+
SilcUI
nt32 hdata_len;
+
SilcUI
nt64 offset;
+
SilcUI
nt32 len;
SILC_LOG_DEBUG(("Read request"));
ret = silc_buffer_unformat(&buf,
SILC_STR_UI_INT(&id),
SILC_LOG_DEBUG(("Read request"));
ret = silc_buffer_unformat(&buf,
SILC_STR_UI_INT(&id),
- SILC_STR_UI32_NSTRING(&hdata,
+ SILC_STR_UI32_NSTRING(&hdata,
&hdata_len),
SILC_STR_UI_INT64(&offset),
SILC_STR_UI_INT(&len),
&hdata_len),
SILC_STR_UI_INT64(&offset),
SILC_STR_UI_INT(&len),
@@
-466,6
+480,11
@@
void silc_sftp_server_receive_process(SilcSFTP sftp,
break;
}
break;
}
+ /* Read operation */
+ server->fs->fs->sftp_read(server->fs->fs_context, sftp,
+ handle, offset, len,
+ silc_sftp_server_data, SILC_32_TO_PTR(id));
+
/* Call monitor */
if (server->monitors & SILC_SFTP_MONITOR_READ && server->monitor) {
mdata.offset = offset;
/* Call monitor */
if (server->monitors & SILC_SFTP_MONITOR_READ && server->monitor) {
mdata.offset = offset;
@@
-473,30
+492,25
@@
void silc_sftp_server_receive_process(SilcSFTP sftp,
(*server->monitor)(sftp, SILC_SFTP_MONITOR_READ, &mdata,
server->monitor_context);
}
(*server->monitor)(sftp, SILC_SFTP_MONITOR_READ, &mdata,
server->monitor_context);
}
-
- /* Read operation */
- server->fs->fs->sftp_read(server->fs->fs_context, sftp,
- handle, offset, len,
- silc_sftp_server_data, (void *)id);
}
break;
case SILC_SFTP_WRITE:
{
unsigned char *hdata;
}
break;
case SILC_SFTP_WRITE:
{
unsigned char *hdata;
-
ui
nt32 hdata_len;
-
ui
nt64 offset;
+
SilcUI
nt32 hdata_len;
+
SilcUI
nt64 offset;
unsigned char *data;
unsigned char *data;
-
ui
nt32 data_len;
+
SilcUI
nt32 data_len;
SILC_LOG_DEBUG(("Read request"));
ret = silc_buffer_unformat(&buf,
SILC_STR_UI_INT(&id),
SILC_LOG_DEBUG(("Read request"));
ret = silc_buffer_unformat(&buf,
SILC_STR_UI_INT(&id),
- SILC_STR_UI32_NSTRING(&hdata,
+ SILC_STR_UI32_NSTRING(&hdata,
&hdata_len),
SILC_STR_UI_INT64(&offset),
&hdata_len),
SILC_STR_UI_INT64(&offset),
- SILC_STR_UI32_NSTRING(&data,
+ SILC_STR_UI32_NSTRING(&data,
&data_len),
SILC_STR_END);
if (ret < 0)
&data_len),
SILC_STR_END);
if (ret < 0)
@@
-511,6
+525,11
@@
void silc_sftp_server_receive_process(SilcSFTP sftp,
break;
}
break;
}
+ /* Write operation */
+ server->fs->fs->sftp_write(server->fs->fs_context, sftp, handle, offset,
+ (const unsigned char *)data, data_len,
+ silc_sftp_server_status, SILC_32_TO_PTR(id));
+
/* Call monitor */
if (server->monitors & SILC_SFTP_MONITOR_WRITE && server->monitor) {
mdata.offset = offset;
/* Call monitor */
if (server->monitors & SILC_SFTP_MONITOR_WRITE && server->monitor) {
mdata.offset = offset;
@@
-518,11
+537,6
@@
void silc_sftp_server_receive_process(SilcSFTP sftp,
(*server->monitor)(sftp, SILC_SFTP_MONITOR_WRITE, &mdata,
server->monitor_context);
}
(*server->monitor)(sftp, SILC_SFTP_MONITOR_WRITE, &mdata,
server->monitor_context);
}
-
- /* Write operation */
- server->fs->fs->sftp_write(server->fs->fs_context, sftp, handle, offset,
- (const unsigned char *)data, data_len,
- silc_sftp_server_status, (void *)id);
}
break;
}
break;
@@
-546,7
+560,7
@@
void silc_sftp_server_receive_process(SilcSFTP sftp,
/* Remove operation */
server->fs->fs->sftp_remove(server->fs->fs_context, sftp, filename,
/* Remove operation */
server->fs->fs->sftp_remove(server->fs->fs_context, sftp, filename,
- silc_sftp_server_status,
(void *)id
);
+ silc_sftp_server_status,
SILC_32_TO_PTR(id)
);
silc_free(filename);
}
silc_free(filename);
}
@@
-575,9
+589,9
@@
void silc_sftp_server_receive_process(SilcSFTP sftp,
}
/* Rename operation */
}
/* Rename operation */
- server->fs->fs->sftp_rename(server->fs->fs_context, sftp,
+ server->fs->fs->sftp_rename(server->fs->fs_context, sftp,
filename, newname,
filename, newname,
- silc_sftp_server_status,
(void *)id
);
+ silc_sftp_server_status,
SILC_32_TO_PTR(id)
);
silc_free(filename);
silc_free(newname);
silc_free(filename);
silc_free(newname);
@@
-587,7
+601,7
@@
void silc_sftp_server_receive_process(SilcSFTP sftp,
case SILC_SFTP_MKDIR:
{
unsigned char *attr_buf;
case SILC_SFTP_MKDIR:
{
unsigned char *attr_buf;
-
ui
nt32 attr_len = 0;
+
SilcUI
nt32 attr_len = 0;
SilcBufferStruct tmpbuf;
SILC_LOG_DEBUG(("Mkdir request"));
SilcBufferStruct tmpbuf;
SILC_LOG_DEBUG(("Mkdir request"));
@@
-604,8
+618,12
@@
void silc_sftp_server_receive_process(SilcSFTP sftp,
if (attr_len) {
silc_buffer_set(&tmpbuf, attr_buf, attr_len);
attrs = silc_sftp_attr_decode(&tmpbuf);
if (attr_len) {
silc_buffer_set(&tmpbuf, attr_buf, attr_len);
attrs = silc_sftp_attr_decode(&tmpbuf);
+ if (!attrs)
+ goto failure;
} else {
attrs = silc_calloc(1, sizeof(*attrs));
} else {
attrs = silc_calloc(1, sizeof(*attrs));
+ if (!attrs)
+ goto failure;
}
/* Call monitor */
}
/* Call monitor */
@@
-617,7
+635,7
@@
void silc_sftp_server_receive_process(SilcSFTP sftp,
/* Mkdir operation */
server->fs->fs->sftp_mkdir(server->fs->fs_context, sftp, path, attrs,
/* Mkdir operation */
server->fs->fs->sftp_mkdir(server->fs->fs_context, sftp, path, attrs,
- silc_sftp_server_status,
(void *)id
);
+ silc_sftp_server_status,
SILC_32_TO_PTR(id)
);
silc_sftp_attr_free(attrs);
silc_free(path);
silc_sftp_attr_free(attrs);
silc_free(path);
@@
-644,7
+662,7
@@
void silc_sftp_server_receive_process(SilcSFTP sftp,
/* Rmdir operation */
server->fs->fs->sftp_rmdir(server->fs->fs_context, sftp, path,
/* Rmdir operation */
server->fs->fs->sftp_rmdir(server->fs->fs_context, sftp, path,
- silc_sftp_server_status,
(void *)id
);
+ silc_sftp_server_status,
SILC_32_TO_PTR(id)
);
silc_free(path);
}
silc_free(path);
}
@@
-670,7
+688,7
@@
void silc_sftp_server_receive_process(SilcSFTP sftp,
/* Opendir operation */
server->fs->fs->sftp_opendir(server->fs->fs_context, sftp, path,
/* Opendir operation */
server->fs->fs->sftp_opendir(server->fs->fs_context, sftp, path,
- silc_sftp_server_handle,
(void *)id
);
+ silc_sftp_server_handle,
SILC_32_TO_PTR(id)
);
silc_free(path);
}
silc_free(path);
}
@@
-679,13
+697,13
@@
void silc_sftp_server_receive_process(SilcSFTP sftp,
case SILC_SFTP_READDIR:
{
unsigned char *hdata;
case SILC_SFTP_READDIR:
{
unsigned char *hdata;
-
ui
nt32 hdata_len;
+
SilcUI
nt32 hdata_len;
SILC_LOG_DEBUG(("Readdir request"));
ret = silc_buffer_unformat(&buf,
SILC_STR_UI_INT(&id),
SILC_LOG_DEBUG(("Readdir request"));
ret = silc_buffer_unformat(&buf,
SILC_STR_UI_INT(&id),
- SILC_STR_UI32_NSTRING(&hdata,
+ SILC_STR_UI32_NSTRING(&hdata,
&hdata_len),
SILC_STR_END);
if (ret < 0)
&hdata_len),
SILC_STR_END);
if (ret < 0)
@@
-708,7
+726,7
@@
void silc_sftp_server_receive_process(SilcSFTP sftp,
/* Readdir operation */
server->fs->fs->sftp_readdir(server->fs->fs_context, sftp, handle,
/* Readdir operation */
server->fs->fs->sftp_readdir(server->fs->fs_context, sftp, handle,
- silc_sftp_server_name,
(void *)id
);
+ silc_sftp_server_name,
SILC_32_TO_PTR(id)
);
}
break;
}
break;
@@
-732,7
+750,7
@@
void silc_sftp_server_receive_process(SilcSFTP sftp,
/* Stat operation */
server->fs->fs->sftp_stat(server->fs->fs_context, sftp, path,
/* Stat operation */
server->fs->fs->sftp_stat(server->fs->fs_context, sftp, path,
- silc_sftp_server_attr,
(void *)id
);
+ silc_sftp_server_attr,
SILC_32_TO_PTR(id)
);
silc_free(path);
}
silc_free(path);
}
@@
-758,7
+776,7
@@
void silc_sftp_server_receive_process(SilcSFTP sftp,
/* Lstat operation */
server->fs->fs->sftp_lstat(server->fs->fs_context, sftp, path,
/* Lstat operation */
server->fs->fs->sftp_lstat(server->fs->fs_context, sftp, path,
- silc_sftp_server_attr,
(void *)id
);
+ silc_sftp_server_attr,
SILC_32_TO_PTR(id)
);
silc_free(path);
}
silc_free(path);
}
@@
-767,13
+785,13
@@
void silc_sftp_server_receive_process(SilcSFTP sftp,
case SILC_SFTP_FSTAT:
{
unsigned char *hdata;
case SILC_SFTP_FSTAT:
{
unsigned char *hdata;
-
ui
nt32 hdata_len;
+
SilcUI
nt32 hdata_len;
SILC_LOG_DEBUG(("Fstat request"));
ret = silc_buffer_unformat(&buf,
SILC_STR_UI_INT(&id),
SILC_LOG_DEBUG(("Fstat request"));
ret = silc_buffer_unformat(&buf,
SILC_STR_UI_INT(&id),
- SILC_STR_UI32_NSTRING(&hdata,
+ SILC_STR_UI32_NSTRING(&hdata,
&hdata_len),
SILC_STR_END);
if (ret < 0)
&hdata_len),
SILC_STR_END);
if (ret < 0)
@@
-796,14
+814,14
@@
void silc_sftp_server_receive_process(SilcSFTP sftp,
/* Fstat operation */
server->fs->fs->sftp_fstat(server->fs->fs_context, sftp, handle,
/* Fstat operation */
server->fs->fs->sftp_fstat(server->fs->fs_context, sftp, handle,
- silc_sftp_server_attr,
(void *)id
);
+ silc_sftp_server_attr,
SILC_32_TO_PTR(id)
);
}
break;
case SILC_SFTP_SETSTAT:
{
unsigned char *attr_buf;
}
break;
case SILC_SFTP_SETSTAT:
{
unsigned char *attr_buf;
-
ui
nt32 attr_len = 0;
+
SilcUI
nt32 attr_len = 0;
SilcBufferStruct tmpbuf;
SILC_LOG_DEBUG(("Setstat request"));
SilcBufferStruct tmpbuf;
SILC_LOG_DEBUG(("Setstat request"));
@@
-820,8
+838,12
@@
void silc_sftp_server_receive_process(SilcSFTP sftp,
if (attr_len) {
silc_buffer_set(&tmpbuf, attr_buf, attr_len);
attrs = silc_sftp_attr_decode(&tmpbuf);
if (attr_len) {
silc_buffer_set(&tmpbuf, attr_buf, attr_len);
attrs = silc_sftp_attr_decode(&tmpbuf);
+ if (!attrs)
+ goto failure;
} else {
attrs = silc_calloc(1, sizeof(*attrs));
} else {
attrs = silc_calloc(1, sizeof(*attrs));
+ if (!attrs)
+ goto failure;
}
/* Call monitor */
}
/* Call monitor */
@@
-833,7
+855,7
@@
void silc_sftp_server_receive_process(SilcSFTP sftp,
/* Setstat operation */
server->fs->fs->sftp_setstat(server->fs->fs_context, sftp, path, attrs,
/* Setstat operation */
server->fs->fs->sftp_setstat(server->fs->fs_context, sftp, path, attrs,
- silc_sftp_server_status,
(void *)id
);
+ silc_sftp_server_status,
SILC_32_TO_PTR(id)
);
silc_sftp_attr_free(attrs);
silc_free(path);
silc_sftp_attr_free(attrs);
silc_free(path);
@@
-843,14
+865,14
@@
void silc_sftp_server_receive_process(SilcSFTP sftp,
case SILC_SFTP_FSETSTAT:
{
unsigned char *hdata, *attr_buf;
case SILC_SFTP_FSETSTAT:
{
unsigned char *hdata, *attr_buf;
-
ui
nt32 hdata_len, attr_len = 0;
+
SilcUI
nt32 hdata_len, attr_len = 0;
SilcBufferStruct tmpbuf;
SILC_LOG_DEBUG(("Fsetstat request"));
ret = silc_buffer_unformat(&buf,
SILC_STR_UI_INT(&id),
SilcBufferStruct tmpbuf;
SILC_LOG_DEBUG(("Fsetstat request"));
ret = silc_buffer_unformat(&buf,
SILC_STR_UI_INT(&id),
- SILC_STR_UI32_NSTRING(&hdata,
+ SILC_STR_UI32_NSTRING(&hdata,
&hdata_len),
SILC_STR_UI32_NSTRING(&attr_buf,
&attr_len),
&hdata_len),
SILC_STR_UI32_NSTRING(&attr_buf,
&attr_len),
@@
-861,8
+883,12
@@
void silc_sftp_server_receive_process(SilcSFTP sftp,
if (attr_len) {
silc_buffer_set(&tmpbuf, attr_buf, attr_len);
attrs = silc_sftp_attr_decode(&tmpbuf);
if (attr_len) {
silc_buffer_set(&tmpbuf, attr_buf, attr_len);
attrs = silc_sftp_attr_decode(&tmpbuf);
+ if (!attrs)
+ goto failure;
} else {
attrs = silc_calloc(1, sizeof(*attrs));
} else {
attrs = silc_calloc(1, sizeof(*attrs));
+ if (!attrs)
+ goto failure;
}
/* Get the handle */
}
/* Get the handle */
@@
-881,9
+907,10
@@
void silc_sftp_server_receive_process(SilcSFTP sftp,
}
/* Fsetstat operation */
}
/* Fsetstat operation */
- server->fs->fs->sftp_fsetstat(server->fs->fs_context, sftp,
+ server->fs->fs->sftp_fsetstat(server->fs->fs_context, sftp,
handle, attrs,
handle, attrs,
- silc_sftp_server_status, (void *)id);
+ silc_sftp_server_status,
+ SILC_32_TO_PTR(id));
silc_sftp_attr_free(attrs);
}
silc_sftp_attr_free(attrs);
}
@@
-909,7
+936,7
@@
void silc_sftp_server_receive_process(SilcSFTP sftp,
/* Readlink operation */
server->fs->fs->sftp_readlink(server->fs->fs_context, sftp, path,
/* Readlink operation */
server->fs->fs->sftp_readlink(server->fs->fs_context, sftp, path,
- silc_sftp_server_name,
(void *)id
);
+ silc_sftp_server_name,
SILC_32_TO_PTR(id)
);
silc_free(path);
}
silc_free(path);
}
@@
-939,7
+966,7
@@
void silc_sftp_server_receive_process(SilcSFTP sftp,
/* Symlink operation */
server->fs->fs->sftp_symlink(server->fs->fs_context, sftp, path, target,
/* Symlink operation */
server->fs->fs->sftp_symlink(server->fs->fs_context, sftp, path, target,
- silc_sftp_server_status,
(void *)id
);
+ silc_sftp_server_status,
SILC_32_TO_PTR(id)
);
silc_free(path);
silc_free(target);
silc_free(path);
silc_free(target);
@@
-966,7
+993,7
@@
void silc_sftp_server_receive_process(SilcSFTP sftp,
/* Realpath operation */
server->fs->fs->sftp_realpath(server->fs->fs_context, sftp, path,
/* Realpath operation */
server->fs->fs->sftp_realpath(server->fs->fs_context, sftp, path,
- silc_sftp_server_name,
(void *)id
);
+ silc_sftp_server_name,
SILC_32_TO_PTR(id)
);
silc_free(path);
}
silc_free(path);
}
@@
-976,7
+1003,7
@@
void silc_sftp_server_receive_process(SilcSFTP sftp,
{
char *request = NULL;
unsigned char *data;
{
char *request = NULL;
unsigned char *data;
-
ui
nt32 data_len;
+
SilcUI
nt32 data_len;
SILC_LOG_DEBUG(("Extended request"));
SILC_LOG_DEBUG(("Extended request"));
@@
-1003,9
+1030,10
@@
void silc_sftp_server_receive_process(SilcSFTP sftp,
}
/* Extended operation */
}
/* Extended operation */
- server->fs->fs->sftp_extended(server->fs->fs_context, sftp,
+ server->fs->fs->sftp_extended(server->fs->fs_context, sftp,
request, data, data_len,
request, data, data_len,
- silc_sftp_server_extended, (void *)id);
+ silc_sftp_server_extended,
+ SILC_32_TO_PTR(id));
silc_free(request);
}
silc_free(request);
}