
On 05/20/2013 01:55 PM, Michal Privoznik wrote:
--- src/rpc/gendispatch.pl | 21 ++++-------- src/rpc/virnetclient.c | 16 ++++----- src/rpc/virnetmessage.c | 27 +++++++++------ src/rpc/virnetsaslcontext.c | 6 ++-- src/rpc/virnetserver.c | 6 ++-- src/rpc/virnetserverclient.c | 10 ++---- src/rpc/virnetservermdns.c | 6 ++-- src/rpc/virnetsocket.c | 10 +++--- src/rpc/virnetsshsession.c | 78 +++++++++++++++++++++----------------------- src/rpc/virnettlscontext.c | 26 +++++++-------- 10 files changed, 92 insertions(+), 114 deletions(-)
diff --git a/src/rpc/gendispatch.pl b/src/rpc/gendispatch.pl [...snip...]
diff --git a/src/rpc/virnetmessage.c b/src/rpc/virnetmessage.c index b2c6e5b..8483cd5 100644 --- a/src/rpc/virnetmessage.c +++ b/src/rpc/virnetmessage.c @@ -29,6 +29,7 @@ #include "virlog.h" #include "virfile.h" #include "virutil.h" +#include "virstring.h"
#define VIR_FROM_THIS VIR_FROM_RPC
@@ -514,22 +515,28 @@ void virNetMessageSaveError(virNetMessageErrorPtr rerr) if (verr) { rerr->code = verr->code; rerr->domain = verr->domain; - if (verr->message && VIR_ALLOC(rerr->message) == 0) - *rerr->message = strdup(verr->message); + if (verr->message && VIR_ALLOC(rerr->message) == 0 && + VIR_STRDUP_QUIET(*rerr->message, verr->message) < 0) + VIR_FREE(rerr->message); rerr->level = verr->level; - if (verr->str1 && VIR_ALLOC(rerr->str1) == 0) - *rerr->str1 = strdup(verr->str1); - if (verr->str2 && VIR_ALLOC(rerr->str2) == 0) - *rerr->str2 = strdup(verr->str2); - if (verr->str3 && VIR_ALLOC(rerr->str3) == 0) - *rerr->str3 = strdup(verr->str3); + if (verr->str1 && VIR_ALLOC(rerr->str1) == 0 && + VIR_STRDUP_QUIET(*rerr->str1, verr->str1) < 0) + VIR_FREE(verr->str1); + if (verr->str2 && VIR_ALLOC(rerr->str2) == 0 && + VIR_STRDUP_QUIET(*rerr->str2, verr->str2) < 0) + VIR_FREE(verr->str2); + if (verr->str3 && VIR_ALLOC(rerr->str3) == 0 && + VIR_STRDUP_QUIET(*rerr->str3, verr->str3) < 0) + VIR_FREE(verr->str2);
Coverity has a complaint in here: 525 if (verr->str2 && VIR_ALLOC(rerr->str2) == 0 && 526 VIR_STRDUP_QUIET(*rerr->str2, verr->str2) < 0) (1) Event original: "verr->str2" looks like the original copy. Also see events: [copy_paste_error] 527 VIR_FREE(verr->str2); 528 if (verr->str3 && VIR_ALLOC(rerr->str3) == 0 && 529 VIR_STRDUP_QUIET(*rerr->str3, verr->str3) < 0) (2) Event copy_paste_error: "str2" in "verr->str2" looks like a copy-paste error. Should it say "str3" instead? Also see events: [original] 530 VIR_FREE(verr->str2); 531 rerr->int1 = verr->int1; 532 rerr->int2 = verr->int2; The complaint is only on the last VIR_FREE(verr->str2); as a cut-n-paste of the one on line 527; however, it seems to me all those VIR_FREE()'s should be on "rerr" and not "verr", right? That is, there's a VIR_ALLOC(rerr->str#) for each section, then on failure shouldn't it be VIR_FREE(rerr->str#)? John
rerr->int1 = verr->int1; rerr->int2 = verr->int2; } else { rerr->code = VIR_ERR_INTERNAL_ERROR; rerr->domain = VIR_FROM_RPC; - if (VIR_ALLOC(rerr->message) == 0) - *rerr->message = strdup(_("Library function returned error but did not set virError")); + if (VIR_ALLOC(rerr->message) == 0 && + VIR_STRDUP_QUIET(*rerr->message, + _("Library function returned error but did not set virError")) < 0) + VIR_FREE(rerr->message); rerr->level = VIR_ERR_ERROR; } }
[...snip...]