aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Shishkin <virtuoso@slind.org>2010-10-28 06:10:03 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2010-10-28 06:10:03 +0200
commit776509544123c68bbc128c0fdb2f699062d294cf (patch)
treebda6c568102334dca82da268b9aa42b012a4ed69
parent78b286fea51ef137d660b91037c89376115a1994 (diff)
downloadbusybox-w32-776509544123c68bbc128c0fdb2f699062d294cf.tar.gz
busybox-w32-776509544123c68bbc128c0fdb2f699062d294cf.tar.bz2
busybox-w32-776509544123c68bbc128c0fdb2f699062d294cf.zip
mount: pass NULL, not "", as "data" to mount syscall if we have no opts
When mounting a filesystem without any additional options (data parameter to the mount(2) syscall), pass NULL instead of an empty string like GNU mount does. This fixes, for example mounting cgroup fs with bbox mount. Signed-off-by: Alexander Shishkin <virtuoso@slind.org> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--util-linux/mount.c34
1 files changed, 22 insertions, 12 deletions
diff --git a/util-linux/mount.c b/util-linux/mount.c
index 3ac8ce093..0f213bb30 100644
--- a/util-linux/mount.c
+++ b/util-linux/mount.c
@@ -332,7 +332,7 @@ static void append_mount_options(char **oldopts, const char *newopts)
332} 332}
333 333
334// Use the mount_options list to parse options into flags. 334// Use the mount_options list to parse options into flags.
335// Also return list of unrecognized options if unrecognized != NULL 335// Also update list of unrecognized options if unrecognized != NULL
336static long parse_mount_options(char *options, char **unrecognized) 336static long parse_mount_options(char *options, char **unrecognized)
337{ 337{
338 long flags = MS_SILENT; 338 long flags = MS_SILENT;
@@ -348,25 +348,35 @@ static long parse_mount_options(char *options, char **unrecognized)
348// FIXME: use hasmntopt() 348// FIXME: use hasmntopt()
349 // Find this option in mount_options 349 // Find this option in mount_options
350 for (i = 0; i < ARRAY_SIZE(mount_options); i++) { 350 for (i = 0; i < ARRAY_SIZE(mount_options); i++) {
351 if (!strcasecmp(option_str, options)) { 351 if (strcasecmp(option_str, options) == 0) {
352 long fl = mount_options[i]; 352 long fl = mount_options[i];
353 if (fl < 0) flags &= fl; 353 if (fl < 0)
354 else flags |= fl; 354 flags &= fl;
355 break; 355 else
356 flags |= fl;
357 goto found;
356 } 358 }
357 option_str += strlen(option_str) + 1; 359 option_str += strlen(option_str) + 1;
358 } 360 }
359 // If unrecognized not NULL, append unrecognized mount options 361 // We did not recognize this option.
360 if (unrecognized && i == ARRAY_SIZE(mount_options)) { 362 // If "unrecognized" is not NULL, append option there.
363 // Note that we should not append *empty* option -
364 // in this case we want to pass NULL, not "", to "data"
365 // parameter of mount(2) syscall.
366 // This is crucial for filesystems that don't accept
367 // any arbitrary mount options, like cgroup fs:
368 // "mount -t cgroup none /mnt"
369 if (options[0] && unrecognized) {
361 // Add it to strflags, to pass on to kernel 370 // Add it to strflags, to pass on to kernel
362 i = *unrecognized ? strlen(*unrecognized) : 0; 371 char *p = *unrecognized;
363 *unrecognized = xrealloc(*unrecognized, i + strlen(options) + 2); 372 unsigned len = p ? strlen(p) : 0;
373 *unrecognized = p = xrealloc(p, len + strlen(options) + 2);
364 374
365 // Comma separated if it's not the first one 375 // Comma separated if it's not the first one
366 if (i) (*unrecognized)[i++] = ','; 376 if (len) p[len++] = ',';
367 strcpy((*unrecognized)+i, options); 377 strcpy(p + len, options);
368 } 378 }
369 379 found:
370 if (!comma) 380 if (!comma)
371 break; 381 break;
372 // Advance to next option 382 // Advance to next option