On 7/24/19 1:02 PM, Daniel P. Berrangé wrote:
On Fri, Jul 12, 2019 at 12:23:43PM -0400, Stefan Berger wrote:
for (i = 0; i < ARRAY_CARDINALITY(prgs); i++) {
char *path;
bool findit = *prgs[i].path == NULL;
+ struct stat statbuf;
+ char *tmp;
+
+ if (!findit) {
+ /* has executables changed? */
+ if (stat(*prgs[i].path, &statbuf) < 0) {
+ virReportSystemError(errno,
+ _("Could not stat %s"), path);
+ findit = true;
If we can't stat the binary, then I we should reset ourselves
back to fully uninitialized state. Certainly if we intend to
call virReportSystemError, then we must ensure the caller
treats it as a fatal error. Currently I believe its still
treated as success by the caller since progs[i].path is
already non-NULL at this point.
Removed the virReportError() here since we will try to find it again
below and report errors there then.
> + }
> + if (!findit &&
> + memcmp(&statbuf.st_mtim,
> + &prgs[i].stat->st_mtime,
> + sizeof(statbuf.st_mtim))) {
> + findit = true;
> + }
> + }
>
> if (findit) {
> path = virFindFileInPath(prgs[i].name);
> @@ -151,7 +177,15 @@ virTPMEmulatorInit(void)
> VIR_FREE(path);
> return -1;
> }
> + if (stat(path, prgs[i].stat) < 0) {
> + virReportSystemError(errno,
> + _("Could not stat %s"), path);
> + VIR_FREE(path);
> + return -1;
> + }
> + tmp = *prgs[i].path;
> *prgs[i].path = path;
> + VIR_FREE(tmp);
> }
> }
>
> --
> 2.20.1
>
Regards,
Daniel