John Ferlan <jferlan(a)redhat.com> [2018-01-04, 03:56PM -0500]:
On 12/19/2017 05:08 AM, Bjoern Walk wrote:
> diff --git a/src/util/virsysinfo.c b/src/util/virsysinfo.c
> index ab81b1f7..0c2267e3 100644
> --- a/src/util/virsysinfo.c
> +++ b/src/util/virsysinfo.c
> @@ -495,6 +495,7 @@ virSysinfoParseS390Processor(const char *base, virSysinfoDefPtr
ret)
> char *tmp_base;
> char *manufacturer = NULL;
> char *procline = NULL;
> + char *ncpu = NULL;
> int result = -1;
> virSysinfoProcessorDefPtr processor;
>
> @@ -524,11 +525,41 @@ virSysinfoParseS390Processor(const char *base,
virSysinfoDefPtr ret)
>
> VIR_FREE(procline);
> }
> +
> + /* now, for each processor found, extract the frequency information */
> + tmp_base = (char *) base;
> +
> + while ((tmp_base = strstr(tmp_base, "cpu number")) &&
> + (tmp_base = virSysinfoParseS390Line(tmp_base, "cpu number",
&ncpu))) {
> + unsigned int n;
> + char *mhz = NULL;
> +
> + if (virStrToLong_ui(ncpu, NULL, 10, &n) < 0 || n >=
ret->nprocessor)
> + goto cleanup;
Should these be split? Reason I ask is if n >= ret->nprocessor, then
going to cleanup results in returning a failure. That leads to an
eventual generic command failed for some reason. Of course that reason
shouldn't be possible, but since this is a CYA exercise, the check
should have a specific error message - similar to what one would get if
other calls failed...
I don't quite follow. You want an explicit error message here if n >=
ret->nprocessor? Right now, for this call sequence there is no error
reporting at all. This just fills the respective driver->hostsysinfo
struct and sets this to NULL in case of an error. Later on, when the
hostsysinfo is used and not available, an error is generated.
> +
> + if (!(tmp_base = strstr(tmp_base, "cpu MHz dynamic")) ||
> + !virSysinfoParseS390Line(tmp_base, "cpu MHz dynamic",
&mhz) ||
> + !mhz)
Other virSysinfoParseS390Line callers never check whether the returned
4th argument is NULL - should they? or is the !mhz check here (and the
next one) superfluous? I note the @ncpu one above doesn't have it
either. In the long run, who cares if it's NULL?
Yes, combined with the strstr call I guess this check is not necessary.
I can remove it.
> + goto cleanup;
> +
> + ret->processor[n].processor_external_clock = mhz;
> +
> + if (!(tmp_base = strstr(tmp_base, "cpu MHz static")) ||
> + !virSysinfoParseS390Line(tmp_base, "cpu MHz static",
&mhz) ||
> + !mhz)
> + goto cleanup;
> +
> + ret->processor[n].processor_max_speed = mhz;
FWIW,
you could remove @mhz and replace with a "virSysinfoProcessorDefPtr
processor;" definition followed by an appropriately placed "processsor =
&ret->processor[n];", and then and assign directly to
&processor->{external_clock|processor_max_speed}
True, but that would probably make the parsing line harder to read. I'll
see if I can find some improvements.
John
> +
> + VIR_FREE(ncpu);
> + }
> +
> result = 0;
>
> cleanup:
> VIR_FREE(manufacturer);
> VIR_FREE(procline);
> + VIR_FREE(ncpu);
> return result;
> }
>
>