[lvm-devel] Question about destroy_toolcontext()

Peter Rajnoha prajnoha at redhat.com
Wed Aug 17 10:29:16 UTC 2016


On 08/17/2016 11:04 AM, Liuhua Wang wrote:
> Hi Peter,
> 
> I read the source of lib/commands/toolcontext.c
> and have a question about the following lines:
> 
> ----------------------------
> void destroy_toolcontext(struct cmd_context *cmd){
> 
> [snip]
> 
>   #ifndef VALGRIND_POOL
>     if (cmd->linebuffer) {
>         /* Reset stream buffering to defaults */
>         if (is_valid_fd(STDIN_FILENO) &&
>             ((flags = fcntl(STDIN_FILENO, F_GETFL)) > 0) &&
>             (flags & O_ACCMODE) != O_WRONLY) {
>             if (_reopen_stream(stdin, STDIN_FILENO, "r", "stdin", &new_stream)) {
>                 stdin = new_stream;
>                 setlinebuf(stdin);
>             } else 
>                 cmd->linebuffer = NULL; /* Leave buffer in place (deliberate leak) */
>         }    
> 
>         if (is_valid_fd(STDOUT_FILENO) &&
>             ((flags = fcntl(STDOUT_FILENO, F_GETFL)) > 0) &&
>             (flags & O_ACCMODE) != O_RDONLY) {
>             if (_reopen_stream(stdout, STDOUT_FILENO, "w", "stdout", &new_stream)) {
>                 stdout = new_stream;
>                 setlinebuf(stdout);
>             } else 
>                 cmd->linebuffer = NULL; /* Leave buffer in place (deliberate leak) */
>         }    
> 
>         dm_free(cmd->linebuffer);
>     }    
>   #endif
> -------------------------------
> when cmd->linebuffer is NULL and then dm_free(cmd->linebuffer),
> won't it make it segfault?

The "dm_free" is just a wrapper over "free" call which currently ends up
as either "dm_free_aux" (libdm/mm/dbg_malloc.c) call with some extra
code added around "free" if memory debugging is enabled or directly as
pure "free" call. In both cases, when NULL value is passed, there's no
operation done. So it's safe to call dm_free with NULL as it may happen
in the code you pasted above...

-- 
Peter




More information about the lvm-devel mailing list