continue; /* still in quoted block */
if (!sep && p > start && *p == '=')
sep = p; /* name and value separator */
- if (*p == ',')
+ if (*p == ',' && (p == optstr0 || *(p - 1) != '\\'))
stop = p; /* terminate the option item */
else if (*(p + 1) == '\0')
stop = p + 1; /* end of optstr */
#include "mountP.h"
#include "fileutils.h" /* statx() fallback */
+#include "strutils.h"
#include "mount-api-utils.h"
#include "linux_version.h"
const char *name, const char *value)
{
int rc;
+ char *p = NULL;
- DBG(HOOK, ul_debugobj(hs, " fsconfig(name=%s,value=%s)", name,
+ if (value && strstr(value, "\\,")) {
+ p = strdup(value);
+ if (!p)
+ return -EINVAL;
+
+ strrem(p, '\\');
+ value = p;
+ }
+
+ DBG(HOOK, ul_debugobj(hs, " fsconfig(name=\"%s\" value=\"%s\")", name,
value ? : ""));
- if (value)
+ if (value) {
rc = fsconfig(fd, FSCONFIG_SET_STRING, name, value, 0);
- else
+ free(p);
+ } else
rc = fsconfig(fd, FSCONFIG_SET_FLAG, name, NULL, 0);
set_syscall_status(cxt, "fsconfig", rc == 0);