[libvirt] [PATCH] fix errors in virReportSystemErrorFull

Jim Meyering jim at meyering.net
Tue Jan 27 12:27:53 UTC 2009


"Daniel P. Berrange" <berrange at redhat.com> wrote:
> On Tue, Jan 27, 2009 at 11:28:32AM +0100, Jim Meyering wrote:
>> "Daniel P. Berrange" <berrange at redhat.com> wrote:
>> ...
>> > Looking at the whole method again, I think it needs to be re-written to
>> > something closer to this:
>>
>> Ok, I've adapted that.
>> +void virReportSystemErrorFull(virConnectPtr conn,
>> +                              int domcode,
>> +                              int theerrno,
>> +                              const char *filename ATTRIBUTE_UNUSED,
>> +                              const char *funcname ATTRIBUTE_UNUSED,
>> +                              size_t linenr ATTRIBUTE_UNUSED,
>> +                              const char *fmt, ...)
>> +{
>> +    char strerror_buf[1024];
>> +    char msgDetailBuf[1024];
>> +
>> +    const char *errnoDetail = virStrerror(theerrno, strerror_buf,
>> +                                          sizeof(strerror_buf));
>> +    const char *msg = virErrorMsg(VIR_ERR_SYSTEM_ERROR, fmt);
>> +    const char *msgDetail = NULL;
>>
>>      if (fmt) {
>> +        va_list args;
>> +        int n;
>> +
>>          va_start(args, fmt);
>> -        vsnprintf(errorMessage, sizeof(errorMessage)-1, fmt, args);
>> +        n = vsnprintf(msgDetailBuf, sizeof(msgDetailBuf), fmt, args);
>>          va_end(args);
>> -    } else {
>> -        errorMessage[0] = '\0';
>> +
>> +        size_t len = strlen (msgDetailBuf);
>> +        if (0 <= n && n + 2 + len < sizeof (msgDetailBuf)) {
>> +          char *p = msgDetailBuf + n;
>> +          stpcpy (stpcpy (p, ": "), errnoDetail);
>> +          msgDetail = msgDetailBuf;
>> +        }
>>      }
>>
>> -    if (virAsprintf(&combined, "%s: %s", errorMessage, theerrnostr) < 0)
>> -        combined = theerrnostr; /* OOM, so lets just pass the strerror info as best effort */
>> +    if (!msgDetailBuf)
>> +        msgDetail = errnoDetail;
>
> This should be   if (!msgDetail) - indeed just noticed the compiler
> warns on this
>
> cc1: warnings being treated as errors
> virterror.c: In function 'virReportSystemErrorFull':
> virterror.c:1062: error: the address of 'msgDetailBuf' will always evaluate as 'true'

Good catch.
I've just committed this:

>From 2bb6830c061a580328abf4647a26b9ecc7f7eaa1 Mon Sep 17 00:00:00 2001
From: Jim Meyering <meyering at redhat.com>
Date: Tue, 27 Jan 2009 13:25:16 +0100
Subject: [PATCH] virterror.c: don't read beyond end of buffer upon OOM

* src/virterror.c (virReportSystemErrorFull): Fix typo in
my previous change.  Patch by Daniel P. Berrange.
---
 src/virterror.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/src/virterror.c b/src/virterror.c
index a577002..160fea3 100644
--- a/src/virterror.c
+++ b/src/virterror.c
@@ -1059,7 +1059,7 @@ void virReportSystemErrorFull(virConnectPtr conn,
         }
     }

-    if (!msgDetailBuf)
+    if (!msgDetail)
         msgDetail = errnoDetail;

     virRaiseError(conn, NULL, NULL, domcode, VIR_ERR_SYSTEM_ERROR, VIR_ERR_ERROR,
--
1.6.1.401.gf39d5




More information about the libvir-list mailing list