]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - fs/eventpoll.c
epoll: avoid double-inserts in case of EFAULT
[linux-2.6-omap-h63xx.git] / fs / eventpoll.c
index 99368bda0261321290a6afa52ad74a797f79cd54..aec5c13f634177bab34f108e9f4891e300b873a3 100644 (file)
@@ -930,8 +930,15 @@ errxit:
         * inside the main ready-list here.
         */
        for (nepi = ep->ovflist; (epi = nepi) != NULL;
-            nepi = epi->next, epi->next = EP_UNACTIVE_PTR)
-               list_add_tail(&epi->rdllink, &ep->rdllist);
+            nepi = epi->next, epi->next = EP_UNACTIVE_PTR) {
+               /*
+                * If the above loop quit with errors, the epoll item might still
+                * be linked to "txlist", and the list_splice() done below will
+                * take care of those cases.
+                */
+               if (!ep_is_linked(&epi->rdllink))
+                       list_add_tail(&epi->rdllink, &ep->rdllist);
+       }
        /*
         * We need to set back ep->ovflist to EP_UNACTIVE_PTR, so that after
         * releasing the lock, events will be queued in the normal way inside