summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Staessens <dimitri@ouroboros.rocks>2023-11-18 16:32:55 +0100
committerSander Vrijders <sander@ouroboros.rocks>2023-11-20 13:19:48 +0100
commita37d4f406a4c6d39dbd6ff137dcd5a8047397d73 (patch)
treec7871b1018598ddc53d4fecfb893ee865e3759f3
parenteacf47723eb7084f6f067ad30bb58c163a7c918a (diff)
downloadouroboros-a37d4f406a4c6d39dbd6ff137dcd5a8047397d73.tar.gz
ouroboros-a37d4f406a4c6d39dbd6ff137dcd5a8047397d73.zip
lib: Fix FUSE output on Raspbian
For some reason, 'ls' on raspbian invoked the fuse readdir() in a loop where the first call had fuse_file_info * info set to NULL and subsequent calls had info->nonseekable set to 1. Since we don't check the value the info struct, this caused an infinite loop when trying to list the contents of the fuse filesystem subdirectories of /tmp/ouroboros/. Signed-off-by: Dimitri Staessens <dimitri@ouroboros.rocks> Signed-off-by: Sander Vrijders <sander@ouroboros.rocks>
-rw-r--r--src/ipcpd/ipcp.c2
-rw-r--r--src/lib/rib.c4
2 files changed, 5 insertions, 1 deletions
diff --git a/src/ipcpd/ipcp.c b/src/ipcpd/ipcp.c
index 5c1ffd03..617dd11f 100644
--- a/src/ipcpd/ipcp.c
+++ b/src/ipcpd/ipcp.c
@@ -176,7 +176,7 @@ static int ipcp_rib_readdir(char *** buf)
while (info[i] != NULL) {
(*buf)[i] = strdup(info[i]);
- if (*buf == NULL)
+ if ((*buf)[i] == NULL)
goto fail_dup;
i++;
}
diff --git a/src/lib/rib.c b/src/lib/rib.c
index 22b57fb7..78ae82ef 100644
--- a/src/lib/rib.c
+++ b/src/lib/rib.c
@@ -139,6 +139,10 @@ static int rib_readdir(const char * path,
(void) offset;
(void) info;
+ /* Fix ls calling readdir in an infinite loop on raspbian. */
+ if (info != NULL && info->nonseekable != 0)
+ return -ENOENT;
+
filler(buf, ".", NULL, 0);
filler(buf, "..", NULL, 0);