]> arthur.barton.de Git - netatalk.git/blobdiff - libatalk/dsi/dsi_stream.c
Temp solution from trunk for bailing out on invalid DSI packets.
[netatalk.git] / libatalk / dsi / dsi_stream.c
index f20045d51c8b761819587e044406fa930401353d..026d82042ac0a94888d307140d00705455dbeafc 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: dsi_stream.c,v 1.3 2001-06-29 14:14:46 rufustfirefly Exp $
+ * $Id: dsi_stream.c,v 1.4.2.2 2002-03-12 16:16:55 srittau Exp $
  *
  * Copyright (c) 1998 Adrian Sun (asun@zoology.washington.edu)
  * All rights reserved. See COPYRIGHT.
@@ -52,7 +52,7 @@ size_t dsi_stream_write(DSI *dsi, void *data, const size_t length)
       continue;
 
     if (len < 0) {
-      syslog(LOG_ERR, "dsi_stream_write: %m");
+      syslog(LOG_ERR, "dsi_stream_write: %s", strerror(errno));
       break;
     }
     
@@ -72,14 +72,14 @@ size_t dsi_stream_read(DSI *dsi, void *data, const size_t length)
   
   stored = 0;
   while (stored < length) {
-    if ((len = read(dsi->socket, (u_int8_t *) data + stored, 
-                   length - stored)) == -1 && errno == EINTR)
+    len = read(dsi->socket, (u_int8_t *) data + stored, length - stored);
+    if (len == -1 && errno == EINTR)
       continue;
 
-    if (len > 0)
+    else if (len > 0)
       stored += len;
-    else {/* eof or error */
-      syslog(LOG_ERR, "dsi_stream_read(%d): %m", len);
+    else { /* eof or error */
+      syslog(LOG_ERR, "dsi_stream_read(%d): %s", len, strerror(errno));
       break;
     }
   }
@@ -135,7 +135,7 @@ int dsi_stream_send(DSI *dsi, void *buf, size_t length)
     if (len == towrite) /* wrote everything out */
       break;
     else if (len < 0) { /* error */
-      syslog(LOG_ERR, "dsi_stream_send: %m");
+      syslog(LOG_ERR, "dsi_stream_send: %s", strerror(errno));
       sigprocmask(SIG_SETMASK, &oldset, NULL);
       return 0;
     }
@@ -182,6 +182,14 @@ int dsi_stream_receive(DSI *dsi, void *buf, const int ilength,
 
   dsi->header.dsi_flags = block[0];
   dsi->header.dsi_command = block[1];
+  /* FIXME, not the right place, 
+     but we get a server disconnect without reason in the log
+  */
+  if (!block[1]) {
+      LOG(log_error, logtype_default, "dsi_stream_receive: invalid packet, fatal");
+      return 0;
+  }
+
   memcpy(&dsi->header.dsi_requestID, block + 2, 
         sizeof(dsi->header.dsi_requestID));
   memcpy(&dsi->header.dsi_code, block + 4, sizeof(dsi->header.dsi_code));