On Oct 24 17:59, Takashi Yano wrote:
> Previously, lockf() printed a warning message when the number of locks
> per file exceeds the limit (MAX_LOCKF_CNT). This patch makes lockf()
> return ENOLCK in that case rather than printing the warning message.
> 
> Addresses: https://cygwin.com/pipermail/cygwin/2024-October/256528.html
> Fixes: 31390e4ca643 ("(inode_t::get_all_locks_list): Use pre-allocated buffer 
> in i_all_lf instead of allocating every lock.  Return pointer to start of 
> linked list of locks.")
> Reported-by: Christian Franke <christian.fra...@t-online.de>
> Reviewed-by: Corinna Vinschen <cori...@vinschen.de>
> Signed-off-by: Takashi Yano <takashi.y...@nifty.ne.jp>
> ---
>  winsup/cygwin/flock.cc | 68 +++++++++++++++++++++++++++++++++++++-----
>  1 file changed, 60 insertions(+), 8 deletions(-)
> 
> diff --git a/winsup/cygwin/flock.cc b/winsup/cygwin/flock.cc
> index 5550b3a5b..b05005dab 100644
> --- a/winsup/cygwin/flock.cc
> +++ b/winsup/cygwin/flock.cc
> @@ -610,17 +614,13 @@ inode_t::get_all_locks_list ()
>         dbi->ObjectName.Buffer[LOCK_OBJ_NAME_LEN] = L'\0';
>         if (!newlock.from_obj_name (this, &i_all_lf, dbi->ObjectName.Buffer))
>           continue;
> -       if (lock - i_all_lf >= MAX_LOCKF_CNT)
> -         {
> -           system_printf ("Warning, can't handle more than %d locks per 
> file.",
> -                          MAX_LOCKF_CNT);
> -           break;
> -         }
> +       assert (lock - i_all_lf < MAX_LOCKF_CNT);

Shouldn't that be a <=?  The original test above was off-by-one, right?

But I still don't get it.  The successful assert() will end the process
as well, just like api_fatal.  Shouldn't this situation just return
ENOLCK as well, as the commit message suggests?


Thanks,
Corinna

Reply via email to