X-Git-Url: http://andersk.mit.edu/gitweb/moira.git/blobdiff_plain/4ce8321c959682cfafd2200fce4bc99fa2949a58..refs/heads/LOCKING:/server/mr_scall.c diff --git a/server/mr_scall.c b/server/mr_scall.c index a3671b97..eecc2d0d 100644 --- a/server/mr_scall.c +++ b/server/mr_scall.c @@ -24,11 +24,15 @@ static char *rcsid_sms_scall_c = "$Header$"; extern char buf1[]; extern int nclients; extern char *whoami; -extern char *malloc(); extern int errno; extern void clist_delete(), do_auth(), do_shutdown(); void do_call(); +extern int ingres_errno, mr_errcode; +static int row_count; + +/* Put this in a variable so that we can patch it if necessary */ +int max_row_count = 2048; /* * Welcome to the (finite state) machine (highest level). @@ -175,17 +179,26 @@ retr_callback(argc, argv, p_cp) char *p_cp; { register client *cp = (client *)p_cp; + mr_params *arg_tmp; + returned_tuples *tp; + OPERATION op_tmp; + register char **nargv; + register int i; + + if (row_count++ >= max_row_count) { + ingres_errno = mr_errcode = MR_NO_MEM; + return; + } + /* * This takes too much advantage of the fact that * serialization of the data happens during the queue operation. */ - mr_params *arg_tmp = (mr_params *)db_alloc(sizeof(mr_params)); - returned_tuples *tp = (returned_tuples *) - db_alloc(sizeof(returned_tuples)); - register char **nargv = (char **)malloc(argc * sizeof(char *)); - register int i; + arg_tmp = (mr_params *)db_alloc(sizeof(mr_params)); + tp = (returned_tuples *)db_alloc(sizeof(returned_tuples)); + nargv = (char **)malloc(argc * sizeof(char *)); - OPERATION op_tmp = create_operation(); + op_tmp = create_operation(); if (mr_trim_args(argc, argv) == MR_NO_MEM) { com_err(whoami, MR_NO_MEM, "while trimming args"); @@ -233,7 +246,6 @@ list_users(callbk, callarg) extern client **clients; extern char *inet_ntoa(); char *cp; - char *index(); char *ctime(); for (i = 0; i < nclients; i++) { @@ -262,7 +274,13 @@ do_retr(cl) cl->reply.mr_argc = 0; cl->reply.mr_status = 0; + row_count = 0; + if (cl->args->mr_argc < 1) { + cl->reply.mr_status = MR_ARGS; + com_err(whoami, MR_ARGS, "got nameless query"); + return; + } queryname = cl->args->mr_argv[0]; if (cl->args->mr_version_no == MR_VERSION_2) @@ -275,12 +293,17 @@ do_retr(cl) else { cl->reply.mr_status = mr_process_query(cl, - cl->args->mr_argv[0], + queryname, cl->args->mr_argc-1, cl->args->mr_argv+1, retr_callback, (char *)cl); } + if (row_count >= max_row_count) { + critical_alert("moirad", "attempted query %s with %d rows\n", + queryname, row_count); + } + if (log_flags & LOG_RES) com_err(whoami, 0, "Query complete."); } @@ -288,6 +311,11 @@ do_retr(cl) do_access(cl) client *cl; { + if (cl->args->mr_argc < 1) { + cl->reply.mr_status = MR_ARGS; + com_err(whoami, MR_ARGS, "got nameless access"); + return; + } cl->reply.mr_argc = 0; cl->reply.mr_status = @@ -354,6 +382,7 @@ client *cl; len = read(motd, buffer, sizeof(buffer) - 1); close(motd); buffer[len] = 0; + row_count = 0; retr_callback(1, arg, cl); cl->reply.mr_status = 0; }