gstpluginloader: Don't hang on short reads/writes
authorMartin Dørum <martid0311@gmail.com>
Wed, 31 Aug 2022 12:23:59 +0000 (14:23 +0200)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Wed, 31 Aug 2022 16:54:24 +0000 (16:54 +0000)
If read_one or write_one was called but the stream closed before it could
read/write a whole packet, read_one/write_one would hang indefinitely,
consuming 100% CPU. This commit fixes that by treating a short read/write
as an error.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2964>

subprojects/gstreamer/gst/gstpluginloader.c

index fb8b45c..8dc96fd 100644 (file)
@@ -810,6 +810,9 @@ write_one (GstPluginLoader * l)
         continue;
       /* Failed to write -> child died */
       goto fail_and_cleanup;
+    } else if (G_UNLIKELY (res == 0)) {
+      /* FD closed -> child died */
+      goto fail_and_cleanup;
     }
     to_write -= res;
     out += res;
@@ -1074,6 +1077,9 @@ read_one (GstPluginLoader * l)
         continue;
       GST_LOG ("Failed reading packet header");
       return FALSE;
+    } else if (G_UNLIKELY (res == 0)) {
+      GST_LOG ("Failed reading packet header: Unexpected EOF");
+      return FALSE;
     }
     to_read -= res;
     in += res;
@@ -1111,6 +1117,9 @@ read_one (GstPluginLoader * l)
           continue;
         GST_ERROR ("Packet payload read failed");
         return FALSE;
+      } else if (G_UNLIKELY (res == 0)) {
+        GST_ERROR ("Packet payload read failed: Unexpected EOF");
+        return FALSE;
       }
       to_read -= res;
       in += res;