Patch from Vladimir:
authorEric Andersen <andersen@codepoet.org>
Tue, 15 May 2001 17:42:16 +0000 (17:42 -0000)
committerEric Andersen <andersen@codepoet.org>
Tue, 15 May 2001 17:42:16 +0000 (17:42 -0000)
    1) fixed a bug that could crash df, mount, and umount applets if the root
    device name was longer then the word "root" (/dev/loop1 vs /dev/root) -
    2) severl functions needed static declaration in the umount applet
    3) update declaration for function in last_char_is() in libbb

12 files changed:
coreutils/df.c
df.c
include/libbb.h
libbb/chomp.c
libbb/concat_path_file.c
libbb/find_root_device.c
libbb/last_char_is.c
libbb/libbb.h
mount.c
umount.c
util-linux/mount.c
util-linux/umount.c

index 21a1dbb319fc3a04d619606437d3d2458e412bec..df68744337e2ebf4adc52ad2c43e3fd7a7681cd6 100644 (file)
@@ -60,7 +60,9 @@ static int do_df(char *device, const char *mount_point)
                if (strcmp(device, "/dev/root") == 0) {
                        /* Adjusts device to be the real root device,
                         * or leaves device alone if it can't find it */
-                       find_real_root_device_name( device);
+                       device = find_real_root_device_name(device);
+                       if(device==NULL)
+                               return FALSE;
                }
 #ifdef BB_FEATURE_HUMAN_READABLE
                switch (df_disp_hr) {
diff --git a/df.c b/df.c
index 21a1dbb319fc3a04d619606437d3d2458e412bec..df68744337e2ebf4adc52ad2c43e3fd7a7681cd6 100644 (file)
--- a/df.c
+++ b/df.c
@@ -60,7 +60,9 @@ static int do_df(char *device, const char *mount_point)
                if (strcmp(device, "/dev/root") == 0) {
                        /* Adjusts device to be the real root device,
                         * or leaves device alone if it can't find it */
-                       find_real_root_device_name( device);
+                       device = find_real_root_device_name(device);
+                       if(device==NULL)
+                               return FALSE;
                }
 #ifdef BB_FEATURE_HUMAN_READABLE
                switch (df_disp_hr) {
index 02cf607a7f3f5785e68cd6ea553871515f0628ea..f34bee8f77679a7ac4e4ed213582675fb2bedcd3 100644 (file)
@@ -123,13 +123,9 @@ extern struct mntent *find_mount_point(const char *name, const char *table);
 extern void write_mtab(char* blockDevice, char* directory, 
        char* filesystemType, long flags, char* string_flags);
 extern void erase_mtab(const char * name);
-extern void mtab_read(void);
-extern char *mtab_first(void **iter);
-extern char *mtab_next(void **iter);
-extern char *mtab_getinfo(const char *match, const char which);
 extern long atoi_w_units (const char *cp);
 extern pid_t* find_pid_by_name( char* pidName);
-extern int find_real_root_device_name(char* name);
+extern char *find_real_root_device_name(const char* name);
 extern char *get_line_from_file(FILE *file);
 extern void print_file(FILE *file);
 extern int print_file_by_name(char *filename);
@@ -218,7 +214,7 @@ int klogctl(int type, char * b, int len);
 char *xgetcwd(char *cwd);
 char *xreadlink(const char *path);
 char *concat_path_file(const char *path, const char *filename);
-char *last_char_is(char *s, int c);
+char *last_char_is(const char *s, int c);
 
 typedef struct ar_headers_s {
        char *name;
index e62cb4005663f5a0393d2af0792eab4ace409115..111d4cf7713f9eb608861693b833a6c0a87a929e 100644 (file)
@@ -32,7 +32,7 @@
 
 void chomp(char *s)
 {
-       char *lc = (char *)last_char_is(s, '\n');
+       char *lc = last_char_is(s, '\n');
        
        if(lc)
                *lc = 0;
index 6b7abf24ba9508a61099a89faa099f3070e266da..12a57c837391ba387312641de3c0c19e72370671 100644 (file)
@@ -11,9 +11,9 @@
 extern char *concat_path_file(const char *path, const char *filename)
 {
        char *outbuf;
-       const char *lc;
+       char *lc;
        
-       lc = last_char_is((char*)path, '/');
+       lc = last_char_is(path, '/');
        if (filename[0] == '/')
                filename++;
        outbuf = xmalloc(strlen(path)+strlen(filename)+1+(lc==NULL));
index de765ce4499eed22c4a0a2bc6ff3f11c64e35997..75ed1a979be024a75f2a52028207532c1c3289c6 100644 (file)
 #include <stdio.h>
 #include <string.h>
 #include <dirent.h>
+#include <stdlib.h>
 #include "libbb.h"
 
 
 
-extern int find_real_root_device_name(char* name)
+extern char *find_real_root_device_name(const char* name)
 {
        DIR *dir;
        struct dirent *entry;
        struct stat statBuf, rootStat;
-       char fileName[BUFSIZ];
+       char *fileName;
 
        if (stat("/", &rootStat) != 0) {
                error_msg("could not stat '/'");
-               return( FALSE);
+               return NULL;
        }
 
        dir = opendir("/dev");
        if (!dir) {
                error_msg("could not open '/dev'");
-               return( FALSE);
+               return NULL;
        }
 
        while((entry = readdir(dir)) != NULL) {
@@ -57,21 +58,20 @@ extern int find_real_root_device_name(char* name)
                if (strcmp(entry->d_name, "..") == 0)
                        continue;
 
-               snprintf( fileName, strlen(name)+1, "/dev/%s", entry->d_name);
+               fileName = concat_path_file("/dev/", entry->d_name);
 
-               if (stat(fileName, &statBuf) != 0)
-                       continue;
                /* Some char devices have the same dev_t as block
                 * devices, so make sure this is a block device */
-               if (! S_ISBLK(statBuf.st_mode))
-                       continue;
-               if (statBuf.st_rdev == rootStat.st_rdev) {
-                       strcpy(name, fileName); 
-                       return ( TRUE);
+               if (stat(fileName, &statBuf) == 0 && 
+                               S_ISBLK(statBuf.st_mode)!=0 &&
+                               statBuf.st_rdev == rootStat.st_rdev) {
+                       return fileName; 
                }
+               free(fileName);
        }
+       closedir(dir);
 
-       return( FALSE);
+       return NULL;
 }
 
 
index 36b695b40af3136a6135efcf013a11702f51b02f..ae2d24bf71894d479778cded3ed7643729f661bb 100644 (file)
@@ -25,9 +25,9 @@
  * underrun the buffer if the string length is 0.  Also avoids a possible
  * space-hogging inline of strlen() per usage.
  */
-char * last_char_is(char *s, int c)
+char * last_char_is(const char *s, int c)
 {
-       char *sret  = s+strlen(s)-1;
+       char *sret  = (char *)s+strlen(s)-1;
        if (sret>=s && *sret == c) { 
                return sret;
        } else {
index 02cf607a7f3f5785e68cd6ea553871515f0628ea..f34bee8f77679a7ac4e4ed213582675fb2bedcd3 100644 (file)
@@ -123,13 +123,9 @@ extern struct mntent *find_mount_point(const char *name, const char *table);
 extern void write_mtab(char* blockDevice, char* directory, 
        char* filesystemType, long flags, char* string_flags);
 extern void erase_mtab(const char * name);
-extern void mtab_read(void);
-extern char *mtab_first(void **iter);
-extern char *mtab_next(void **iter);
-extern char *mtab_getinfo(const char *match, const char which);
 extern long atoi_w_units (const char *cp);
 extern pid_t* find_pid_by_name( char* pidName);
-extern int find_real_root_device_name(char* name);
+extern char *find_real_root_device_name(const char* name);
 extern char *get_line_from_file(FILE *file);
 extern void print_file(FILE *file);
 extern int print_file_by_name(char *filename);
@@ -218,7 +214,7 @@ int klogctl(int type, char * b, int len);
 char *xgetcwd(char *cwd);
 char *xreadlink(const char *path);
 char *concat_path_file(const char *path, const char *filename);
-char *last_char_is(char *s, int c);
+char *last_char_is(const char *s, int c);
 
 typedef struct ar_headers_s {
        char *name;
diff --git a/mount.c b/mount.c
index 0295fabc69896c46ef48372da3676399eb98428b..4e0e3e42863daf6b4e615abb8c373a2c8e537cd6 100644 (file)
--- a/mount.c
+++ b/mount.c
@@ -319,10 +319,14 @@ void show_mounts()
                while ((m = getmntent(mountTable)) != 0) {
                        char *blockDevice = m->mnt_fsname;
                        if (strcmp(blockDevice, "/dev/root") == 0) {
-                               find_real_root_device_name( blockDevice);
+                               blockDevice = find_real_root_device_name(blockDevice);
                        }
                        printf("%s on %s type %s (%s)\n", blockDevice, m->mnt_dir,
                                   m->mnt_type, m->mnt_opts);
+#ifdef BB_FEATURE_CLEAN_UP
+                       if(blockDevice != m->mnt_fsname)
+                               free(blockDevice);
+#endif
                }
                endmntent(mountTable);
        } else {
index 0eade5a36363692797c0aa12e7ad0d5d091fa535..8565744f256926a94e42ea4d45a806fb35560519 100644 (file)
--- a/umount.c
+++ b/umount.c
@@ -74,7 +74,7 @@ extern const char mtab_file[];        /* Defined in utility.c */
  * TODO: Perhaps switch to using Glibc's getmntent_r
  *        -Erik
  */
-void mtab_read(void)
+static void mtab_read(void)
 {
        struct _mtab_entry_t *entry = NULL;
        struct mntent *e;
@@ -97,7 +97,7 @@ void mtab_read(void)
        endmntent(fp);
 }
 
-char *mtab_getinfo(const char *match, const char which)
+static char *mtab_getinfo(const char *match, const char which)
 {
        struct _mtab_entry_t *cur = mtab_cache;
 
@@ -111,8 +111,7 @@ char *mtab_getinfo(const char *match, const char which)
                                if (strcmp(cur->device, "/dev/root") == 0) {
                                        /* Adjusts device to be the real root device,
                                         * or leaves device alone if it can't find it */
-                                       find_real_root_device_name( cur->device);
-                                       return ( cur->device);
+                                       cur->device = find_real_root_device_name(cur->device);
                                }
 #endif
                                return cur->device;
@@ -123,18 +122,7 @@ char *mtab_getinfo(const char *match, const char which)
        return NULL;
 }
 
-char *mtab_first(void **iter)
-{
-       struct _mtab_entry_t *mtab_iter;
-
-       if (!iter)
-               return NULL;
-       mtab_iter = mtab_cache;
-       *iter = (void *) mtab_iter;
-       return mtab_next(iter);
-}
-
-char *mtab_next(void **iter)
+static char *mtab_next(void **iter)
 {
        char *mp;
 
@@ -145,10 +133,21 @@ char *mtab_next(void **iter)
        return mp;
 }
 
+static char *mtab_first(void **iter)
+{
+       struct _mtab_entry_t *mtab_iter;
+
+       if (!iter)
+               return NULL;
+       mtab_iter = mtab_cache;
+       *iter = (void *) mtab_iter;
+       return mtab_next(iter);
+}
+
 /* Don't bother to clean up, since exit() does that 
  * automagically, so we can save a few bytes */
 #ifdef BB_FEATURE_CLEAN_UP
-void mtab_free(void)
+static void mtab_free(void)
 {
        struct _mtab_entry_t *this, *next;
 
index 0295fabc69896c46ef48372da3676399eb98428b..4e0e3e42863daf6b4e615abb8c373a2c8e537cd6 100644 (file)
@@ -319,10 +319,14 @@ void show_mounts()
                while ((m = getmntent(mountTable)) != 0) {
                        char *blockDevice = m->mnt_fsname;
                        if (strcmp(blockDevice, "/dev/root") == 0) {
-                               find_real_root_device_name( blockDevice);
+                               blockDevice = find_real_root_device_name(blockDevice);
                        }
                        printf("%s on %s type %s (%s)\n", blockDevice, m->mnt_dir,
                                   m->mnt_type, m->mnt_opts);
+#ifdef BB_FEATURE_CLEAN_UP
+                       if(blockDevice != m->mnt_fsname)
+                               free(blockDevice);
+#endif
                }
                endmntent(mountTable);
        } else {
index 0eade5a36363692797c0aa12e7ad0d5d091fa535..8565744f256926a94e42ea4d45a806fb35560519 100644 (file)
@@ -74,7 +74,7 @@ extern const char mtab_file[];        /* Defined in utility.c */
  * TODO: Perhaps switch to using Glibc's getmntent_r
  *        -Erik
  */
-void mtab_read(void)
+static void mtab_read(void)
 {
        struct _mtab_entry_t *entry = NULL;
        struct mntent *e;
@@ -97,7 +97,7 @@ void mtab_read(void)
        endmntent(fp);
 }
 
-char *mtab_getinfo(const char *match, const char which)
+static char *mtab_getinfo(const char *match, const char which)
 {
        struct _mtab_entry_t *cur = mtab_cache;
 
@@ -111,8 +111,7 @@ char *mtab_getinfo(const char *match, const char which)
                                if (strcmp(cur->device, "/dev/root") == 0) {
                                        /* Adjusts device to be the real root device,
                                         * or leaves device alone if it can't find it */
-                                       find_real_root_device_name( cur->device);
-                                       return ( cur->device);
+                                       cur->device = find_real_root_device_name(cur->device);
                                }
 #endif
                                return cur->device;
@@ -123,18 +122,7 @@ char *mtab_getinfo(const char *match, const char which)
        return NULL;
 }
 
-char *mtab_first(void **iter)
-{
-       struct _mtab_entry_t *mtab_iter;
-
-       if (!iter)
-               return NULL;
-       mtab_iter = mtab_cache;
-       *iter = (void *) mtab_iter;
-       return mtab_next(iter);
-}
-
-char *mtab_next(void **iter)
+static char *mtab_next(void **iter)
 {
        char *mp;
 
@@ -145,10 +133,21 @@ char *mtab_next(void **iter)
        return mp;
 }
 
+static char *mtab_first(void **iter)
+{
+       struct _mtab_entry_t *mtab_iter;
+
+       if (!iter)
+               return NULL;
+       mtab_iter = mtab_cache;
+       *iter = (void *) mtab_iter;
+       return mtab_next(iter);
+}
+
 /* Don't bother to clean up, since exit() does that 
  * automagically, so we can save a few bytes */
 #ifdef BB_FEATURE_CLEAN_UP
-void mtab_free(void)
+static void mtab_free(void)
 {
        struct _mtab_entry_t *this, *next;