diff --git a/archival/ar.c b/archival/ar.c index 71f949e79..320cbae72 100644 --- a/archival/ar.c +++ b/archival/ar.c @@ -196,9 +196,10 @@ static int write_ar_archive(archive_handle_t *handle) static void FAST_FUNC header_verbose_list_ar(const file_header_t *file_header) { - const char *mode = bb_mode_string(file_header->mode); + char mode[12]; char *mtime; + bb_mode_string(mode, file_header->mode); mtime = ctime(&file_header->mtime); mtime[16] = ' '; memmove(&mtime[17], &mtime[20], 4); diff --git a/archival/libarchive/header_verbose_list.c b/archival/libarchive/header_verbose_list.c index be5140f8b..a575a08a0 100644 --- a/archival/libarchive/header_verbose_list.c +++ b/archival/libarchive/header_verbose_list.c @@ -9,6 +9,7 @@ void FAST_FUNC header_verbose_list(const file_header_t *file_header) { struct tm tm_time; struct tm *ptm = &tm_time; //localtime(&file_header->mtime); + char modestr[12]; #if ENABLE_FEATURE_TAR_UNAME_GNAME char uid[sizeof(int)*3 + 2]; @@ -29,7 +30,7 @@ void FAST_FUNC header_verbose_list(const file_header_t *file_header) group = utoa(file_header->gid); } printf("%s %s/%s %9"OFF_FMT"u %4u-%02u-%02u %02u:%02u:%02u %s", - bb_mode_string(file_header->mode), + bb_mode_string(modestr, file_header->mode), user, group, file_header->size, @@ -46,7 +47,7 @@ void FAST_FUNC header_verbose_list(const file_header_t *file_header) localtime_r(&file_header->mtime, ptm); printf("%s %u/%u %9"OFF_FMT"u %4u-%02u-%02u %02u:%02u:%02u %s", - bb_mode_string(file_header->mode), + bb_mode_string(modestr, file_header->mode), (unsigned)file_header->uid, (unsigned)file_header->gid, file_header->size, diff --git a/coreutils/chmod.c b/coreutils/chmod.c index 8e3e1387e..5832cc51b 100644 --- a/coreutils/chmod.c +++ b/coreutils/chmod.c @@ -91,8 +91,9 @@ static int FAST_FUNC fileAction(struct recursive_state *state, || (OPT_CHANGED && (statbuf->st_mode & 07777) != (newmode & 07777)) ) { + char modestr[12]; printf("mode of '%s' changed to %04o (%s)\n", fileName, - newmode & 07777, bb_mode_string(newmode)+1); + newmode & 07777, bb_mode_string(modestr, newmode)+1); } return TRUE; } diff --git a/coreutils/ls.c b/coreutils/ls.c index 9e8561606..9a1264e65 100644 --- a/coreutils/ls.c +++ b/coreutils/ls.c @@ -503,7 +503,8 @@ static NOINLINE unsigned display_single(const struct dnode *dn) column += printf("%6"OFF_FMT"u ", (off_t) (dn->dn_blocks >> 1)); if (opt & OPT_l) { /* long listing: show mode */ - column += printf("%-10s ", (char *) bb_mode_string(dn->dn_mode)); + char modestr[12]; + column += printf("%-10s ", (char *) bb_mode_string(modestr, dn->dn_mode)); /* long listing: show number of links */ column += printf("%4lu ", (long) dn->dn_nlink); /* long listing: show user/group */ diff --git a/coreutils/stat.c b/coreutils/stat.c index a8393468e..2c2909e7e 100644 --- a/coreutils/stat.c +++ b/coreutils/stat.c @@ -339,7 +339,8 @@ static void FAST_FUNC print_stat(char *pformat, const char m, strcat(pformat, "lo"); printf(pformat, (unsigned long) (statbuf->st_mode & (S_ISUID|S_ISGID|S_ISVTX|S_IRWXU|S_IRWXG|S_IRWXO))); } else if (m == 'A') { - printfs(pformat, bb_mode_string(statbuf->st_mode)); + char modestr[12]; + printfs(pformat, bb_mode_string(modestr, statbuf->st_mode)); } else if (m == 'f') { strcat(pformat, "lx"); printf(pformat, (unsigned long) statbuf->st_mode); @@ -702,6 +703,7 @@ static bool do_stat(const char *filename, const char *format) bb_putchar('\n'); # endif } else { + char modestr[12]; char *linkname = NULL; struct passwd *pw_ent; struct group *gw_ent; @@ -736,7 +738,7 @@ static bool do_stat(const char *filename, const char *format) bb_putchar('\n'); printf("Access: (%04lo/%10.10s) Uid: (%5lu/%8s) Gid: (%5lu/%8s)\n", (unsigned long) (statbuf.st_mode & (S_ISUID|S_ISGID|S_ISVTX|S_IRWXU|S_IRWXG|S_IRWXO)), - bb_mode_string(statbuf.st_mode), + bb_mode_string(modestr, statbuf.st_mode), (unsigned long) statbuf.st_uid, (pw_ent != NULL) ? pw_ent->pw_name : "UNKNOWN", (unsigned long) statbuf.st_gid, diff --git a/include/libbb.h b/include/libbb.h index 6727c22b2..b0312e5d4 100644 --- a/include/libbb.h +++ b/include/libbb.h @@ -442,7 +442,7 @@ void *xmmap_anon(size_t size) FAST_FUNC; //TODO: supply a pointer to char[11] buffer (avoid statics)? -extern const char *bb_mode_string(mode_t mode) FAST_FUNC; +extern char *bb_mode_string(char buf[12], mode_t mode) FAST_FUNC; extern int is_directory(const char *name, int followLinks) FAST_FUNC; enum { /* cp.c, mv.c, install.c depend on these values. CAREFUL when changing them! */ FILEUTILS_PRESERVE_STATUS = 1 << 0, /* -p */ diff --git a/libbb/mode_string.c b/libbb/mode_string.c index 9a286f3ff..2b829016f 100644 --- a/libbb/mode_string.c +++ b/libbb/mode_string.c @@ -43,9 +43,8 @@ static const char type_chars[16] ALIGN1 = "?pc?d?b?-?l?s???"; /***************************************** 0123456789abcdef */ static const char mode_chars[7] ALIGN1 = "rwxSTst"; -const char* FAST_FUNC bb_mode_string(mode_t mode) +char* FAST_FUNC bb_mode_string(char buf[12], mode_t mode) { - static char buf[12]; char *p = buf; int i, j, k; @@ -83,9 +82,8 @@ static const char type_chars[16] ALIGN1 = "?pc?d?b?-?l?s???"; /********************************** 0123456789abcdef */ static const char mode_chars[7] ALIGN1 = "rwxSTst"; -const char* FAST_FUNC bb_mode_string(mode_t mode) +char* FAST_FUNC bb_mode_string(char buf[12], mode_t mode) { - static char buf[12]; char *p = buf; int i, j, k, m;