summaryrefslogtreecommitdiffstats
path: root/usr.sbin/httpd/src/modules/ssl/ssl_expr_eval.c
diff options
context:
space:
mode:
authorbeck <beck@openbsd.org>1999-12-08 02:45:48 +0000
committerbeck <beck@openbsd.org>1999-12-08 02:45:48 +0000
commit69fe16e6f86413aa00dca3a3ae2292edea53059f (patch)
tree9f81d76784a617777075a3bf694aaa8e6e580ba2 /usr.sbin/httpd/src/modules/ssl/ssl_expr_eval.c
parentAH finished, a couple of cosmetic changes in ESP. (diff)
downloadwireguard-openbsd-69fe16e6f86413aa00dca3a3ae2292edea53059f.tar.xz
wireguard-openbsd-69fe16e6f86413aa00dca3a3ae2292edea53059f.zip
mod_ssl 2.4.9 merge
Diffstat (limited to 'usr.sbin/httpd/src/modules/ssl/ssl_expr_eval.c')
-rw-r--r--usr.sbin/httpd/src/modules/ssl/ssl_expr_eval.c39
1 files changed, 32 insertions, 7 deletions
diff --git a/usr.sbin/httpd/src/modules/ssl/ssl_expr_eval.c b/usr.sbin/httpd/src/modules/ssl/ssl_expr_eval.c
index 8fd58a59768..6e1fc60384b 100644
--- a/usr.sbin/httpd/src/modules/ssl/ssl_expr_eval.c
+++ b/usr.sbin/httpd/src/modules/ssl/ssl_expr_eval.c
@@ -70,9 +70,10 @@
** _________________________________________________________________
*/
-static BOOL ssl_expr_eval_comp(request_rec *r, ssl_expr *node);
-static char *ssl_expr_eval_word(request_rec *r, ssl_expr *node);
-static char *ssl_expr_eval_func_file(request_rec *r, char *filename);
+static BOOL ssl_expr_eval_comp(request_rec *, ssl_expr *);
+static char *ssl_expr_eval_word(request_rec *, ssl_expr *);
+static char *ssl_expr_eval_func_file(request_rec *, char *);
+static int ssl_expr_eval_strcmplex(char *, char *);
BOOL ssl_expr_eval(request_rec *r, ssl_expr *node)
{
@@ -124,22 +125,22 @@ static BOOL ssl_expr_eval_comp(request_rec *r, ssl_expr *node)
case op_LT: {
ssl_expr *e1 = (ssl_expr *)node->node_arg1;
ssl_expr *e2 = (ssl_expr *)node->node_arg2;
- return (strcmp(ssl_expr_eval_word(r, e1), ssl_expr_eval_word(r, e2)) < 0);
+ return (ssl_expr_eval_strcmplex(ssl_expr_eval_word(r, e1), ssl_expr_eval_word(r, e2)) < 0);
}
case op_LE: {
ssl_expr *e1 = (ssl_expr *)node->node_arg1;
ssl_expr *e2 = (ssl_expr *)node->node_arg2;
- return (strcmp(ssl_expr_eval_word(r, e1), ssl_expr_eval_word(r, e2)) <= 0);
+ return (ssl_expr_eval_strcmplex(ssl_expr_eval_word(r, e1), ssl_expr_eval_word(r, e2)) <= 0);
}
case op_GT: {
ssl_expr *e1 = (ssl_expr *)node->node_arg1;
ssl_expr *e2 = (ssl_expr *)node->node_arg2;
- return (strcmp(ssl_expr_eval_word(r, e1), ssl_expr_eval_word(r, e2)) > 0);
+ return (ssl_expr_eval_strcmplex(ssl_expr_eval_word(r, e1), ssl_expr_eval_word(r, e2)) > 0);
}
case op_GE: {
ssl_expr *e1 = (ssl_expr *)node->node_arg1;
ssl_expr *e2 = (ssl_expr *)node->node_arg2;
- return (strcmp(ssl_expr_eval_word(r, e1), ssl_expr_eval_word(r, e2)) >= 0);
+ return (ssl_expr_eval_strcmplex(ssl_expr_eval_word(r, e1), ssl_expr_eval_word(r, e2)) >= 0);
}
case op_IN: {
ssl_expr *e1 = (ssl_expr *)node->node_arg1;
@@ -255,3 +256,27 @@ static char *ssl_expr_eval_func_file(request_rec *r, char *filename)
return buf;
}
+/* a variant of strcmp(3) which works correctly also for number strings */
+static int ssl_expr_eval_strcmplex(char *cpNum1, char *cpNum2)
+{
+ int i, n1, n2;
+
+ if (cpNum1 == NULL)
+ return -1;
+ if (cpNum2 == NULL)
+ return +1;
+ n1 = strlen(cpNum1);
+ n2 = strlen(cpNum2);
+ if (n1 > n2)
+ return 1;
+ if (n1 < n2)
+ return -1;
+ for (i = 0; i < n1; i++) {
+ if (cpNum1[i] > cpNum2[i])
+ return 1;
+ if (cpNum1[i] < cpNum2[i])
+ return -1;
+ }
+ return 0;
+}
+