Make crossystem.h more polite and more useful.

This adds a VB_MAX_STRING_PROPERTY for callers that don't
want to guess at how big to make their buffers.

Additionally, it changes the size parameter to VbGetPropertyString()
from int to size_t.

BUG=None
TEST=compile the code
BRANCH=none

Change-Id: I22809d48e13b535593cb22a56444e2dcb27791a5
Reviewed-on: https://chromium-review.googlesource.com/175039
Reviewed-by: Randall Spangler <rspangler@chromium.org>
Tested-by: Richard Barnette <jrbarnette@chromium.org>
Reviewed-by: Bill Richardson <wfrichar@chromium.org>
Commit-Queue: Richard Barnette <jrbarnette@chromium.org>
diff --git a/host/arch/arm/lib/crossystem_arch.c b/host/arch/arm/lib/crossystem_arch.c
index 99b8689..b5422de 100644
--- a/host/arch/arm/lib/crossystem_arch.c
+++ b/host/arch/arm/lib/crossystem_arch.c
@@ -5,6 +5,7 @@
 
 #include <stdio.h>
 #include <string.h>
+#include <stddef.h>
 #include <stdlib.h>
 #include <linux/fs.h>
 #include <sys/types.h>
@@ -533,7 +534,8 @@
     return -1;
 }
 
-const char* VbGetArchPropertyString(const char* name, char* dest, int size) {
+const char* VbGetArchPropertyString(const char* name, char* dest,
+                                    size_t size) {
   char *str = NULL;
   char *rv = NULL;
   char *prop = NULL;
diff --git a/host/arch/x86/lib/crossystem_arch.c b/host/arch/x86/lib/crossystem_arch.c
index 9398a35..2b379a7 100644
--- a/host/arch/x86/lib/crossystem_arch.c
+++ b/host/arch/x86/lib/crossystem_arch.c
@@ -7,6 +7,7 @@
 #include <dirent.h>
 #include <errno.h>
 #include <linux/nvram.h>
+#include <stddef.h>
 #include <stdint.h>
 #include <stdio.h>
 #include <string.h>
@@ -671,7 +672,8 @@
 }
 
 
-const char* VbGetArchPropertyString(const char* name, char* dest, int size) {
+const char* VbGetArchPropertyString(const char* name, char* dest,
+                                    size_t size) {
 
   if (!strcasecmp(name,"arch")) {
     return StrCopy(dest, "x86", size);
diff --git a/host/include/crossystem.h b/host/include/crossystem.h
index c116b0c..25b9cc0 100644
--- a/host/include/crossystem.h
+++ b/host/include/crossystem.h
@@ -10,6 +10,12 @@
 extern "C" {
 #endif
 
+#include <stddef.h>
+
+/* Recommended size for string property buffers used with
+ * VbGetSystemPropertyString(). */
+#define VB_MAX_STRING_PROPERTY     ((size_t) 8192)
+
 /* Reads a system property integer.
  *
  * Returns the property value, or -1 if error. */
@@ -19,8 +25,12 @@
  * specified size.  Returned string will be null-terminated.  If the
  * buffer is too small, the returned string will be truncated.
  *
+ * The caller can expect an un-truncated value if the size provided is
+ * at least VB_MAX_STRING_PROPERTY.
+ *
  * Returns the passed buffer, or NULL if error. */
-const char* VbGetSystemPropertyString(const char* name, char* dest, int size);
+const char* VbGetSystemPropertyString(const char* name, char* dest,
+                                      size_t size);
 
 /* Sets a system property integer.
  *
@@ -29,6 +39,9 @@
 
 /* Set a system property string.
  *
+ * The maximum length of the value accepted depends on the specific
+ * property, not on VB_MAX_STRING_PROPERTY.
+ *
  * Returns 0 if success, -1 if error. */
 int VbSetSystemPropertyString(const char* name, const char* value);
 
diff --git a/host/lib/crossystem.c b/host/lib/crossystem.c
index b482433..b496259 100644
--- a/host/lib/crossystem.c
+++ b/host/lib/crossystem.c
@@ -3,6 +3,7 @@
  * found in the LICENSE file.
  */
 
+#include <stddef.h>
 #include <stdio.h>
 #include <string.h>
 #include <sys/types.h>
@@ -69,7 +70,7 @@
 
 /* Return true if the FWID starts with the specified string. */
 int FwidStartsWith(const char *start) {
-  char fwid[128];
+  char fwid[VB_MAX_STRING_PROPERTY];
   if (!VbGetSystemPropertyString("fwid", fwid, sizeof(fwid)))
     return 0;
 
@@ -492,7 +493,8 @@
 }
 
 
-const char* VbGetSystemPropertyString(const char* name, char* dest, int size) {
+const char* VbGetSystemPropertyString(const char* name, char* dest,
+                                      size_t size) {
   static const char unknown_string[] = "unknown";
 
   /* Check architecture-dependent properties first */
diff --git a/host/lib/include/crossystem_arch.h b/host/lib/include/crossystem_arch.h
index 4044c74..50198b0 100644
--- a/host/lib/include/crossystem_arch.h
+++ b/host/lib/include/crossystem_arch.h
@@ -8,6 +8,8 @@
 #ifndef VBOOT_REFERENCE_CROSSYSTEM_ARCH_H_
 #define VBOOT_REFERENCE_CROSSYSTEM_ARCH_H_
 
+#include <stddef.h>
+
 #include "vboot_nvstorage.h"
 #include "vboot_struct.h"
 
@@ -76,7 +78,7 @@
  * will be truncated.
  *
  * Returns the passed buffer, or NULL if error. */
-const char* VbGetArchPropertyString(const char* name, char* dest, int size);
+const char* VbGetArchPropertyString(const char* name, char* dest, size_t size);
 
 /* Set an architecture-specific system property integer.
  *
diff --git a/utility/crossystem.c b/utility/crossystem.c
index d7007ee..520f7fd 100644
--- a/utility/crossystem.c
+++ b/utility/crossystem.c
@@ -11,9 +11,6 @@
 
 #include "crossystem.h"
 
-/* Max length of a string parameter */
-#define MAX_STRING 8192
-
 /*
  * Call arch specific init, if provided, otherwise use the 'weak' stub.
  */
@@ -153,7 +150,7 @@
  * Returns 0 if success (match), non-zero if error (mismatch). */
 int CheckParam(const Param* p, char* expect) {
   if (p->flags & IS_STRING) {
-    char buf[MAX_STRING];
+    char buf[VB_MAX_STRING_PROPERTY];
     const char* v = VbGetSystemPropertyString(p->name, buf, sizeof(buf));
     if (!v || 0 != strcmp(v, expect))
       return 1;
@@ -175,7 +172,7 @@
  * Returns 0 if success, non-zero if error. */
 int PrintParam(const Param* p) {
   if (p->flags & IS_STRING) {
-    char buf[MAX_STRING];
+    char buf[VB_MAX_STRING_PROPERTY];
     const char* v = VbGetSystemPropertyString(p->name, buf, sizeof(buf));
     if (!v)
       return 1;
@@ -197,7 +194,7 @@
 int PrintAllParams(int force_all) {
   const Param* p;
   int retval = 0;
-  char buf[MAX_STRING];
+  char buf[VB_MAX_STRING_PROPERTY];
   const char* value;
 
   for (p = sys_param_list; p->name; p++) {