<p dir="ltr"><br>
On Apr 11, 2016 19:12, "Sean McGovern" <<a href="mailto:gseanmcg@gmail.com">gseanmcg@gmail.com</a>> wrote:<br>
><br>
> Additionally, remove the unlock call as fclose() will drop<br>
> the lock for us.<br>
> ---<br>
>  modules/keystore/file.c |   39 ++++++++++++++++++++++++++++++++-------<br>
>  1 file changed, 32 insertions(+), 7 deletions(-)<br>
><br>
> diff --git a/modules/keystore/file.c b/modules/keystore/file.c<br>
> index 381ec87..25eddd9 100644<br>
> --- a/modules/keystore/file.c<br>
> +++ b/modules/keystore/file.c<br>
> @@ -27,6 +27,9 @@<br>
>  #ifdef HAVE_FLOCK<br>
>  #include <sys/file.h><br>
>  #endif<br>
> +#ifdef HAVE_FCNTL<br>
> +#include <fcntl.h><br>
> +#endif<br>
><br>
>  #include <vlc_common.h><br>
>  #include <vlc_plugin.h><br>
> @@ -262,6 +265,24 @@ end:<br>
>      }<br>
>      return VLC_SUCCESS;<br>
>  }<br>
> +<br>
> +#if (!defined(HAVE_FLOCK) && defined (HAVE_FCNTL) && defined (F_SETLKW))<br>
> +static int<br>
> +posix_lock_fd(int fd)<br>
> +{<br>
> +    struct flock lock;<br>
> +<br>
> +    if(fd == -1)<br>
> +        return -1;<br>
> +<br>
> +    lock.l_start = 0;<br>
> +    lock.l_len = 0;<br>
> +    lock.l_whence = SEEK_SET;<br>
> +    lock.l_type = F_RDLCK;<br>
> +<br>
> +    return fcntl(fd, F_SETLKW, &lock);<br>
> +}<br>
> +#endif<br>
><br>
>  static int<br>
>  file_open(const char *psz_file, const char *psz_mode, FILE **pp_file)<br>
> @@ -279,17 +300,21 @@ file_open(const char *psz_file, const char *psz_mode, FILE **pp_file)<br>
>      {<br>
>          fclose(p_file);<br>
>      }<br>
> +#else<br>
> +#if defined (HAVE_FCNTL) && defined (F_SETLKW)<br>
> +    if (posix_lock_fd(i_fd) != 0)<br>
> +    {<br>
> +        fclose(p_file);<br>
> +    }<br>
> +#endif<br>
>  #endif<br>
>      *pp_file = p_file;<br>
>      return i_fd;<br>
>  }<br>
><br>
>  static void<br>
> -file_close(FILE *p_file, int i_fd)<br>
> +file_close(FILE *p_file)<br>
>  {<br>
> -#ifdef HAVE_FLOCK<br>
> -    flock(i_fd, LOCK_UN);<br>
> -#endif<br>
>      fclose(p_file);<br>
>  }<br>
><br>
> @@ -349,7 +374,7 @@ Store(vlc_keystore *p_keystore, const char *const ppsz_values[KEY_MAX],<br>
>      i_ret = file_save(p_keystore, p_file, i_fd, &list);<br>
><br>
>  end:<br>
> -    file_close(p_file, i_fd);<br>
> +    file_close(p_file);<br>
>      ks_list_free(&list);<br>
>      return i_ret;<br>
>  }<br>
> @@ -413,7 +438,7 @@ Find(vlc_keystore *p_keystore, const char *const ppsz_values[KEY_MAX],<br>
><br>
>      *pp_entries = out_list.p_entries;<br>
>  end:<br>
> -    file_close(p_file, i_fd);<br>
> +    file_close(p_file);<br>
>      ks_list_free(&list);<br>
>      return out_list.i_count;<br>
>  }<br>
> @@ -445,7 +470,7 @@ Remove(vlc_keystore *p_keystore, const char *const ppsz_values[KEY_MAX])<br>
>          i_count = 0;<br>
><br>
>  end:<br>
> -    file_close(p_file, i_fd);<br>
> +    file_close(p_file);<br>
>      ks_list_free(&list);<br>
>      return i_count;<br>
>  }<br>
> --<br>
> </p>
<p dir="ltr">Actually -- this module needs to lock for both reading _and_ writing, yes?</p>
<p dir="ltr">In which case this patch is wrong.</p>
<p dir="ltr">Will poke at it tomorrow with a clearer head.</p>
<p dir="ltr">-- Sean McG.</p>