1
0

build: address clang reports about virCommand

clang had 5 reports against virCommand; three were false positives
(a NULL deref in ProcessIO solved by sa_assert, and two uninitialized
memory operations solved by adding an initializer), but two were real.

* src/util/command.c (virCommandProcessIO): Fix real bug of
possible NULL dereference.  Teach clang that buf is never NULL.
(virCommandRun): Teach clang that infd is only ever accessed when
initialized.
This commit is contained in:
Eric Blake 2011-02-14 15:24:08 -07:00
parent 1a82c5f7c6
commit 3db08aeaef

View File

@ -1,7 +1,7 @@
/* /*
* command.c: Child command execution * command.c: Child command execution
* *
* Copyright (C) 2010 Red Hat, Inc. * Copyright (C) 2010-2011 Red Hat, Inc.
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public * modify it under the terms of the GNU Lesser General Public
@ -881,6 +881,8 @@ virCommandProcessIO(virCommandPtr cmd)
buf = cmd->errbuf; buf = cmd->errbuf;
len = &errlen; len = &errlen;
} }
/* Silence a false positive from clang. */
sa_assert(buf);
done = read(fds[i].fd, data, sizeof(data)); done = read(fds[i].fd, data, sizeof(data));
if (done < 0) { if (done < 0) {
@ -930,9 +932,9 @@ virCommandProcessIO(virCommandPtr cmd)
ret = 0; ret = 0;
cleanup: cleanup:
if (*cmd->outbuf) if (cmd->outbuf && *cmd->outbuf)
(*cmd->outbuf)[outlen] = '\0'; (*cmd->outbuf)[outlen] = '\0';
if (*cmd->errbuf) if (cmd->errbuf && *cmd->errbuf)
(*cmd->errbuf)[errlen] = '\0'; (*cmd->errbuf)[errlen] = '\0';
return ret; return ret;
} }
@ -950,7 +952,7 @@ virCommandRun(virCommandPtr cmd, int *exitstatus)
int ret = 0; int ret = 0;
char *outbuf = NULL; char *outbuf = NULL;
char *errbuf = NULL; char *errbuf = NULL;
int infd[2]; int infd[2] = { -1, -1 };
struct stat st; struct stat st;
bool string_io; bool string_io;
bool async_io = false; bool async_io = false;