init: handle ueventd path truncation better

Log an error before discarding problematic events, and add a missing
truncation check to the usb subsystem's unique codepath

Change-Id: I0d05aa287ffc63b46d1752d2a7409d35dc8caca7
Signed-off-by: Greg Hackmann <ghackmann@google.com>
diff --git a/init/devices.c b/init/devices.c
index af88c5f..2551ca8 100644
--- a/init/devices.c
+++ b/init/devices.c
@@ -530,8 +530,11 @@
     name++;
 
     /* too-long names would overrun our buffer */
-    if(strlen(name) > len)
+    if(strlen(name) > len) {
+        ERROR("DEVPATH=%s exceeds %u-character limit on filename; ignoring event\n",
+                name, len);
         return NULL;
+    }
 
     return name;
 }
@@ -576,7 +579,18 @@
                  * see drivers/base/core.c
                  */
                 char *p = devpath;
-                snprintf(devpath, sizeof(devpath), "/dev/%s", uevent->device_name);
+                int s = snprintf(devpath, sizeof(devpath), "/dev/%s",
+                        uevent->device_name);
+                if (s < 0) {
+                    ERROR("failed to assemble device path (%s); ignoring event\n",
+                            strerror(errno));
+                    return;
+                } else if ((size_t)s >= sizeof(devpath)) {
+                    ERROR("/dev/%s exceeds %u-character limit on path; ignoring event\n",
+                            uevent->device_name, sizeof(devpath));
+                    return;
+                }
+
                 /* skip leading /dev/ */
                 p += 5;
                 /* build directories */