From 374650579de428eb38622c9c04aa454a13a8d531 Mon Sep 17 00:00:00 2001 From: Frank Lahm Date: Mon, 2 Apr 2012 13:57:53 +0200 Subject: [PATCH 1/1] Proper check whether code runs in an AFP session context or not --- include/atalk/globals.h | 2 ++ libatalk/dsi/dsi_getsess.c | 1 + libatalk/util/netatalk_conf.c | 12 ++++++------ 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/include/atalk/globals.h b/include/atalk/globals.h index e1aca814..e34f4ee8 100644 --- a/include/atalk/globals.h +++ b/include/atalk/globals.h @@ -50,6 +50,8 @@ #define PASSWD_NOSAVE (1 << 1) #define PASSWD_ALL (PASSWD_SET | PASSWD_NOSAVE) +#define IS_AFP_SESSION(obj) ((obj)->dsi && (obj)->dsi->serversock == -1) + /********************************************************************************************** * Ini config sections **********************************************************************************************/ diff --git a/libatalk/dsi/dsi_getsess.c b/libatalk/dsi/dsi_getsess.c index 5debd037..7c668ec8 100644 --- a/libatalk/dsi/dsi_getsess.c +++ b/libatalk/dsi/dsi_getsess.c @@ -81,6 +81,7 @@ afp_child_t *dsi_getsession(DSI *dsi, server_child *serv_children, int tickleval /* get rid of some stuff */ close(dsi->serversock); + dsi->serversock = -1; server_child_free(serv_children); switch (dsi->header.dsi_command) { diff --git a/libatalk/util/netatalk_conf.c b/libatalk/util/netatalk_conf.c index f963fbf0..a75ded21 100644 --- a/libatalk/util/netatalk_conf.c +++ b/libatalk/util/netatalk_conf.c @@ -333,15 +333,14 @@ static char *volxlate(const AFPObj *obj, q++; } } else if (IS_VAR(p, "$c")) { - DSI *dsi = obj->dsi; - if (obj->username[0]) { + if (IS_AFP_SESSION(obj)) { + DSI *dsi = obj->dsi; len = sprintf(dest, "%s:%u", getip_string((struct sockaddr *)&dsi->client), getip_port((struct sockaddr *)&dsi->client)); - } else { + dest += len; + destlen -= len; } - dest += len; - destlen -= len; } else if (IS_VAR(p, "$d")) { q = path; } else if (pwd && IS_VAR(p, "$f")) { @@ -970,7 +969,7 @@ static int readvolfile(AFPObj *obj, const struct passwd *pwent) continue; if (STRCMP(secname, ==, INISEC_HOMES)) { have_uservol = 1; - if (obj->username[0] == 0 + if (!IS_AFP_SESSION(obj) || strcmp(obj->username, obj->options.guest) == 0) /* not an AFP session, but cnid daemon, dbd or ad util, or guest login */ continue; @@ -1322,6 +1321,7 @@ struct vol *getvolbypath(AFPObj *obj, const char *path) subpath = prw; strlcat(tmpbuf, user, MAXPATHLEN); + strlcat(obj->username, user, MAXUSERLEN); strlcat(tmpbuf, "/", MAXPATHLEN); /* (6) */ -- 2.39.2