|
| 1 | +From f7c46500f455eb4edfc3656c3fa20af61b16abb7 Mon Sep 17 00:00:00 2001 |
| 2 | +From: luke <luke@00db46b3-68df-0310-9c12-caf00c1e9a41> |
| 3 | +Date: Sun, 31 Mar 2024 19:35:58 +0000 |
| 4 | +Subject: [PATCH] readRDS() and unserialize() now signal an errorr instead of |
| 5 | + returning a PROMSXP. |
| 6 | + |
| 7 | +git-svn-id: https://svn.r-project.org/R/trunk@86235 00db46b3-68df-0310-9c12-caf00c1e9a41 |
| 8 | +--- |
| 9 | + src/main/serialize.c | 13 ++++++++++--- |
| 10 | + 1 file changed, 10 insertions(+), 3 deletions(-) |
| 11 | + |
| 12 | +diff --git a/src/main/serialize.c b/src/main/serialize.c |
| 13 | +index a389f713116..a190fbf8f3c 100644 |
| 14 | +--- a/src/main/serialize.c |
| 15 | ++++ b/src/main/serialize.c |
| 16 | +@@ -2650,6 +2650,13 @@ do_serializeToConn(SEXP call, SEXP op, SEXP args, SEXP env) |
| 17 | + return R_NilValue; |
| 18 | + } |
| 19 | + |
| 20 | ++static SEXP checkNotPromise(SEXP val) |
| 21 | ++{ |
| 22 | ++ if (TYPEOF(val) == PROMSXP) |
| 23 | ++ error(_("cannot return a promise (PROMSXP) object")); |
| 24 | ++ return val; |
| 25 | ++} |
| 26 | ++ |
| 27 | + /* unserializeFromConn(conn, hook) used from readRDS(). |
| 28 | + It became public in R 2.13.0, and that version added support for |
| 29 | + connections internally */ |
| 30 | +@@ -2699,7 +2706,7 @@ do_unserializeFromConn(SEXP call, SEXP op, SEXP args, SEXP env) |
| 31 | + con->close(con); |
| 32 | + UNPROTECT(1); |
| 33 | + } |
| 34 | +- return ans; |
| 35 | ++ return checkNotPromise(ans); |
| 36 | + } |
| 37 | + |
| 38 | + /* |
| 39 | +@@ -3330,8 +3337,8 @@ attribute_hidden SEXP |
| 40 | + do_serialize(SEXP call, SEXP op, SEXP args, SEXP env) |
| 41 | + { |
| 42 | + checkArity(op, args); |
| 43 | +- if (PRIMVAL(op) == 2) return R_unserialize(CAR(args), CADR(args)); |
| 44 | +- |
| 45 | ++ if (PRIMVAL(op) == 2) //return R_unserialize(CAR(args), CADR(args)); |
| 46 | ++ return checkNotPromise(R_unserialize(CAR(args), CADR(args))); |
| 47 | + SEXP object, icon, type, ver, fun; |
| 48 | + object = CAR(args); args = CDR(args); |
| 49 | + icon = CAR(args); args = CDR(args); |
0 commit comments