Hello Guillem,
Many thanks for your comments, and apologies for leaving all the
dpkg-source --commit boilerplate on the original patch.
I have reworked the patch.
Best regards,
João
--- dillo-3.3.0.orig/src/dilloc.c
+++ dillo-3.3.0/src/dilloc.c
@@ -104,9 +104,21 @@ connect_given_pid(int *sock, const char
static int
find_working_socket(int *sock)
{
- char ctlpath[PATH_MAX];
- if (snprintf(ctlpath, PATH_MAX, "%s/.dillo/ctl", dGethomedir()) >= PATH_MAX) {
- fprintf(stderr, "path too long\n");
+ int sz = snprintf(NULL, 0, "%s/.dillo/ctl", dGethomedir());
+ if (sz <= 0) {
+ fprintf(stderr, "path size error\n");
+ return -1;
+ }
+
+ char *ctlpath = (char *) malloc(sz+1);
+ if (ctlpath == NULL) {
+ fprintf(stderr, "memory allocation error\n");
+ return -1;
+ }
+
+ if (snprintf(ctlpath, sz, "%s/.dillo/ctl", dGethomedir()) <= 0) {
+ fprintf(stderr, "path copy error\n");
+ free(ctlpath);
return -1;
}
@@ -116,10 +128,11 @@ find_working_socket(int *sock)
fprintf(stderr, "error: cannot open %s directory: %s\n",
ctlpath, strerror(errno));
fprintf(stderr, "hint: is dillo running?\n");
+ free(ctlpath);
return -1;
}
- int found_pid = 0;
+ int found_pid = 0;
struct sockaddr_un addr;
addr.sun_family = AF_UNIX;
@@ -136,6 +149,7 @@ find_working_socket(int *sock)
#define LEN ((int) sizeof(addr.sun_path))
if (snprintf(addr.sun_path, LEN, "%s/%s", ctlpath, num) >= LEN) {
fprintf(stderr, "pid path too long\n");
+ free(ctlpath);
return -1;
}
#undef LEN
@@ -143,6 +157,7 @@ find_working_socket(int *sock)
int fd;
if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
fprintf(stderr, "socket() failed: %s\n", strerror(errno));
+ free(ctlpath);
return -1;
}
@@ -170,11 +185,13 @@ find_working_socket(int *sock)
if (fd != -1 && dClose(fd) != 0) {
fprintf(stderr, "cannot close fd: %s", strerror(errno));
+ free(ctlpath);
return -1;
}
}
closedir(dp);
+ free(ctlpath);
if (found_pid == 1)
return 0;