Applied, thanks!

Mike Kelly, le sam. 21 mars 2026 17:35:04 +0000, a ecrit:
> This was showing whilst running in an SMP kernel. The address
> associated with the rlock_list can be deallocated from the vm_map
> after the call to free() resulting in a page fault failure. Altered
> usage of for loops to while loops to manage the list iteration more
> carefully and avoid the free memory read errors.
> ---
>  libfshelp/rlock-tweak.c | 36 ++++++++++++++++--------------------
>  1 file changed, 16 insertions(+), 20 deletions(-)
> 
> diff --git a/libfshelp/rlock-tweak.c b/libfshelp/rlock-tweak.c
> index 8be889938..d42354157 100644
> --- a/libfshelp/rlock-tweak.c
> +++ b/libfshelp/rlock-tweak.c
> @@ -61,9 +61,10 @@ fshelp_rlock_tweak (struct rlock_box *box, pthread_mutex_t 
> *mutex,
>        return l;
>      }
>  
> -  inline void
> +  inline struct rlock_list *
>    rele_lock (struct rlock_list *l, int wake_waiters)
>      {
> +      struct rlock_list *next = l->po.next;
>        list_unlink (po, l);
>        list_unlink (node, l);
>  
> @@ -72,19 +73,19 @@ fshelp_rlock_tweak (struct rlock_box *box, 
> pthread_mutex_t *mutex,
>  
>        pthread_cond_destroy(&l->wait);
>        free (l);
> +      return next;
>      }
>  
>    error_t
>    unlock_region (loff_t start, loff_t len)
>      {
> -      struct rlock_list *l;
> +      struct rlock_list *l = *po->locks;
>  
> -      for (l = *po->locks; l; l = l->po.next)
> +      while (l)
>       {
>         if (l->len != 0 && l->start + l->len <= start)
>           /* We start after the locked region ends.  */
>           {
> -           continue;
>           }
>         else if (len != 0 && start + len <= l->start)
>           /* We end before this region starts.  Since we are sorted,
> @@ -98,7 +99,7 @@ fshelp_rlock_tweak (struct rlock_box *box, pthread_mutex_t 
> *mutex,
>                          && l->start + l->len <= start + len)))
>           /* We wrap the locked region; consume it.  */
>           {
> -           rele_lock (l, 1);
> +           l = rele_lock (l, 1);
>             continue;
>           }
>         else if (start <= l->start
> @@ -135,8 +136,6 @@ fshelp_rlock_tweak (struct rlock_box *box, 
> pthread_mutex_t *mutex,
>                 l->waiting = 0;
>                 pthread_cond_broadcast (&l->wait);
>               }
> -
> -           continue;
>           }
>         else if (l->start < start
>                  && (l->len == 0
> @@ -170,6 +169,8 @@ fshelp_rlock_tweak (struct rlock_box *box, 
> pthread_mutex_t *mutex,
>           }
>         else
>           assert (! "Impossible!");
> +
> +       l = l->po.next;
>       }
>  
>        return 0;
> @@ -196,9 +197,9 @@ fshelp_rlock_tweak (struct rlock_box *box, 
> pthread_mutex_t *mutex,
>    inline error_t
>    merge_in (loff_t start, loff_t len, int type)
>      {
> -      struct rlock_list *l;
> +      struct rlock_list *l = *po->locks;
>  
> -      for (l = *po->locks; l; l = l->po.next)
> +      while (l)
>       {
>         if (l->start <= start
>             && (l->len == 0
> @@ -235,7 +236,7 @@ fshelp_rlock_tweak (struct rlock_box *box, 
> pthread_mutex_t *mutex,
>                 if (! tail)
>                   {
>                     if (head)
> -                     rele_lock (head, 0);
> +                     (void) rele_lock (head, 0);
>                     return ENOMEM;
>                   }
>               }
> @@ -258,7 +259,7 @@ fshelp_rlock_tweak (struct rlock_box *box, 
> pthread_mutex_t *mutex,
>                 start = l->start;
>                 len = l->len;
>  
> -               rele_lock (l, 1);
> +               l = rele_lock (l, 1);
>                 continue;
>               }
>             else
> @@ -277,7 +278,7 @@ fshelp_rlock_tweak (struct rlock_box *box, 
> pthread_mutex_t *mutex,
>  
>             if (type == l->type || type == F_WRLCK)
>               {
> -               rele_lock (l, 1);
> +               l = rele_lock (l, 1);
>                 /* Try to merge more.  */
>                 continue;
>               }
> @@ -301,8 +302,6 @@ fshelp_rlock_tweak (struct rlock_box *box, 
> pthread_mutex_t *mutex,
>                 if (len != 0)
>                   len = start + len - (l->start + l->len);
>                 start = l->start + l->len;
> -
> -               continue;
>               }
>             else
>               /* Our end is silently consumed.  */
> @@ -328,7 +327,7 @@ fshelp_rlock_tweak (struct rlock_box *box, 
> pthread_mutex_t *mutex,
>                   len += start - l->start;
>                 start = l->start;
>  
> -               rele_lock (l, 1);
> +               l = rele_lock (l, 1);
>  
>                 /* Try to merge in more.  */
>                 continue;
> @@ -338,7 +337,6 @@ fshelp_rlock_tweak (struct rlock_box *box, 
> pthread_mutex_t *mutex,
>                    intersection) and we are not the same type.  */
>               {
>                 /* The is nothing to do except continue the search.  */
> -               continue;
>               }
>             else if (type == F_WRLCK)
>               /* We comsume the intersection.  */
> @@ -349,7 +347,6 @@ fshelp_rlock_tweak (struct rlock_box *box, 
> pthread_mutex_t *mutex,
>  
>                 /* Don't create the lock now; we might be able to
>                    consume more locks.  */
> -               continue;
>               }
>             else
>               /* We are dominated; the locked region comsumes the
> @@ -366,7 +363,6 @@ fshelp_rlock_tweak (struct rlock_box *box, 
> pthread_mutex_t *mutex,
>  
>                 /* There is still a chance that we can consume more
>                    locks.  */
> -               continue;
>               }
>           }
>         else if (start < l->start
> @@ -393,7 +389,6 @@ fshelp_rlock_tweak (struct rlock_box *box, 
> pthread_mutex_t *mutex,
>                  region, however, we are not the same type.  Just
>                  insert it.  */
>               {
> -               continue;
>               }
>             else if (type == F_WRLCK)
>               /* We consume the intersection.  */
> @@ -441,8 +436,9 @@ fshelp_rlock_tweak (struct rlock_box *box, 
> pthread_mutex_t *mutex,
>           {
>             assert (start >= l->start + l->len);
>             assert (l->len != 0);
> -           continue;
>           }
> +
> +          l = l->po.next;
>       }
>  
>        return (gen_lock (start, len, type) ? 0 : ENOMEM);
> -- 
> 2.47.3
> 
> 

-- 
Samuel
<i8b4uUnderground> d-_-b
<BonyNoMore> how u make that inverted b?
<BonyNoMore> wait
<BonyNoMore> never mind

Reply via email to