Merge "uevent.c: avoid POLLERR infinite loop" into main am: cc5dc08c15

Original change: https://android-review.googlesource.com/c/platform/hardware/libhardware_legacy/+/2878224

Change-Id: I3262b82c9849723ce3930a2690a31157927e5c43
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/Android.bp b/Android.bp
index 409db5d..871b1f9 100644
--- a/Android.bp
+++ b/Android.bp
@@ -79,6 +79,7 @@
     shared_libs: [
         "android.system.suspend-V1-ndk",
         "libdl",
+        "liblog",
     ],
 
     header_libs: [
diff --git a/uevent.c b/uevent.c
index e40aa2e..0dcae79 100644
--- a/uevent.c
+++ b/uevent.c
@@ -16,6 +16,8 @@
 
 #include <hardware_legacy/uevent.h>
 
+#include <log/log.h>
+
 #include <malloc.h>
 #include <string.h>
 #include <unistd.h>
@@ -94,6 +96,16 @@
                 return count;
             } 
         }
+
+        if (nr > 0 && (fds.revents & POLLERR)) {
+            int error = 0;
+            socklen_t errlen = sizeof(error);
+            getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &errlen);
+
+            // see b/300009377, this used to be an infinite loop
+            // abort to try to recover
+            LOG_ALWAYS_FATAL("Uevent POLLERR: %s, on FD %d", strerror(error), fd);
+        }
     }
     
     // won't get here