--- modules/filters/mod_include.c	30 Dec 2001 06:51:21 -0000	1.177
+++ modules/filters/mod_include.c	31 Dec 2001 05:46:00 -0000
@@ -2578,6 +2648,7 @@
     char *tag     = NULL;
     char *tag_val = NULL;
     char *var     = NULL;
+    char *value   = NULL;
     apr_bucket *tmp_buck;
     char parsed_string[MAX_STRING_LEN];
 
@@ -2586,27 +2657,13 @@
         while (1) {
             ap_ssi_get_tag_and_value(ctx, &tag, &tag_val, 1);
             if ((tag == NULL) && (tag_val == NULL)) {
-                return 0;
-            }
-            else if (tag_val == NULL) {
-                return 1;
+                break;
             }
             else if (!strcmp(tag, "var")) {
                 var = tag_val;
             }
             else if (!strcmp(tag, "value")) {
-                if (var == (char *) NULL) {
-                    ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, r,
-                           "variable must precede value in set directive in %s",
-                           r->filename);
-                    CREATE_ERROR_BUCKET(ctx, tmp_buck, head_ptr, 
-                                        *inserted_head);
-                    return (-1);
-                }
-                ap_ssi_parse_string(r, ctx, tag_val, parsed_string, 
-                                    sizeof(parsed_string), 0);
-                apr_table_setn(r->subprocess_env, apr_pstrdup(r->pool, var),
-                               apr_pstrdup(r->pool, parsed_string));
+                value = tag_val;
             }
             else {
                 ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, r,
@@ -2616,7 +2673,23 @@
             }
         }
     }
-    return 0;
+    if (!var || !*var) {
+        ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, r,
+                     "Empty or missing var for set directive in %s", 
+                     r->filename);
+        CREATE_ERROR_BUCKET(ctx, tmp_buck, head_ptr, *inserted_head);
+        return -1;
+    }
+    if (value) {
+        ap_ssi_parse_string(r, ctx, value, parsed_string, 
+                            sizeof(parsed_string), 0);
+        apr_table_setn(r->subprocess_env, apr_pstrdup(r->pool, var),
+                       apr_pstrdup(r->pool, parsed_string));
+    }
+    else {
+        apr_table_unset(r->subprocess_env, apr_pstrdup(r->pool, var));
+    }
+    return 0;
 }
 
 static int handle_printenv(include_ctx_t *ctx, apr_bucket_brigade **bb, 
