Skip to content

Commit 8ac5a38

Browse files
committed
improve bounds checking
1 parent 5c3d16a commit 8ac5a38

File tree

2 files changed

+16
-16
lines changed

2 files changed

+16
-16
lines changed

c_src/texture.c

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,6 @@ nif_get_g(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
125125
// get the parameters
126126
if ( !enif_inspect_binary(env, argv[0], &pixels) ) {return enif_make_badarg(env);}
127127
if ( !enif_get_uint(env, argv[1], &pos) ) {return enif_make_badarg(env);}
128-
if ( pos < 0 ) {return enif_make_badarg(env);}
129128
if ( pos >= pixels.size ) {return enif_make_badarg(env);}
130129

131130
// return the value of g
@@ -143,7 +142,6 @@ nif_get_ga(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
143142
// get the parameters
144143
if ( !enif_inspect_binary(env, argv[0], &pixels) ) {return enif_make_badarg(env);}
145144
if ( !enif_get_uint(env, argv[1], &pos) ) {return enif_make_badarg(env);}
146-
if ( pos < 0 ) {return enif_make_badarg(env);}
147145
if ( pos >= (pixels.size - 1) ) {return enif_make_badarg(env);}
148146

149147
// get the values
@@ -169,7 +167,6 @@ nif_get_rgb(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
169167
// get the parameters
170168
if ( !enif_inspect_binary(env, argv[0], &pixels) ) {return enif_make_badarg(env);}
171169
if ( !enif_get_uint(env, argv[1], &pos) ) {return enif_make_badarg(env);}
172-
if ( pos < 0 ) {return enif_make_badarg(env);}
173170
if ( pos >= (pixels.size - 2) ) {return enif_make_badarg(env);}
174171

175172
// get the values
@@ -198,7 +195,6 @@ nif_get_rgba(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
198195
// get the parameters
199196
if ( !enif_inspect_binary(env, argv[0], &pixels) ) {return enif_make_badarg(env);}
200197
if ( !enif_get_uint(env, argv[1], &pos) ) {return enif_make_badarg(env);}
201-
if ( pos < 0 ) {return enif_make_badarg(env);}
202198
if ( pos >= (pixels.size - 3) ) {return enif_make_badarg(env);}
203199

204200
// get the values
@@ -227,7 +223,6 @@ nif_put_g(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
227223
// get the parameters
228224
if ( !enif_inspect_binary(env, argv[0], &pixels) ) {return enif_make_badarg(env);}
229225
if ( !enif_get_uint(env, argv[1], &pos) ) {return enif_make_badarg(env);}
230-
if ( pos < 0 ) {return enif_make_badarg(env);}
231226
if ( pos >= pixels.size ) {return enif_make_badarg(env);}
232227
if ( !enif_get_uint(env, argv[2], &g) ) {return enif_make_badarg(env);}
233228

@@ -248,7 +243,6 @@ nif_put_ga(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
248243
// get the parameters
249244
if ( !enif_inspect_binary(env, argv[0], &pixels) ) {return enif_make_badarg(env);}
250245
if ( !enif_get_uint(env, argv[1], &pos) ) {return enif_make_badarg(env);}
251-
if ( pos < 0 ) {return enif_make_badarg(env);}
252246
if ( pos >= (pixels.size - 1) ) {return enif_make_badarg(env);}
253247
if ( !enif_get_uint(env, argv[2], &g) ) {return enif_make_badarg(env);}
254248
if ( !enif_get_uint(env, argv[3], &a) ) {return enif_make_badarg(env);}
@@ -273,7 +267,6 @@ nif_put_rgb(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
273267
// get the parameters
274268
if ( !enif_inspect_binary(env, argv[0], &pixels) ) {return enif_make_badarg(env);}
275269
if ( !enif_get_uint(env, argv[1], &pos) ) {return enif_make_badarg(env);}
276-
if ( pos < 0 ) {return enif_make_badarg(env);}
277270
if ( pos >= (pixels.size - 2) ) {return enif_make_badarg(env);}
278271
if ( !enif_get_uint(env, argv[2], &r) ) {return enif_make_badarg(env);}
279272
if ( !enif_get_uint(env, argv[3], &g) ) {return enif_make_badarg(env);}
@@ -301,7 +294,6 @@ nif_put_rgba(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
301294
// get the parameters
302295
if ( !enif_inspect_binary(env, argv[0], &pixels) ) {return enif_make_badarg(env);}
303296
if ( !enif_get_uint(env, argv[1], &pos) ) {return enif_make_badarg(env);}
304-
if ( pos < 0 ) {return enif_make_badarg(env);}
305297
if ( pos >= (pixels.size - 3) ) {return enif_make_badarg(env);}
306298
if ( !enif_get_uint(env, argv[2], &r) ) {return enif_make_badarg(env);}
307299
if ( !enif_get_uint(env, argv[3], &g) ) {return enif_make_badarg(env);}

lib/utilities/texture.ex

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -148,10 +148,18 @@ defmodule Scenic.Utilities.Texture do
148148

149149
# --------------------------------------------------------
150150
def get(texture, x, y)
151-
def get({:g, w, h, p, _}, x, y) when x <= w and y <= h, do: nif_get_g(p, y * w + x)
152-
def get({:ga, w, h, p, _}, x, y) when x <= w and y <= h, do: nif_get_ga(p, y * w + x)
153-
def get({:rgb, w, h, p, _}, x, y) when x <= w and y <= h, do: nif_get_rgb(p, y * w + x)
154-
def get({:rgba, w, h, p, _}, x, y) when x <= w and y <= h, do: nif_get_rgba(p, y * w + x)
151+
152+
def get({:g, w, h, p, _}, x, y) when x >= 0 and x <= w and y >= 0 and y <= h,
153+
do: nif_get_g(p, y * w + x)
154+
155+
def get({:ga, w, h, p, _}, x, y) when x >= 0 and x <= w and y >= 0 and y <= h,
156+
do: nif_get_ga(p, y * w + x)
157+
158+
def get({:rgb, w, h, p, _}, x, y) when x >= 0 and x <= w and y >= 0 and y <= h,
159+
do: nif_get_rgb(p, y * w + x)
160+
161+
def get({:rgba, w, h, p, _}, x, y) when x >= 0 and x <= w and y >= 0 and y <= h,
162+
do: nif_get_rgba(p, y * w + x)
155163

156164
defp nif_get_g(_, _), do: :erlang.nif_error("Did not find nif_get_g")
157165
defp nif_get_ga(_, _), do: :erlang.nif_error("Did not find nif_get_ga")
@@ -161,25 +169,25 @@ defmodule Scenic.Utilities.Texture do
161169
# --------------------------------------------------------
162170
def put!(texture, x, y, color)
163171

164-
def put!({:g, w, h, p, hints}, x, y, color) when x <= w and y <= h do
172+
def put!({:g, w, h, p, hints}, x, y, color) when x >= 0 and x <= w and y >= 0 and y <= h do
165173
g = prep_color(:g, color)
166174
nif_put(p, y * w + x, g)
167175
{:g, w, h, p, hints}
168176
end
169177

170-
def put!({:ga, w, h, p, hints}, x, y, color) when x <= w and y <= h do
178+
def put!({:ga, w, h, p, hints}, x, y, color) when x >= 0 and x <= w and y >= 0 and y <= h do
171179
{g, a} = prep_color(:ga, color)
172180
nif_put(p, y * w + x, g, a)
173181
{:ga, w, h, p, hints}
174182
end
175183

176-
def put!({:rgb, w, h, p, hints}, x, y, color) when x <= w and y <= h do
184+
def put!({:rgb, w, h, p, hints}, x, y, color) when x >= 0 and x <= w and y >= 0 and y <= h do
177185
{r, g, b} = prep_color(:rgb, color)
178186
nif_put(p, y * w + x, r, g, b)
179187
{:rgb, w, h, p, hints}
180188
end
181189

182-
def put!({:rgba, w, h, p, hints}, x, y, color) when x <= w and y <= h do
190+
def put!({:rgba, w, h, p, hints}, x, y, color) when x >= 0 and x <= w and y >= 0 and y <= h do
183191
{r, g, b, a} = Color.to_rgba(color)
184192
nif_put(p, y * w + x, r, g, b, a)
185193
{:rgba, w, h, p, hints}

0 commit comments

Comments
 (0)