I fixed one sed labels related bug. Sed labels were not been handled properly.

Code has been updated and can be obtained by mercurial as :
$ hg clone ssh://[EMAIL PROTECTED]/hg/webstack/mod_sed

Regards,
Basant.

diff -r 6dedc621b00d libsed.h
--- a/libsed.h  Thu Apr 17 15:15:01 2008 -0700
+++ b/libsed.h  Thu Apr 24 17:23:06 2008 -0700
@@ -104,6 +104,7 @@ struct sed_commands_s {
     sed_reptr_t  *rep;
     int          nrep;
     apr_pool_t   *pool;
+    int          canbefinal;
 };

 typedef struct sed_eval_s sed_eval_t;
@@ -157,7 +158,8 @@ apr_status_t sed_init_commands(sed_comma
                                apr_pool_t *p);
 apr_status_t sed_compile_string(sed_commands_t *commands, const char *s);
 apr_status_t sed_compile_file(sed_commands_t *commands, apr_file_t *fin);
-apr_status_t sed_finalize_commands(sed_commands_t *commands);
+char* sed_get_finalize_error(const sed_commands_t *commands, apr_pool_t* pool);
+int sed_canbe_finalized(const sed_commands_t *commands);
 void sed_destroy_commands(sed_commands_t *commands);

 apr_status_t sed_init_eval(sed_eval_t *eval, sed_commands_t *commands,
diff -r 6dedc621b00d regexp.h
--- a/regexp.h  Thu Apr 17 15:15:01 2008 -0700
+++ b/regexp.h  Thu Apr 24 17:23:06 2008 -0700
@@ -102,6 +102,7 @@ extern void command_errf(sed_commands_t
 #define SEDERR_TSNTSS "transform strings not the same size: %s"
 #define SEDERR_OLTL "output line too long."
 #define SEDERR_HSOVERFLOW "hold space overflowed."
+#define SEDERR_INTERNAL "internal sed error"

 #ifdef __cplusplus
 }
diff -r 6dedc621b00d sed0.c
--- a/sed0.c    Thu Apr 17 15:15:01 2008 -0700
+++ b/sed0.c    Thu Apr 24 17:23:06 2008 -0700
@@ -39,6 +39,7 @@ static char *comple(sed_commands_t *comm
 static char *comple(sed_commands_t *commands, sed_comp_args *compargs,
                     char *x1, char *ep, char *x3, char x4);
 static sed_reptr_t *alloc_reptr(sed_commands_t *commands);
+static int check_finalized(const sed_commands_t *commands);

 void command_errf(sed_commands_t *commands, const char *fmt, ...)
 {
@@ -80,6 +81,7 @@ apr_status_t sed_init_commands(sed_comma
     commands->rep->ad1 = commands->respace;
     commands->reend = &commands->respace[RESIZE - 1];
     commands->labend = &commands->labtab[SED_LABSIZE];
+    commands->canbefinal = 1;

     return APR_SUCCESS;
 }
@@ -102,6 +104,8 @@ apr_status_t sed_compile_string(sed_comm
     commands->eflag = 1;

     rv = fcomp(commands, NULL);
+    if (rv == APR_SUCCESS)
+        commands->canbefinal = check_finalized(commands);

     commands->eflag = 0;

@@ -118,40 +122,75 @@ apr_status_t sed_compile_file(sed_comman
 }

 /*
- * sed_finalize_commands
- */
-apr_status_t sed_finalize_commands(sed_commands_t *commands)
-{
-    sed_label_t *lab;
-
+ * sed_get_finalize_error
+ */
+char* sed_get_finalize_error(const sed_commands_t *commands, apr_pool_t* pool)
+{
+    const sed_label_t *lab;
     if (commands->depth) {
-        command_errf(commands, SEDERR_TMOMES);
-        return APR_EGENERAL;
-    }
-
-    for (lab = commands->labtab; lab < commands->lab; lab++) {
+        return SEDERR_TMOMES;
+    }
+
+    /* Empty branch chain is not a issue */
+    for (lab = commands->labtab + 1; lab < commands->lab; lab++) {
+        char *error;
         if (lab->address == 0) {
-            command_errf(commands, SEDERR_ULMES, lab->asc);
-            return APR_EGENERAL;
+            error = apr_psprintf(pool, SEDERR_ULMES, lab->asc);
+            return error;
         }

         if (lab->chain) {
-            sed_reptr_t *rep;
-
-            rep = lab->chain;
-            while (rep->lb1) {
-                sed_reptr_t *next;
-
-                next = rep->lb1;
-                rep->lb1 = lab->address;
-                rep = next;
-            }
-
-            rep->lb1 = lab->address;
-        }
-    }
-
-    return APR_SUCCESS;
+            return SEDERR_INTERNAL;
+        }
+    }
+    return NULL;
+}
+
+/*
+ * sed_canbe_finalized
+ */
+int sed_canbe_finalized(const sed_commands_t *commands)
+{
+    return commands->canbefinal;
+}
+
+/*
+ * check_finalized
+ */
+static int check_finalized(const sed_commands_t *commands)
+{
+    const sed_label_t *lab;
+    if (commands->depth) {
+        return 0;
+    }
+
+    /* Empty branch chain is not a issue */
+    for (lab = commands->labtab + 1; lab < commands->lab; lab++) {
+        if (lab->address == 0 || (lab->chain)) {
+            return 0;
+        }
+    }
+    return 1;
+}
+
+/*
+ * dechain
+ */
+static void dechain(sed_label_t *lpt, sed_reptr_t *address)
+{
+    sed_reptr_t *rep;
+    if ((lpt == NULL) || (lpt->chain == NULL) || (address == NULL))
+        return;
+    rep = lpt->chain;
+    while (rep->lb1) {
+        sed_reptr_t *next;
+
+        next = rep->lb1;
+        rep->lb1 = address;
+        rep = next;
+    }
+    rep->lb1 = address;
+    lpt->chain = NULL;
 }

 /*
@@ -309,6 +348,7 @@ swit:
                     command_errf(commands, SEDERR_DLMES, commands->linebuf);
                     return -1;
                 }
+                dechain(lpt, commands->rep);
             } else {
                 commands->lab->chain = 0;
                 lpt = commands->lab;
diff -r 6dedc621b00d sed1.c
--- a/sed1.c    Thu Apr 17 15:15:01 2008 -0700
+++ b/sed1.c    Thu Apr 24 17:23:06 2008 -0700
@@ -207,6 +207,15 @@ apr_status_t sed_eval_buffer(sed_eval_t

     if (eval->quitflag)
         return APR_SUCCESS;
+
+    if (!sed_canbe_finalized(eval->commands)) {
+        /* Commands were not finalized properly. */
+        const char* error = sed_get_finalize_error(eval->commands, eval->pool);
+        if (error) {
+            eval_errf(eval, error);
+            return APR_EGENERAL;
+        }
+    }

     eval->fout = fout;


Reply via email to