A patch to move FSCTL handling into the VFS
Rusty Russell
rusty at ozlabs.org
Wed Sep 21 18:46:30 MDT 2011
On Fri, 16 Sep 2011 11:58:04 -0700, Richard Sharpe <realrichardsharpe at gmail.com> wrote:
> 2. Is the handling of talloc correct. Ie, will these allocations get
> cleaned up when the request completes. I used
> talloc_size(talloc_tos(), ...) mostly.
Yes, that looks wrong (I have no idea about this code, BTW, just that I
know something about talloc).
You usually want to use talloc_array, which gives you type checking:
> +static NTSTATUS vfswrap_fsctl(struct vfs_handle_struct *handle,
> + struct files_struct *fsp,
> + uint32_t function,
> + uint16_t req_flags, /* Needed for UNICODE ... */
> + const char *in_data,
> + uint32_t in_len,
> + char **out_data,
> + uint32_t max_out_len,
> + uint32_t *out_len)
> +{
...
> + *out_len = (max_out_len >= 64) ? 64 : max_out_len;
> + /* Hmmm, will this cause problems if less data asked for? */
> + return_data = talloc_size(talloc_tos(), 64);
> + if (return_data == NULL) {
> + return NT_STATUS_NO_MEMORY;
> + }
> +
> + /* For backwards compatibility only store the dev/inode. */
> + push_file_id_16(return_data, &fsp->file_id);
> + memcpy(return_data+16,create_volume_objectid(fsp->conn,objid),16);
> + push_file_id_16(return_data+32, &fsp->file_id);
> + *out_data = return_data;
> + return NT_STATUS_OK;
This would be neater as an explicit char array allocation:
return_data = talloc_array(<parent>, char, 64);
More importantly, the parent is wrong: you can't parent on the top of
stack then return! Your function should take a MEM_CTX ptr: the caller
should pass the allocation which it wants the out_data to hang from.
> + shadow_data = talloc_zero(talloc_tos(),
> + struct shadow_copy_data);
> + if (shadow_data == NULL) {
> + DEBUG(0,("TALLOC_ZERO() failed!\n"));
> + reply NT_STATUS_NO_MEMORY;
> + }
This is actually OK, since you only use this variable in this function.
> + cur_pdata = talloc_size(talloc_tos(), *out_len);
> + if (cur_pdata == NULL) {
> + TALLOC_FREE(shadow_data);
> + return NT_STATUS_NO_MEMORY;
> + }
> +
> + *out_data = cur_pdata;
This needs a mem_ctx to hang off...
> + *out_len = 16;
> + out_data_tmp = talloc_size(talloc_tos, *out_len);
Again...
Hope that helps,
Rusty.
More information about the samba-technical
mailing list