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;