Code

Fixed memory errors identified by LLVM's AddressSanitizer.
[sysdb.git] / src / utils / unixsock.c
index 138205d936bfc6573d08b99c77246f7c93e103ea..62b6f45aa404f360ed1f623c07362dcb2c2e26b0 100644 (file)
@@ -25,8 +25,8 @@
  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+#include "utils/error.h"
 #include "utils/unixsock.h"
-#include "core/error.h"
 
 #include <assert.h>
 #include <errno.h>
@@ -258,6 +258,9 @@ sdb_unixsock_client_connect(sdb_unixsock_client_t *client)
                return -1;
        }
 
+       /* enable line-buffering */
+       setvbuf(client->fh, NULL, _IOLBF, 0);
+
        client->shutdown = 0;
        return 0;
 } /* sdb_unixsock_client_connect */
@@ -289,26 +292,35 @@ char *
 sdb_unixsock_client_recv(sdb_unixsock_client_t *client,
                char *buffer, size_t buflen)
 {
+       char *tmp;
+
        if ((! client) || (! client->fh) || (! buffer))
                return NULL;
 
        if (client->shutdown & SDB_SHUT_RD) /* reconnect */
                sdb_unixsock_client_connect(client);
 
-       buffer = fgets(buffer, (int)buflen - 1, client->fh);
-       if (! buffer) {
-               if (! feof(client->fh)) {
-                       char errbuf[1024];
-                       sdb_log(SDB_LOG_ERR, "unixsock: Failed to read "
-                                       "from socket (%s): %s", client->path,
-                                       sdb_strerror(errno, errbuf, sizeof(errbuf)));
+       tmp = NULL;
+       while (tmp == NULL) {
+               errno = 0;
+               tmp = fgets(buffer, (int)buflen - 1, client->fh);
+               if (! tmp) {
+                       if ((errno == EAGAIN) || (errno == EINTR))
+                               continue;
+
+                       if (! feof(client->fh)) {
+                               char errbuf[1024];
+                               sdb_log(SDB_LOG_ERR, "unixsock: Failed to read "
+                                               "from socket (%s): %s", client->path,
+                                               sdb_strerror(errno, errbuf, sizeof(errbuf)));
+                       }
+                       return NULL;
                }
-               return buffer;
        }
        buffer[buflen - 1] = '\0';
 
        buflen = strlen(buffer);
-       while ((buffer[buflen - 1] == '\n') || (buffer[buflen - 1] == '\r')) {
+       while (buflen && ((buffer[buflen - 1] == '\n') || (buffer[buflen - 1] == '\r'))) {
                buffer[buflen - 1] = '\0';
                --buflen;
        }