X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=etc%2Fafpd%2Fmessages.c;h=5bd965bd2a55fd569942f550173b80a44e27c1a5;hb=HEAD;hp=241f0d08166a166ed2a4b22f8d8b5e088c0b7876;hpb=a83e8197c7b8af45f8d56acf158920c03698bfc6;p=netatalk.git diff --git a/etc/afpd/messages.c b/etc/afpd/messages.c index 241f0d08..5bd965bd 100644 --- a/etc/afpd/messages.c +++ b/etc/afpd/messages.c @@ -15,6 +15,7 @@ #include #include #include +#include #include #include @@ -26,9 +27,18 @@ static char servermesg[MAXPATHLEN] = ""; static char localized_message[MAXPATHLEN] = ""; -void setmessage(const char *message) +/*! + * Copy AFP message to message buffer + * @param message (r) message to send + * @returns 0 if this message is being set the first time, return 1 if the preceeding + * message was the same + */ +int setmessage(const char *message) { + if (strncmp(message, servermesg, MAXMESGSIZE) == 0) + return 1; strlcpy(servermesg, message, MAXMESGSIZE); + return 0; } void readmessage(AFPObj *obj) @@ -40,7 +50,6 @@ void readmessage(AFPObj *obj) unsigned int i; int rc; static int c; - uid_t euid; uint32_t maxmsgsize; maxmsgsize = MIN(MAX(obj->dsi->attn_quantum, MAXMESGSIZE), MAXPATHLEN); @@ -77,22 +86,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)); @@ -187,6 +186,6 @@ int afp_getsrvrmesg(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf, siz *rbuflen += 1; } *rbuflen += outlen; - *message = 0; +// *message = 0; return AFP_OK; }