if (!dir->entry) {
dir->entry = silc_calloc(3, sizeof(*entry));
+ if (!dir->entry)
+ return FALSE;
dir->entry[0] = entry;
dir->entry_count = 3;
entry->created = time(0);
dir->entry = silc_realloc(dir->entry, sizeof(*dir->entry) *
(dir->entry_count + 3));
+ if (!dir->entry)
+ return FALSE;
for (i = dir->entry_count + 1; i < dir->entry_count + 3; i++)
dir->entry[i] = NULL;
dir->entry[dir->entry_count] = entry;
int i;
handle = silc_calloc(1, sizeof(*handle));
+ if (!handle)
+ return NULL;
handle->fd = fd;
handle->entry = entry;
if (!fs->handles) {
fs->handles = silc_calloc(5, sizeof(*fs->handles));
+ if (!fs->handles)
+ return NULL;
fs->handles[0] = handle;
fs->handles_count = 5;
fs->handles = silc_realloc(fs->handles, sizeof(*fs->handles) *
(fs->handles_count + 5));
+ if (!fs->handles)
+ return NULL;
for (i = fs->handles_count + 1; i < fs->handles_count + 5; i++)
fs->handles[i] = NULL;
fs->handles[fs->handles_count] = handle;
MemFS fs;
fs = silc_calloc(1, sizeof(*fs));
+ if (!fs)
+ return NULL;
+
fs->root = silc_calloc(1, sizeof(*fs->root));
+ if (!fs->root) {
+ silc_free(fs);
+ return NULL;
+ }
+
fs->root->perm = perm;
fs->root_perm = perm;
fs->root->directory = TRUE;
fs->root->name = strdup(DIR_SEPARATOR);
filesystem = silc_calloc(1, sizeof(*filesystem));
- filesystem->fs =
- (struct SilcSFTPFilesystemOpsStruct *)&silc_sftp_fs_memory;
+ if (!filesystem) {
+ silc_free(fs->root);
+ silc_free(fs);
+ return NULL;
+ }
+
+ filesystem->fs = (struct SilcSFTPFilesystemOpsStruct *)&silc_sftp_fs_memory;
filesystem->fs_context = (void *)fs;
return filesystem;
MemFSEntry entry;
entry = silc_calloc(1, sizeof(*entry));
+ if (!entry)
+ return NULL;
+
entry->perm = perm;
entry->name = strdup(name);
entry->directory = TRUE;
ret = mem_del_entry(memfs->root, FALSE);
memfs->root = silc_calloc(1, sizeof(*memfs->root));
+ if (!memfs->root)
+ return FALSE;
+
memfs->root->perm = memfs->root_perm;
memfs->root->directory = TRUE;
memfs->root->name = strdup(DIR_SEPARATOR);
MemFSEntry entry;
entry = silc_calloc(1, sizeof(*entry));
+ if (!entry)
+ return FALSE;
+
entry->perm = perm;
entry->name = strdup(filename);
entry->data = strdup(realpath);
MemFSFileHandle h = (MemFSFileHandle)handle;
data = silc_calloc(4, sizeof(*data));
+ if (!data)
+ return NULL;
+
SILC_PUT32_MSB(h->handle, data);
*handle_len = 4;
-
return data;
}
/* File opened, return handle */
handle = mem_create_handle(fs, fd, entry);
- (*callback)(sftp, SILC_SFTP_STATUS_OK, (SilcSFTPHandle)handle,
- callback_context);
+ if (handle)
+ (*callback)(sftp, SILC_SFTP_STATUS_OK, (SilcSFTPHandle)handle,
+ callback_context);
+ else
+ (*callback)(sftp, SILC_SFTP_STATUS_PERMISSION_DENIED, NULL,
+ callback_context);
}
void mem_close(void *context, SilcSFTP sftp,
len = 32768;
data = silc_malloc(len);
+ if (!data) {
+ (*callback)(sftp, SILC_SFTP_STATUS_EOF, NULL, 0, callback_context);
+ return;
+ }
lseek(h->fd, (off_t)offset, SEEK_SET);
/* Attempt to read */
/* Directory opened, return handle */
handle = mem_create_handle(fs, 0, entry);
- (*callback)(sftp, SILC_SFTP_STATUS_OK, (SilcSFTPHandle)handle,
- callback_context);
+ if (handle)
+ (*callback)(sftp, SILC_SFTP_STATUS_OK, (SilcSFTPHandle)handle,
+ callback_context);
+ else
+ (*callback)(sftp, SILC_SFTP_STATUS_PERMISSION_DENIED, NULL,
+ callback_context);
}
void mem_readdir(void *context, SilcSFTP sftp,
}
name = silc_calloc(1, sizeof(*name));
+ if (!name) {
+ (*callback)(sftp, SILC_SFTP_STATUS_EOF, NULL, callback_context);
+ return;
+ }
for (i = h->fd; i < 100 + h->fd; i++) {
if (i >= h->entry->entry_count)
break;
if (strrchr(date, ':'))
*strrchr(date, ':') = '\0';
- if (!entry->directory)
+ if (!entry->directory) {
filesize = silc_file_size(entry->data + 7);
+ memset(&stats, 0, sizeof(stats));
+ stat(entry->data + 7, &stats);
+ }
/* Long name format is:
drwx------ 1 324210 Apr 8 08:40 mail/
/* Add attributes */
attrs = silc_calloc(1, sizeof(*attrs));
+ if (!attrs) {
+ (*callback)(sftp, SILC_SFTP_STATUS_EOF, NULL, callback_context);
+ return;
+ }
attrs->flags = (SILC_SFTP_ATTR_SIZE |
SILC_SFTP_ATTR_UIDGID);
attrs->size = filesize;
}
attrs = silc_calloc(1, sizeof(*attrs));
+ if (!attrs) {
+ (*callback)(sftp, SILC_SFTP_STATUS_FAILURE, NULL, callback_context);
+ return;
+ }
attrs->flags = (SILC_SFTP_ATTR_SIZE |
SILC_SFTP_ATTR_UIDGID |
SILC_SFTP_ATTR_ACMODTIME);
}
attrs = silc_calloc(1, sizeof(*attrs));
+ if (!attrs) {
+ (*callback)(sftp, SILC_SFTP_STATUS_FAILURE, NULL, callback_context);
+ return;
+ }
attrs->flags = (SILC_SFTP_ATTR_SIZE |
SILC_SFTP_ATTR_UIDGID |
SILC_SFTP_ATTR_ACMODTIME);
}
attrs = silc_calloc(1, sizeof(*attrs));
+ if (!attrs) {
+ (*callback)(sftp, SILC_SFTP_STATUS_FAILURE, NULL, callback_context);
+ return;
+ }
attrs->flags = (SILC_SFTP_ATTR_SIZE |
SILC_SFTP_ATTR_UIDGID |
SILC_SFTP_ATTR_ACMODTIME);
path = (const char *)DIR_SEPARATOR;
realpath = mem_expand_path(fs->root, path);
- if (!realpath) {
- (*callback)(sftp, SILC_SFTP_STATUS_FAILURE, NULL, callback_context);
- return;
- }
+ if (!realpath)
+ goto fail;
name = silc_calloc(1, sizeof(*name));
+ if (!name)
+ goto fail;
+
name->filename = silc_calloc(1, sizeof(*name->filename));
+ if (!name->filename)
+ goto fail;
name->filename[0] = realpath;
name->long_filename = silc_calloc(1, sizeof(*name->long_filename));
+ if (!name->long_filename)
+ goto fail;
name->long_filename[0] = realpath;
name->attrs = silc_calloc(1, sizeof(*name->attrs));
+ if (!name->attrs)
+ goto fail;
name->attrs[0] = silc_calloc(1, sizeof(*name->attrs[0]));
+ if (!name->attrs[0])
+ goto fail;
name->count = 1;
(*callback)(sftp, SILC_SFTP_STATUS_FAILURE, (const SilcSFTPName)name,
callback_context);
silc_sftp_name_free(name);
+ return;
+
+ fail:
+ (*callback)(sftp, SILC_SFTP_STATUS_FAILURE, NULL, callback_context);
}
void mem_extended(void *context, SilcSFTP sftp,