]> git.proxmox.com Git - mirror_spl-debian.git/commitdiff
Fix off-by-1 truncation of hw_serial when converting from integer to string, when...
authorRicardo M. Correia <Ricardo.M.Correia@Sun.COM>
Thu, 12 Mar 2009 21:23:34 +0000 (21:23 +0000)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Thu, 12 Mar 2009 22:47:50 +0000 (15:47 -0700)
Fixes hostid mismatch which leads to assertion failure when the hostid/hw_serial is a 10-character decimal number:

$ zpool status
  pool: lustre
 state: ONLINE
lt-zpool: zpool_main.c:3176: status_callback: Assertion `reason == ZPOOL_STATUS_OK' failed.
zsh: 5262 abort      zpool status

module/spl/spl-proc.c

index d0ce231943766bfe51fb9f2bcf77430326fb4494..294948d81957cd0a527a6a9262970131b6d98cf2 100644 (file)
@@ -457,23 +457,24 @@ proc_dohostid(struct ctl_table *table, int write, struct file *filp,
         int len, rc = 0;
         int32_t val;
         char *end, str[32];
-       ENTRY;
+        ENTRY;
 
         if (write) {
-               /* We can't use proc_doulongvec_minmax() in the write
-                * case hear because hostid while a hex value has no
-                * leading 0x which confuses the helper function. */
+                /* We can't use proc_doulongvec_minmax() in the write
+                 * case hear because hostid while a hex value has no
+                 * leading 0x which confuses the helper function. */
                 rc = proc_copyin_string(str, sizeof(str), buffer, *lenp);
                 if (rc < 0)
                         RETURN(rc);
 
                 val = simple_strtol(str, &end, 16);
-               if (str == end)
-                       RETURN(-EINVAL);
+                if (str == end)
+                        RETURN(-EINVAL);
 
-               spl_hostid = (long)val;
-                (void)snprintf(hw_serial, HW_HOSTID_LEN-1, "%u",
-                              (val >= 0) ? val : -val);
+                spl_hostid = (long) val;
+                (void) snprintf(hw_serial, HW_HOSTID_LEN, "%u",
+                               (val >= 0) ? val : -val);
+                hw_serial[HW_HOSTID_LEN - 1] = '\0';
                 *ppos += *lenp;
         } else {
                 len = snprintf(str, sizeof(str), "%lx", spl_hostid);