Avoid dup'ing file descriptors when not necessary.
Do not send fd to the client if ops->get_fd() fails.

diff --git a/server/mapping.c b/server/mapping.c
index 38d1d89..43a67d8 100644
--- a/server/mapping.c
+++ b/server/mapping.c
@@ -91,7 +91,11 @@
 inline static int get_mmap_fd( struct file *file )
 {
     struct object *obj;
-    if (!(obj = (struct object *)file)) return -1;
+    if (!(obj = (struct object *)file))
+    {
+        set_error( STATUS_INVALID_HANDLE );
+        return -1;
+    }
     return obj->ops->get_fd( obj );
 }
 
@@ -100,8 +104,8 @@
                                  IMAGE_SECTION_HEADER *sec, int nb_sec )
 {
     int i, max_size, total_size, pos;
-    char *buffer = NULL; 
-    int shared_fd = -1;
+    char *buffer = NULL;
+    int shared_fd;
     long toread;
 
     /* compute the total size of the shared mapping */
@@ -147,12 +151,10 @@
         }
         if (write( shared_fd, buffer, sec[i].SizeOfRawData ) != sec[i].SizeOfRawData) goto error;
     }
-    close( shared_fd );
     free( buffer );
     return 1;
 
  error:
-    if (shared_fd != -1) close( shared_fd );
     if (buffer) free( buffer );
     return 0;
 }
@@ -193,13 +195,11 @@
     if (mapping->header_size > mapping->size_low) goto error;
 
     lseek( fd, filepos, SEEK_SET );
-    close( fd );
     free( sec );
     return 1;
 
  error:
     lseek( fd, filepos, SEEK_SET );
-    close( fd );
     if (sec) free( sec );
     set_error( STATUS_INVALID_FILE_FOR_SECTION );
     return 0;