[PATCH] for "testparm should check for invalid vfs objects"

Amit amitkuma at redhat.com
Fri Sep 7 08:15:08 UTC 2018


Dear Metze,

I am obliged with your support.

I did the code change but cannot find definition of function
'smb_vfs_find_module' in testparm.c

# make
default/source3/utils/testparm_38.o: In function `do_per_share_checks':
testparm.c:(.text+0x15fa): undefined reference to `smb_vfs_find_module'

cat vim source3/utils/testparm.c
#include "smbd/smbd.h"
static void do_per_share_checks(int s){
....
smb_vfs_find_module(vfs_objects[k], NULL, NULL, NULL);
}

cat ./source3/smbd/proto.h
bool smb_vfs_find_module(const char *vfs_object,
                         const struct vfs_fn_pointers **fns_ptr,
                         TALLOC_CTX *mem_ctx,
                         const char **module_params_ptr);


Also, module_params_ptr would be created by passing 1st argument of
talloc_strdup as NULL since we donot pass connection_struct*
smb_vfs_find_module
{
        if (module_param) {
                *module_params_ptr = talloc_strdup(NULL, module_param);
        }
}

Thanks
Amit
On 08/28/2018 12:35 PM, Stefan Metzmacher wrote:
> Hi Amit,
>
> it looks much better, but we also need to check builtin modules
> not only share modules.
>
> I think we should split out the first part of vfs_init_custom(),
> everything before 'handle = talloc_zero(conn, vfs_handle_struct);'
> into a new function:
>
> NTSTATUS smb_vfs_find_module(const char *vfs_object,
> 			     const struct vfs_fn_pointers **fns_ptr,
> 			     TALLOC_CTX *mem_ctx,
> 			     char **module_params_ptr);
>
> It should be allowed to pass fns_ptr = NULL, mem_ctx = NULL and
> module_params_ptr = NULL. And that's what your code should do.
>
> You'll get extra points if you convert the code to use
> 'TALLOC_CTX *frame = talloc_stackframe();' and talloc_strdup(frame, ...)
> instead of smb_xstrdup().
>
> In your loop you just call
>
> status = smb_vfs_find_module(vfs_objects[k], NULL, NULL, NULL);
>
>
> vfs_init_custom() will just be:
>
> handle = talloc_zero(conn, vfs_handle_struct);
> ...
> handle->conn = conn;
>
> status = smb_vfs_find_module(vfs_object,
>                              &handle->fns,
>                              handle,
>                              &handle->param);
> ...
> DLIST_ADD(conn->vfs_handles, handle);
>
> I hope that helps!
>
> metze
>
>
> Am 28.08.2018 um 07:13 schrieb Amit:
>> Dear Metze/volker,
>>
>> Can you please look at the patch and suggest.
>>
>> # cat /usr/local/samba/etc/smb.conf | grep vfs
>>     vfs objects = fruit1   23     worm2112
>>  # /usr/local/samba/bin/testparm
>> Load smb config files from /usr/local/samba/etc/smb.conf
>> rlimit_max: increasing rlimit_max (1024) to minimum Windows limit (16384)
>> Processing section "[myshare]"
>> Loaded services file OK.
>> Error loading module '/usr/local/samba/lib/vfs/fruit1.so':
>> /usr/local/samba/lib/vfs/fruit1.so: cannot open shared object file: No
>> such file or directory
>> WARNING: Wrong vfs module: fruit1
>>
>> Error loading module '/usr/local/samba/lib/vfs/23.so':
>> /usr/local/samba/lib/vfs/23.so: cannot open shared object file: No such
>> file or directory
>> WARNING: Wrong vfs module: 23
>>
>> Error loading module '/usr/local/samba/lib/vfs/worm2112.so':
>> /usr/local/samba/lib/vfs/worm2112.so: cannot open shared object file: No
>> such file or directory
>> WARNING: Wrong vfs module: worm2112
>>
>> Server role: ROLE_STANDALONE
>>
>> Press enter to see a dump of your service definitions
>> ^C
>> #
>>
>> Thanks
>>
>> Amit
>>
>>
>> On 08/27/2018 12:34 PM, Amit wrote:
>>> Hello All,
>>>
>>> New patch. PFA
>>>
>>> Thanks
>>> Amit
>>>
>>>
>>> On 08/21/2018 07:20 PM, Stefan Metzmacher wrote:
>>>> Hello Amit,
>>>>
>>>>> I tried using getting vfs_object list as done in smbd_vfs_init(), Since
>>>>> I donot have connection_struct i used #define GLOBAL_SECTION_SNUM    
>>>>> (-1). But values are not retrieved.
>>>> Testparm should have the snum for the section it is checking.
>>>> do_per_share_checks(int s), 's' is the one you need.
>>>>
>>>>>         int test = -1, o=0;
>>>>>         char **vfs_objects_test = lp_vfs_objects(test);
>>>>>         while(vfs_objects_test[o]){
>>>>>                 printf("vfs_objects_test=%s\n",vfs_objects_test[o]);
>>>>>                 o++;
>>>>>         }
>>>> Within the loop you need a logic like vfs_init_custom(), you need the
>>>> logic that converts the string 'vfs_object' into module_path and
>>>> module_name and then the following check:
>>>>
>>>>         entry = vfs_find_backend_entry(module_name);
>>>>         if (!entry) {
>>>>                 NTSTATUS status;
>>>>
>>>>                 status = smb_load_module("vfs", module_path);
>>>>                 if (!NT_STATUS_IS_OK(status)) {
>>>>                         DEBUG(0, ("error probing vfs module '%s': %s\n",
>>>>                                   module_path, nt_errstr(status)));
>>>>                         goto fail;
>>>>                 }
>>>>
>>>>                 entry = vfs_find_backend_entry(module_name);
>>>>                 if (!entry) {
>>>>                         DEBUG(0,("Can't find a vfs module
>>>> [%s]\n",vfs_object));
>>>>                         goto fail;
>>>>                 }
>>>>         }
>>>>
>>>>> Also have do we have any module extracted using 'waf' which can refereed
>>>>> as for reference.
>>>> It could get a list, but only with internal modules, at buildtime.
>>>>
>>>> If a packager moved some modules to separate rpm/deb packages and those
>>>> are not installed, the list would still be wrong.
>>>>
>>>> I hope that helps...
>>>>
>>>> metze
>>> -- 
>>> Thanks
>>> Amit Kumar
>>> !!If you stumble, get back up. 
>>> What happened yesterday, no longer matters.
>>> Today is another day to move closer to your GOAL!!
>

-- 
Thanks
Amit Kumar
!!If you stumble, get back up. 
What happened yesterday, no longer matters.
Today is another day to move closer to your GOAL!!




More information about the samba-technical mailing list