Track tainted data and refuse to expand it
[exim.git] / src / src / auths / pwcheck.c
index 115c1454dde30881f8e44800df32313c08bc962c..f733b9898046d94523a59ee7523ff82c901a11ed 100644 (file)
@@ -1,5 +1,3 @@
-/* $Cambridge: exim/src/src/auths/pwcheck.c,v 1.2 2005/06/27 14:29:44 ph10 Exp $ */
-
 /* SASL server API implementation
  * Rob Siemborski
  * Tim Martin
@@ -50,6 +48,9 @@
  * Oct 2001 - Apr 2002: Slightly modified by Philip Hazel.
  * Aug 2003: new code for saslauthd from Alexander S. Sabourenkov incorporated
  *           by Philip Hazel (minor mods to avoid compiler warnings)
+ * Oct 2006: (PH) removed redundant tests on "reply" being NULL - some were
+ *           missing, and confused someone who was using this code for some
+ *           other purpose. Here in Exim, "reply" is never NULL.
  *
  * screwdriver@lxnt.info
  *
@@ -107,25 +108,25 @@ return PWCHECK_FAIL;
      struct iovec iov[2];
      static char response[1024];
 
-     if (reply) { *reply = NULL; }
+     *reply = NULL;
 
      s = socket(AF_UNIX, SOCK_STREAM, 0);
      if (s == -1) { return PWCHECK_FAIL; }
 
-     memset((char *)&srvaddr, 0, sizeof(srvaddr));
+     memset(CS &srvaddr, 0, sizeof(srvaddr));
      srvaddr.sun_family = AF_UNIX;
      strncpy(srvaddr.sun_path, CYRUS_PWCHECK_SOCKET, sizeof(srvaddr.sun_path));
      r = connect(s, (struct sockaddr *)&srvaddr, sizeof(srvaddr));
      if (r == -1) {
         DEBUG(D_auth)
             debug_printf("Cannot connect to pwcheck daemon (at '%s')\n",CYRUS_PWCHECK_SOCKET);
-       if (reply) { *reply = "cannot connect to pwcheck daemon"; }
+       *reply = "cannot connect to pwcheck daemon";
        return PWCHECK_FAIL;
      }
 
-     iov[0].iov_base = (char *)userid;
+     iov[0].iov_base = CS userid;
      iov[0].iov_len = strlen(userid)+1;
-     iov[1].iov_base = (char *)passwd;
+     iov[1].iov_base = CS passwd;
      iov[1].iov_len = strlen(passwd)+1;
 
      retry_writev(s, iov, 2);
@@ -144,7 +145,7 @@ return PWCHECK_FAIL;
      }
 
      response[start] = '\0';
-     if (reply) { *reply = response; }
+     *reply = response;
      return PWCHECK_NO;
  }
 
@@ -183,7 +184,7 @@ int saslauthd_verify_password(const uschar *userid,
                 const uschar *realm,
                 const uschar **reply)
 {
-    uschar *daemon_reply;
+    uschar *daemon_reply = NULL;
     int s, r;
     struct sockaddr_un srvaddr;
 
@@ -191,29 +192,26 @@ int saslauthd_verify_password(const uschar *userid,
        debug_printf("saslauthd userid='%s' servicename='%s'"
                     " realm='%s'\n", userid, service, realm );
 
-    if (reply)
-        *reply = NULL;
+    *reply = NULL;
 
     s = socket(AF_UNIX, SOCK_STREAM, 0);
     if (s == -1) {
-        if (reply)
-            *reply = CUstrerror(errno);
+       *reply = CUstrerror(errno);
        return PWCHECK_FAIL;
     }
 
-    memset((char *)&srvaddr, 0, sizeof(srvaddr));
+    memset(CS &srvaddr, 0, sizeof(srvaddr));
     srvaddr.sun_family = AF_UNIX;
     strncpy(srvaddr.sun_path, CYRUS_SASLAUTHD_SOCKET,
             sizeof(srvaddr.sun_path));
     r = connect(s, (struct sockaddr *)&srvaddr, sizeof(srvaddr));
     if (r == -1) {
-        DEBUG(D_auth)
+       DEBUG(D_auth)
             debug_printf("Cannot connect to saslauthd daemon (at '%s'): %s\n",
                          CYRUS_SASLAUTHD_SOCKET, strerror(errno));
-       if (reply)
-           *reply = string_sprintf("cannot connect to saslauthd daemon at "
-                                   "%s: %s", CYRUS_SASLAUTHD_SOCKET,
-                                   strerror(errno));
+       *reply = string_sprintf("cannot connect to saslauthd daemon at "
+                               "%s: %s", CYRUS_SASLAUTHD_SOCKET,
+                               strerror(errno));
        return PWCHECK_FAIL;
     }
 
@@ -298,7 +296,8 @@ static int read_string(int fd, uschar **retval) {
         if (count > MAX_REQ_LEN) {
             return -1;
         } else {
-            *retval = store_get(count + 1);
+           /* Assume the file is trusted, so no tainting */
+            *retval = store_get(count + 1, FALSE);
             rc = (retry_read(fd, *retval, count) < (int) count);
             (*retval)[count] = '\0';
             return count;
@@ -345,7 +344,7 @@ static int retry_read(int fd, void *inbuf, unsigned nbyte)
 {
     int n;
     int nread = 0;
-    char *buf = (char *)inbuf;
+    char *buf = CS inbuf;
 
     if (nbyte == 0) return 0;
 
@@ -434,7 +433,7 @@ retry_writev (
 
        for (i = 0; i < iovcnt; i++) {
            if (iov[i].iov_len > (unsigned) n) {
-               iov[i].iov_base = (char *)iov[i].iov_base + n;
+               iov[i].iov_base = CS iov[i].iov_base + n;
                iov[i].iov_len -= n;
                break;
            }