Hi.
As reported by Diego Blanco in
- https://bugzilla.redhat.com/show_bug.cgi?id=702602
commit f0443765 which replaced openvz_readline to getline(3)
broke OpenVZ driver as it changed semantics of EOF-handling
when parsing OpenVZ configuration.
There're several other issues reported with current OpenVZ driver:
#1: unclear error message when parsing "CPUS=" line
#2: openvz driver goes into crashing loop
#3: "NETIF=" line in configuration is not parsed correctly
#4: aborts even when optional parameter is missing
#5: there's a potential memory leak
In this email, I'm sending in updated patch to fix #[145].
This patch does not fix #[23] as I haven't verified these yet,
but this at least got me to run OpenVZ on libvirt once again.
This patch applies to latest git, and I verified that both
"make check" and "make syntax-check" passes (except
for check_author_list check).
Best Regards,
> --- Comment #3 from Cole Robinson <[email protected]> 2011-05-18 09:34:21
> EDT ---
> Thanks for the report and the patch. However, libvirt devs generally don't
> review patches in bugzilla. Can you please send your patch to
> [email protected], and ensure that it applied against latest upstream,
> and that make check and make syntax-check both pass?
>
> When the patch is applied, we can close this bug. Thanks!
>
> --
> Configure bugmail: https://bugzilla.redhat.com/userprefs.cgi?tab=email
> ------- You are receiving this mail because: -------
> You are on the CC list for the bug.
>
diff --git a/src/openvz/openvz_conf.c b/src/openvz/openvz_conf.c
index cfb6917..3e4844a 100644
--- a/src/openvz/openvz_conf.c
+++ b/src/openvz/openvz_conf.c
@@ -642,53 +642,45 @@ openvzWriteVPSConfigParam(int vpsid, const char *param, const char *value)
/*
* value will be freed before a new value is assigned to it, the caller is
* responsible for freeing it afterwards.
+ *
+ * Returns <0 on error, 0 if not found, 1 if found.
*/
static int
openvzReadConfigParam(const char *conf_file, const char *param, char **value)
{
char *line = NULL;
size_t line_size = 0;
- ssize_t ret;
FILE *fp;
- int found = 0;
- char *sf, *token;
- char *saveptr = NULL;
-
- value[0] = 0;
+ int err = 0;
+ char *sf, *token, *saveptr;
fp = fopen(conf_file, "r");
if (fp == NULL)
return -1;
- while (1) {
- ret = getline(&line, &line_size, fp);
- if (ret <= 0)
- break;
+ VIR_FREE(*value);
+ while (getline(&line, &line_size, fp) >= 0) {
+ if (! STREQLEN(line, param, strlen(param)))
+ continue;
+
+ sf = line + strlen(param);
+ if (*sf++ != '=') continue;
+
saveptr = NULL;
- if (STREQLEN(line, param, strlen(param))) {
- sf = line;
- sf += strlen(param);
- if (sf[0] == '=' && sf[1] != '\0' ) {
- sf++;
- if ((token = strtok_r(sf,"\"\t\n", &saveptr)) != NULL) {
- VIR_FREE(*value);
- *value = strdup(token);
- if (value == NULL) {
- ret = -1;
- break;
- }
- found = 1;
- }
+ if ((token = strtok_r(sf, "\"\t\n", &saveptr)) != NULL) {
+ VIR_FREE(*value);
+ *value = strdup(token);
+ if (*value == NULL) {
+ err = 1;
+ break;
}
- }
+ /* keep going - last entry wins */
+ }
}
VIR_FREE(line);
VIR_FORCE_FCLOSE(fp);
- if (ret == 0 && found)
- ret = 1;
-
- return ret;
+ return err ? -1 : *value ? 1 : 0;
}
/*
--
libvir-list mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/libvir-list