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-build-ver-is-still-10022000194.html
> >> https://github.com/cygwin/cygwin/blob/a263fe0b268580273c1adc4b1bad256147990222/winsup/cygwin/wincap.cc#L429
> >> 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-build-ver-is-still-10022000194.html
> >> +           * 
> >> https://github.com/cygwin/cygwin/blob/a263fe0b268580273c1adc4b1bad256147990222/winsup/cygwin/wincap.cc#L429
> >> +           */
> >> +          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 <ler...@redhat.com>

Thanks,

Rich.

> > 
> > Rich.
> > 
> >> +            return safe_strdup (g, "win11");
> >> +          else
> >> +            return safe_strdup (g, "win10");
> >> +        }
> >>        }
> >>        break;
> >>      }
> >> -- 
> >> 2.37.3
> >>
> >> _______________________________________________
> >> Libguestfs mailing list
> >> Libguestfs@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
_______________________________________________
Libguestfs mailing list
Libguestfs@redhat.com
https://listman.redhat.com/mailman/listinfo/libguestfs

Reply via email to