From c911a4389bbaa5ac85d725c8c05e452dfba8583d Mon Sep 17 00:00:00 2001 From: Eric Andersen Date: Tue, 15 May 2001 17:42:16 +0000 Subject: [PATCH] Patch from Vladimir: 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 --- coreutils/df.c | 4 +++- df.c | 4 +++- include/libbb.h | 8 ++------ libbb/chomp.c | 2 +- libbb/concat_path_file.c | 4 ++-- libbb/find_root_device.c | 26 +++++++++++++------------- libbb/last_char_is.c | 4 ++-- libbb/libbb.h | 8 ++------ mount.c | 6 +++++- umount.c | 33 ++++++++++++++++----------------- util-linux/mount.c | 6 +++++- util-linux/umount.c | 33 ++++++++++++++++----------------- 12 files changed, 70 insertions(+), 68 deletions(-) diff --git a/coreutils/df.c b/coreutils/df.c index 21a1dbb31..df6874433 100644 --- a/coreutils/df.c +++ b/coreutils/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) { diff --git a/df.c b/df.c index 21a1dbb31..df6874433 100644 --- 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) { diff --git a/include/libbb.h b/include/libbb.h index 02cf607a7..f34bee8f7 100644 --- a/include/libbb.h +++ b/include/libbb.h @@ -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/libbb/chomp.c b/libbb/chomp.c index e62cb4005..111d4cf77 100644 --- a/libbb/chomp.c +++ b/libbb/chomp.c @@ -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; diff --git a/libbb/concat_path_file.c b/libbb/concat_path_file.c index 6b7abf24b..12a57c837 100644 --- a/libbb/concat_path_file.c +++ b/libbb/concat_path_file.c @@ -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)); diff --git a/libbb/find_root_device.c b/libbb/find_root_device.c index de765ce44..75ed1a979 100644 --- a/libbb/find_root_device.c +++ b/libbb/find_root_device.c @@ -28,26 +28,27 @@ #include #include #include +#include #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; } diff --git a/libbb/last_char_is.c b/libbb/last_char_is.c index 36b695b40..ae2d24bf7 100644 --- a/libbb/last_char_is.c +++ b/libbb/last_char_is.c @@ -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 { diff --git a/libbb/libbb.h b/libbb/libbb.h index 02cf607a7..f34bee8f7 100644 --- a/libbb/libbb.h +++ b/libbb/libbb.h @@ -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 0295fabc6..4e0e3e428 100644 --- 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 { diff --git a/umount.c b/umount.c index 0eade5a36..8565744f2 100644 --- 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; diff --git a/util-linux/mount.c b/util-linux/mount.c index 0295fabc6..4e0e3e428 100644 --- a/util-linux/mount.c +++ b/util-linux/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 { diff --git a/util-linux/umount.c b/util-linux/umount.c index 0eade5a36..8565744f2 100644 --- a/util-linux/umount.c +++ b/util-linux/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; -- 2.25.1