Alexandre Julliard : server: Refuse to close handles in other processes if they have an associated fd.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Nov 2 15:39:47 CST 2006


Module: wine
Branch: master
Commit: 715d78e006461fccb893d1a6aed8018456598aca
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=715d78e006461fccb893d1a6aed8018456598aca

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Nov  2 20:52:22 2006 +0100

server: Refuse to close handles in other processes if they have an associated fd.

---

 server/change.c     |    2 +-
 server/fd.c         |    6 ++++++
 server/file.c       |    2 +-
 server/file.h       |    1 +
 server/mailslot.c   |    6 +++---
 server/mapping.c    |    2 +-
 server/named_pipe.c |    6 +++---
 server/serial.c     |    2 +-
 server/sock.c       |    2 +-
 9 files changed, 18 insertions(+), 11 deletions(-)

diff --git a/server/change.c b/server/change.c
index e046181..5468e85 100644
--- a/server/change.c
+++ b/server/change.c
@@ -177,7 +177,7 @@ static const struct object_ops dir_ops =
     dir_get_fd,               /* get_fd */
     dir_map_access,           /* map_access */
     no_lookup_name,           /* lookup_name */
-    no_close_handle,          /* close_handle */
+    fd_close_handle,          /* close_handle */
     dir_destroy               /* destroy */
 };
 
diff --git a/server/fd.c b/server/fd.c
index 25b9a7c..4fbecbe 100644
--- a/server/fd.c
+++ b/server/fd.c
@@ -1658,6 +1658,12 @@ int is_same_file_fd( struct fd *fd1, str
     return fd1->inode == fd2->inode;
 }
 
+/* handler for close_handle that refuses to close fd-associated handles in other processes */
+int fd_close_handle( struct object *obj, struct process *process, obj_handle_t handle )
+{
+    return (!current || current->process == process);
+}
+
 /* callback for event happening in the main poll() loop */
 void fd_poll_event( struct fd *fd, int event )
 {
diff --git a/server/file.c b/server/file.c
index 0f90019..ec34295 100644
--- a/server/file.c
+++ b/server/file.c
@@ -84,7 +84,7 @@ static const struct object_ops file_ops
     file_get_fd,                  /* get_fd */
     file_map_access,              /* map_access */
     no_lookup_name,               /* lookup_name */
-    no_close_handle,              /* close_handle */
+    fd_close_handle,              /* close_handle */
     file_destroy                  /* destroy */
 };
 
diff --git a/server/file.h b/server/file.h
index 16d4399..fc8b904 100644
--- a/server/file.h
+++ b/server/file.h
@@ -55,6 +55,7 @@ extern void *get_fd_user( struct fd *fd
 extern void set_fd_user( struct fd *fd, const struct fd_ops *ops, struct object *user );
 extern int get_unix_fd( struct fd *fd );
 extern int is_same_file_fd( struct fd *fd1, struct fd *fd2 );
+extern int fd_close_handle( struct object *obj, struct process *process, obj_handle_t handle );
 extern void fd_poll_event( struct fd *fd, int event );
 extern int check_fd_events( struct fd *fd, int events );
 extern void set_fd_events( struct fd *fd, int events );
diff --git a/server/mailslot.c b/server/mailslot.c
index 6c4fc1c..7015f41 100644
--- a/server/mailslot.c
+++ b/server/mailslot.c
@@ -80,7 +80,7 @@ static const struct object_ops mailslot_
     mailslot_get_fd,           /* get_fd */
     mailslot_map_access,       /* map_access */
     no_lookup_name,            /* lookup_name */
-    no_close_handle,           /* close_handle */
+    fd_close_handle,           /* close_handle */
     mailslot_destroy           /* destroy */
 };
 
@@ -124,7 +124,7 @@ static const struct object_ops mail_writ
     mail_writer_get_fd,         /* get_fd */
     mail_writer_map_access,     /* map_access */
     no_lookup_name,             /* lookup_name */
-    no_close_handle,            /* close_handle */
+    fd_close_handle,            /* close_handle */
     mail_writer_destroy         /* destroy */
 };
 
@@ -167,7 +167,7 @@ static const struct object_ops mailslot_
     mailslot_device_get_fd,         /* get_fd */
     no_map_access,                  /* map_access */
     mailslot_device_lookup_name,    /* lookup_name */
-    no_close_handle,                /* close_handle */
+    fd_close_handle,                /* close_handle */
     mailslot_device_destroy         /* destroy */
 };
 
diff --git a/server/mapping.c b/server/mapping.c
index 212af1b..d526e75 100644
--- a/server/mapping.c
+++ b/server/mapping.c
@@ -68,7 +68,7 @@ static const struct object_ops mapping_o
     mapping_get_fd,              /* get_fd */
     mapping_map_access,          /* map_access */
     no_lookup_name,              /* lookup_name */
-    no_close_handle,             /* close_handle */
+    fd_close_handle,             /* close_handle */
     mapping_destroy              /* destroy */
 };
 
diff --git a/server/named_pipe.c b/server/named_pipe.c
index bb0e741..e58f5b0 100644
--- a/server/named_pipe.c
+++ b/server/named_pipe.c
@@ -148,7 +148,7 @@ static const struct object_ops pipe_serv
     pipe_server_get_fd,           /* get_fd */
     pipe_map_access,              /* map_access */
     no_lookup_name,               /* lookup_name */
-    no_close_handle,              /* close_handle */
+    fd_close_handle,              /* close_handle */
     pipe_server_destroy           /* destroy */
 };
 
@@ -181,7 +181,7 @@ static const struct object_ops pipe_clie
     pipe_client_get_fd,           /* get_fd */
     pipe_map_access,              /* map_access */
     no_lookup_name,               /* lookup_name */
-    no_close_handle,              /* close_handle */
+    fd_close_handle,              /* close_handle */
     pipe_client_destroy           /* destroy */
 };
 
@@ -214,7 +214,7 @@ static const struct object_ops named_pip
     named_pipe_device_get_fd,         /* get_fd */
     pipe_map_access,                  /* map_access */
     named_pipe_device_lookup_name,    /* lookup_name */
-    no_close_handle,                  /* close_handle */
+    fd_close_handle,                  /* close_handle */
     named_pipe_device_destroy         /* destroy */
 };
 
diff --git a/server/serial.c b/server/serial.c
index 49d3f79..a772256 100644
--- a/server/serial.c
+++ b/server/serial.c
@@ -104,7 +104,7 @@ static const struct object_ops serial_op
     serial_get_fd,                /* get_fd */
     serial_map_access,            /* map_access */
     no_lookup_name,               /* lookup_name */
-    no_close_handle,              /* close_handle */
+    fd_close_handle,              /* close_handle */
     serial_destroy                /* destroy */
 };
 
diff --git a/server/sock.c b/server/sock.c
index c1a7a8d..9637469 100644
--- a/server/sock.c
+++ b/server/sock.c
@@ -114,7 +114,7 @@ static const struct object_ops sock_ops
     sock_get_fd,                  /* get_fd */
     sock_map_access,              /* map_access */
     no_lookup_name,               /* lookup_name */
-    no_close_handle,              /* close_handle */
+    fd_close_handle,              /* close_handle */
     sock_destroy                  /* destroy */
 };
 




More information about the wine-cvs mailing list