/* This function will be call back from libsed functions if there is any error
* happend during execution of sed scripts
*/
-static void log_sed_errf(void *data, const char *error)
+static apr_status_t log_sed_errf(void *data, const char *error)
{
request_rec *r = (request_rec *) data;
ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, error);
+ return APR_SUCCESS;
}
/* This function will be call back from libsed functions if there is any
* compilation error.
*/
-static void sed_compile_errf(void *data, const char *error)
+static apr_status_t sed_compile_errf(void *data, const char *error)
{
sed_expr_config *sed_cfg = (sed_expr_config *) data;
sed_cfg->last_error = error;
+ return APR_SUCCESS;
}
/* clear the temporary pool (used for transient buckets)
/* append_bucket
* Allocate a new bucket from buf and sz and append to ctx->bb
*/
-static void append_bucket(sed_filter_ctxt* ctx, char* buf, int sz)
+static apr_status_t append_bucket(sed_filter_ctxt* ctx, char* buf, int sz)
{
- int rv;
+ apr_status_t status = APR_SUCCESS;
apr_bucket *b;
if (ctx->tpool == ctx->r->pool) {
/* We are not using transient bucket */
if (ctx->numbuckets >= MAX_TRANSIENT_BUCKETS) {
b = apr_bucket_flush_create(ctx->r->connection->bucket_alloc);
APR_BRIGADE_INSERT_TAIL(ctx->bb, b);
- rv = ap_pass_brigade(ctx->f->next, ctx->bb);
+ status = ap_pass_brigade(ctx->f->next, ctx->bb);
apr_brigade_cleanup(ctx->bb);
clear_ctxpool(ctx);
}
}
+ return status;
}
/*
* flush_output_buffer
* Flush the output data (stored in ctx->outbuf)
*/
-static void flush_output_buffer(sed_filter_ctxt *ctx)
+static apr_status_t flush_output_buffer(sed_filter_ctxt *ctx)
{
int size = ctx->curoutbuf - ctx->outbuf;
char *out;
+ apr_status_t status = APR_SUCCESS;
if ((ctx->outbuf == NULL) || (size <=0))
- return;
+ return status;
out = apr_palloc(ctx->tpool, size);
memcpy(out, ctx->outbuf, size);
- append_bucket(ctx, out, size);
+ status = append_bucket(ctx, out, size);
ctx->curoutbuf = ctx->outbuf;
+ return status;
}
/* This is a call back function. When libsed wants to generate the output,
* this function will be invoked.
*/
-static void sed_write_output(void *dummy, char *buf, int sz)
+static apr_status_t sed_write_output(void *dummy, char *buf, int sz)
{
/* dummy is basically filter context. Context is passed during invocation
* of sed_eval_buffer
*/
int remainbytes = 0;
+ apr_status_t status = APR_SUCCESS;
sed_filter_ctxt *ctx = (sed_filter_ctxt *) dummy;
if (ctx->outbuf == NULL) {
alloc_outbuf(ctx);
ctx->curoutbuf += remainbytes;
}
/* buffer is now full */
- append_bucket(ctx, ctx->outbuf, ctx->bufsize);
+ status = append_bucket(ctx, ctx->outbuf, ctx->bufsize);
/* old buffer is now used so allocate new buffer */
alloc_outbuf(ctx);
- /* if size is bigger than the allocated buffer directly add to output brigade */
- if (sz >= ctx->bufsize) {
+ /* if size is bigger than the allocated buffer directly add to output
+ * brigade */
+ if ((status == APR_SUCCESS) && (sz >= ctx->bufsize)) {
char* newbuf = apr_palloc(ctx->tpool, sz);
memcpy(newbuf, buf, sz);
- append_bucket(ctx, newbuf, sz);
+ status = append_bucket(ctx, newbuf, sz);
/* pool might get clear after append_bucket */
if (ctx->outbuf == NULL) {
alloc_outbuf(ctx);
memcpy(ctx->curoutbuf, buf, sz);
ctx->curoutbuf += sz;
}
+ return status;
}
/* Compile a sed expression. Compiled context is saved in sed_cfg->sed_cmds.
{
apr_status_t status;
sed_filter_ctxt* ctx;
- apr_pool_t *tpool;
request_rec *r = f->r;
/* Create the context. Call sed_init_eval. libsed will generated
* output by calling sed_write_output and generates any error by
apr_bucket *b1 = APR_BUCKET_NEXT(b);
/* Now clean up the internal sed buffer */
sed_finalize_eval(&ctx->eval, ctx);
- flush_output_buffer(ctx);
+ status = flush_output_buffer(ctx);
+ if (status != APR_SUCCESS) {
+ clear_ctxpool(ctx);
+ return status;
+ }
APR_BUCKET_REMOVE(b);
/* Insert the eos bucket to ctx->bb brigade */
APR_BRIGADE_INSERT_TAIL(ctx->bb, b);
else if (APR_BUCKET_IS_FLUSH(b)) {
apr_bucket *b1 = APR_BUCKET_NEXT(b);
APR_BUCKET_REMOVE(b);
- flush_output_buffer(ctx);
+ status = flush_output_buffer(ctx);
+ if (status != APR_SUCCESS) {
+ clear_ctxpool(ctx);
+ return status;
+ }
APR_BRIGADE_INSERT_TAIL(ctx->bb, b);
b = b1;
}
}
}
apr_brigade_cleanup(bb);
- flush_output_buffer(ctx);
- status = APR_SUCCESS;
+ status = flush_output_buffer(ctx);
+ if (status != APR_SUCCESS) {
+ clear_ctxpool(ctx);
+ return status;
+ }
if (!APR_BRIGADE_EMPTY(ctx->bb)) {
status = ap_pass_brigade(f->next, ctx->bb);
apr_brigade_cleanup(ctx->bb);
static char *place(sed_eval_t *eval, char *asp, char *al1, char *al2);
static apr_status_t command(sed_eval_t *eval, sed_reptr_t *ipc,
step_vars_storage *step_vars);
-static void wline(sed_eval_t *eval, char *buf, int sz);
-static void arout(sed_eval_t *eval);
+static apr_status_t wline(sed_eval_t *eval, char *buf, int sz);
+static apr_status_t arout(sed_eval_t *eval);
static void eval_errf(sed_eval_t *eval, const char *fmt, ...)
{
eval->lspend--;
*eval->lspend = '\0';
rv = execute(eval);
- if (rv != 0)
- return APR_EGENERAL;
+ if (rv != APR_SUCCESS)
+ return rv;
}
while (bufsz) {
buf += (llen + 1);
bufsz -= (llen + 1);
rv = execute(eval);
- if (rv != 0)
- return APR_EGENERAL;
+ if (rv != APR_SUCCESS)
+ return rv;
if (eval->quitflag)
break;
}
*eval->lspend = '\0';
rv = execute(eval);
- if (rv != 0)
- return APR_EGENERAL;
+ if (rv != APR_SUCCESS)
+ return rv;
}
eval->quitflag = 1;
{
sed_reptr_t *ipc = eval->commands->ptrspace;
step_vars_storage step_vars;
+ apr_status_t rv = APR_SUCCESS;
eval->lnum++;
while (ipc->command) {
char *p1;
char *p2;
- apr_status_t rv;
int c;
p1 = ipc->ad1;
ipc = ipc->next;
}
- if (!eval->commands->nflag && !eval->delflag)
- wline(eval, eval->linebuf, eval->lspend - eval->linebuf);
+ if (!eval->commands->nflag && !eval->delflag) {
+ rv = wline(eval, eval->linebuf, eval->lspend - eval->linebuf);
+ if (rv != APR_SUCCESS)
+ return rv;
+ }
if (eval->aptr > eval->abuf)
- arout(eval);
+ rv = arout(eval);
eval->delflag = 0;
eval->lspend = eval->linebuf;
- return APR_SUCCESS;
+ return rv;
}
/*
char *p1, *p2, *p3;
int length;
char sz[32]; /* 32 bytes enough to store 64 bit integer in decimal */
+ apr_status_t rv = APR_SUCCESS;
switch(ipc->command) {
if(!eval->inar[ipc->nrep] || eval->dolflag) {
for (p1 = ipc->re1; *p1; p1++)
;
- wline(eval, ipc->re1, p1 - ipc->re1);
+ rv = wline(eval, ipc->re1, p1 - ipc->re1);
}
break;
case DCOM:
case EQCOM:
length = apr_snprintf(sz, sizeof(sz), "%d", (int) eval->lnum);
- wline(eval, sz, length);
+ rv = wline(eval, sz, length);
break;
case GCOM:
case ICOM:
for (p1 = ipc->re1; *p1; p1++);
- wline(eval, ipc->re1, p1 - ipc->re1);
+ rv = wline(eval, ipc->re1, p1 - ipc->re1);
break;
case BCOM:
while ((*p2++ = *p3++) != 0)
if(p2 >= eval->lcomend) {
*p2 = '\\';
- wline(eval, eval->genbuf,
- strlen(eval->genbuf));
+ rv = wline(eval, eval->genbuf,
+ strlen(eval->genbuf));
+ if (rv != APR_SUCCESS)
+ return rv;
p2 = eval->genbuf;
}
p2--;
*p2++ = '\\';
if(p2 >= eval->lcomend) {
*p2 = '\\';
- wline(eval, eval->genbuf, strlen(eval->genbuf));
+ rv = wline(eval, eval->genbuf,
+ strlen(eval->genbuf));
+ if (rv != APR_SUCCESS)
+ return rv;
p2 = eval->genbuf;
}
*p2++ = (*p1 >> 6) + '0';
if(p2 >= eval->lcomend) {
*p2 = '\\';
- wline(eval, eval->genbuf, strlen(eval->genbuf));
+ rv = wline(eval, eval->genbuf,
+ strlen(eval->genbuf));
+ if (rv != APR_SUCCESS)
+ return rv;
p2 = eval->genbuf;
}
*p2++ = ((*p1 >> 3) & 07) + '0';
if(p2 >= eval->lcomend) {
*p2 = '\\';
- wline(eval, eval->genbuf, strlen(eval->genbuf));
+ rv = wline(eval, eval->genbuf,
+ strlen(eval->genbuf));
+ if (rv != APR_SUCCESS)
+ return rv;
p2 = eval->genbuf;
}
*p2++ = (*p1++ & 07) + '0';
if(p2 >= eval->lcomend) {
*p2 = '\\';
- wline(eval, eval->genbuf, strlen(eval->genbuf));
+ rv = wline(eval, eval->genbuf,
+ strlen(eval->genbuf));
+ if (rv != APR_SUCCESS)
+ return rv;
p2 = eval->genbuf;
}
} else {
*p2++ = *p1++;
if(p2 >= eval->lcomend) {
*p2 = '\\';
- wline(eval, eval->genbuf, strlen(eval->genbuf));
+ rv = wline(eval, eval->genbuf,
+ strlen(eval->genbuf));
+ if (rv != APR_SUCCESS)
+ return rv;
p2 = eval->genbuf;
}
}
while ((*p2++ = *p3++) != 0)
if(p2 >= eval->lcomend) {
*p2 = '\\';
- wline(eval, eval->genbuf, strlen(eval->genbuf));
+ rv = wline(eval, eval->genbuf,
+ strlen(eval->genbuf));
+ if (rv != APR_SUCCESS)
+ return rv;
p2 = eval->genbuf;
}
p2--;
p1++;
}
*p2 = 0;
- wline(eval, eval->genbuf, strlen(eval->genbuf));
+ rv = wline(eval, eval->genbuf, strlen(eval->genbuf));
break;
case NCOM:
if(!eval->commands->nflag) {
- wline(eval, eval->linebuf, eval->lspend - eval->linebuf);
+ rv = wline(eval, eval->linebuf, eval->lspend - eval->linebuf);
+ if (rv != APR_SUCCESS)
+ return rv;
}
- if(eval->aptr > eval->abuf)
- arout(eval);
+ if(eval->aptr > eval->abuf) {
+ rv = arout(eval);
+ if (rv != APR_SUCCESS)
+ return rv;
+ }
eval->lspend = eval->linebuf;
eval->pending = ipc->next;
break;
case CNCOM:
- if(eval->aptr > eval->abuf)
- arout(eval);
+ if(eval->aptr > eval->abuf) {
+ rv = arout(eval);
+ if (rv != APR_SUCCESS)
+ return rv;
+ }
append_to_linebuf(eval, "\n");
eval->pending = ipc->next;
break;
case PCOM:
- wline(eval, eval->linebuf, eval->lspend - eval->linebuf);
+ rv = wline(eval, eval->linebuf, eval->lspend - eval->linebuf);
break;
case CPCOM:
for (p1 = eval->linebuf; *p1 != '\n' && *p1 != '\0'; p1++);
- wline(eval, eval->linebuf, p1 - eval->linebuf);
+ rv = wline(eval, eval->linebuf, p1 - eval->linebuf);
break;
case QCOM:
- if (!eval->commands->nflag)
- wline(eval, eval->linebuf, eval->lspend - eval->linebuf);
+ if (!eval->commands->nflag) {
+ rv = wline(eval, eval->linebuf, eval->lspend - eval->linebuf);
+ if (rv != APR_SUCCESS)
+ break;
+ }
- if(eval->aptr > eval->abuf)
- arout(eval);
+ if(eval->aptr > eval->abuf) {
+ rv = arout(eval);
+ if (rv != APR_SUCCESS)
+ return rv;
+ }
eval->quitflag = 1;
break;
}
if(ipc->pfl && eval->commands->nflag && i) {
if(ipc->pfl == 1) {
- wline(eval, eval->linebuf, eval->lspend - eval->linebuf);
+ rv = wline(eval, eval->linebuf, eval->lspend -
+ eval->linebuf);
+ if (rv != APR_SUCCESS)
+ return rv;
} else {
for (p1 = eval->linebuf; *p1 != '\n' && *p1 != '\0'; p1++);
- wline(eval, eval->linebuf, p1 - eval->linebuf);
+ rv = wline(eval, eval->linebuf, p1 - eval->linebuf);
+ if (rv != APR_SUCCESS)
+ return rv;
}
}
if (i && (ipc->findex >= 0) && eval->fcode[ipc->findex])
while((*p1 = p2[(unsigned char)*p1]) != 0) p1++;
break;
}
- return APR_SUCCESS;
+ return rv;
}
/*
* arout
*/
-static void arout(sed_eval_t *eval)
+static apr_status_t arout(sed_eval_t *eval)
{
+ apr_status_t rv = APR_SUCCESS;
eval->aptr = eval->abuf - 1;
while (*++eval->aptr) {
if ((*eval->aptr)->command == ACOM) {
char *p1;
for (p1 = (*eval->aptr)->re1; *p1; p1++);
- wline(eval, (*eval->aptr)->re1, p1 - (*eval->aptr)->re1);
+ rv = wline(eval, (*eval->aptr)->re1, p1 - (*eval->aptr)->re1);
+ if (rv != APR_SUCCESS)
+ return rv;
} else {
apr_file_t *fi = NULL;
char buf[512];
while ((apr_file_read(fi, buf, &n)) == APR_SUCCESS) {
if (n == 0)
break;
- eval->writefn(eval->fout, buf, n);
+ rv = eval->writefn(eval->fout, buf, n);
+ if (rv != APR_SUCCESS) {
+ apr_file_close(fi);
+ return rv;
+ }
n = sizeof(buf);
}
apr_file_close(fi);
}
eval->aptr = eval->abuf;
*eval->aptr = NULL;
+ return rv;
}
/*
* wline
*/
-static void wline(sed_eval_t *eval, char *buf, int sz)
+static apr_status_t wline(sed_eval_t *eval, char *buf, int sz)
{
- eval->writefn(eval->fout, buf, sz);
- eval->writefn(eval->fout, "\n", 1);
+ apr_status_t rv = APR_SUCCESS;
+ rv = eval->writefn(eval->fout, buf, sz);
+ if (rv != APR_SUCCESS)
+ return rv;
+ rv = eval->writefn(eval->fout, "\n", 1);
+ return rv;
}