{
FILE *fp = NULL;
struct sockaddr_un addr;
- int mybuffer, ret = -1, i, numbytes, fd;
+ int mybuffer, ret = -1, i, numbytes, fd = -1;
unsigned char tempbuf[255];
- if (bytes > (int)sizeof(tempbuf))
+ if (bytes <= 0 || bytes > (int)sizeof(tempbuf))
return -1;
/* Make socket. */
#else
fd = socket(AF_UNIX, SOCK_STREAM, 0);
#endif
- if (fd == -1 || (fp = fdopen(fd, "r+")) == NULL)
+ if (fd == -1)
return -1;
- setbuf(fp, NULL);
/* Try to connect */
for (;;) {
}
}
+ /* Create stream only after a successful connect to avoid stale FILE* on fd swap. */
+ fp = fdopen(fd, "r+");
+ if (fp == NULL) {
+ close(fd);
+ return -1;
+ }
+ setbuf(fp, NULL);
+
/* Make request, see how many bytes we can get back. */
tempbuf[0] = 1;
tempbuf[1] = bytes;
goto err;
numbytes = tempbuf[0];
+ if (numbytes <= 0 || numbytes > bytes || numbytes > (int)sizeof(tempbuf))
+ goto err;
+
/* Which buffer are we using? */
mybuffer = buf == NULL;
if (mybuffer)
err:
if (fp != NULL)
fclose(fp);
+ else if (fd != -1)
+ close(fd);
return ret;
}