Added support for inter-process GetWindowWord.
Do better range checking on the window extra bytes.
diff --git a/server/protocol.def b/server/protocol.def
index 69004f7..c9d4df9 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -1834,6 +1834,7 @@
void* instance; /* creator instance */
void* user_data; /* user-specific data */
int extra_offset; /* offset to set in extra bytes */
+ size_t extra_size; /* size to set in extra bytes */
unsigned int extra_value; /* value to set in extra bytes */
@REPLY
unsigned int old_style; /* old window style */
@@ -1848,8 +1849,7 @@
#define SET_WIN_ID 0x04
#define SET_WIN_INSTANCE 0x08
#define SET_WIN_USERDATA 0x10
-#define SET_WIN_EXTRAWORD 0x20
-#define SET_WIN_EXTRALONG 0x40
+#define SET_WIN_EXTRA 0x20
/* Get a list of the window parents, up to the root of the tree */
diff --git a/server/trace.c b/server/trace.c
index a73d34c..9cd0650 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -2157,6 +2157,7 @@
fprintf( stderr, " instance=%p,", req->instance );
fprintf( stderr, " user_data=%p,", req->user_data );
fprintf( stderr, " extra_offset=%d,", req->extra_offset );
+ fprintf( stderr, " extra_size=%d,", req->extra_size );
fprintf( stderr, " extra_value=%08x", req->extra_value );
}
diff --git a/server/window.c b/server/window.c
index ff16793..6373068 100644
--- a/server/window.c
+++ b/server/window.c
@@ -586,20 +586,20 @@
set_error( STATUS_ACCESS_DENIED );
return;
}
- if (req->extra_offset < -1 || req->extra_offset >= win->nb_extra_bytes)
+ if (req->extra_size > sizeof(req->extra_value) ||
+ req->extra_offset < -1 ||
+ req->extra_offset > win->nb_extra_bytes - (int)req->extra_size)
{
- set_error( STATUS_INVALID_PARAMETER );
+ set_win32_error( ERROR_INVALID_INDEX );
return;
}
if (req->extra_offset != -1)
{
- memcpy( &reply->old_extra_value, win->extra_bytes + req->extra_offset,
- min( sizeof(reply->old_extra_value),
- (size_t)(win->nb_extra_bytes - req->extra_offset) ));
+ memcpy( &reply->old_extra_value, win->extra_bytes + req->extra_offset, req->extra_size );
}
- else if (req->flags & (SET_WIN_EXTRAWORD|SET_WIN_EXTRALONG))
+ else if (req->flags & SET_WIN_EXTRA)
{
- set_error( STATUS_INVALID_PARAMETER );
+ set_win32_error( ERROR_INVALID_INDEX );
return;
}
reply->old_style = win->style;
@@ -612,12 +612,8 @@
if (req->flags & SET_WIN_ID) win->id = req->id;
if (req->flags & SET_WIN_INSTANCE) win->instance = req->instance;
if (req->flags & SET_WIN_USERDATA) win->user_data = req->user_data;
- if (req->flags & (SET_WIN_EXTRAWORD|SET_WIN_EXTRALONG))
- {
- const int len = (req->flags & SET_WIN_EXTRALONG) ? sizeof(int) : sizeof(short);
- memcpy( win->extra_bytes + req->extra_offset, &req->extra_value,
- min( len, win->nb_extra_bytes - req->extra_offset ));
- }
+ if (req->flags & SET_WIN_EXTRA) memcpy( win->extra_bytes + req->extra_offset,
+ &req->extra_value, req->extra_size );
}