On Fri, Dec 02, 2022 at 10:11:32AM +0100, Laszlo Ersek wrote:
On 12/01/22 12:20, Richard W.M. Jones wrote:
> On Thu, Dec 01, 2022 at 10:34:09AM +0000, Richard W.M. Jones wrote:
>> For Windows Client, we can only distinguish between Windows 10 and
>> Windows 11 using the build ID. The product name in both cases is
>> "Windows 10 <something>", apparently intentionally.
>>
>> References:
>>
https://learn.microsoft.com/en-us/answers/questions/586619/windows-11-bui...
>>
https://github.com/cygwin/cygwin/blob/a263fe0b268580273c1adc4b1bad2561479...
>>
https://en.wikipedia.org/wiki/List_of_Microsoft_Windows_versions
>>
>> After this fix, the output of virt-inspector changes to this, which is
>> a bit odd, but correct:
>>
>> <name>windows</name>
>> <arch>x86_64</arch>
>> <distro>windows</distro>
>> <product_name>Windows 10 Pro</product_name>
>> <product_variant>Client</product_variant>
>> <major_version>10</major_version>
>> <minor_version>0</minor_version>
>> <windows_systemroot>/Windows</windows_systemroot>
>>
<windows_current_control_set>ControlSet001</windows_current_control_set>
>> <osinfo>win11</osinfo>
>>
>> Thanks: Yaakov Selkowitz
>> Reported-by: Yongkui Guo
>> Fixes:
https://bugzilla.redhat.com/show_bug.cgi?id=2012658
>> ---
>> lib/inspect-osinfo.c | 25 +++++++++++++++++++++++--
>> 1 file changed, 23 insertions(+), 2 deletions(-)
>>
>> diff --git a/lib/inspect-osinfo.c b/lib/inspect-osinfo.c
>> index 90e57e6dfa..9a22a9d037 100644
>> --- a/lib/inspect-osinfo.c
>> +++ b/lib/inspect-osinfo.c
>> @@ -86,6 +86,8 @@ guestfs_impl_inspect_get_osinfo (guestfs_h *g, const char
*root)
>> else if (STREQ (type, "windows")) {
>> CLEANUP_FREE char *product_name = NULL;
>> CLEANUP_FREE char *product_variant = NULL;
>> + CLEANUP_FREE char *build_id_str = NULL;
>> + int build_id;
>>
>> product_name = guestfs_inspect_get_product_name (g, root);
>> if (!product_name)
>> @@ -142,8 +144,27 @@ guestfs_impl_inspect_get_osinfo (guestfs_h *g, const char
*root)
>> return safe_strdup (g, "win2k19");
>> else
>> return safe_strdup (g, "win2k16");
>> - } else
>> - return safe_strdup (g, "win10");
>> + }
>> + else {
>> + /* For Windows >= 10 Client we can only distinguish between
>> + * versions by looking at the build ID. See:
>> + *
https://learn.microsoft.com/en-us/answers/questions/586619/windows-11-bui...
>> + *
https://github.com/cygwin/cygwin/blob/a263fe0b268580273c1adc4b1bad2561479...
>> + */
>> + build_id_str = guestfs_inspect_get_build_id (g, root);
>> + if (!build_id_str)
>> + return NULL;
Does this deserve an error() call like the one below?
>> +
>> + if (sscanf (build_id_str, "%d", &build_id) != 1) {
>> + error (g, "cannot parse Windows build ID from this
guest");
>> + return NULL;
>> + }
>> +
>> + if (build_id >= 2200)
>
> This should of course be 22000! Updated my copy.
In addition, please replace sscanf() with strtol(). The behavior of the
former is undefined when the subject sequence forms a valid decimal
string, but the numeric value does not fit into an "int". And, this is
untrusted data. strtol() handles this securely (although strtol() is not
trivial to use).
I really think we (meaning Eric :-) should get scanf fixed, but yes
I'll replace this with xstrol since we have it around.
I seem to remember gnulib offers xstrol() -- indeed, our trimmed,
embedded copy of gnulib offers xstrtol(), from commit 0f54df53d26e
("build: Remove gnulib.", 2021-04-08); so that's the function to use
here, IMO.
series
Reviewed-by: Laszlo Ersek <lersek(a)redhat.com>
Thanks,
Rich.
>
> Rich.
>
>> + return safe_strdup (g, "win11");
>> + else
>> + return safe_strdup (g, "win10");
>> + }
>> }
>> break;
>> }
>> --
>> 2.37.3
>>
>> _______________________________________________
>> Libguestfs mailing list
>> Libguestfs(a)redhat.com
>>
https://listman.redhat.com/mailman/listinfo/libguestfs
>
--
Richard Jones, Virtualization Group, Red Hat
http://people.redhat.com/~rjones
Read my programming and virtualization blog:
http://rwmj.wordpress.com
virt-builder quickly builds VMs from scratch
http://libguestfs.org/virt-builder.1.html