View Issue Details
| ID | Project | Category | View Status | Date Submitted | Last Update |
|---|---|---|---|---|---|
| 0000543 | LDMud 3.3 | Efuns | public | 2008-07-01 01:10 | 2008-07-10 02:00 |
| Reporter | Gnomi | Assigned To | Gnomi | ||
| Priority | normal | Severity | feature | Reproducibility | always |
| Status | resolved | Resolution | fixed | ||
| Platform | i686 | OS | Debian GNU/Linux | OS Version | 4.0 |
| Product Version | 3.3.716 | ||||
| Fixed in Version | 3.3.717 | ||||
| Summary | 0000543: Mudlib controlled sqlite pragmas | ||||
| Description | This is a patch that calls master->privilege_violation for each sqlite pragma, so that the mudlib can decide whether to allow or disallow. The current behavior is to allow 'pragma synchronous' and disallow all other. (This is a TODO item in pkg-sqlite.c.) In UNItopia we used this patch for a year. The only drawback I can see is that it makes secure_apply_error visible to all the other files, but I wanted to avoid duplicate code and I do need such a function for error handling. | ||||
| Tags | No tags attached. | ||||
| Attached Files | sqlite_pragma.diff (5,184 bytes)
Index: 3.3sqlite/src/pkg-sqlite.c
===================================================================
--- 3.3sqlite/src/pkg-sqlite.c (Revision 2314)
+++ 3.3sqlite/src/pkg-sqlite.c (Arbeitskopie)
@@ -74,7 +74,7 @@
/* The list of database connections.
*/
static sqlite_dbs_t *head = NULL;
-
+
/*-------------------------------------------------------------------------*/
static sqlite_dbs_t *
find_db (object_t * obj)
@@ -150,29 +150,83 @@
/*-------------------------------------------------------------------------*/
static int
-my_sqlite3_authorizer(void * data, int what, const char* arg1, const char* arg2,
+my_sqlite3_authorizer (void * data, int what, const char* arg1, const char* arg2,
const char* dbname, const char* view)
/* Callback function for SQLite to handle authorizations.
*/
{
- /* TODO: Check them via privilege_violation resp. valid_write.
- (Don't know, whether sqlite can handle longjmps out of
- its code in case of an error...)
- */
-
+ struct error_recovery_info error_recovery_info;
+ svalue_t *save_sp, sarg1, sarg2;
+ struct control_stack *save_csp;
+ int val;
+
switch(what)
{
case SQLITE_PRAGMA:
- if(!strcasecmp(arg1, "synchronous"))
- return SQLITE_OK;
- return SQLITE_DENY;
+ /* PRAGMA name [ = value ]
+ * PRAGMA function(arg)
+ *
+ * arg1: name/function
+ * arg2: value/arg
+ * dbname/view: NULL
+ */
+
+ error_recovery_info.rt.last = rt_context;
+ error_recovery_info.rt.type = ERROR_RECOVERY_APPLY;
+ rt_context = (rt_context_t *)&error_recovery_info;
+ save_sp = inter_sp;
+ save_csp = csp;
+ sarg1.type = T_INVALID;
+ sarg2.type = T_INVALID;
+
+ if (setjmp(error_recovery_info.con.text))
+ {
+ secure_apply_error(save_sp, save_csp, MY_FALSE);
+ val = SQLITE_DENY;
+ }
+ else
+ {
+ if(arg1)
+ put_c_string(&sarg1, arg1);
+ else
+ put_number(&sarg1, 0);
+
+ if(arg2)
+ put_c_string(&sarg2, arg2);
+ else
+ put_number(&sarg2, 0);
+
+ if(privilege_violation2(STR_SQLITE_PRAGMA, &sarg1, &sarg2, inter_sp))
+ val = SQLITE_OK;
+ else
+ val = SQLITE_DENY;
+ }
+
+ free_svalue(&sarg1);
+ sarg1.type = T_INVALID;
+ free_svalue(&sarg2);
+ sarg2.type = T_INVALID;
+
+ rt_context = error_recovery_info.rt.last;
+
+ return val;
+
case SQLITE_ATTACH:
- case SQLITE_DETACH:
+ /* ATTACH "filename" AS "dbname"
+ *
+ * arg1: filename
+ * arg2, dbname, view: NULL
+ */
+
+ /* SQLite3 doesn't allow the filename to be changed,
+ * but at least we must convert an absolute pathname
+ * to a relative one. So we have to deactivate it...
+ */
return SQLITE_DENY;
-
+
default:
return SQLITE_OK;
}
@@ -323,7 +377,7 @@
db = find_db (current_object);
if (!db)
errorf("The current object doesn't have a database open.\n");
-
+
err = sqlite3_prepare(db->db, get_txt(argp->u.str), mstrsize(argp->u.str),
&stmt, &tail);
if(err)
Index: 3.3sqlite/src/string_spec
===================================================================
--- 3.3sqlite/src/string_spec (Revision 2314)
+++ 3.3sqlite/src/string_spec (Arbeitskopie)
@@ -232,6 +232,7 @@
#ifdef USE_SQLITE
SQLITE_OPEN "sl_open"
+SQLITE_PRAGMA "sqlite_pragma"
#endif
/***************************************************************************/
Index: 3.3sqlite/src/interpret.c
===================================================================
--- 3.3sqlite/src/interpret.c (Revision 2314)
+++ 3.3sqlite/src/interpret.c (Arbeitskopie)
@@ -17093,7 +17093,7 @@
} /* apply() */
/*-------------------------------------------------------------------------*/
-static void
+void
secure_apply_error ( svalue_t *save_sp, struct control_stack *save_csp
, Bool clear_costs)
Index: 3.3sqlite/src/interpret.h
===================================================================
--- 3.3sqlite/src/interpret.h (Revision 2314)
+++ 3.3sqlite/src/interpret.h (Arbeitskopie)
@@ -183,6 +183,7 @@
extern int get_line_number_if_any(string_t **name);
extern void reset_machine(Bool first);
extern svalue_t *secure_apply(string_t *fun, object_t *ob, int num_arg);
+extern void secure_apply_error(svalue_t *save_sp, struct control_stack *save_csp, Bool clear_costs);
extern svalue_t *apply_master_ob(string_t *fun, int num_arg, Bool external);
#define apply_master(fun, num_arg) apply_master_ob(fun, num_arg, MY_FALSE)
#define callback_master(fun, num_arg) apply_master_ob(fun, num_arg, MY_TRUE)
| ||||
|
|
Seems to me OK as well. Did you know if secure_apply_error() was actually inlined until now or did you recognize any impact? But anyway I guess, it would be neglectable. I think, the thing missing is the documentation (doc/master/privilege_violation). ;-) |
|
|
I doesn't look like it was inlined before. But errors in master applies should be rare, so it doesn't matter much. Oh, documentation, right. I'll try. :-) |
|
|
Committed as r2378. |
| Date Modified | Username | Field | Change |
|---|---|---|---|
| 2008-07-01 01:10 | Gnomi | New Issue | |
| 2008-07-01 01:10 | Gnomi | Status | new => assigned |
| 2008-07-01 01:10 | Gnomi | Assigned To | => Gnomi |
| 2008-07-01 01:10 | Gnomi | File Added: sqlite_pragma.diff | |
| 2008-07-08 15:45 | zesstra | Note Added: 0000688 | |
| 2008-07-09 08:39 | Gnomi | Note Added: 0000703 | |
| 2008-07-10 02:00 | Gnomi | Status | assigned => resolved |
| 2008-07-10 02:00 | Gnomi | Fixed in Version | => 3.3.717 |
| 2008-07-10 02:00 | Gnomi | Resolution | open => fixed |
| 2008-07-10 02:00 | Gnomi | Note Added: 0000712 |