72 lines
1.9 KiB
Diff
72 lines
1.9 KiB
Diff
|
References: bnc#842512 CVE-2013-4369 XSA-68
|
||
|
|
||
|
# Commit c53702cee1d6f9f1b72f0cae0b412e21bcda8724
|
||
|
# Date 2013-10-10 15:48:55 +0100
|
||
|
# Author Ian Jackson <ian.jackson@eu.citrix.com>
|
||
|
# Committer Ian Jackson <Ian.Jackson@eu.citrix.com>
|
||
|
libxl: fix vif rate parsing
|
||
|
|
||
|
strtok can return NULL here. We don't need to use strtok anyway, so just
|
||
|
use a simple strchr method.
|
||
|
|
||
|
Coverity-ID: 1055642
|
||
|
|
||
|
This is CVE-2013-4369 / XSA-68
|
||
|
|
||
|
Signed-off-by: Matthew Daley <mattjd@gmail.com>
|
||
|
|
||
|
Fix type. Add test case
|
||
|
|
||
|
Signed-off-by: Ian Campbell <Ian.campbell@citrix.com>
|
||
|
|
||
|
--- a/tools/libxl/check-xl-vif-parse
|
||
|
+++ b/tools/libxl/check-xl-vif-parse
|
||
|
@@ -206,4 +206,8 @@ expected </dev/null
|
||
|
one $e rate=4294967295GB/s@5us
|
||
|
one $e rate=4296MB/s@4294s
|
||
|
|
||
|
+# test include of single '@'
|
||
|
+expected </dev/null
|
||
|
+one $e rate=@
|
||
|
+
|
||
|
complete
|
||
|
--- a/tools/libxl/libxlu_vif.c
|
||
|
+++ b/tools/libxl/libxlu_vif.c
|
||
|
@@ -95,23 +95,30 @@ int xlu_vif_parse_rate(XLU_Config *cfg,
|
||
|
uint64_t bytes_per_sec = 0;
|
||
|
uint64_t bytes_per_interval = 0;
|
||
|
uint32_t interval_usecs = 50000UL; /* Default to 50ms */
|
||
|
- char *ratetok, *tmprate;
|
||
|
+ char *p, *tmprate;
|
||
|
int rc = 0;
|
||
|
|
||
|
tmprate = strdup(rate);
|
||
|
+ if (tmprate == NULL) {
|
||
|
+ rc = ENOMEM;
|
||
|
+ goto out;
|
||
|
+ }
|
||
|
+
|
||
|
+ p = strchr(tmprate, '@');
|
||
|
+ if (p != NULL)
|
||
|
+ *p++ = 0;
|
||
|
+
|
||
|
if (!strcmp(tmprate,"")) {
|
||
|
xlu__vif_err(cfg, "no rate specified", rate);
|
||
|
rc = EINVAL;
|
||
|
goto out;
|
||
|
}
|
||
|
|
||
|
- ratetok = strtok(tmprate, "@");
|
||
|
- rc = vif_parse_rate_bytes_per_sec(cfg, ratetok, &bytes_per_sec);
|
||
|
+ rc = vif_parse_rate_bytes_per_sec(cfg, tmprate, &bytes_per_sec);
|
||
|
if (rc) goto out;
|
||
|
|
||
|
- ratetok = strtok(NULL, "@");
|
||
|
- if (ratetok != NULL) {
|
||
|
- rc = vif_parse_rate_interval_usecs(cfg, ratetok, &interval_usecs);
|
||
|
+ if (p != NULL) {
|
||
|
+ rc = vif_parse_rate_interval_usecs(cfg, p, &interval_usecs);
|
||
|
if (rc) goto out;
|
||
|
}
|
||
|
|