mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-11 07:17:44 +00:00
libxl: Compile regular expression where it is used
The regular expression used to determine guest capabilities was compiled in libxlCapsInitHost() but used in libxlCapsInitGuests(). Move compilation to libxlCapsInitGuests() where it is used, and free the compiled regex after use. Ensure not to free the regex if compilation fails.
This commit is contained in:
parent
8818376889
commit
4e0ba0bd05
@ -61,8 +61,7 @@ struct guest_arch {
|
|||||||
int ia64_be;
|
int ia64_be;
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char *xen_cap_re = "(xen|hvm)-[[:digit:]]+\\.[[:digit:]]+-(x86_32|x86_64|ia64|powerpc64)(p|be)?";
|
#define XEN_CAP_REGEX "(xen|hvm)-[[:digit:]]+\\.[[:digit:]]+-(x86_32|x86_64|ia64|powerpc64)(p|be)?"
|
||||||
static regex_t xen_cap_rec;
|
|
||||||
|
|
||||||
|
|
||||||
static virClassPtr libxlDriverConfigClass;
|
static virClassPtr libxlDriverConfigClass;
|
||||||
@ -103,20 +102,9 @@ libxlDriverConfigDispose(void *obj)
|
|||||||
static int
|
static int
|
||||||
libxlCapsInitHost(libxl_ctx *ctx, virCapsPtr caps)
|
libxlCapsInitHost(libxl_ctx *ctx, virCapsPtr caps)
|
||||||
{
|
{
|
||||||
int err;
|
|
||||||
libxl_physinfo phy_info;
|
libxl_physinfo phy_info;
|
||||||
int host_pae;
|
int host_pae;
|
||||||
|
|
||||||
err = regcomp(&xen_cap_rec, xen_cap_re, REG_EXTENDED);
|
|
||||||
if (err != 0) {
|
|
||||||
char error[100];
|
|
||||||
regerror(err, &xen_cap_rec, error, sizeof(error));
|
|
||||||
regfree(&xen_cap_rec);
|
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
|
||||||
_("Failed to compile regex %s"), error);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (libxl_get_physinfo(ctx, &phy_info) != 0) {
|
if (libxl_get_physinfo(ctx, &phy_info) != 0) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
_("Failed to get node physical info from libxenlight"));
|
_("Failed to get node physical info from libxenlight"));
|
||||||
@ -249,6 +237,8 @@ static int
|
|||||||
libxlCapsInitGuests(libxl_ctx *ctx, virCapsPtr caps)
|
libxlCapsInitGuests(libxl_ctx *ctx, virCapsPtr caps)
|
||||||
{
|
{
|
||||||
const libxl_version_info *ver_info;
|
const libxl_version_info *ver_info;
|
||||||
|
int err;
|
||||||
|
regex_t regex;
|
||||||
char *str, *token;
|
char *str, *token;
|
||||||
regmatch_t subs[4];
|
regmatch_t subs[4];
|
||||||
char *saveptr = NULL;
|
char *saveptr = NULL;
|
||||||
@ -265,6 +255,16 @@ libxlCapsInitGuests(libxl_ctx *ctx, virCapsPtr caps)
|
|||||||
_("Failed to get version info from libxenlight"));
|
_("Failed to get version info from libxenlight"));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
err = regcomp(®ex, XEN_CAP_REGEX, REG_EXTENDED);
|
||||||
|
if (err != 0) {
|
||||||
|
char error[100];
|
||||||
|
regerror(err, ®ex, error, sizeof(error));
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
|
_("Failed to compile regex %s"), error);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
/* Format of capabilities string is documented in the code in
|
/* Format of capabilities string is documented in the code in
|
||||||
* xen-unstable.hg/xen/arch/.../setup.c.
|
* xen-unstable.hg/xen/arch/.../setup.c.
|
||||||
*
|
*
|
||||||
@ -294,7 +294,7 @@ libxlCapsInitGuests(libxl_ctx *ctx, virCapsPtr caps)
|
|||||||
nr_guest_archs < sizeof(guest_archs) / sizeof(guest_archs[0])
|
nr_guest_archs < sizeof(guest_archs) / sizeof(guest_archs[0])
|
||||||
&& (token = strtok_r(str, " ", &saveptr)) != NULL;
|
&& (token = strtok_r(str, " ", &saveptr)) != NULL;
|
||||||
str = NULL) {
|
str = NULL) {
|
||||||
if (regexec(&xen_cap_rec, token, sizeof(subs) / sizeof(subs[0]),
|
if (regexec(®ex, token, sizeof(subs) / sizeof(subs[0]),
|
||||||
subs, 0) == 0) {
|
subs, 0) == 0) {
|
||||||
int hvm = STRPREFIX(&token[subs[1].rm_so], "hvm");
|
int hvm = STRPREFIX(&token[subs[1].rm_so], "hvm");
|
||||||
virArch arch;
|
virArch arch;
|
||||||
@ -353,6 +353,7 @@ libxlCapsInitGuests(libxl_ctx *ctx, virCapsPtr caps)
|
|||||||
guest_archs[i].ia64_be = ia64_be;
|
guest_archs[i].ia64_be = ia64_be;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
regfree(®ex);
|
||||||
|
|
||||||
for (i = 0; i < nr_guest_archs; ++i) {
|
for (i = 0; i < nr_guest_archs; ++i) {
|
||||||
virCapsGuestPtr guest;
|
virCapsGuestPtr guest;
|
||||||
|
Loading…
Reference in New Issue
Block a user