Justus Winter, le Fri 08 Nov 2013 21:24:10 +0100, a écrit : > add_el reallocs two memory regions. If at least one of the operation > fails, free any region that was successfully resized. Also release the > lock. > > Found using the Clang Static Analyzer. > > * libtrivfs/dyn-classes.c (add_el): Improve the oom handling. > --- > libtrivfs/dyn-classes.c | 3 +++ > 1 file changed, 3 insertions(+) > > diff --git a/libtrivfs/dyn-classes.c b/libtrivfs/dyn-classes.c > index a6bb7de..981a588 100644 > --- a/libtrivfs/dyn-classes.c > +++ b/libtrivfs/dyn-classes.c > @@ -104,6 +104,9 @@ add_el (void *el, void (*free_el)(), > { > if (free_el) > (*free_el) (el); > + free (new_vec); > + free (new_aux_vec);
Mmm, but the caller's pointers would have potentially been freed by the realloc. Here it's too late to revert that anyway, so perhaps it'd rather be /* Update caller's pointers, at least. */ if (new_vec) *vec = new_vec; if (new_aux_vec) *aux_vec = new_aux_vec; > + pthread_mutex_unlock (&dyn_lock); Ack. > /* One of the vectors might be the wrong size, but who cares. */ > return ENOMEM; > } > -- > 1.7.10.4 > > -- Samuel Be warned that typing \fBkillall \fIname\fP may not have the desired effect on non-Linux systems, especially when done by a privileged user. (From the killall manual page)