Hi Minh,
Yes, that will be ok.

/Regards HansN

-----Original Message-----
From: Minh Hon Chau [mailto:minh.c...@dektech.com.au] 
Sent: den 20 mars 2018 12:53
To: Hans Nordebäck <hans.nordeb...@ericsson.com>; Anders Widell 
<anders.wid...@ericsson.com>; ravisekhar.ko...@oracle.com
Cc: opensaf-devel@lists.sourceforge.net
Subject: Re: [PATCH 1/1] base: Only close inherited fd(s) after fork() in child 
process [#2805]

Hi Hans,

So I guess it's ok to push V1 with comments from you and Anders.

Regards,

Minh


On 20/03/18 19:16, Hans Nordebäck wrote:
> Hi Minh,
>
> I think you can keep v1 but add the missing if stmt. The /proc/self/fd 
> directory should only contain open fd's and the current and parent directory.
> Later you change stroixmax to the new string to integer utility, if needed, 
> (not likely it is needed though, I think).
> /Regards HansN
>
> -----Original Message-----
> From: Minh Hon Chau [mailto:minh.c...@dektech.com.au]
> Sent: den 20 mars 2018 08:29
> To: Hans Nordebäck <hans.nordeb...@ericsson.com>; Anders Widell 
> <anders.wid...@ericsson.com>; ravisekhar.ko...@oracle.com
> Cc: opensaf-devel@lists.sourceforge.net
> Subject: Re: [PATCH 1/1] base: Only close inherited fd(s) after fork() 
> in child process [#2805]
>
> Hi Hans,
>
> I have just seen Anders created #2814 for the utility function, once
> #2814 is done, we can change the integer conversion in this patch by new 
> utility function, maybe for a numbers of atoXX (atoi, atol,..) calls in many 
> other places for a better error handling. How do you think?
>
> Thanks,
>
> Minh
>
>
> On 20/03/18 01:29, Hans Nordebäck wrote:
>> Hi Minh,
>>
>> I think this additional check, current and parent, directory is 
>> enough for V1 patch. The usage of the 2nd
>>
>> parameter of strtol in V2 patch can be put in a utility function for 
>> a broader use.
>>
>> /Regards HansN
>>
>>
>> On 03/19/2018 08:50 AM, Minh Hon Chau wrote:
>>> Hi Hans,
>>>
>>> Agree that the check of "." and ".." should be added in V1.
>>>
>>> This V2 I use the second parameter of strtol, it should ensure that 
>>> anything read from the fd directory is entirely digit, before close 
>>> the fd.
>>>
>>> There should not be any alphabet-based directories other than ".", 
>>> ".." and 0, 1, 2, ..etc, but the usage of 2nd parameter of strtol is 
>>> more generalized
>>>
>>> So I think the check of strcmp is not needed?
>>>
>>> Thanks,
>>> Minh
>>> On 19/03/18 18:00, Hans Nordebäck wrote:
>>>> Hi Minh,
>>>>
>>>> my comment was that this check could be added:
>>>>
>>>> if (strcmp(pentry->d_name, ".") == 0 || strcmp(pentry->d_name, 
>>>> "..") == 0)
>>>>
>>>>     continue;
>>>>
>>>> /Regards HansN
>>>>
>>>> On 03/16/2018 01:27 PM, Minh Hon Chau wrote:
>>>>> Hi Anders, Hans,
>>>>>
>>>>> When I tested the patch, I did see the "." and ".." returned from 
>>>>> readdir, but the stroimax also return 0, so probably it won't be a 
>>>>> problem to close(0) more than once
>>>>>
>>>>> But to be more safety, it should check the @second_ptr too, I will 
>>>>> update and send out a V2.
>>>>>
>>>>> Thanks
>>>>> Minh
>>>>> On 16/03/18 23:00, Anders Widell wrote:
>>>>>> Hi!
>>>>>>
>>>>>> See my comments below, marked AndersW2>.
>>>>>>
>>>>>> regards,
>>>>>>
>>>>>> Anders Widell
>>>>>>
>>>>>>
>>>>>> On 03/16/2018 12:39 PM, Hans Nordebäck wrote:
>>>>>>> Hi Minh, ack with some comments, (on top of AndersW comments).
>>>>>>>
>>>>>>> /Thanks HansN
>>>>>>>
>>>>>>>
>>>>>>> On 03/15/2018 07:50 AM, Minh Chau wrote:
>>>>>>>> ---
>>>>>>>>    src/base/os_defs.c | 25 ++++++++++++++++++++-----
>>>>>>>>    1 file changed, 20 insertions(+), 5 deletions(-)
>>>>>>>>
>>>>>>>> diff --git a/src/base/os_defs.c b/src/base/os_defs.c index
>>>>>>>> 6f9ec52..e914011 100644
>>>>>>>> --- a/src/base/os_defs.c
>>>>>>>> +++ b/src/base/os_defs.c
>>>>>>>> @@ -1052,14 +1052,29 @@ uint32_t 
>>>>>>>> ncs_os_process_execute_timed(NCS_OS_PROC_EXECUTE_TIMED_INFO
>>>>>>>> *req)
>>>>>>>>             * child */
>>>>>>>>            if (getenv("OPENSAF_KEEP_FD_OPEN_AFTER_FORK") == 
>>>>>>>> NULL) {
>>>>>>>>                /* Close all inherited file descriptors */
>>>>>>>> -            int i = sysconf(_SC_OPEN_MAX);
>>>>>>>> -            if (i == -1) {
>>>>>>>> +            int fd_max = sysconf(_SC_OPEN_MAX);
>>>>>>>> +
>>>>>>>> +            if (fd_max == -1) {
>>>>>>>>                    syslog(LOG_ERR, "%s: sysconf failed - %s",
>>>>>>>> -                       __FUNCTION__, strerror(errno));
>>>>>>>> +                    __FUNCTION__, strerror(errno));
>>>>>>>>                    exit(EXIT_FAILURE);
>>>>>>>>                }
>>>>>>>> -            for (i--; i >= 0; --i)
>>>>>>>> -                (void)close(i); /* close all descriptors */
>>>>>>>> +            struct dirent *pentry = NULL;
>>>>>>>> +            DIR *dir = opendir("/proc/self/fd");
>>>>>>>> +
>>>>>>>> +            if (dir != NULL) {
>>>>>>>> +                while ((pentry = readdir(dir)) != NULL) {
>>>>>>> [HansN] readdir will return not only 0, 1, 2 etc. but also the 
>>>>>>> current directory '.' and '..' this should be handled here.
>>>>>>> [HansN] perhaps we should use readdir_r instead?
>>>>>> AndersW2> I also thought about this, but it turns out that
>>>>>> readdir_r is (or will become) obsolete. It is listed as obsolete 
>>>>>> on our wiki page:
>>>>>>
>>>>>> https://sourceforge.net/p/opensaf/wiki/Unsafe%20and%20Obsolete%20
>>>>>> F
>>>>>> unctions/
>>>>>>
>>>>>>
>>>>>> Maybe we should unlist readdir() from the non-thread-safe section?
>>>>>>
>>>>>> Regarding . and .., I think we should check for parse errors, i.e.
>>>>>> if it was a valid number or not. The second parameter to 
>>>>>> strtoimax will (if not NULL) tell us how much of the string that was 
>>>>>> parsed.
>>>>>> It should point to a '\0' character if the whole string was 
>>>>>> parsed as a valid number. In addition, you need to check that the 
>>>>>> string was not empty to begin with.
>>>>>>
>>>>>> I am thinking about adding a support function in base, that can 
>>>>>> parse strings into numbers and handle parse errors in a 
>>>>>> convenient way. the strtoxxx functions are a bit tricky since you 
>>>>>> need to check the end pointer, and also errno for overflow/underflow 
>>>>>> errors.
>>>>>>
>>>>>>
>>>>>>>> +                    int fd = strtoimax(pentry->d_name, NULL, 
>>>>>>>> +10);
>>>>>>>> +                    if (fd > INT_MIN && fd < fd_max)
>>>>>>>> (void)close(fd);
>>>>>>>> +                }
>>>>>>>> +                (void)closedir(dir);
>>>>>>>> +            } else {
>>>>>>>> +                /* fall back, close all possible descriptors 
>>>>>>>> +*/
>>>>>>>> +                syslog(LOG_ERR, "%s: opendir failed - %s",
>>>>>>>> +                    __FUNCTION__, strerror(errno));
>>>>>>>> +                for (fd_max--; fd_max >= 0; --fd_max)
>>>>>>>> +                    (void)close(fd_max);
>>>>>>>> +            }
>>>>>>>>                  /* Redirect standard files to /dev/null */
>>>>>>>>                if (freopen("/dev/null", "r", stdin) == NULL)
>>>>
>>

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to