summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordjm@openbsd.org <djm@openbsd.org>2019-09-03 08:32:11 +0000
committerDamien Miller <djm@mindrot.org>2019-09-03 18:39:31 +1000
commit5485f8d50a5bc46aeed829075ebf5d9c617027ea (patch)
treefaaa341e91f2e3006af62927fe484ab09fbc5b79
parentf8df0413f0a057b6a3d3dd7bd8bc7c5d80911d3a (diff)
upstream: move authorized_keys option parsing helpsers to misc.c
and make them public; ok markus@ OpenBSD-Commit-ID: c18bcb2a687227b3478377c981c2d56af2638ea2
-rw-r--r--auth-options.c71
-rw-r--r--misc.c74
-rw-r--r--misc.h7
3 files changed, 80 insertions, 72 deletions
diff --git a/auth-options.c b/auth-options.c
index ca92f7a7..ac362e27 100644
--- a/auth-options.c
+++ b/auth-options.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: auth-options.c,v 1.86 2019/07/09 04:15:00 djm Exp $ */
+/* $OpenBSD: auth-options.c,v 1.87 2019/09/03 08:32:11 djm Exp $ */
/*
* Copyright (c) 2018 Damien Miller <djm@mindrot.org>
*
@@ -40,75 +40,6 @@
#include "ssh2.h"
#include "auth-options.h"
-/*
- * Match flag 'opt' in *optsp, and if allow_negate is set then also match
- * 'no-opt'. Returns -1 if option not matched, 1 if option matches or 0
- * if negated option matches.
- * If the option or negated option matches, then *optsp is updated to
- * point to the first character after the option.
- */
-static int
-opt_flag(const char *opt, int allow_negate, const char **optsp)
-{
- size_t opt_len = strlen(opt);
- const char *opts = *optsp;
- int negate = 0;
-
- if (allow_negate && strncasecmp(opts, "no-", 3) == 0) {
- opts += 3;
- negate = 1;
- }
- if (strncasecmp(opts, opt, opt_len) == 0) {
- *optsp = opts + opt_len;
- return negate ? 0 : 1;
- }
- return -1;
-}
-
-static char *
-opt_dequote(const char **sp, const char **errstrp)
-{
- const char *s = *sp;
- char *ret;
- size_t i;
-
- *errstrp = NULL;
- if (*s != '"') {
- *errstrp = "missing start quote";
- return NULL;
- }
- s++;
- if ((ret = malloc(strlen((s)) + 1)) == NULL) {
- *errstrp = "memory allocation failed";
- return NULL;
- }
- for (i = 0; *s != '\0' && *s != '"';) {
- if (s[0] == '\\' && s[1] == '"')
- s++;
- ret[i++] = *s++;
- }
- if (*s == '\0') {
- *errstrp = "missing end quote";
- free(ret);
- return NULL;
- }
- ret[i] = '\0';
- s++;
- *sp = s;
- return ret;
-}
-
-static int
-opt_match(const char **opts, const char *term)
-{
- if (strncasecmp((*opts), term, strlen(term)) == 0 &&
- (*opts)[strlen(term)] == '=') {
- *opts += strlen(term) + 1;
- return 1;
- }
- return 0;
-}
-
static int
dup_strings(char ***dstp, size_t *ndstp, char **src, size_t nsrc)
{
diff --git a/misc.c b/misc.c
index d5e44da7..88833d7f 100644
--- a/misc.c
+++ b/misc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: misc.c,v 1.141 2019/09/03 08:29:58 djm Exp $ */
+/* $OpenBSD: misc.c,v 1.142 2019/09/03 08:32:11 djm Exp $ */
/*
* Copyright (c) 2000 Markus Friedl. All rights reserved.
* Copyright (c) 2005,2006 Damien Miller. All rights reserved.
@@ -2137,3 +2137,75 @@ skip_space(char **cpp)
;
*cpp = cp;
}
+
+/* authorized_key-style options parsing helpers */
+
+/*
+ * Match flag 'opt' in *optsp, and if allow_negate is set then also match
+ * 'no-opt'. Returns -1 if option not matched, 1 if option matches or 0
+ * if negated option matches.
+ * If the option or negated option matches, then *optsp is updated to
+ * point to the first character after the option.
+ */
+int
+opt_flag(const char *opt, int allow_negate, const char **optsp)
+{
+ size_t opt_len = strlen(opt);
+ const char *opts = *optsp;
+ int negate = 0;
+
+ if (allow_negate && strncasecmp(opts, "no-", 3) == 0) {
+ opts += 3;
+ negate = 1;
+ }
+ if (strncasecmp(opts, opt, opt_len) == 0) {
+ *optsp = opts + opt_len;
+ return negate ? 0 : 1;
+ }
+ return -1;
+}
+
+char *
+opt_dequote(const char **sp, const char **errstrp)
+{
+ const char *s = *sp;
+ char *ret;
+ size_t i;
+
+ *errstrp = NULL;
+ if (*s != '"') {
+ *errstrp = "missing start quote";
+ return NULL;
+ }
+ s++;
+ if ((ret = malloc(strlen((s)) + 1)) == NULL) {
+ *errstrp = "memory allocation failed";
+ return NULL;
+ }
+ for (i = 0; *s != '\0' && *s != '"';) {
+ if (s[0] == '\\' && s[1] == '"')
+ s++;
+ ret[i++] = *s++;
+ }
+ if (*s == '\0') {
+ *errstrp = "missing end quote";
+ free(ret);
+ return NULL;
+ }
+ ret[i] = '\0';
+ s++;
+ *sp = s;
+ return ret;
+}
+
+int
+opt_match(const char **opts, const char *term)
+{
+ if (strncasecmp((*opts), term, strlen(term)) == 0 &&
+ (*opts)[strlen(term)] == '=') {
+ *opts += strlen(term) + 1;
+ return 1;
+ }
+ return 0;
+}
+
diff --git a/misc.h b/misc.h
index 8deea5ea..bcc34f98 100644
--- a/misc.h
+++ b/misc.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: misc.h,v 1.80 2019/09/03 08:29:58 djm Exp $ */
+/* $OpenBSD: misc.h,v 1.81 2019/09/03 08:32:11 djm Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
@@ -166,6 +166,11 @@ int safe_path(const char *, struct stat *, const char *, uid_t,
int safe_path_fd(int, const char *, struct passwd *,
char *err, size_t errlen);
+/* authorized_key-style options parsing helpers */
+int opt_flag(const char *opt, int allow_negate, const char **optsp);
+char *opt_dequote(const char **sp, const char **errstrp);
+int opt_match(const char **opts, const char *term);
+
/* readpass.c */
#define RP_ECHO 0x0001