git: 85d7875d4291 - main - LinuxKPI: Fix dmi_matches() function

From: Hans Petter Selasky <hselasky_at_FreeBSD.org>
Date: Mon, 06 Jun 2022 08:32:14 UTC
The branch main has been updated by hselasky:

URL: https://cgit.FreeBSD.org/src/commit/?id=85d7875d42913c2cb10a007a1be05b210dc6aab2

commit 85d7875d42913c2cb10a007a1be05b210dc6aab2
Author:     Hans Petter Selasky <hselasky@FreeBSD.org>
AuthorDate: 2022-06-06 08:23:23 +0000
Commit:     Hans Petter Selasky <hselasky@FreeBSD.org>
CommitDate: 2022-06-06 08:31:34 +0000

    LinuxKPI: Fix dmi_matches() function
    
    Make sure to check for NULL pointers and also check all search criterias,
    not only the first one!
    
    Bump the FreeBSD version.
    
    Reviewed by:    manu@
    Differential Revision:  https://reviews.freebsd.org/D35403
    MFC after:      1 week
    Sponsored by:   NVIDIA Networking
---
 sys/compat/linuxkpi/common/src/linux_dmi.c | 19 ++++++++++++-------
 sys/sys/param.h                            |  2 +-
 2 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/sys/compat/linuxkpi/common/src/linux_dmi.c b/sys/compat/linuxkpi/common/src/linux_dmi.c
index f5350751a496..70d56c246c10 100644
--- a/sys/compat/linuxkpi/common/src/linux_dmi.c
+++ b/sys/compat/linuxkpi/common/src/linux_dmi.c
@@ -77,20 +77,25 @@ linux_dmi_match(enum dmi_field f, const char *str)
 static bool
 linux_dmi_matches(const struct dmi_system_id *dsi)
 {
+	enum dmi_field slot;
 	int i;
 
 	for (i = 0; i < nitems(dsi->matches); i++) {
-		if (dsi->matches[i].slot == DMI_NONE)
+		slot = dsi->matches[i].slot;
+		if (slot == DMI_NONE)
 			break;
+		if (slot >= DMI_STRING_MAX ||
+		    dmi_data[slot] == NULL)
+			return (false);
 		if (dsi->matches[i].exact_match) {
-			return (dmi_match(dsi->matches[i].slot,
-			    dsi->matches[i].substr));
-		} else {
-			return (strstr(dmi_data[dsi->matches[i].slot],
-				    dsi->matches[i].substr) != NULL);
+			if (dmi_match(slot, dsi->matches[i].substr))
+				continue;
+		} else if (strstr(dmi_data[slot],
+			dsi->matches[i].substr) != NULL) {
+			continue;
 		}
+		return (false);
 	}
-
 	return (true);
 }
 
diff --git a/sys/sys/param.h b/sys/sys/param.h
index 1f720ed31142..d68b5c2d4f2f 100644
--- a/sys/sys/param.h
+++ b/sys/sys/param.h
@@ -76,7 +76,7 @@
  * cannot include sys/param.h and should only be updated here.
  */
 #undef __FreeBSD_version
-#define __FreeBSD_version 1400059
+#define __FreeBSD_version 1400060
 
 /*
  * __FreeBSD_kernel__ indicates that this system uses the kernel of FreeBSD,