Jim Paris <jim(a)jtan.com> wrote:
Jim Meyering wrote:
> + /* Record failure if any of these fails,
> + and be careful always to close the stream. */
> + if ((fseek(fp, 0, SEEK_END) < 0)
> + + (fprintf(fp, "\n#UUID: %s\n", uuidstr) < 0);
> + + (fclose(fp) == EOF))
> + ret = -1;
I don't think you want to fprintf() if the fseek() fails?
Good catch. Thanks.
I've fixed it this way.
[Hmm.. normally I would have saved and restored errno around the unchecked
fclose call, but I see that the sole caller of openvzSetUUID always
ignores this function's return value. Sigh... ]
diff --git a/src/openvz_conf.c b/src/openvz_conf.c
index a274223..f0f579a 100644
--- a/src/openvz_conf.c
+++ b/src/openvz_conf.c
@@ -680,7 +680,6 @@ openvzSetUUID(int vpsid)
char uuidstr[VIR_UUID_STRING_BUFLEN];
unsigned char uuid[VIR_UUID_BUFLEN];
char *conf_dir;
- int fd, ret;
conf_dir = openvzLocateConfDir();
if (conf_dir == NULL)
@@ -688,23 +687,27 @@ openvzSetUUID(int vpsid)
sprintf(conf_file, "%s/%d.conf", conf_dir, vpsid);
free(conf_dir);
- fd = open(conf_file, O_RDWR);
- if(fd == -1)
+ if (openvzGetVPSUUID(vpsid, uuidstr))
return -1;
- ret = openvzGetVPSUUID(vpsid, uuidstr);
- if(ret == -1)
- return -1;
+ if (uuidstr[0] == 0) {
+ FILE *fp = fopen(conf_file, "a");
+ if (fp == NULL)
+ return -1;
- if(uuidstr[0] == 0) {
virUUIDGenerate(uuid);
virUUIDFormat(uuid, uuidstr);
- lseek(fd, 0, SEEK_END);
- write(fd, "\n#UUID: ", 8);
- write(fd, uuidstr, strlen(uuidstr));
- write(fd, "\n", 1);
- close(fd);
+ /* Record failure if fseek, fprintf or fclose fails,
+ and be careful always to close the stream. */
+ if (fseek(fp, 0, SEEK_END) < 0) {
+ fclose(fp);
+ return -1;
+ }
+
+ if ((fprintf(fp, "\n#UUID: %s\n", uuidstr) < 0)
+ + (fclose(fp) == EOF))
+ return -1;
}
return 0;
--
1.5.4.2.134.g82883