Add range-checking to lots of arguments in the C code

This change catches things like c:geometry { width = -42 }.

Helps-a-bit-with: https://github.com/awesomeWM/awesome/pull/820 (fixes X errors)
Signed-off-by: Uli Schlachter <psychon@znc.in>
This commit is contained in:
Uli Schlachter 2016-04-17 13:44:05 +02:00 committed by Emmanuel Lepage Vallee
parent 39c031241f
commit d46e11f5e1
8 changed files with 38 additions and 35 deletions

2
luaa.c
View File

@ -181,7 +181,7 @@ luaA_load_image(lua_State *L)
static int static int
luaA_set_preferred_icon_size(lua_State *L) luaA_set_preferred_icon_size(lua_State *L)
{ {
globalconf.preferred_icon_size = luaL_checknumber(L, 1); globalconf.preferred_icon_size = luaA_checkinteger_range(L, 1, 0, UINT32_MAX);
return 0; return 0;
} }

View File

@ -31,6 +31,7 @@
#include "mouse.h" #include "mouse.h"
#include "common/util.h" #include "common/util.h"
#include "common/xutil.h"
#include "globalconf.h" #include "globalconf.h"
#include "objects/client.h" #include "objects/client.h"
#include "objects/drawin.h" #include "objects/drawin.h"
@ -111,7 +112,7 @@ mouse_query_pointer_root(int16_t *x, int16_t *y, xcb_window_t *child, uint16_t *
* \param y Y-coordinate inside window. * \param y Y-coordinate inside window.
*/ */
static inline void static inline void
mouse_warp_pointer(xcb_window_t window, int x, int y) mouse_warp_pointer(xcb_window_t window, int16_t x, int16_t y)
{ {
xcb_warp_pointer(globalconf.connection, XCB_NONE, window, xcb_warp_pointer(globalconf.connection, XCB_NONE, window,
0, 0, 0, 0, x, y); 0, 0, 0, 0, x, y);
@ -223,8 +224,8 @@ luaA_mouse_coords(lua_State *L)
if(!mouse_query_pointer_root(&mouse_x, &mouse_y, NULL, &mask)) if(!mouse_query_pointer_root(&mouse_x, &mouse_y, NULL, &mask))
return 0; return 0;
x = luaA_getopt_number(L, 1, "x", mouse_x); x = luaA_getopt_integer_range(L, 1, "x", mouse_x, MIN_X11_COORDINATE, MAX_X11_COORDINATE);
y = luaA_getopt_number(L, 1, "y", mouse_y); y = luaA_getopt_integer_range(L, 1, "y", mouse_y, MIN_X11_COORDINATE, MAX_X11_COORDINATE);
if(ignore_enter_notify) if(ignore_enter_notify)
client_ignore_enterleave_events(); client_ignore_enterleave_events();

View File

@ -2538,7 +2538,7 @@ luaA_client_titlebar_ ## name(lua_State *L) \
if (lua_isnil(L, 2)) \ if (lua_isnil(L, 2)) \
titlebar_resize(L, 1, c, index, 0); \ titlebar_resize(L, 1, c, index, 0); \
else \ else \
titlebar_resize(L, 1, c, index, luaL_checknumber(L, 2)); \ titlebar_resize(L, 1, c, index, luaA_checkinteger_range(L, 2, 0, MAX_X11_SIZE)); \
} \ } \
\ \
luaA_object_push_item(L, 1, titlebar_get_drawable(L, c, 1, index)); \ luaA_object_push_item(L, 1, titlebar_get_drawable(L, c, 1, index)); \
@ -2566,8 +2566,8 @@ luaA_client_geometry(lua_State *L)
area_t geometry; area_t geometry;
luaA_checktable(L, 2); luaA_checktable(L, 2);
geometry.x = luaA_getopt_number(L, 2, "x", c->geometry.x); geometry.x = luaA_getopt_integer_range(L, 2, "x", c->geometry.x, MIN_X11_COORDINATE, MAX_X11_COORDINATE);
geometry.y = luaA_getopt_number(L, 2, "y", c->geometry.y); geometry.y = luaA_getopt_integer_range(L, 2, "y", c->geometry.y, MIN_X11_COORDINATE, MAX_X11_COORDINATE);
if(client_isfixed(c)) if(client_isfixed(c))
{ {
geometry.width = c->geometry.width; geometry.width = c->geometry.width;
@ -2575,8 +2575,8 @@ luaA_client_geometry(lua_State *L)
} }
else else
{ {
geometry.width = luaA_getopt_number(L, 2, "width", c->geometry.width); geometry.width = luaA_getopt_integer_range(L, 2, "width", c->geometry.width, MIN_X11_SIZE, MAX_X11_SIZE);
geometry.height = luaA_getopt_number(L, 2, "height", c->geometry.height); geometry.height = luaA_getopt_integer_range(L, 2, "height", c->geometry.height, MIN_X11_SIZE, MAX_X11_SIZE);
} }
client_resize(c, geometry, c->size_hints_honor); client_resize(c, geometry, c->size_hints_honor);
@ -2600,8 +2600,8 @@ luaA_client_apply_size_hints(lua_State *L)
area_t geometry = c->geometry; area_t geometry = c->geometry;
if(!client_isfixed(c)) if(!client_isfixed(c))
{ {
geometry.width = luaL_checknumber(L, 2); geometry.width = luaA_checkinteger_range(L, 2, MIN_X11_SIZE, MAX_X11_SIZE);
geometry.height = luaL_checknumber(L, 3); geometry.height = luaA_checkinteger_range(L, 3, MIN_X11_SIZE, MAX_X11_SIZE);
} }
if (c->size_hints_honor) if (c->size_hints_honor)

View File

@ -34,6 +34,7 @@
#include "drawin.h" #include "drawin.h"
#include "common/atoms.h" #include "common/atoms.h"
#include "common/xcursor.h" #include "common/xcursor.h"
#include "common/xutil.h"
#include "event.h" #include "event.h"
#include "ewmh.h" #include "ewmh.h"
#include "objects/client.h" #include "objects/client.h"
@ -406,10 +407,10 @@ luaA_drawin_geometry(lua_State *L)
area_t wingeom; area_t wingeom;
luaA_checktable(L, 2); luaA_checktable(L, 2);
wingeom.x = luaA_getopt_number(L, 2, "x", drawin->geometry.x); wingeom.x = luaA_getopt_integer_range(L, 2, "x", drawin->geometry.x, MIN_X11_COORDINATE, MAX_X11_COORDINATE);
wingeom.y = luaA_getopt_number(L, 2, "y", drawin->geometry.y); wingeom.y = luaA_getopt_integer_range(L, 2, "y", drawin->geometry.y, MIN_X11_COORDINATE, MAX_X11_COORDINATE);
wingeom.width = luaA_getopt_number(L, 2, "width", drawin->geometry.width); wingeom.width = luaA_getopt_integer_range(L, 2, "width", drawin->geometry.width, MIN_X11_SIZE, MAX_X11_SIZE);
wingeom.height = luaA_getopt_number(L, 2, "height", drawin->geometry.height); wingeom.height = luaA_getopt_integer_range(L, 2, "height", drawin->geometry.height, MIN_X11_SIZE, MAX_X11_SIZE);
if(wingeom.width > 0 && wingeom.height > 0) if(wingeom.width > 0 && wingeom.height > 0)
drawin_moveresize(L, 1, wingeom); drawin_moveresize(L, 1, wingeom);
@ -426,7 +427,8 @@ LUA_OBJECT_EXPORT_PROPERTY(drawin, drawin_t, visible, lua_pushboolean)
static int static int
luaA_drawin_set_x(lua_State *L, drawin_t *drawin) luaA_drawin_set_x(lua_State *L, drawin_t *drawin)
{ {
drawin_moveresize(L, -3, (area_t) { .x = luaA_checkinteger(L, -1), int x = luaA_checkinteger_range(L, -1, MIN_X11_COORDINATE, MAX_X11_COORDINATE);
drawin_moveresize(L, -3, (area_t) { .x = x,
.y = drawin->geometry.y, .y = drawin->geometry.y,
.width = drawin->geometry.width, .width = drawin->geometry.width,
.height = drawin->geometry.height }); .height = drawin->geometry.height });
@ -443,8 +445,9 @@ luaA_drawin_get_x(lua_State *L, drawin_t *drawin)
static int static int
luaA_drawin_set_y(lua_State *L, drawin_t *drawin) luaA_drawin_set_y(lua_State *L, drawin_t *drawin)
{ {
int y = luaA_checkinteger_range(L, -1, MIN_X11_COORDINATE, MAX_X11_COORDINATE);
drawin_moveresize(L, -3, (area_t) { .x = drawin->geometry.x, drawin_moveresize(L, -3, (area_t) { .x = drawin->geometry.x,
.y = luaA_checkinteger(L, -1), .y = y,
.width = drawin->geometry.width, .width = drawin->geometry.width,
.height = drawin->geometry.height }); .height = drawin->geometry.height });
return 0; return 0;
@ -460,9 +463,7 @@ luaA_drawin_get_y(lua_State *L, drawin_t *drawin)
static int static int
luaA_drawin_set_width(lua_State *L, drawin_t *drawin) luaA_drawin_set_width(lua_State *L, drawin_t *drawin)
{ {
int width = luaA_checkinteger(L, -1); int width = luaA_checkinteger_range(L, -1, MIN_X11_SIZE, MAX_X11_SIZE);
if(width <= 0)
luaL_error(L, "invalid width");
drawin_moveresize(L, -3, (area_t) { .x = drawin->geometry.x, drawin_moveresize(L, -3, (area_t) { .x = drawin->geometry.x,
.y = drawin->geometry.y, .y = drawin->geometry.y,
.width = width, .width = width,
@ -480,9 +481,7 @@ luaA_drawin_get_width(lua_State *L, drawin_t *drawin)
static int static int
luaA_drawin_set_height(lua_State *L, drawin_t *drawin) luaA_drawin_set_height(lua_State *L, drawin_t *drawin)
{ {
int height = luaA_checkinteger(L, -1); int height = luaA_checkinteger_range(L, -1, MIN_X11_SIZE, MAX_X11_SIZE);
if(height <= 0)
luaL_error(L, "invalid height");
drawin_moveresize(L, -3, (area_t) { .x = drawin->geometry.x, drawin_moveresize(L, -3, (area_t) { .x = drawin->geometry.x,
.y = drawin->geometry.y, .y = drawin->geometry.y,
.width = drawin->geometry.width, .width = drawin->geometry.width,

View File

@ -29,6 +29,7 @@
#include "objects/window.h" #include "objects/window.h"
#include "common/atoms.h" #include "common/atoms.h"
#include "common/xutil.h"
#include "ewmh.h" #include "ewmh.h"
#include "property.h" #include "property.h"
#include "xwindow.h" #include "xwindow.h"
@ -352,7 +353,7 @@ window_set_xproperty(lua_State *L, xcb_window_t window, int prop_idx, int value_
} else if(prop->type == PROP_NUMBER || prop->type == PROP_BOOLEAN) } else if(prop->type == PROP_NUMBER || prop->type == PROP_BOOLEAN)
{ {
if (prop->type == PROP_NUMBER) if (prop->type == PROP_NUMBER)
number = luaL_checkinteger(L, value_idx); number = luaA_checkinteger_range(L, value_idx, 0, UINT32_MAX);
else else
number = luaA_checkboolean(L, value_idx); number = luaA_checkboolean(L, value_idx);
data = &number; data = &number;
@ -475,7 +476,7 @@ window_translate_type(window_type_t type)
static int static int
luaA_window_set_border_width(lua_State *L, window_t *c) luaA_window_set_border_width(lua_State *L, window_t *c)
{ {
window_set_border_width(L, -3, luaL_checknumber(L, -1)); window_set_border_width(L, -3, luaA_checkinteger_range(L, -1, 0, MAX_X11_SIZE));
return 0; return 0;
} }

5
root.c
View File

@ -30,6 +30,7 @@
#include "common/atoms.h" #include "common/atoms.h"
#include "common/xcursor.h" #include "common/xcursor.h"
#include "common/xutil.h"
#include "objects/button.h" #include "objects/button.h"
#include "xwindow.h" #include "xwindow.h"
@ -265,8 +266,8 @@ luaA_root_fake_input(lua_State *L)
{ {
type = XCB_MOTION_NOTIFY; type = XCB_MOTION_NOTIFY;
detail = luaA_checkboolean(L, 2); /* relative to the current position or not */ detail = luaA_checkboolean(L, 2); /* relative to the current position or not */
x = luaL_checkinteger(L, 3); x = luaA_checkinteger_range(L, 3, MIN_X11_COORDINATE, MAX_X11_COORDINATE);
y = luaL_checkinteger(L, 4); y = luaA_checkinteger_range(L, 4, MIN_X11_COORDINATE, MAX_X11_COORDINATE);
} }
else else
return 0; return 0;

View File

@ -51,10 +51,10 @@ void
luaA_tostrut(lua_State *L, int idx, strut_t *strut) luaA_tostrut(lua_State *L, int idx, strut_t *strut)
{ {
luaA_checktable(L, idx); luaA_checktable(L, idx);
strut->left = luaA_getopt_integer(L, idx, "left", strut->left); strut->left = luaA_getopt_integer_range(L, idx, "left", strut->left, 0, UINT16_MAX);
strut->right = luaA_getopt_integer(L, idx, "right", strut->right); strut->right = luaA_getopt_integer_range(L, idx, "right", strut->right, 0, UINT16_MAX);
strut->top = luaA_getopt_integer(L, idx, "top", strut->top); strut->top = luaA_getopt_integer_range(L, idx, "top", strut->top, 0, UINT16_MAX);
strut->bottom = luaA_getopt_integer(L, idx, "bottom", strut->bottom); strut->bottom = luaA_getopt_integer_range(L, idx, "bottom", strut->bottom, 0, UINT16_MAX);
} }
// vim: filetype=c:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80 // vim: filetype=c:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80

View File

@ -21,6 +21,7 @@
#include "systray.h" #include "systray.h"
#include "common/atoms.h" #include "common/atoms.h"
#include "common/xutil.h"
#include "objects/drawin.h" #include "objects/drawin.h"
#include "xwindow.h" #include "xwindow.h"
#include "globalconf.h" #include "globalconf.h"
@ -324,13 +325,13 @@ luaA_systray(lua_State *L)
{ {
size_t bg_len; size_t bg_len;
drawin_t *w = luaA_checkudata(L, 1, &drawin_class); drawin_t *w = luaA_checkudata(L, 1, &drawin_class);
int x = luaL_checkinteger(L, 2); int x = luaA_checkinteger_range(L, 2, MIN_X11_COORDINATE, MAX_X11_COORDINATE);
int y = luaL_checkinteger(L, 3); int y = luaA_checkinteger_range(L, 3, MIN_X11_COORDINATE, MAX_X11_COORDINATE);
int base_size = luaL_checkinteger(L, 4); int base_size = luaA_checkinteger_range(L, 4, MIN_X11_SIZE, MAX_X11_SIZE);
bool horiz = lua_toboolean(L, 5); bool horiz = lua_toboolean(L, 5);
const char *bg = luaL_checklstring(L, 6, &bg_len); const char *bg = luaL_checklstring(L, 6, &bg_len);
bool revers = lua_toboolean(L, 7); bool revers = lua_toboolean(L, 7);
int spacing = luaL_checkinteger(L, 8); int spacing = luaA_checkinteger_range(L, 8, 0, MAX_X11_COORDINATE);
color_t bg_color; color_t bg_color;
bool force_redraw = false; bool force_redraw = false;