X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=netatalk.git;a=blobdiff_plain;f=etc%2Fafpd%2Fmessages.c;h=3c85f6a3a505c7fe9ae4c5ade65a5c44f997e708;hp=2784e8260280ee20e3af9298dd903decb2e3c75b;hb=4111aba41c36a99bfd7eb7e987b24314735cdd10;hpb=f1c0e462cdfe8d19a14bb4e296ed005e3f14bd56 diff --git a/etc/afpd/messages.c b/etc/afpd/messages.c index 2784e826..3c85f6a3 100644 --- a/etc/afpd/messages.c +++ b/etc/afpd/messages.c @@ -1,6 +1,4 @@ /* - * $Id: messages.c,v 1.23 2009-11-24 15:44:40 didg Exp $ - * * Copyright (c) 1997 Adrian Sun (asun@zoology.washington.edu) * All Rights Reserved. See COPYRIGHT. */ @@ -9,9 +7,7 @@ #include "config.h" #endif /* HAVE_CONFIG_H */ -#ifdef HAVE_UNISTD_H #include -#endif /* HAVE_UNISTD_H */ #include #include #include @@ -19,12 +15,12 @@ #include #include #include +#include #include #include #include "misc.h" - #define MAXMESGSIZE 199 /* this is only used by afpd children, so it's okay. */ @@ -45,10 +41,9 @@ void readmessage(AFPObj *obj) unsigned int i; int rc; static int c; - uid_t euid; - u_int32_t maxmsgsize; + uint32_t maxmsgsize; - maxmsgsize = (obj->proto == AFPPROTO_DSI)?MIN(MAX(((DSI*)obj->handle)->attn_quantum, MAXMESGSIZE),MAXPATHLEN):MAXMESGSIZE; + maxmsgsize = MIN(MAX(obj->dsi->attn_quantum, MAXMESGSIZE), MAXPATHLEN); i=0; /* Construct file name SERVERTEXT/message.[pid] */ @@ -82,22 +77,12 @@ void readmessage(AFPObj *obj) /* cleanup */ fclose(message); - /* Save effective uid and switch to root to delete file. */ - /* Delete will probably fail otherwise, but let's try anyways */ - euid = geteuid(); - if (seteuid(0) < 0) { - LOG(log_error, logtype_afpd, "Could not switch back to root: %s", - strerror(errno)); - } + become_root(); if ((rc = unlink(filename)) != 0) LOG(log_error, logtype_afpd, "File '%s' could not be deleted", strerror(errno)); - /* Drop privs again, failing this is very bad */ - if (seteuid(euid) < 0) { - LOG(log_error, logtype_afpd, "Could not switch back to uid %d: %s", euid, strerror(errno)); - exit(EXITERR_SYS); - } + unbecome_root(); if (rc < 0) { LOG(log_error, logtype_afpd, "Error deleting %s: %s", filename, strerror(rc)); @@ -117,15 +102,15 @@ void readmessage(AFPObj *obj) int afp_getsrvrmesg(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf, size_t *rbuflen) { char *message; - u_int16_t type, bitmap; - u_int16_t msgsize; + uint16_t type, bitmap; + uint16_t msgsize; size_t outlen = 0; size_t msglen = 0; int utf8 = 0; *rbuflen = 0; - msgsize = (obj->proto == AFPPROTO_DSI)?MAX(((DSI*)obj->handle)->attn_quantum, MAXMESGSIZE):MAXMESGSIZE; + msgsize = MAX(obj->dsi->attn_quantum, MAXMESGSIZE); memcpy(&type, ibuf + 2, sizeof(type)); memcpy(&bitmap, ibuf + 4, sizeof(bitmap)); @@ -138,10 +123,11 @@ int afp_getsrvrmesg(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf, siz * it has asked the login msg... * Workaround: concatenate the two if any, ugly. */ - if (*message && *obj->options.loginmesg) { - strlcat(message, " - ", MAXMESGSIZE); + if (obj->options.loginmesg) { + if (*message) + strlcat(message, " - ", MAXMESGSIZE); + strlcat(message, obj->options.loginmesg, MAXMESGSIZE); } - strlcat(message, obj->options.loginmesg, MAXMESGSIZE); break; case AFPMESG_SERVER: /* server */ break;