openvz: use virAsprintf to avoid large stacks

* src/openvz/openvz_conf.c (openvzLocateConfFile): Alter
signature.
(openvzGetVPSUUID, openvzSetDefinedUUID)
(openvzWriteVPSConfigParam, openvzReadVPSConfigParam)
(openvzCopyDefaultConfig): Adjust callers.
This commit is contained in:
Eric Blake 2010-08-31 16:56:22 -06:00
parent c6e8e26edf
commit a9afbf4fc5

View File

@ -55,7 +55,7 @@
static char *openvzLocateConfDir(void); static char *openvzLocateConfDir(void);
static int openvzGetVPSUUID(int vpsid, char *uuidstr, size_t len); static int openvzGetVPSUUID(int vpsid, char *uuidstr, size_t len);
static int openvzLocateConfFile(int vpsid, char *conffile, int maxlen, const char *ext); static int openvzLocateConfFile(int vpsid, char **conffile, const char *ext);
static int openvzAssignUUIDs(void); static int openvzAssignUUIDs(void);
int int
@ -615,12 +615,15 @@ error:
int int
openvzWriteVPSConfigParam(int vpsid, const char *param, const char *value) openvzWriteVPSConfigParam(int vpsid, const char *param, const char *value)
{ {
char conf_file[PATH_MAX]; char *conf_file;
int ret;
if (openvzLocateConfFile(vpsid, conf_file, PATH_MAX, "conf")<0) if (openvzLocateConfFile(vpsid, &conf_file, "conf") < 0)
return -1; return -1;
return openvzWriteConfigParam(conf_file, param, value); ret = openvzWriteConfigParam(conf_file, param, value);
VIR_FREE(conf_file);
return ret;
} }
static int static int
@ -676,12 +679,15 @@ openvzReadConfigParam(const char * conf_file ,const char * param, char *value, i
int int
openvzReadVPSConfigParam(int vpsid ,const char * param, char *value, int maxlen) openvzReadVPSConfigParam(int vpsid ,const char * param, char *value, int maxlen)
{ {
char conf_file[PATH_MAX]; char *conf_file;
int ret;
if (openvzLocateConfFile(vpsid, conf_file, PATH_MAX, "conf")<0) if (openvzLocateConfFile(vpsid, &conf_file, "conf") < 0)
return -1; return -1;
return openvzReadConfigParam(conf_file, param, value, maxlen); ret = openvzReadConfigParam(conf_file, param, value, maxlen);
VIR_FREE(conf_file);
return ret;
} }
static int static int
@ -736,7 +742,7 @@ openvzCopyDefaultConfig(int vpsid)
char * confdir = NULL; char * confdir = NULL;
char * default_conf_file = NULL; char * default_conf_file = NULL;
char configfile_value[PATH_MAX]; char configfile_value[PATH_MAX];
char conf_file[PATH_MAX]; char *conf_file = NULL;
int ret = -1; int ret = -1;
if (openvzReadConfigParam(VZ_CONF_FILE, "CONFIGFILE", configfile_value, if (openvzReadConfigParam(VZ_CONF_FILE, "CONFIGFILE", configfile_value,
@ -747,12 +753,13 @@ openvzCopyDefaultConfig(int vpsid)
if (confdir == NULL) if (confdir == NULL)
goto cleanup; goto cleanup;
if (virAsprintf(&default_conf_file, "%s/ve-%s.conf-sample", confdir, configfile_value) < 0) { if (virAsprintf(&default_conf_file, "%s/ve-%s.conf-sample", confdir,
configfile_value) < 0) {
virReportOOMError(); virReportOOMError();
goto cleanup; goto cleanup;
} }
if (openvzLocateConfFile(vpsid, conf_file, PATH_MAX, "conf")<0) if (openvzLocateConfFile(vpsid, &conf_file, "conf") < 0)
goto cleanup; goto cleanup;
if (openvz_copyfile(default_conf_file, conf_file)<0) if (openvz_copyfile(default_conf_file, conf_file)<0)
@ -762,6 +769,7 @@ openvzCopyDefaultConfig(int vpsid)
cleanup: cleanup:
VIR_FREE(confdir); VIR_FREE(confdir);
VIR_FREE(default_conf_file); VIR_FREE(default_conf_file);
VIR_FREE(conf_file);
return ret; return ret;
} }
@ -770,7 +778,7 @@ cleanup:
* 0 - OK * 0 - OK
*/ */
static int static int
openvzLocateConfFile(int vpsid, char *conffile, int maxlen, const char *ext) openvzLocateConfFile(int vpsid, char **conffile, const char *ext)
{ {
char * confdir; char * confdir;
int ret = 0; int ret = 0;
@ -779,9 +787,11 @@ openvzLocateConfFile(int vpsid, char *conffile, int maxlen, const char *ext)
if (confdir == NULL) if (confdir == NULL)
return -1; return -1;
if (snprintf(conffile, maxlen, "%s/%d.%s", if (virAsprintf(conffile, "%s/%d.%s", confdir, vpsid,
confdir, vpsid, ext ? ext : "conf") >= maxlen) ext ? ext : "conf") < 0) {
virReportOOMError();
ret = -1; ret = -1;
}
VIR_FREE(confdir); VIR_FREE(confdir);
return ret; return ret;
@ -830,27 +840,25 @@ openvz_readline(int fd, char *ptr, int maxlen)
static int static int
openvzGetVPSUUID(int vpsid, char *uuidstr, size_t len) openvzGetVPSUUID(int vpsid, char *uuidstr, size_t len)
{ {
char conf_file[PATH_MAX]; char *conf_file;
char line[1024]; char line[1024];
char *saveptr = NULL; char *saveptr = NULL;
char *uuidbuf; char *uuidbuf;
char *iden; char *iden;
int fd, ret; int fd, ret;
int retval = 0; int retval = -1;
if (openvzLocateConfFile(vpsid, conf_file, PATH_MAX, "conf")<0) if (openvzLocateConfFile(vpsid, &conf_file, "conf") < 0)
return -1; return -1;
fd = open(conf_file, O_RDONLY); fd = open(conf_file, O_RDONLY);
if (fd == -1) if (fd == -1)
return -1; goto cleanup;
while (1) { while (1) {
ret = openvz_readline(fd, line, sizeof(line)); ret = openvz_readline(fd, line, sizeof(line));
if (ret == -1) { if (ret == -1)
close(fd); goto cleanup;
return -1;
}
if (ret == 0) { /* EoF, UUID was not found */ if (ret == 0) { /* EoF, UUID was not found */
uuidstr[0] = 0; uuidstr[0] = 0;
@ -861,12 +869,19 @@ openvzGetVPSUUID(int vpsid, char *uuidstr, size_t len)
uuidbuf = strtok_r(NULL, "\n", &saveptr); uuidbuf = strtok_r(NULL, "\n", &saveptr);
if (iden != NULL && uuidbuf != NULL && STREQ(iden, "#UUID:")) { if (iden != NULL && uuidbuf != NULL && STREQ(iden, "#UUID:")) {
if (virStrcpy(uuidstr, uuidbuf, len) == NULL) if (virStrcpy(uuidstr, uuidbuf, len) == NULL) {
retval = -1; openvzError(VIR_ERR_INTERNAL_ERROR,
_("invalid uuid %s"), uuidbuf);
goto cleanup;
}
break; break;
} }
} }
close(fd); retval = 0;
cleanup:
if (fd >= 0)
close(fd);
VIR_FREE(conf_file);
return retval; return retval;
} }
@ -877,22 +892,23 @@ openvzGetVPSUUID(int vpsid, char *uuidstr, size_t len)
int int
openvzSetDefinedUUID(int vpsid, unsigned char *uuid) openvzSetDefinedUUID(int vpsid, unsigned char *uuid)
{ {
char conf_file[PATH_MAX]; char *conf_file;
char uuidstr[VIR_UUID_STRING_BUFLEN]; char uuidstr[VIR_UUID_STRING_BUFLEN];
int ret = -1;
if (uuid == NULL) if (uuid == NULL)
return -1; return -1;
if (openvzLocateConfFile(vpsid, conf_file, PATH_MAX, "conf")<0) if (openvzLocateConfFile(vpsid, &conf_file, "conf") < 0)
return -1; return -1;
if (openvzGetVPSUUID(vpsid, uuidstr, sizeof(uuidstr))) if (openvzGetVPSUUID(vpsid, uuidstr, sizeof(uuidstr)))
return -1; goto cleanup;
if (uuidstr[0] == 0) { if (uuidstr[0] == 0) {
FILE *fp = fopen(conf_file, "a"); /* append */ FILE *fp = fopen(conf_file, "a"); /* append */
if (fp == NULL) if (fp == NULL)
return -1; goto cleanup;
virUUIDFormat(uuid, uuidstr); virUUIDFormat(uuid, uuidstr);
@ -900,10 +916,13 @@ openvzSetDefinedUUID(int vpsid, unsigned char *uuid)
and be careful always to close the stream. */ and be careful always to close the stream. */
if ((fprintf(fp, "\n#UUID: %s\n", uuidstr) < 0) if ((fprintf(fp, "\n#UUID: %s\n", uuidstr) < 0)
+ (fclose(fp) == EOF)) + (fclose(fp) == EOF))
return -1; goto cleanup;
} }
return 0; ret = 0;
cleanup:
VIR_FREE(conf_file);
return ret;
} }
static int static int