[libvirt] [PATCH] avoid a probable EINVAL from lseek

Jim Meyering jim at meyering.net
Tue Feb 2 09:37:32 UTC 2010


Daniel P. Berrange wrote:

> On Mon, Feb 01, 2010 at 10:18:27PM +0100, Jim Meyering wrote:
>>
>> In src/qemu/qemu_driver.c, coverity reports this:
>>
>>   Event negative_return_fn: Called negative-returning function "lseek(logfile, 0L, 2)"
>>   Event var_assign: NEGATIVE return value of "lseek" assigned to signed variable "pos"
>>   At conditional (1): "(pos = lseek(logfile, 0L, 2)) < 0" taking true path
>>   2877 	    if ((pos = lseek(logfile, 0, SEEK_END)) < 0)
>>   2878 	        VIR_WARN(_("Unable to seek to end of logfile: %s"),
>>   2879 	                 virStrerror(errno, ebuf, sizeof ebuf));
>
> I think it'd be less surprising to just set 'pos = 0' inside the if
> branch here, so later code doesn't have to worry about unexpected
> negative values.

Oh.  I pushed after DV's ACK.

That would let the later code continue, but using (lseek'ing to) an
invalid position.  Sounds like it could result in a cascade of
additional errors, or worse, silent malfunction.

But this is largely hypothetical, since failing to lseek-to-EOF
on a valid file descriptor is not likely to happen.

>> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
>> index 22593bf..676a27b 100644
>> --- a/src/qemu/qemu_driver.c
>> +++ b/src/qemu/qemu_driver.c
>> @@ -558,8 +558,8 @@ qemudLogReadFD(virConnectPtr conn, const char* logDir, const char* name, off_t p
>>          close(fd);
>>          return -1;
>>      }
>> -    if (lseek(fd, pos, SEEK_SET) < 0) {
>> -        virReportSystemError(conn, errno,
>> +    if (pos < 0 || lseek(fd, pos, SEEK_SET) < 0) {
>> +      virReportSystemError(conn, pos < 0 ? 0 : errno,
>>                               _("Unable to seek to %lld in %s"),
>>                               (long long) pos, logfile);
>>          close(fd);




More information about the libvir-list mailing list