Skip to content

Commit 2c152b8

Browse files
committed
FIX: System crash when reading any http request
fixes: #11 related to: metaeducation/rebol-issues#2362
1 parent cfc52b0 commit 2c152b8

File tree

5 files changed

+47
-20
lines changed

5 files changed

+47
-20
lines changed

src/core/t-event.c

+29-18
Original file line numberDiff line numberDiff line change
@@ -120,15 +120,24 @@
120120
case SYM_OFFSET:
121121
if (IS_PAIR(val)) {
122122
SET_EVENT_XY(value, Float_Int16(VAL_PAIR_X(val)), Float_Int16(VAL_PAIR_Y(val)));
123+
CLR_FLAG(VAL_EVENT_FLAGS(value), EVF_HAS_CODE);
124+
SET_FLAG(VAL_EVENT_FLAGS(value), EVF_HAS_XY);
125+
break;
123126
}
124-
else return FALSE;
125-
break;
127+
//O: should it be possible to remove offset value from event?
128+
//else if (IS_NONE(val)) {
129+
// CLR_FLAG(VAL_EVENT_FLAGS(value), EVF_HAS_XY);
130+
//}
131+
return FALSE;
126132

127133
case SYM_KEY:
128134
//VAL_EVENT_TYPE(value) != EVT_KEY && VAL_EVENT_TYPE(value) != EVT_KEY_UP)
129135
VAL_EVENT_MODEL(value) = EVM_GUI;
130136
if (IS_CHAR(val)) {
131137
VAL_EVENT_DATA(value) = VAL_CHAR(val);
138+
CLR_FLAG(VAL_EVENT_FLAGS(value), EVF_HAS_XY);
139+
SET_FLAG(VAL_EVENT_FLAGS(value), EVF_HAS_CODE);
140+
break;
132141
}
133142
else if (IS_LIT_WORD(val) || IS_WORD(val)) {
134143
arg = Get_System(SYS_VIEW, VIEW_EVENT_KEYS);
@@ -143,20 +152,21 @@
143152
if (IS_END(arg)) return FALSE;
144153
break;
145154
}
146-
return FALSE;
147155
}
148-
else return FALSE;
149-
break;
156+
return FALSE;
150157

151158
case SYM_CODE:
159+
//if (GET_FLAG(VAL_EVENT_FLAGS(value), EVF_HAS_XY)) return FALSE;
152160
if (IS_INTEGER(val)) {
153-
VAL_EVENT_DATA(value) = VAL_INT32(val);
161+
VAL_EVENT_DATA(value) = VAL_INT64(val);
162+
CLR_FLAG(VAL_EVENT_FLAGS(value), EVF_HAS_XY);
163+
SET_FLAG(VAL_EVENT_FLAGS(value), EVF_HAS_CODE);
164+
break;
154165
}
155-
else return FALSE;
156-
break;
166+
return FALSE;
157167

158168
default:
159-
return FALSE;
169+
return FALSE;
160170
}
161171

162172
return TRUE;
@@ -210,7 +220,7 @@
210220
*val = *Get_System(SYS_VIEW, VIEW_EVENT_PORT);
211221
}
212222
// Event holds a port:
213-
else if (IS_PORT(value) && (IS_EVENT_MODEL(value, EVM_PORT) || IS_EVENT_MODEL(value, EVM_MIDI))) {
223+
else if (IS_EVENT_MODEL(value, EVM_PORT) || IS_EVENT_MODEL(value, EVM_MIDI)) {
214224
SET_PORT(val, VAL_EVENT_SER(value));
215225
}
216226
// Event holds an object:
@@ -242,12 +252,13 @@
242252
goto is_none;
243253

244254
case SYM_OFFSET:
245-
if (IS_EVENT_MODEL(value, EVM_GUI) && VAL_EVENT_TYPE(value) != EVT_KEY && VAL_EVENT_TYPE(value) != EVT_KEY_UP) {
255+
if (GET_FLAG(VAL_EVENT_FLAGS(value), EVF_HAS_XY)) {
246256
VAL_SET(val, REB_PAIR);
247257
VAL_PAIR_X(val) = (REBD32)VAL_EVENT_X(value);
248258
VAL_PAIR_Y(val) = (REBD32)VAL_EVENT_Y(value);
249-
} else goto is_none;
250-
break;
259+
break;
260+
}
261+
goto is_none;
251262

252263
case SYM_KEY:
253264
if (VAL_EVENT_TYPE(value) != EVT_KEY && VAL_EVENT_TYPE(value) != EVT_KEY_UP)
@@ -285,11 +296,11 @@
285296
break;
286297

287298
case SYM_CODE:
288-
if (VAL_EVENT_TYPE(value) != EVT_KEY && VAL_EVENT_TYPE(value) != EVT_KEY_UP)
289-
goto is_none;
290-
n = VAL_EVENT_DATA(value); // key-words in top 16, chars in lower 16
291-
SET_INTEGER(val, n);
292-
break;
299+
if (GET_FLAG(VAL_EVENT_FLAGS(value), EVF_HAS_CODE)) {
300+
SET_INTEGER(val, VAL_EVENT_DATA(value)); // key-words in top 16, chars in lower 16
301+
break;
302+
}
303+
goto is_none;
293304

294305
case SYM_DATA:
295306
// Event holds a file string:

src/include/reb-event.h

+1
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ enum {
6060
EVF_CONTROL,
6161
EVF_SHIFT,
6262
EVF_HAS_DATA, // drop_file event series contains data instead of gob
63+
EVF_HAS_CODE, // XY value is interpreted as integer instead of pair
6364
};
6465

6566

src/mezz/prot-http.r

+1-1
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ read-sync-awake: func [event [event!] /local error][
121121
true
122122
]
123123
custom [
124-
if all [event/offset event/offset/x = 300][
124+
if event/code = 300 [
125125
event/port/state/state: 'redirect
126126
return true
127127
]

src/tests/units/mold-test.r3

+9-1
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,15 @@ Rebol [
237237
;@@ https://github.com/rebol/rebol-issues/issues/2362
238238
p: make object! [x: "foo"]
239239
e: make event! [type: 'lookup port: p]
240-
--assert {make event! [type: 'lookup port: make object! [x: "foo"]]} = mold/flat e
240+
--assert (mold/flat e) = {make event! [type: 'lookup port: make object! [x: "foo"]]}
241+
e: make event! [type: 'move offset: 10x20]
242+
--assert (mold/flat e) = {make event! [type: 'move offset: 10x20]}
243+
244+
; only code or offset may be used!
245+
e: make event! [type: 'move code: 100 offset: 10x20]
246+
--assert (mold/flat e) = {make event! [type: 'move offset: 10x20]}
247+
e: make event! [type: 'move offset: 10x20 code: 100]
248+
--assert (mold/flat e) = {make event! [type: 'move code: 100]}
241249

242250
===end-group===
243251

src/tests/units/port-test.r3

+7
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,13 @@ Rebol [
7979

8080
===end-group===
8181

82+
===start-group=== "HTTP scheme"
83+
--test-- "read HTTP"
84+
--assert string? try [read http://google.com]
85+
--test-- "read HTTPS"
86+
--assert string? try [read https://www.google.com]
87+
===end-group===
88+
8289

8390
if "true" <> get-env "CONTINUOUS_INTEGRATION" [
8491
;- don't do these tests on Travis CI

0 commit comments

Comments
 (0)