summaryrefslogtreecommitdiff
path: root/src/clipboard.c
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@bitplanet.net>2013-07-25 16:21:41 -0700
committerKristian Høgsberg <krh@bitplanet.net>2013-07-25 16:21:41 -0700
commit46118f8197b7e8b464d1882440ca0892ffc23091 (patch)
tree7189a8709de46db484b98286cc973e13c6edbcdc /src/clipboard.c
parent5e76a49d9c5ae86c67c70c13b1199a9efb43392b (diff)
downloadweston-46118f8197b7e8b464d1882440ca0892ffc23091.tar.gz
clipboard: Fix fd leak
We never closed the reading end of the pipe after copying data to the clipboard.
Diffstat (limited to 'src/clipboard.c')
-rw-r--r--src/clipboard.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/clipboard.c b/src/clipboard.c
index 81b7b19b..7cba7515 100644
--- a/src/clipboard.c
+++ b/src/clipboard.c
@@ -38,6 +38,7 @@ struct clipboard_source {
struct wl_event_source *event_source;
uint32_t serial;
int refcount;
+ int fd;
};
struct clipboard {
@@ -58,8 +59,10 @@ clipboard_source_unref(struct clipboard_source *source)
if (source->refcount > 0)
return;
- if (source->event_source)
+ if (source->event_source) {
wl_event_source_remove(source->event_source);
+ close(source->fd);
+ }
wl_signal_emit(&source->base.destroy_signal,
&source->base);
s = source->base.mime_types.data;
@@ -87,6 +90,7 @@ clipboard_source_data(int fd, uint32_t mask, void *data)
len = read(fd, p, size);
if (len == 0) {
wl_event_source_remove(source->event_source);
+ close(fd);
source->event_source = NULL;
} else if (len < 0) {
clipboard_source_unref(source);
@@ -256,8 +260,10 @@ clipboard_set_selection(struct wl_listener *listener, void *data)
clipboard->source =
clipboard_source_create(clipboard, mime_types[0],
seat->selection_serial, p[0]);
- if (clipboard->source == NULL)
+ if (clipboard->source == NULL) {
+ close(p[0]);
return;
+ }
}
static void